Merge tag 'multi-platform-for-3.7' of git://sources.calxeda.com/kernel/linux into...
authorOlof Johansson <olof@lixom.net>
Fri, 21 Sep 2012 05:53:18 +0000 (22:53 -0700)
committerOlof Johansson <olof@lixom.net>
Fri, 21 Sep 2012 05:54:07 +0000 (22:54 -0700)
Enable initial ARM multi-platform support for highbank, mvebu,
socfpga, picoxcell, and vexpress.

Multi-platform support is dependent on mach/gpio.h removal and
restructuring of DEBUG_LL and dtb build rules included in this branch.

This has been built for all defconfigs, and booted on highbank with
all 5 platforms enabled.

By Rob Herring (18) and Arnd Bergmann (1)
via Rob Herring
* tag 'multi-platform-for-3.7' of git://sources.calxeda.com/kernel/linux:
  ARM: vexpress: convert to multi-platform
  ARM: initial multiplatform support
  ARM: mvebu: move armada-370-xp.h in mach dir
  ARM: vexpress: remove dependency on mach/* headers
  ARM: picoxcell: remove dependency on mach/* headers
  ARM: move all dtb targets out of Makefile.boot
  ARM: picoxcell: move debug macros to include/debug
  ARM: socfpga: move debug macros to include/debug
  ARM: mvebu: move debug macros to include/debug
  ARM: vexpress: move debug macros to include/debug
  ARM: highbank: move debug macros to include/debug
  ARM: move debug macros to common location
  ARM: make mach/gpio.h headers optional
  ARM: orion: move custom gpio functions to orion-gpio.h
  ARM: shmobile: move custom gpio functions to sh-gpio.h
  ARM: pxa: use gpio_to_irq for sharppm_sl
  net: pxaficp_ir: add irq resources
  usb: pxa27x_udc: remove IRQ_USB define
  staging: ste_rmi4: remove gpio.h include

Conflicts due to addition of bcm2835 and removal of pnx4008 in:
arch/arm/Kconfig
arch/arm/Makefile

Conflicts due to new dtb targets, moved to arch/arm/boot/dts/Makefile in:
arch/arm/mach-imx/Makefile.boot
arch/arm/mach-mxs/Makefile.boot
arch/arm/mach-tegra/Makefile.boot

Signed-off-by: Olof Johansson <olof@lixom.net>
1498 files changed:
Documentation/ABI/testing/sysfs-bus-pci
Documentation/ABI/testing/sysfs-tty
Documentation/arm/Samsung-S3C24XX/GPIO.txt
Documentation/arm/Samsung/GPIO.txt
Documentation/arm/memory.txt
Documentation/devicetree/bindings/arm/bcm2835.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/mrvl/tauros2.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/msm/timer.txt [new file with mode: 0644]
Documentation/devicetree/bindings/arm/omap/omap.txt
Documentation/devicetree/bindings/arm/pmu.txt
Documentation/devicetree/bindings/clock/imx23-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/imx28-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/clock/imx6q-clock.txt [new file with mode: 0644]
Documentation/devicetree/bindings/gpio/gpio-samsung.txt
Documentation/devicetree/bindings/gpio/gpio-twl4030.txt
Documentation/devicetree/bindings/i2c/trivial-devices.txt
Documentation/devicetree/bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt [new file with mode: 0644]
Documentation/devicetree/bindings/lpddr2/lpddr2-timings.txt [new file with mode: 0644]
Documentation/devicetree/bindings/lpddr2/lpddr2.txt [new file with mode: 0644]
Documentation/devicetree/bindings/memory-controllers/ti/emif.txt [new file with mode: 0644]
Documentation/devicetree/bindings/mtd/pxa3xx-nand.txt [new file with mode: 0644]
Documentation/devicetree/bindings/regulator/tps6586x.txt
Documentation/devicetree/bindings/rtc/pxa-rtc.txt [new file with mode: 0644]
Documentation/devicetree/bindings/timer/brcm,bcm2835-system-timer.txt [new file with mode: 0644]
Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt [new file with mode: 0644]
Documentation/devicetree/bindings/tty/serial/of-serial.txt
Documentation/devicetree/bindings/vendor-prefixes.txt
Documentation/feature-removal-schedule.txt
Documentation/i2c/busses/i2c-i801
Documentation/serial/00-INDEX
Documentation/serial/computone.txt [deleted file]
MAINTAINERS
Makefile
arch/alpha/kernel/srmcons.c
arch/arm/Kconfig
arch/arm/Kconfig.debug
arch/arm/Makefile
arch/arm/boot/compressed/head.S
arch/arm/boot/dts/Makefile
arch/arm/boot/dts/am335x-bone.dts
arch/arm/boot/dts/am335x-evm.dts
arch/arm/boot/dts/am33xx.dtsi
arch/arm/boot/dts/at91sam9g25ek.dts
arch/arm/boot/dts/bcm2835-rpi-b.dts [new file with mode: 0644]
arch/arm/boot/dts/bcm2835.dtsi [new file with mode: 0644]
arch/arm/boot/dts/ea3250.dts
arch/arm/boot/dts/elpida_ecb240abacn.dtsi [new file with mode: 0644]
arch/arm/boot/dts/imx23-evk.dts
arch/arm/boot/dts/imx23-olinuxino.dts
arch/arm/boot/dts/imx23-stmp378x_devb.dts
arch/arm/boot/dts/imx23.dtsi
arch/arm/boot/dts/imx27-phytec-phycore.dts
arch/arm/boot/dts/imx27.dtsi
arch/arm/boot/dts/imx28-apx4devkit.dts
arch/arm/boot/dts/imx28-cfa10049.dts [new file with mode: 0644]
arch/arm/boot/dts/imx28-evk.dts
arch/arm/boot/dts/imx28-m28evk.dts
arch/arm/boot/dts/imx28-tx28.dts
arch/arm/boot/dts/imx28.dtsi
arch/arm/boot/dts/imx51-babbage.dts
arch/arm/boot/dts/imx51.dtsi
arch/arm/boot/dts/imx53-ard.dts
arch/arm/boot/dts/imx53-evk.dts
arch/arm/boot/dts/imx53-qsb.dts
arch/arm/boot/dts/imx53-smd.dts
arch/arm/boot/dts/imx53.dtsi
arch/arm/boot/dts/imx6q-arm2.dts
arch/arm/boot/dts/imx6q-sabrelite.dts
arch/arm/boot/dts/imx6q-sabresd.dts
arch/arm/boot/dts/imx6q.dtsi
arch/arm/boot/dts/mmp2.dtsi
arch/arm/boot/dts/msm8660-surf.dts
arch/arm/boot/dts/msm8960-cdp.dts [new file with mode: 0644]
arch/arm/boot/dts/omap2420-h4.dts
arch/arm/boot/dts/omap2420.dtsi [new file with mode: 0644]
arch/arm/boot/dts/omap2430.dtsi [new file with mode: 0644]
arch/arm/boot/dts/omap3-beagle-xm.dts [moved from arch/arm/boot/dts/omap3-beagle.dts with 52% similarity]
arch/arm/boot/dts/omap3-evm.dts
arch/arm/boot/dts/omap3-overo.dtsi [new file with mode: 0644]
arch/arm/boot/dts/omap3-tobi.dts [new file with mode: 0644]
arch/arm/boot/dts/omap3.dtsi
arch/arm/boot/dts/omap36xx.dtsi [new file with mode: 0644]
arch/arm/boot/dts/omap4-panda.dts
arch/arm/boot/dts/omap4-sdp.dts
arch/arm/boot/dts/omap4.dtsi
arch/arm/boot/dts/omap5-evm.dts
arch/arm/boot/dts/omap5.dtsi
arch/arm/boot/dts/phy3250.dts
arch/arm/boot/dts/prima2-cb.dts [deleted file]
arch/arm/boot/dts/prima2-evb.dts [new file with mode: 0644]
arch/arm/boot/dts/prima2.dtsi [new file with mode: 0644]
arch/arm/boot/dts/pxa27x.dtsi [new file with mode: 0644]
arch/arm/boot/dts/pxa2xx.dtsi [new file with mode: 0644]
arch/arm/boot/dts/pxa3xx.dtsi [new file with mode: 0644]
arch/arm/boot/dts/pxa910.dtsi
arch/arm/boot/dts/tegra20-harmony.dts
arch/arm/boot/dts/tegra20-medcom-wide.dts [new file with mode: 0644]
arch/arm/boot/dts/tegra20-paz00.dts
arch/arm/boot/dts/tegra20-plutux.dts [new file with mode: 0644]
arch/arm/boot/dts/tegra20-seaboard.dts
arch/arm/boot/dts/tegra20-tamonten.dtsi [new file with mode: 0644]
arch/arm/boot/dts/tegra20-tec.dts [new file with mode: 0644]
arch/arm/boot/dts/tegra20-ventana.dts
arch/arm/boot/dts/tegra20-whistler.dts
arch/arm/boot/dts/tegra20.dtsi
arch/arm/boot/dts/tegra30-cardhu-a02.dts [new file with mode: 0644]
arch/arm/boot/dts/tegra30-cardhu-a04.dts [new file with mode: 0644]
arch/arm/boot/dts/tegra30-cardhu.dts [deleted file]
arch/arm/boot/dts/tegra30-cardhu.dtsi [new file with mode: 0644]
arch/arm/boot/dts/tegra30.dtsi
arch/arm/boot/dts/tps65217.dtsi [new file with mode: 0644]
arch/arm/boot/dts/tps65910.dtsi [new file with mode: 0644]
arch/arm/boot/dts/twl4030.dtsi
arch/arm/boot/dts/twl6030.dtsi
arch/arm/configs/armadillo800eva_defconfig
arch/arm/configs/bcm2835_defconfig [new file with mode: 0644]
arch/arm/configs/imx_v6_v7_defconfig
arch/arm/configs/kzm9d_defconfig
arch/arm/configs/kzm9g_defconfig
arch/arm/configs/mxs_defconfig
arch/arm/configs/omap2plus_defconfig
arch/arm/configs/pnx4008_defconfig [deleted file]
arch/arm/configs/prima2_defconfig
arch/arm/configs/tegra_defconfig
arch/arm/include/asm/assembler.h
arch/arm/include/asm/dma-mapping.h
arch/arm/include/asm/hardware/cache-tauros2.h
arch/arm/include/asm/hardware/iop3xx.h
arch/arm/include/asm/io.h
arch/arm/include/asm/mach/map.h
arch/arm/include/asm/mach/pci.h
arch/arm/include/asm/memory.h
arch/arm/include/asm/perf_event.h
arch/arm/include/asm/pmu.h
arch/arm/include/asm/tlb.h
arch/arm/include/asm/uaccess.h
arch/arm/kernel/Makefile
arch/arm/kernel/bios32.c
arch/arm/kernel/hw_breakpoint.c
arch/arm/kernel/perf_event.c
arch/arm/kernel/perf_event_cpu.c [new file with mode: 0644]
arch/arm/kernel/perf_event_v6.c
arch/arm/kernel/perf_event_v7.c
arch/arm/kernel/perf_event_xscale.c
arch/arm/kernel/pmu.c [deleted file]
arch/arm/kernel/traps.c
arch/arm/lib/delay.c
arch/arm/lib/getuser.S
arch/arm/lib/putuser.S
arch/arm/mach-at91/at91rm9200_time.c
arch/arm/mach-at91/at91sam9260_devices.c
arch/arm/mach-at91/at91sam9261_devices.c
arch/arm/mach-at91/at91sam9263_devices.c
arch/arm/mach-at91/at91sam9g45_devices.c
arch/arm/mach-at91/at91sam9rl_devices.c
arch/arm/mach-at91/clock.c
arch/arm/mach-bcm2835/Makefile [new file with mode: 0644]
arch/arm/mach-bcm2835/Makefile.boot [new file with mode: 0644]
arch/arm/mach-bcm2835/bcm2835.c [new file with mode: 0644]
arch/arm/mach-bcm2835/include/mach/bcm2835_soc.h [new file with mode: 0644]
arch/arm/mach-bcm2835/include/mach/debug-macro.S [new file with mode: 0644]
arch/arm/mach-bcm2835/include/mach/timex.h [moved from arch/arm/mach-versatile/include/mach/io.h with 78% similarity]
arch/arm/mach-bcm2835/include/mach/uncompress.h [new file with mode: 0644]
arch/arm/mach-bcmring/arch.c
arch/arm/mach-bcmring/core.c
arch/arm/mach-bcmring/csp/chipc/chipcHw.c
arch/arm/mach-bcmring/csp/chipc/chipcHw_init.c
arch/arm/mach-bcmring/csp/chipc/chipcHw_reset.c
arch/arm/mach-bcmring/csp/dmac/dmacHw.c
arch/arm/mach-bcmring/csp/dmac/dmacHw_extra.c
arch/arm/mach-bcmring/csp/tmr/tmrHw.c
arch/arm/mach-bcmring/include/cfg_global.h [deleted file]
arch/arm/mach-bcmring/include/csp/cache.h [deleted file]
arch/arm/mach-bcmring/include/csp/delay.h [deleted file]
arch/arm/mach-bcmring/include/csp/errno.h [deleted file]
arch/arm/mach-bcmring/include/csp/intcHw.h [deleted file]
arch/arm/mach-bcmring/include/csp/module.h [deleted file]
arch/arm/mach-bcmring/include/csp/secHw.h [deleted file]
arch/arm/mach-bcmring/include/csp/stdint.h [deleted file]
arch/arm/mach-bcmring/include/csp/string.h [deleted file]
arch/arm/mach-bcmring/include/mach/cfg_global.h [moved from arch/arm/mach-bcmring/include/cfg_global_defines.h with 74% similarity]
arch/arm/mach-bcmring/include/mach/csp/cap_inline.h
arch/arm/mach-bcmring/include/mach/csp/chipcHw_def.h
arch/arm/mach-bcmring/include/mach/csp/chipcHw_inline.h
arch/arm/mach-bcmring/include/mach/csp/chipcHw_reg.h
arch/arm/mach-bcmring/include/mach/csp/ddrcReg.h
arch/arm/mach-bcmring/include/mach/csp/dmacHw.h [moved from arch/arm/mach-bcmring/include/csp/dmacHw.h with 99% similarity]
arch/arm/mach-bcmring/include/mach/csp/dmacHw_priv.h
arch/arm/mach-bcmring/include/mach/csp/dmacHw_reg.h
arch/arm/mach-bcmring/include/mach/csp/hw_cfg.h
arch/arm/mach-bcmring/include/mach/csp/intcHw_reg.h
arch/arm/mach-bcmring/include/mach/csp/mm_addr.h
arch/arm/mach-bcmring/include/mach/csp/mm_io.h
arch/arm/mach-bcmring/include/mach/csp/reg.h [moved from arch/arm/mach-bcmring/include/csp/reg.h with 81% similarity]
arch/arm/mach-bcmring/include/mach/csp/secHw_inline.h
arch/arm/mach-bcmring/include/mach/csp/tmrHw.h [moved from arch/arm/mach-bcmring/include/csp/tmrHw.h with 99% similarity]
arch/arm/mach-bcmring/include/mach/dma.h
arch/arm/mach-bcmring/include/mach/hardware.h
arch/arm/mach-bcmring/include/mach/reg_nand.h
arch/arm/mach-bcmring/include/mach/reg_umi.h
arch/arm/mach-bcmring/mm.c
arch/arm/mach-bcmring/timer.c
arch/arm/mach-dove/common.c
arch/arm/mach-dove/include/mach/dove.h
arch/arm/mach-dove/include/mach/io.h [deleted file]
arch/arm/mach-dove/pcie.c
arch/arm/mach-exynos/clock-exynos5.c
arch/arm/mach-exynos/include/mach/map.h
arch/arm/mach-footbridge/common.c
arch/arm/mach-footbridge/dc21285.c
arch/arm/mach-footbridge/include/mach/debug-macro.S
arch/arm/mach-footbridge/include/mach/io.h
arch/arm/mach-gemini/irq.c
arch/arm/mach-imx/Kconfig
arch/arm/mach-imx/Makefile
arch/arm/mach-imx/clk-imx21.c
arch/arm/mach-imx/clk-imx25.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-pllv1.c
arch/arm/mach-imx/clk.c [new file with mode: 0644]
arch/arm/mach-imx/clk.h
arch/arm/mach-imx/devices-imx53.h [deleted file]
arch/arm/mach-imx/efika.h [deleted file]
arch/arm/mach-imx/imx51-dt.c
arch/arm/mach-imx/mach-imx53.c [moved from arch/arm/mach-imx/imx53-dt.c with 81% similarity]
arch/arm/mach-imx/mach-imx6q.c
arch/arm/mach-imx/mach-kzm_arm11_01.c
arch/arm/mach-imx/mach-mx51_efikamx.c [deleted file]
arch/arm/mach-imx/mach-mx51_efikasb.c [deleted file]
arch/arm/mach-imx/mach-mx53_ard.c [deleted file]
arch/arm/mach-imx/mach-mx53_evk.c [deleted file]
arch/arm/mach-imx/mach-mx53_loco.c [deleted file]
arch/arm/mach-imx/mach-mx53_smd.c [deleted file]
arch/arm/mach-imx/mm-imx5.c
arch/arm/mach-imx/mx51_efika.c [deleted file]
arch/arm/mach-integrator/include/mach/platform.h
arch/arm/mach-integrator/integrator_ap.c
arch/arm/mach-integrator/pci_v3.c
arch/arm/mach-iop13xx/include/mach/io.h [deleted file]
arch/arm/mach-iop13xx/include/mach/iop13xx.h
arch/arm/mach-iop13xx/io.c
arch/arm/mach-iop13xx/pci.c
arch/arm/mach-iop13xx/setup.c
arch/arm/mach-iop32x/include/mach/io.h [deleted file]
arch/arm/mach-iop33x/include/mach/io.h [deleted file]
arch/arm/mach-kirkwood/common.c
arch/arm/mach-kirkwood/db88f6281-bp-setup.c
arch/arm/mach-kirkwood/include/mach/io.h [deleted file]
arch/arm/mach-kirkwood/include/mach/kirkwood.h
arch/arm/mach-kirkwood/pcie.c
arch/arm/mach-ks8695/include/mach/regs-timer.h [deleted file]
arch/arm/mach-ks8695/time.c
arch/arm/mach-lpc32xx/irq.c
arch/arm/mach-lpc32xx/phy3250.c
arch/arm/mach-mmp/Kconfig
arch/arm/mach-mmp/Makefile
arch/arm/mach-mmp/clock-mmp2.c [new file with mode: 0644]
arch/arm/mach-mmp/clock-pxa168.c [new file with mode: 0644]
arch/arm/mach-mmp/clock-pxa910.c [new file with mode: 0644]
arch/arm/mach-mmp/common.h
arch/arm/mach-mmp/include/mach/regs-apbc.h
arch/arm/mach-mmp/include/mach/regs-apmu.h
arch/arm/mach-mmp/mmp2.c
arch/arm/mach-mmp/pxa168.c
arch/arm/mach-mmp/pxa910.c
arch/arm/mach-msm/Kconfig
arch/arm/mach-msm/Makefile
arch/arm/mach-msm/Makefile.boot
arch/arm/mach-msm/acpuclock-arm11.c [deleted file]
arch/arm/mach-msm/acpuclock.h [deleted file]
arch/arm/mach-msm/board-dt-8660.c [new file with mode: 0644]
arch/arm/mach-msm/board-dt-8960.c [new file with mode: 0644]
arch/arm/mach-msm/board-halibut.c
arch/arm/mach-msm/board-mahimahi.c
arch/arm/mach-msm/board-msm7x27.c [deleted file]
arch/arm/mach-msm/board-msm7x30.c
arch/arm/mach-msm/board-msm8960.c [deleted file]
arch/arm/mach-msm/board-msm8x60.c [deleted file]
arch/arm/mach-msm/board-qsd8x50.c
arch/arm/mach-msm/board-sapphire.c
arch/arm/mach-msm/board-trout.c
arch/arm/mach-msm/clock-pcom.c
arch/arm/mach-msm/common.h [new file with mode: 0644]
arch/arm/mach-msm/devices-msm8960.c [deleted file]
arch/arm/mach-msm/dma.c
arch/arm/mach-msm/idle.c [deleted file]
arch/arm/mach-msm/include/mach/board.h
arch/arm/mach-msm/include/mach/msm_iomap-7x00.h
arch/arm/mach-msm/include/mach/msm_iomap-7x30.h
arch/arm/mach-msm/include/mach/msm_iomap-8960.h
arch/arm/mach-msm/include/mach/msm_iomap-8x50.h
arch/arm/mach-msm/include/mach/msm_iomap-8x60.h
arch/arm/mach-msm/include/mach/system.h [deleted file]
arch/arm/mach-msm/io.c
arch/arm/mach-msm/platsmp.c
arch/arm/mach-msm/proc_comm.c
arch/arm/mach-msm/smd.c
arch/arm/mach-msm/timer.c
arch/arm/mach-mv78xx0/addr-map.c
arch/arm/mach-mv78xx0/common.c
arch/arm/mach-mv78xx0/include/mach/io.h [deleted file]
arch/arm/mach-mv78xx0/include/mach/mv78xx0.h
arch/arm/mach-mv78xx0/pcie.c
arch/arm/mach-mxs/Kconfig
arch/arm/mach-mxs/Makefile
arch/arm/mach-mxs/devices-mx23.h [deleted file]
arch/arm/mach-mxs/devices-mx28.h [deleted file]
arch/arm/mach-mxs/devices.c [deleted file]
arch/arm/mach-mxs/devices/Kconfig [deleted file]
arch/arm/mach-mxs/devices/Makefile [deleted file]
arch/arm/mach-mxs/devices/platform-auart.c [deleted file]
arch/arm/mach-mxs/devices/platform-dma.c [deleted file]
arch/arm/mach-mxs/devices/platform-fec.c [deleted file]
arch/arm/mach-mxs/devices/platform-flexcan.c [deleted file]
arch/arm/mach-mxs/devices/platform-gpio-mxs.c [deleted file]
arch/arm/mach-mxs/devices/platform-gpmi-nand.c [deleted file]
arch/arm/mach-mxs/devices/platform-mxs-i2c.c [deleted file]
arch/arm/mach-mxs/devices/platform-mxs-mmc.c [deleted file]
arch/arm/mach-mxs/devices/platform-mxs-pwm.c [deleted file]
arch/arm/mach-mxs/devices/platform-mxs-saif.c [deleted file]
arch/arm/mach-mxs/devices/platform-mxsfb.c [deleted file]
arch/arm/mach-mxs/devices/platform-rtc-stmp3xxx.c [deleted file]
arch/arm/mach-mxs/include/mach/common.h
arch/arm/mach-mxs/include/mach/devices-common.h [deleted file]
arch/arm/mach-mxs/include/mach/iomux-mx23.h [deleted file]
arch/arm/mach-mxs/include/mach/iomux-mx28.h [deleted file]
arch/arm/mach-mxs/include/mach/iomux.h [deleted file]
arch/arm/mach-mxs/iomux.c [deleted file]
arch/arm/mach-mxs/mach-apx4devkit.c [deleted file]
arch/arm/mach-mxs/mach-m28evk.c [deleted file]
arch/arm/mach-mxs/mach-mx23evk.c [deleted file]
arch/arm/mach-mxs/mach-mx28evk.c [deleted file]
arch/arm/mach-mxs/mach-mxs.c
arch/arm/mach-mxs/mach-stmp378x_devb.c [deleted file]
arch/arm/mach-mxs/mach-tx28.c [deleted file]
arch/arm/mach-mxs/mm.c
arch/arm/mach-mxs/module-tx28.c [deleted file]
arch/arm/mach-mxs/module-tx28.h [deleted file]
arch/arm/mach-omap1/ams-delta-fiq-handler.S
arch/arm/mach-omap1/ams-delta-fiq.c
arch/arm/mach-omap1/board-ams-delta.c
arch/arm/mach-omap1/board-fsample.c
arch/arm/mach-omap1/board-generic.c
arch/arm/mach-omap1/board-h2.c
arch/arm/mach-omap1/board-h3.c
arch/arm/mach-omap1/board-htcherald.c
arch/arm/mach-omap1/board-innovator.c
arch/arm/mach-omap1/board-nokia770.c
arch/arm/mach-omap1/board-osk.c
arch/arm/mach-omap1/board-palmte.c
arch/arm/mach-omap1/board-palmtt.c
arch/arm/mach-omap1/board-palmz71.c
arch/arm/mach-omap1/board-perseus2.c
arch/arm/mach-omap1/board-sx1-mmc.c
arch/arm/mach-omap1/board-sx1.c
arch/arm/mach-omap1/board-voiceblue.c
arch/arm/mach-omap1/clock.c
arch/arm/mach-omap1/clock_data.c
arch/arm/mach-omap1/devices.c
arch/arm/mach-omap1/dma.c
arch/arm/mach-omap1/flash.c
arch/arm/mach-omap1/gpio15xx.c
arch/arm/mach-omap1/gpio16xx.c
arch/arm/mach-omap1/gpio7xx.c
arch/arm/mach-omap1/i2c.c
arch/arm/mach-omap1/include/mach/ams-delta-fiq.h
arch/arm/mach-omap1/include/mach/board-ams-delta.h [moved from arch/arm/plat-omap/include/plat/board-ams-delta.h with 100% similarity]
arch/arm/mach-omap1/include/mach/board-sx1.h [moved from arch/arm/plat-omap/include/plat/board-sx1.h with 100% similarity]
arch/arm/mach-omap1/include/mach/board-voiceblue.h [moved from arch/arm/plat-omap/include/plat/board-voiceblue.h with 100% similarity]
arch/arm/mach-omap1/include/mach/flash.h [moved from arch/arm/plat-omap/include/plat/flash.h with 100% similarity]
arch/arm/mach-omap1/include/mach/gpio.h
arch/arm/mach-omap1/include/mach/hardware.h
arch/arm/mach-omap1/include/mach/irda.h [moved from arch/arm/plat-omap/include/plat/irda.h with 100% similarity]
arch/arm/mach-omap1/include/mach/irqs.h
arch/arm/mach-omap1/include/mach/mux.h [moved from arch/arm/plat-omap/include/plat/mux.h with 100% similarity]
arch/arm/mach-omap1/include/mach/omap1510.h [moved from arch/arm/plat-omap/include/plat/omap1510.h with 97% similarity]
arch/arm/mach-omap1/include/mach/omap16xx.h [moved from arch/arm/plat-omap/include/plat/omap16xx.h with 99% similarity]
arch/arm/mach-omap1/include/mach/omap7xx.h [moved from arch/arm/plat-omap/include/plat/omap7xx.h with 98% similarity]
arch/arm/mach-omap1/include/mach/smp.h [deleted file]
arch/arm/mach-omap1/io.c
arch/arm/mach-omap1/lcd_dma.c
arch/arm/mach-omap1/leds-h2p2-debug.c
arch/arm/mach-omap1/leds.c
arch/arm/mach-omap1/mcbsp.c
arch/arm/mach-omap1/mux.c
arch/arm/mach-omap1/pm.c
arch/arm/mach-omap1/serial.c
arch/arm/mach-omap1/usb.c
arch/arm/mach-omap2/Kconfig
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/Makefile.boot
arch/arm/mach-omap2/am33xx.h [moved from arch/arm/plat-omap/include/plat/am33xx.h with 100% similarity]
arch/arm/mach-omap2/am35xx-emac.c
arch/arm/mach-omap2/am35xx.h [moved from arch/arm/mach-omap2/include/mach/am35xx.h with 100% similarity]
arch/arm/mach-omap2/board-2430sdp.c
arch/arm/mach-omap2/board-3430sdp.c
arch/arm/mach-omap2/board-3630sdp.c
arch/arm/mach-omap2/board-4430sdp.c
arch/arm/mach-omap2/board-am3517crane.c
arch/arm/mach-omap2/board-am3517evm.c
arch/arm/mach-omap2/board-apollon.c
arch/arm/mach-omap2/board-cm-t35.c
arch/arm/mach-omap2/board-cm-t3517.c
arch/arm/mach-omap2/board-devkit8000.c
arch/arm/mach-omap2/board-flash.c
arch/arm/mach-omap2/board-generic.c
arch/arm/mach-omap2/board-h4.c
arch/arm/mach-omap2/board-igep0020.c
arch/arm/mach-omap2/board-ldp.c
arch/arm/mach-omap2/board-n8x0.c
arch/arm/mach-omap2/board-omap3beagle.c
arch/arm/mach-omap2/board-omap3evm.c
arch/arm/mach-omap2/board-omap3logic.c
arch/arm/mach-omap2/board-omap3pandora.c
arch/arm/mach-omap2/board-omap3stalker.c
arch/arm/mach-omap2/board-omap3touchbook.c
arch/arm/mach-omap2/board-omap4panda.c
arch/arm/mach-omap2/board-overo.c
arch/arm/mach-omap2/board-rm680.c
arch/arm/mach-omap2/board-rx51-peripherals.c
arch/arm/mach-omap2/board-rx51-video.c
arch/arm/mach-omap2/board-rx51.c
arch/arm/mach-omap2/board-rx51.h [moved from arch/arm/mach-omap2/include/mach/board-rx51.h with 100% similarity]
arch/arm/mach-omap2/board-ti8168evm.c
arch/arm/mach-omap2/board-zoom-debugboard.c
arch/arm/mach-omap2/board-zoom-display.c
arch/arm/mach-omap2/board-zoom-peripherals.c
arch/arm/mach-omap2/board-zoom.c
arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c
arch/arm/mach-omap2/clkt34xx_dpll3m2.c
arch/arm/mach-omap2/clkt_clksel.c
arch/arm/mach-omap2/clkt_dpll.c
arch/arm/mach-omap2/clock.c
arch/arm/mach-omap2/clock2420_data.c
arch/arm/mach-omap2/clock2430.c
arch/arm/mach-omap2/clock2430_data.c
arch/arm/mach-omap2/clock2xxx.c
arch/arm/mach-omap2/clock33xx_data.c
arch/arm/mach-omap2/clock3xxx.c
arch/arm/mach-omap2/clock3xxx_data.c
arch/arm/mach-omap2/clock44xx_data.c
arch/arm/mach-omap2/clockdomain.c
arch/arm/mach-omap2/clockdomain2xxx_3xxx.c
arch/arm/mach-omap2/cm-regbits-34xx.h
arch/arm/mach-omap2/cm2xxx_3xxx.c
arch/arm/mach-omap2/common-board-devices.c
arch/arm/mach-omap2/common.c
arch/arm/mach-omap2/common.h
arch/arm/mach-omap2/control.c
arch/arm/mach-omap2/control.h
arch/arm/mach-omap2/cpuidle34xx.c
arch/arm/mach-omap2/ctrl_module_core_44xx.h [moved from arch/arm/mach-omap2/include/mach/ctrl_module_core_44xx.h with 100% similarity]
arch/arm/mach-omap2/ctrl_module_pad_core_44xx.h [moved from arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h with 100% similarity]
arch/arm/mach-omap2/ctrl_module_pad_wkup_44xx.h [moved from arch/arm/mach-omap2/include/mach/ctrl_module_pad_wkup_44xx.h with 100% similarity]
arch/arm/mach-omap2/ctrl_module_wkup_44xx.h [moved from arch/arm/mach-omap2/include/mach/ctrl_module_wkup_44xx.h with 100% similarity]
arch/arm/mach-omap2/debug-devices.h [new file with mode: 0644]
arch/arm/mach-omap2/devices.c
arch/arm/mach-omap2/dpll3xxx.c
arch/arm/mach-omap2/dpll44xx.c
arch/arm/mach-omap2/dsp.c
arch/arm/mach-omap2/emu.c
arch/arm/mach-omap2/gpio.c
arch/arm/mach-omap2/gpmc-nand.c
arch/arm/mach-omap2/gpmc-onenand.c
arch/arm/mach-omap2/gpmc-smc91x.c
arch/arm/mach-omap2/gpmc-smc91x.h [moved from arch/arm/plat-omap/include/plat/gpmc-smc91x.h with 100% similarity]
arch/arm/mach-omap2/gpmc-smsc911x.c
arch/arm/mach-omap2/gpmc-smsc911x.h [moved from arch/arm/plat-omap/include/plat/gpmc-smsc911x.h with 100% similarity]
arch/arm/mach-omap2/gpmc.c
arch/arm/mach-omap2/hdq1w.c
arch/arm/mach-omap2/hdq1w.h [moved from arch/arm/plat-omap/include/plat/hdq1w.h with 100% similarity]
arch/arm/mach-omap2/hsmmc.c
arch/arm/mach-omap2/i2c.c
arch/arm/mach-omap2/id.c
arch/arm/mach-omap2/id.h [moved from arch/arm/mach-omap2/include/mach/id.h with 100% similarity]
arch/arm/mach-omap2/include/mach/gpio.h
arch/arm/mach-omap2/include/mach/hardware.h
arch/arm/mach-omap2/include/mach/irqs.h
arch/arm/mach-omap2/include/mach/smp.h [deleted file]
arch/arm/mach-omap2/io.c
arch/arm/mach-omap2/irq.c
arch/arm/mach-omap2/l3_2xxx.h [moved from arch/arm/plat-omap/include/plat/l3_2xxx.h with 100% similarity]
arch/arm/mach-omap2/l3_3xxx.h [moved from arch/arm/plat-omap/include/plat/l3_3xxx.h with 100% similarity]
arch/arm/mach-omap2/l4_2xxx.h [moved from arch/arm/plat-omap/include/plat/l4_2xxx.h with 100% similarity]
arch/arm/mach-omap2/l4_3xxx.h [moved from arch/arm/plat-omap/include/plat/l4_3xxx.h with 100% similarity]
arch/arm/mach-omap2/mailbox.c
arch/arm/mach-omap2/mcbsp.c
arch/arm/mach-omap2/msdi.c
arch/arm/mach-omap2/omap-hotplug.c
arch/arm/mach-omap2/omap-iommu.c
arch/arm/mach-omap2/omap-mpuss-lowpower.c
arch/arm/mach-omap2/omap-secure.c
arch/arm/mach-omap2/omap-secure.h [moved from arch/arm/mach-omap2/include/mach/omap-secure.h with 100% similarity]
arch/arm/mach-omap2/omap-smp.c
arch/arm/mach-omap2/omap-wakeupgen.c
arch/arm/mach-omap2/omap-wakeupgen.h [moved from arch/arm/mach-omap2/include/mach/omap-wakeupgen.h with 100% similarity]
arch/arm/mach-omap2/omap24xx.h [moved from arch/arm/plat-omap/include/plat/omap24xx.h with 98% similarity]
arch/arm/mach-omap2/omap34xx.h [moved from arch/arm/plat-omap/include/plat/omap34xx.h with 98% similarity]
arch/arm/mach-omap2/omap4-common.c
arch/arm/mach-omap2/omap4-keypad.h [moved from arch/arm/plat-omap/include/plat/omap4-keypad.h with 87% similarity]
arch/arm/mach-omap2/omap44xx.h [moved from arch/arm/plat-omap/include/plat/omap44xx.h with 97% similarity]
arch/arm/mach-omap2/omap54xx.h [moved from arch/arm/plat-omap/include/plat/omap54xx.h with 100% similarity]
arch/arm/mach-omap2/omap_hwmod.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_ipblock_data.c
arch/arm/mach-omap2/omap_hwmod_2xxx_interconnect_data.c
arch/arm/mach-omap2/omap_hwmod_2xxx_ipblock_data.c
arch/arm/mach-omap2/omap_hwmod_33xx_data.c [new file with mode: 0644]
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
arch/arm/mach-omap2/omap_hwmod_common_data.h
arch/arm/mach-omap2/omap_l3_noc.c
arch/arm/mach-omap2/omap_phy_internal.c
arch/arm/mach-omap2/opp.c
arch/arm/mach-omap2/opp2420_data.c
arch/arm/mach-omap2/opp2430_data.c
arch/arm/mach-omap2/opp3xxx_data.c
arch/arm/mach-omap2/opp4xxx_data.c
arch/arm/mach-omap2/pm-debug.c
arch/arm/mach-omap2/pm.c
arch/arm/mach-omap2/pm24xx.c
arch/arm/mach-omap2/pm34xx.c
arch/arm/mach-omap2/pm44xx.c
arch/arm/mach-omap2/powerdomain.c
arch/arm/mach-omap2/powerdomain2xxx_3xxx.c
arch/arm/mach-omap2/powerdomain44xx.c
arch/arm/mach-omap2/powerdomains3xxx_data.c
arch/arm/mach-omap2/prcm.c
arch/arm/mach-omap2/prm2xxx_3xxx.c
arch/arm/mach-omap2/prm44xx.c
arch/arm/mach-omap2/prm_common.c
arch/arm/mach-omap2/sdrc2xxx.c
arch/arm/mach-omap2/serial.c
arch/arm/mach-omap2/sleep24xx.S
arch/arm/mach-omap2/sleep34xx.S
arch/arm/mach-omap2/sleep44xx.S
arch/arm/mach-omap2/soc.h [new file with mode: 0644]
arch/arm/mach-omap2/sr_device.c
arch/arm/mach-omap2/sram242x.S
arch/arm/mach-omap2/sram243x.S
arch/arm/mach-omap2/sram34xx.S
arch/arm/mach-omap2/ti81xx.h [moved from arch/arm/plat-omap/include/plat/ti81xx.h with 100% similarity]
arch/arm/mach-omap2/timer.c
arch/arm/mach-omap2/twl-common.c
arch/arm/mach-omap2/twl-common.h
arch/arm/mach-omap2/usb-host.c
arch/arm/mach-omap2/usb-musb.c
arch/arm/mach-omap2/vc.c
arch/arm/mach-omap2/voltage.c
arch/arm/mach-omap2/voltage.h
arch/arm/mach-omap2/voltagedomains3xxx_data.c
arch/arm/mach-omap2/vp.c
arch/arm/mach-orion5x/common.c
arch/arm/mach-orion5x/include/mach/io.h [deleted file]
arch/arm/mach-orion5x/include/mach/orion5x.h
arch/arm/mach-orion5x/pci.c
arch/arm/mach-pnx4008/Makefile [deleted file]
arch/arm/mach-pnx4008/Makefile.boot [deleted file]
arch/arm/mach-pnx4008/clock.c [deleted file]
arch/arm/mach-pnx4008/clock.h [deleted file]
arch/arm/mach-pnx4008/core.c [deleted file]
arch/arm/mach-pnx4008/dma.c [deleted file]
arch/arm/mach-pnx4008/gpio.c [deleted file]
arch/arm/mach-pnx4008/i2c.c [deleted file]
arch/arm/mach-pnx4008/include/mach/clock.h [deleted file]
arch/arm/mach-pnx4008/include/mach/debug-macro.S [deleted file]
arch/arm/mach-pnx4008/include/mach/dma.h [deleted file]
arch/arm/mach-pnx4008/include/mach/entry-macro.S [deleted file]
arch/arm/mach-pnx4008/include/mach/gpio-pnx4008.h [deleted file]
arch/arm/mach-pnx4008/include/mach/hardware.h [deleted file]
arch/arm/mach-pnx4008/include/mach/irq.h [deleted file]
arch/arm/mach-pnx4008/include/mach/irqs.h [deleted file]
arch/arm/mach-pnx4008/include/mach/platform.h [deleted file]
arch/arm/mach-pnx4008/include/mach/pm.h [deleted file]
arch/arm/mach-pnx4008/include/mach/timex.h [deleted file]
arch/arm/mach-pnx4008/include/mach/uncompress.h [deleted file]
arch/arm/mach-pnx4008/irq.c [deleted file]
arch/arm/mach-pnx4008/pm.c [deleted file]
arch/arm/mach-pnx4008/serial.c [deleted file]
arch/arm/mach-pnx4008/sleep.S [deleted file]
arch/arm/mach-pnx4008/time.c [deleted file]
arch/arm/mach-pnx4008/time.h [deleted file]
arch/arm/mach-prima2/Kconfig [new file with mode: 0644]
arch/arm/mach-prima2/Makefile
arch/arm/mach-prima2/Makefile.boot
arch/arm/mach-prima2/clock.c [deleted file]
arch/arm/mach-prima2/common.c [moved from arch/arm/mach-prima2/prima2.c with 81% similarity]
arch/arm/mach-prima2/irq.c
arch/arm/mach-prima2/timer.c
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/Makefile
arch/arm/mach-pxa/clock-pxa3xx.c
arch/arm/mach-pxa/devices.c
arch/arm/mach-pxa/include/mach/pxa3xx-regs.h
arch/arm/mach-pxa/irq.c
arch/arm/mach-pxa/pxa-dt.c [new file with mode: 0644]
arch/arm/mach-pxa/pxa3xx.c
arch/arm/mach-realview/core.c
arch/arm/mach-realview/include/mach/clkdev.h [deleted file]
arch/arm/mach-realview/realview_eb.c
arch/arm/mach-realview/realview_pb1176.c
arch/arm/mach-realview/realview_pb11mp.c
arch/arm/mach-realview/realview_pba8.c
arch/arm/mach-realview/realview_pbx.c
arch/arm/mach-s3c24xx/h1940-bluetooth.c
arch/arm/mach-s3c24xx/mach-anubis.c
arch/arm/mach-s3c24xx/mach-jive.c
arch/arm/mach-s3c24xx/mach-mini2440.c
arch/arm/mach-s3c24xx/mach-nexcoder.c
arch/arm/mach-s3c24xx/mach-osiris-dvs.c
arch/arm/mach-s3c24xx/mach-osiris.c
arch/arm/mach-shark/core.c
arch/arm/mach-shark/include/mach/debug-macro.S
arch/arm/mach-shark/include/mach/entry-macro.S
arch/arm/mach-shark/include/mach/io.h [deleted file]
arch/arm/mach-shark/pci.c
arch/arm/mach-shmobile/Makefile.boot
arch/arm/mach-shmobile/board-ag5evm.c
arch/arm/mach-shmobile/board-armadillo800eva.c
arch/arm/mach-shmobile/board-kzm9g.c
arch/arm/mach-shmobile/board-mackerel.c
arch/arm/mach-shmobile/board-marzen.c
arch/arm/mach-shmobile/clock-r8a7779.c
arch/arm/mach-shmobile/intc-sh73a0.c
arch/arm/mach-shmobile/setup-emev2.c
arch/arm/mach-shmobile/setup-sh73a0.c
arch/arm/mach-tegra/Kconfig
arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/apbio.c
arch/arm/mach-tegra/board-dt-tegra20.c
arch/arm/mach-tegra/board-harmony-pcie.c
arch/arm/mach-tegra/board-harmony-pinmux.c [deleted file]
arch/arm/mach-tegra/board-harmony-power.c [deleted file]
arch/arm/mach-tegra/board-harmony.c [deleted file]
arch/arm/mach-tegra/board-harmony.h [deleted file]
arch/arm/mach-tegra/board-paz00-pinmux.c [deleted file]
arch/arm/mach-tegra/board-paz00.c
arch/arm/mach-tegra/board-paz00.h
arch/arm/mach-tegra/board-trimslice-pinmux.c [deleted file]
arch/arm/mach-tegra/board-trimslice.c [deleted file]
arch/arm/mach-tegra/board-trimslice.h [deleted file]
arch/arm/mach-tegra/clock.c
arch/arm/mach-tegra/clock.h
arch/arm/mach-tegra/common.c
arch/arm/mach-tegra/cpu-tegra.c
arch/arm/mach-tegra/devices.c
arch/arm/mach-tegra/dma.c [deleted file]
arch/arm/mach-tegra/fuse.c
arch/arm/mach-tegra/headsmp.S
arch/arm/mach-tegra/hotplug.c
arch/arm/mach-tegra/include/mach/clk.h
arch/arm/mach-tegra/include/mach/dma.h
arch/arm/mach-tegra/include/mach/io.h [deleted file]
arch/arm/mach-tegra/include/mach/iomap.h
arch/arm/mach-tegra/pcie.c
arch/arm/mach-tegra/platsmp.c
arch/arm/mach-tegra/sleep-t20.S [new file with mode: 0644]
arch/arm/mach-tegra/sleep-t30.S [new file with mode: 0644]
arch/arm/mach-tegra/sleep.S
arch/arm/mach-tegra/sleep.h [new file with mode: 0644]
arch/arm/mach-tegra/tegra20_clocks.c [new file with mode: 0644]
arch/arm/mach-tegra/tegra20_clocks.h [new file with mode: 0644]
arch/arm/mach-tegra/tegra20_clocks_data.c [new file with mode: 0644]
arch/arm/mach-tegra/tegra2_clocks.c [deleted file]
arch/arm/mach-tegra/tegra30_clocks.c
arch/arm/mach-tegra/tegra30_clocks.h [new file with mode: 0644]
arch/arm/mach-tegra/tegra30_clocks_data.c [new file with mode: 0644]
arch/arm/mach-tegra/tegra_cpu_car.h [new file with mode: 0644]
arch/arm/mach-u300/Kconfig
arch/arm/mach-u300/Makefile
arch/arm/mach-u300/core.c
arch/arm/mach-u300/dma_channels.h [moved from arch/arm/mach-u300/include/mach/dma_channels.h with 88% similarity]
arch/arm/mach-u300/i2c.c
arch/arm/mach-u300/include/mach/clkdev.h [deleted file]
arch/arm/mach-u300/include/mach/irqs.h
arch/arm/mach-u300/include/mach/platform.h [deleted file]
arch/arm/mach-u300/include/mach/syscon.h
arch/arm/mach-u300/include/mach/u300-regs.h
arch/arm/mach-u300/spi.c
arch/arm/mach-u300/timer.c
arch/arm/mach-u300/timer.h [new file with mode: 0644]
arch/arm/mach-u300/u300-gpio.h
arch/arm/mach-u300/u300.c [deleted file]
arch/arm/mach-ux500/Kconfig
arch/arm/mach-ux500/Makefile
arch/arm/mach-ux500/board-mop500.c
arch/arm/mach-ux500/cache-l2x0.c
arch/arm/mach-ux500/clock.c [deleted file]
arch/arm/mach-ux500/clock.h [deleted file]
arch/arm/mach-ux500/cpu-db8500.c
arch/arm/mach-ux500/cpu.c
arch/arm/mach-ux500/include/mach/id.h
arch/arm/mach-ux500/platsmp.c
arch/arm/mach-ux500/timer.c
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/include/mach/hardware.h
arch/arm/mach-versatile/pci.c
arch/arm/mach-vexpress/ct-ca9x4.c
arch/arm/mm/cache-tauros2.c
arch/arm/mm/context.c
arch/arm/mm/dma-mapping.c
arch/arm/mm/ioremap.c
arch/arm/mm/mm.h
arch/arm/mm/mmu.c
arch/arm/plat-iop/pci.c
arch/arm/plat-iop/pmu.c
arch/arm/plat-iop/setup.c
arch/arm/plat-mxc/Makefile
arch/arm/plat-mxc/clock.c [deleted file]
arch/arm/plat-mxc/cpufreq.c
arch/arm/plat-mxc/devices/platform-imx-uart.c
arch/arm/plat-mxc/include/mach/clock.h [deleted file]
arch/arm/plat-mxc/include/mach/common.h
arch/arm/plat-mxc/include/mach/iomux-mx3.h
arch/arm/plat-mxc/include/mach/iomux-mx53.h [deleted file]
arch/arm/plat-mxc/include/mach/mx2_cam.h
arch/arm/plat-mxc/ssi-fiq.S
arch/arm/plat-mxc/system.c
arch/arm/plat-omap/Kconfig
arch/arm/plat-omap/Makefile
arch/arm/plat-omap/common.c
arch/arm/plat-omap/counter_32k.c
arch/arm/plat-omap/debug-devices.c
arch/arm/plat-omap/debug-leds.c
arch/arm/plat-omap/devices.c [deleted file]
arch/arm/plat-omap/dma.c
arch/arm/plat-omap/fb.c
arch/arm/plat-omap/i2c.c
arch/arm/plat-omap/include/plat/board.h [deleted file]
arch/arm/plat-omap/include/plat/cpu.h
arch/arm/plat-omap/include/plat/dma.h
arch/arm/plat-omap/include/plat/gpio-switch.h [deleted file]
arch/arm/plat-omap/include/plat/gpmc.h
arch/arm/plat-omap/include/plat/hardware.h [deleted file]
arch/arm/plat-omap/include/plat/irqs-44xx.h [deleted file]
arch/arm/plat-omap/include/plat/irqs.h [deleted file]
arch/arm/plat-omap/include/plat/mmc.h
arch/arm/plat-omap/include/plat/omap-serial.h
arch/arm/plat-omap/include/plat/omap_device.h
arch/arm/plat-omap/include/plat/omap_hwmod.h
arch/arm/plat-omap/include/plat/param.h [deleted file]
arch/arm/plat-omap/include/plat/usb.h
arch/arm/plat-omap/mux.c [deleted file]
arch/arm/plat-omap/omap-pm-noop.c
arch/arm/plat-omap/omap_device.c
arch/arm/plat-omap/sram.c
arch/arm/plat-samsung/devs.c
arch/arm/plat-samsung/include/plat/gpio-fns.h
arch/arm/tools/mach-types
arch/blackfin/Kconfig
arch/blackfin/Makefile
arch/blackfin/include/asm/smp.h
arch/blackfin/mach-common/smp.c
arch/ia64/hp/sim/simserial.c
arch/m68k/emu/nfcon.c
arch/mips/cavium-octeon/serial.c
arch/mips/sni/a20r.c
arch/parisc/kernel/pdc_cons.c
arch/powerpc/include/asm/processor.h
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/dbell.c
arch/powerpc/kernel/entry_64.S
arch/powerpc/kernel/exceptions-64s.S
arch/powerpc/kernel/idle_power7.S
arch/powerpc/kernel/process.c
arch/powerpc/kernel/smp.c
arch/powerpc/kernel/sysfs.c
arch/powerpc/kernel/time.c
arch/powerpc/kernel/traps.c
arch/powerpc/lib/code-patching.c
arch/powerpc/mm/numa.c
arch/powerpc/platforms/powernv/smp.c
arch/powerpc/sysdev/xics/icp-hv.c
arch/s390/oprofile/init.c
arch/um/drivers/line.c
arch/um/os-Linux/time.c
arch/x86/kernel/cpu/perf_event_intel.c
arch/x86/kernel/cpu/perf_event_intel_lbr.c
arch/x86/kernel/microcode_core.c
arch/x86/kvm/i8259.c
arch/x86/kvm/vmx.c
arch/x86/kvm/x86.c
arch/x86/xen/mmu.c
arch/x86/xen/p2m.c
arch/xtensa/platforms/iss/console.c
crypto/authenc.c
drivers/Kconfig
drivers/Makefile
drivers/acpi/bus.c
drivers/acpi/power.c
drivers/ata/ahci.c
drivers/base/dma-contiguous.c
drivers/bluetooth/ath3k.c
drivers/bluetooth/btusb.c
drivers/bluetooth/hci_ath.c
drivers/char/mwave/mwavedd.c
drivers/char/pcmcia/synclink_cs.c
drivers/char/ttyprintk.c
drivers/clk/Kconfig
drivers/clk/Makefile
drivers/clk/clk-bcm2835.c [new file with mode: 0644]
drivers/clk/clk-ls1x.c [new file with mode: 0644]
drivers/clk/clk-max77686.c [new file with mode: 0644]
drivers/clk/clk-prima2.c [new file with mode: 0644]
drivers/clk/clk.c
drivers/clk/mmp/Makefile [new file with mode: 0644]
drivers/clk/mmp/clk-apbc.c [new file with mode: 0644]
drivers/clk/mmp/clk-apmu.c [new file with mode: 0644]
drivers/clk/mmp/clk-frac.c [new file with mode: 0644]
drivers/clk/mmp/clk-mmp2.c [new file with mode: 0644]
drivers/clk/mmp/clk-pxa168.c [new file with mode: 0644]
drivers/clk/mmp/clk-pxa910.c [new file with mode: 0644]
drivers/clk/mmp/clk.h [new file with mode: 0644]
drivers/clk/mxs/clk-imx23.c
drivers/clk/mxs/clk-imx28.c
drivers/clk/ux500/Makefile [new file with mode: 0644]
drivers/clk/ux500/clk-prcc.c [new file with mode: 0644]
drivers/clk/ux500/clk-prcmu.c [new file with mode: 0644]
drivers/clk/ux500/clk.h [new file with mode: 0644]
drivers/clk/ux500/u8500_clk.c [new file with mode: 0644]
drivers/clk/ux500/u8540_clk.c [new file with mode: 0644]
drivers/clk/ux500/u9540_clk.c [new file with mode: 0644]
drivers/clk/versatile/Makefile
drivers/clk/versatile/clk-realview.c [new file with mode: 0644]
drivers/clocksource/Makefile
drivers/clocksource/bcm2835_timer.c [new file with mode: 0644]
drivers/crypto/caam/key_gen.c
drivers/dma/omap-dma.c
drivers/extcon/extcon-max77693.c
drivers/gpio/Kconfig
drivers/gpio/gpio-em.c
drivers/gpio/gpio-omap.c
drivers/gpio/gpio-pxa.c
drivers/gpio/gpio-rdc321x.c
drivers/gpio/gpio-samsung.c
drivers/gpio/gpio-tegra.c
drivers/gpio/gpio-twl4030.c
drivers/gpio/gpiolib-of.c
drivers/gpu/drm/ast/ast_drv.c
drivers/gpu/drm/ast/ast_mode.c
drivers/gpu/drm/cirrus/cirrus_drv.c
drivers/gpu/drm/exynos/Kconfig
drivers/gpu/drm/exynos/exynos_drm_dmabuf.c
drivers/gpu/drm/exynos/exynos_drm_drv.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_hdmi.c
drivers/gpu/drm/exynos/exynos_drm_plane.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/oaktrail_device.c
drivers/gpu/drm/i810/i810_dma.c
drivers/gpu/drm/i810/i810_drv.c
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_panel.c
drivers/gpu/drm/i915/intel_pm.c
drivers/gpu/drm/i915/intel_sdvo.c
drivers/gpu/drm/mgag200/mgag200_drv.c
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nv50_gpio.c
drivers/gpu/drm/nouveau/nvd0_display.c
drivers/gpu/drm/radeon/atombios_crtc.c
drivers/gpu/drm/radeon/radeon_fence.c
drivers/gpu/drm/savage/savage_drv.c
drivers/gpu/drm/sis/sis_drv.c
drivers/gpu/drm/tdfx/tdfx_drv.c
drivers/gpu/drm/udl/udl_drv.c
drivers/gpu/drm/via/via_drv.c
drivers/gpu/drm/vmwgfx/Kconfig
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
drivers/hid/hid-core.c
drivers/hid/hid-logitech-dj.c
drivers/hid/usbhid/hid-quirks.c
drivers/hwmon/ina2xx.c
drivers/hwmon/twl4030-madc-hwmon.c
drivers/i2c/algos/i2c-algo-pca.c
drivers/i2c/busses/Kconfig
drivers/i2c/busses/Makefile
drivers/i2c/busses/i2c-designware-core.c
drivers/i2c/busses/i2c-i801.c
drivers/i2c/busses/i2c-iop3xx.c
drivers/i2c/busses/i2c-mxs.c
drivers/i2c/busses/i2c-pnx.c
drivers/i2c/i2c-core.c
drivers/iio/adc/at91_adc.c
drivers/input/keyboard/Kconfig
drivers/input/keyboard/imx_keypad.c
drivers/input/keyboard/omap-keypad.c
drivers/input/serio/ams_delta_serio.c
drivers/input/serio/i8042-x86ia64io.h
drivers/input/tablet/wacom_wac.c
drivers/input/touchscreen/edt-ft5x06.c
drivers/irqchip/Kconfig [new file with mode: 0644]
drivers/irqchip/Makefile [new file with mode: 0644]
drivers/irqchip/irq-bcm2835.c [new file with mode: 0644]
drivers/isdn/capi/capi.c
drivers/isdn/gigaset/interface.c
drivers/isdn/hardware/mISDN/avmfritz.c
drivers/isdn/hardware/mISDN/hfcmulti.c
drivers/isdn/hardware/mISDN/mISDNipac.c
drivers/isdn/hardware/mISDN/mISDNisar.c
drivers/isdn/hardware/mISDN/netjet.c
drivers/isdn/hardware/mISDN/w6692.c
drivers/isdn/i4l/isdn_tty.c
drivers/isdn/mISDN/hwchannel.c
drivers/media/video/omap/omap_vout.c
drivers/media/video/omap3isp/isp.c
drivers/mfd/88pm800.c
drivers/mfd/88pm805.c
drivers/mfd/88pm860x-core.c
drivers/mfd/aat2870-core.c
drivers/mfd/ab3100-core.c
drivers/mfd/ab8500-core.c
drivers/mfd/arizona-core.c
drivers/mfd/asic3.c
drivers/mfd/cs5535-mfd.c
drivers/mfd/da9052-core.c
drivers/mfd/davinci_voicecodec.c
drivers/mfd/db8500-prcmu.c
drivers/mfd/dbx500-prcmu-regs.h
drivers/mfd/htc-pasic3.c
drivers/mfd/intel_msic.c
drivers/mfd/janz-cmodio.c
drivers/mfd/jz4740-adc.c
drivers/mfd/lm3533-core.c
drivers/mfd/lpc_ich.c
drivers/mfd/lpc_sch.c
drivers/mfd/max77686.c
drivers/mfd/max77693-irq.c
drivers/mfd/max77693.c
drivers/mfd/max8925-core.c
drivers/mfd/max8997.c
drivers/mfd/max8998.c
drivers/mfd/mc13xxx-core.c
drivers/mfd/mfd-core.c
drivers/mfd/palmas.c
drivers/mfd/rc5t583.c
drivers/mfd/rdc321x-southbridge.c
drivers/mfd/sec-core.c
drivers/mfd/sta2x11-mfd.c
drivers/mfd/stmpe.c
drivers/mfd/t7l66xb.c
drivers/mfd/tc3589x.c
drivers/mfd/tc6387xb.c
drivers/mfd/tc6393xb.c
drivers/mfd/ti-ssp.c
drivers/mfd/timberdale.c
drivers/mfd/tps6105x.c
drivers/mfd/tps6507x.c
drivers/mfd/tps65090.c
drivers/mfd/tps65217.c
drivers/mfd/tps6586x.c
drivers/mfd/tps65910.c
drivers/mfd/tps65912-core.c
drivers/mfd/twl-core.c
drivers/mfd/twl4030-audio.c
drivers/mfd/twl6040-core.c
drivers/mfd/vx855.c
drivers/mfd/wl1273-core.c
drivers/mfd/wm831x-core.c
drivers/mfd/wm8400-core.c
drivers/mfd/wm8994-core.c
drivers/misc/ibmasm/uart.c
drivers/misc/pti.c
drivers/mmc/card/block.c
drivers/mmc/card/sdio_uart.c
drivers/mmc/host/atmel-mci.c
drivers/mmc/host/bfin_sdh.c
drivers/mmc/host/dw_mmc.c
drivers/mmc/host/mxs-mmc.c
drivers/mmc/host/omap.c
drivers/mmc/host/omap_hsmmc.c
drivers/mmc/host/sdhci-esdhc.h
drivers/mmc/host/sdhci-tegra.c
drivers/mtd/nand/ams-delta.c
drivers/mtd/nand/bcm_umi_nand.c
drivers/mtd/nand/nand_bcm_umi.h
drivers/mtd/nand/omap2.c
drivers/mtd/nand/pxa3xx_nand.c
drivers/mtd/onenand/omap2.c
drivers/mtd/ubi/vtbl.c
drivers/net/can/mcp251x.c
drivers/net/can/sja1000/sja1000_platform.c
drivers/net/can/softing/softing_fw.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_dump.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c
drivers/net/ethernet/cirrus/cs89x0.c
drivers/net/ethernet/emulex/benet/be_cmds.c
drivers/net/ethernet/emulex/benet/be_main.c
drivers/net/ethernet/freescale/gianfar.c
drivers/net/ethernet/i825xx/znet.c
drivers/net/ethernet/ibm/ibmveth.c
drivers/net/ethernet/intel/e1000e/e1000.h
drivers/net/ethernet/intel/e1000e/netdev.c
drivers/net/ethernet/mellanox/mlx4/main.c
drivers/net/ethernet/mellanox/mlx4/mcg.c
drivers/net/ethernet/mellanox/mlx4/mlx4.h
drivers/net/ethernet/mellanox/mlx4/resource_tracker.c
drivers/net/ethernet/seeq/sgiseeq.c
drivers/net/ethernet/sfc/ethtool.c
drivers/net/ethernet/sgi/ioc3-eth.c
drivers/net/ethernet/stmicro/stmmac/common.h
drivers/net/ethernet/stmicro/stmmac/descs.h
drivers/net/ethernet/stmicro/stmmac/descs_com.h
drivers/net/ethernet/stmicro/stmmac/dwmac100.h
drivers/net/ethernet/stmicro/stmmac/dwmac1000.h
drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h
drivers/net/ethernet/stmicro/stmmac/mmc.h
drivers/net/ethernet/stmicro/stmmac/mmc_core.c
drivers/net/ethernet/stmicro/stmmac/stmmac.h
drivers/net/ethernet/stmicro/stmmac/stmmac_timer.h
drivers/net/ethernet/ti/davinci_mdio.c
drivers/net/fddi/skfp/pmf.c
drivers/net/irda/irtty-sir.c
drivers/net/usb/hso.c
drivers/net/usb/qmi_wwan.c
drivers/net/usb/sierra_net.c
drivers/net/usb/usbnet.c
drivers/net/wan/ixp4xx_hss.c
drivers/net/wireless/ath/ath5k/eeprom.c
drivers/net/wireless/ath/ath5k/eeprom.h
drivers/net/wireless/ath/ath9k/ar9003_paprd.c
drivers/net/wireless/ath/ath9k/ar9003_phy.h
drivers/net/wireless/ath/ath9k/gpio.c
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/ath/ath9k/link.c
drivers/net/wireless/ath/ath9k/xmit.c
drivers/net/wireless/brcm80211/brcmfmac/usb.c
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
drivers/net/wireless/ipw2x00/ipw2100.c
drivers/net/wireless/iwlwifi/dvm/debugfs.c
drivers/net/wireless/iwlwifi/pcie/internal.h
drivers/net/wireless/iwlwifi/pcie/rx.c
drivers/net/wireless/iwlwifi/pcie/trans.c
drivers/net/wireless/libertas/if_sdio.c
drivers/net/wireless/mwifiex/cmdevt.c
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2400pci.h
drivers/net/wireless/rt2x00/rt2500pci.c
drivers/net/wireless/rt2x00/rt2500usb.c
drivers/net/wireless/rt2x00/rt2500usb.h
drivers/net/wireless/rt2x00/rt2800lib.c
drivers/net/wireless/rt2x00/rt2800pci.c
drivers/net/wireless/rt2x00/rt2800usb.c
drivers/net/wireless/rt2x00/rt2x00dev.c
drivers/net/wireless/rt2x00/rt61pci.c
drivers/net/wireless/rt2x00/rt61pci.h
drivers/net/wireless/rt2x00/rt73usb.c
drivers/net/wireless/rt2x00/rt73usb.h
drivers/net/xen-netfront.c
drivers/parport/parport_gsc.c
drivers/parport/parport_serial.c
drivers/pci/pci-driver.c
drivers/pci/pci-sysfs.c
drivers/pci/pci.c
drivers/pci/pcie/portdrv_pci.c
drivers/pci/probe.c
drivers/pcmcia/omap_cf.c
drivers/pinctrl/pinctrl-coh901.c
drivers/pinctrl/pinctrl-sirf.c
drivers/platform/x86/acer-wmi.c
drivers/platform/x86/apple-gmux.c
drivers/platform/x86/asus-laptop.c
drivers/platform/x86/asus-wmi.c
drivers/platform/x86/eeepc-laptop.c
drivers/platform/x86/samsung-laptop.c
drivers/platform/x86/thinkpad_acpi.c
drivers/power/avs/smartreflex.c
drivers/pwm/pwm-tiecap.c
drivers/pwm/pwm-tiehrpwm.c
drivers/regulator/tps65217-regulator.c
drivers/regulator/tps6586x-regulator.c
drivers/remoteproc/omap_remoteproc.c
drivers/rtc/rtc-at91sam9.c
drivers/rtc/rtc-pxa.c
drivers/s390/char/con3215.c
drivers/s390/char/sclp_tty.c
drivers/s390/char/sclp_vt220.c
drivers/s390/char/tty3270.c
drivers/scsi/megaraid/megaraid_sas_base.c
drivers/scsi/mpt2sas/mpt2sas_base.c
drivers/scsi/scsi_error.c
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_scan.c
drivers/spi/Kconfig
drivers/spi/spi-omap-uwire.c
drivers/spi/spi-omap2-mcspi.c
drivers/spi/spi-tegra.c
drivers/staging/android/android_alarm.h
drivers/staging/comedi/drivers/amplc_dio200.c
drivers/staging/comedi/drivers/amplc_pc236.c
drivers/staging/comedi/drivers/amplc_pc263.c
drivers/staging/comedi/drivers/amplc_pci224.c
drivers/staging/comedi/drivers/amplc_pci230.c
drivers/staging/comedi/drivers/das08.c
drivers/staging/iio/accel/lis3l02dq_ring.c
drivers/staging/iio/adc/ad7192.c
drivers/staging/iio/gyro/adis16260_core.c
drivers/staging/iio/imu/adis16400_core.c
drivers/staging/iio/meter/ade7753.c
drivers/staging/iio/meter/ade7754.c
drivers/staging/iio/meter/ade7759.c
drivers/staging/ipack/devices/ipoctal.c
drivers/staging/nvec/nvec.c
drivers/staging/omapdrm/omap_connector.c
drivers/staging/ozwpan/ozcdev.c
drivers/staging/rtl8712/recv_linux.c
drivers/staging/serqt_usb2/serqt_usb2.c
drivers/staging/speakup/serialio.h
drivers/staging/tidspbridge/core/dsp-clock.c
drivers/staging/tidspbridge/core/tiomap3430.c
drivers/staging/tidspbridge/core/tiomap3430_pwr.c
drivers/staging/tidspbridge/core/tiomap_io.c
drivers/staging/tidspbridge/core/wdt.c
drivers/staging/tidspbridge/rmgr/drv_interface.c
drivers/staging/vt6656/dpc.c
drivers/staging/vt6656/rxtx.c
drivers/staging/wlan-ng/cfg80211.c
drivers/staging/zcache/zcache-main.c
drivers/target/iscsi/iscsi_target_login.c
drivers/target/target_core_alua.c
drivers/target/target_core_device.c
drivers/target/target_core_iblock.c
drivers/target/target_core_pr.c
drivers/target/target_core_pscsi.c
drivers/target/target_core_spc.c
drivers/target/target_core_transport.c
drivers/tty/amiserial.c
drivers/tty/bfin_jtag_comm.c
drivers/tty/cyclades.c
drivers/tty/ehv_bytechan.c
drivers/tty/hvc/hvc_console.c
drivers/tty/hvc/hvcs.c
drivers/tty/hvc/hvsi.c
drivers/tty/hvc/hvsi_lib.c
drivers/tty/ipwireless/tty.c
drivers/tty/isicom.c
drivers/tty/moxa.c
drivers/tty/mxser.c
drivers/tty/n_gsm.c
drivers/tty/n_r3964.c
drivers/tty/n_tty.c
drivers/tty/nozomi.c
drivers/tty/pty.c
drivers/tty/rocket.c
drivers/tty/serial/68328serial.c
drivers/tty/serial/8250/8250.c
drivers/tty/serial/8250/8250.h
drivers/tty/serial/8250/8250_acorn.c
drivers/tty/serial/8250/8250_dw.c
drivers/tty/serial/8250/8250_gsc.c
drivers/tty/serial/8250/8250_hp300.c
drivers/tty/serial/8250/8250_pci.c
drivers/tty/serial/8250/8250_pnp.c
drivers/tty/serial/8250/serial_cs.c
drivers/tty/serial/Kconfig
drivers/tty/serial/Makefile
drivers/tty/serial/altera_uart.c
drivers/tty/serial/amba-pl010.c
drivers/tty/serial/amba-pl011.c
drivers/tty/serial/bfin_uart.c
drivers/tty/serial/crisv10.c
drivers/tty/serial/ifx6x60.c
drivers/tty/serial/imx.c
drivers/tty/serial/ioc3_serial.c
drivers/tty/serial/ioc4_serial.c
drivers/tty/serial/jsm/jsm_tty.c
drivers/tty/serial/lpc32xx_hs.c [new file with mode: 0644]
drivers/tty/serial/m32r_sio.c
drivers/tty/serial/max3100.c
drivers/tty/serial/max3107.c [deleted file]
drivers/tty/serial/max3107.h [deleted file]
drivers/tty/serial/max310x.c [new file with mode: 0644]
drivers/tty/serial/mpc52xx_uart.c
drivers/tty/serial/msm_serial.c
drivers/tty/serial/msm_smd_tty.c
drivers/tty/serial/mxs-auart.c
drivers/tty/serial/of_serial.c
drivers/tty/serial/omap-serial.c
drivers/tty/serial/pch_uart.c
drivers/tty/serial/pxa.c
drivers/tty/serial/samsung.c
drivers/tty/serial/sc26xx.c
drivers/tty/serial/sccnxp.c [new file with mode: 0644]
drivers/tty/serial/serial_core.c
drivers/tty/serial/sirfsoc_uart.c
drivers/tty/serial/sunsu.c
drivers/tty/synclink.c
drivers/tty/synclink_gt.c
drivers/tty/synclinkmp.c
drivers/tty/tty_io.c
drivers/tty/tty_ioctl.c
drivers/tty/tty_ldisc.c
drivers/tty/tty_mutex.c
drivers/tty/tty_port.c
drivers/tty/vt/keyboard.c
drivers/tty/vt/vt.c
drivers/usb/Kconfig
drivers/usb/chipidea/udc.c
drivers/usb/class/cdc-acm.c
drivers/usb/class/cdc-wdm.c
drivers/usb/core/quirks.c
drivers/usb/dwc3/core.c
drivers/usb/dwc3/ep0.c
drivers/usb/dwc3/gadget.c
drivers/usb/gadget/at91_udc.c
drivers/usb/gadget/dummy_hcd.c
drivers/usb/gadget/f_fs.c
drivers/usb/gadget/s3c-hsotg.c
drivers/usb/gadget/u_serial.c
drivers/usb/host/Kconfig
drivers/usb/host/ehci-q.c
drivers/usb/host/ohci-at91.c
drivers/usb/host/ohci-hcd.c
drivers/usb/host/ohci-nxp.c
drivers/usb/host/ohci-omap.c
drivers/usb/host/pci-quirks.c
drivers/usb/host/pci-quirks.h
drivers/usb/host/xhci-hub.c
drivers/usb/host/xhci-plat.c
drivers/usb/host/xhci.c
drivers/usb/host/xhci.h
drivers/usb/musb/musb_host.c
drivers/usb/musb/musbhsdma.c
drivers/usb/musb/tusb6010.c
drivers/usb/musb/tusb6010_omap.c
drivers/usb/otg/isp1301_omap.c
drivers/usb/renesas_usbhs/fifo.c
drivers/usb/serial/ark3116.c
drivers/usb/serial/belkin_sa.c
drivers/usb/serial/console.c
drivers/usb/serial/cp210x.c
drivers/usb/serial/cypress_m8.c
drivers/usb/serial/digi_acceleport.c
drivers/usb/serial/empeg.c
drivers/usb/serial/f81232.c
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio_ids.h
drivers/usb/serial/io_edgeport.c
drivers/usb/serial/io_ti.c
drivers/usb/serial/ir-usb.c
drivers/usb/serial/iuu_phoenix.c
drivers/usb/serial/keyspan.c
drivers/usb/serial/keyspan_pda.c
drivers/usb/serial/kl5kusb105.c
drivers/usb/serial/kobil_sct.c
drivers/usb/serial/mct_u232.c
drivers/usb/serial/metro-usb.c
drivers/usb/serial/mos7720.c
drivers/usb/serial/mos7840.c
drivers/usb/serial/option.c
drivers/usb/serial/oti6858.c
drivers/usb/serial/pl2303.c
drivers/usb/serial/quatech2.c
drivers/usb/serial/sierra.c
drivers/usb/serial/spcp8x5.c
drivers/usb/serial/ssu100.c
drivers/usb/serial/ti_usb_3410_5052.c
drivers/usb/serial/usb-serial.c
drivers/usb/serial/usb_wwan.c
drivers/usb/serial/whiteheat.c
drivers/video/auo_k190x.c
drivers/video/backlight/omap1_bl.c
drivers/video/console/bitblit.c
drivers/video/console/fbcon.c
drivers/video/mb862xx/mb862xxfbdrv.c
drivers/video/omap/lcd_ams_delta.c
drivers/video/omap/lcd_mipid.c
drivers/video/omap/lcd_osk.c
drivers/video/omap2/dss/dispc.c
drivers/video/omap2/dss/sdi.c
drivers/video/omap2/omapfb/omapfb-main.c
drivers/w1/masters/omap_hdq.c
drivers/watchdog/Kconfig
drivers/watchdog/ks8695_wdt.c
drivers/watchdog/omap_wdt.c
drivers/xen/swiotlb-xen.c
drivers/xen/xen-pciback/pci_stub.c
firmware/Makefile
firmware/intelliport2.bin.ihex [deleted file]
fs/btrfs/qgroup.c
fs/cifs/cifssmb.c
fs/cifs/dir.c
fs/cifs/file.c
fs/cifs/inode.c
fs/cifs/link.c
fs/cifs/smb2misc.c
fs/cifs/smb2pdu.h
fs/cifs/transport.c
fs/ecryptfs/file.c
fs/ecryptfs/inode.c
fs/ecryptfs/main.c
fs/ext3/inode.c
fs/fuse/control.c
fs/fuse/cuse.c
fs/fuse/dev.c
fs/fuse/inode.c
fs/gfs2/file.c
fs/gfs2/inode.c
fs/gfs2/rgrp.c
fs/nfs/file.c
fs/nfs/inode.c
fs/nfs/nfs3proc.c
fs/nfs/nfs4file.c
fs/nfs/nfs4proc.c
fs/nfs/nfs4xdr.c
fs/nfs/super.c
fs/stat.c
fs/udf/file.c
include/drm/drm_fourcc.h
include/linux/Kbuild
include/linux/amba/serial.h
include/linux/atmel-ssc.h
include/linux/bcm2835_timer.h [new file with mode: 0644]
include/linux/cd1400.h [deleted file]
include/linux/cdk.h [deleted file]
include/linux/clk-provider.h
include/linux/clk/bcm2835.h [moved from arch/arm/mach-pnx4008/include/mach/param.h with 83% similarity]
include/linux/comstats.h [deleted file]
include/linux/generic_serial.h [deleted file]
include/linux/i2c-pnx.h
include/linux/i2c/twl.h
include/linux/irqchip/bcm2835.h [moved from arch/arm/mach-integrator/include/mach/io.h with 62% similarity]
include/linux/istallion.h [deleted file]
include/linux/kbd_kern.h
include/linux/kernel.h
include/linux/kobject.h
include/linux/mISDNhw.h
include/linux/mfd/core.h
include/linux/mfd/dbx500-prcmu.h
include/linux/mfd/tps65217.h
include/linux/mfd/tps6586x.h
include/linux/mfd/twl6040.h
include/linux/mlx4/device.h
include/linux/mmc/card.h
include/linux/nfs_fs.h
include/linux/nfs_xdr.h
include/linux/omapfb.h
include/linux/pci_ids.h
include/linux/perf_event.h
include/linux/platform_data/asoc-ti-mcbsp.h [moved from arch/arm/plat-omap/include/plat/mcbsp.h with 100% similarity]
include/linux/platform_data/clk-realview.h [new file with mode: 0644]
include/linux/platform_data/clk-ux500.h [new file with mode: 0644]
include/linux/platform_data/dsp-omap.h [moved from arch/arm/plat-omap/include/plat/dsp.h with 100% similarity]
include/linux/platform_data/gpio-omap.h [moved from arch/arm/plat-omap/include/plat/gpio.h with 94% similarity]
include/linux/platform_data/keypad-omap.h [moved from arch/arm/plat-omap/include/plat/keypad.h with 100% similarity]
include/linux/platform_data/lcd-mipid.h [moved from arch/arm/plat-omap/include/plat/lcd_mipid.h with 100% similarity]
include/linux/platform_data/max310x.h [new file with mode: 0644]
include/linux/platform_data/mtd-nand-omap2.h [moved from arch/arm/plat-omap/include/plat/nand.h with 96% similarity]
include/linux/platform_data/mtd-onenand-omap2.h [moved from arch/arm/plat-omap/include/plat/onenand.h with 100% similarity]
include/linux/platform_data/omap1_bl.h [new file with mode: 0644]
include/linux/platform_data/pinctrl-coh901.h [moved from arch/arm/mach-u300/include/mach/gpio-u300.h with 72% similarity]
include/linux/platform_data/remoteproc-omap.h [moved from arch/arm/plat-omap/include/plat/remoteproc.h with 100% similarity]
include/linux/platform_data/sccnxp.h [new file with mode: 0644]
include/linux/platform_data/spi-omap2-mcspi.h [moved from arch/arm/plat-omap/include/plat/mcspi.h with 100% similarity]
include/linux/platform_data/voltage-omap.h [moved from arch/arm/plat-omap/include/plat/voltage.h with 100% similarity]
include/linux/power/smartreflex.h
include/linux/sc26198.h [deleted file]
include/linux/sched.h
include/linux/serial.h
include/linux/serial167.h [deleted file]
include/linux/serial_8250.h
include/linux/serial_core.h
include/linux/serial_reg.h
include/linux/stallion.h [deleted file]
include/linux/sunrpc/xprt.h
include/linux/tty.h
include/linux/tty_driver.h
include/linux/tty_flags.h [new file with mode: 0644]
include/net/bluetooth/smp.h
include/net/irda/ircomm_tty.h
include/net/netfilter/nf_conntrack_ecache.h
include/net/xfrm.h
include/target/target_core_backend.h
include/target/target_core_base.h
kernel/events/core.c
kernel/events/hw_breakpoint.c
kernel/sched/core.c
kernel/sched/fair.c
kernel/sched/rt.c
kernel/sched/sched.h
kernel/time/tick-sched.c
kernel/workqueue.c
lib/digsig.c
mm/memblock.c
mm/mempolicy.c
net/bluetooth/hci_conn.c
net/bluetooth/l2cap_core.c
net/bluetooth/l2cap_sock.c
net/bluetooth/rfcomm/tty.c
net/bluetooth/smp.c
net/bridge/netfilter/ebt_log.c
net/caif/cfsrvl.c
net/core/dev.c
net/core/netpoll.c
net/core/pktgen.c
net/core/sock.c
net/ipv4/ipmr.c
net/ipv4/netfilter/nf_nat_sip.c
net/ipv4/route.c
net/ipv4/tcp_input.c
net/ipv4/udp.c
net/ipv6/esp6.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/irda/ircomm/ircomm_param.c
net/irda/ircomm/ircomm_tty.c
net/irda/ircomm/ircomm_tty_attach.c
net/irda/ircomm/ircomm_tty_ioctl.c
net/l2tp/l2tp_core.c
net/l2tp/l2tp_core.h
net/l2tp/l2tp_eth.c
net/mac80211/cfg.c
net/mac80211/mlme.c
net/mac80211/tx.c
net/netfilter/ipvs/ip_vs_ctl.c
net/netfilter/nf_conntrack_core.c
net/netfilter/nf_conntrack_netlink.c
net/netfilter/nf_conntrack_proto_tcp.c
net/netfilter/nfnetlink_log.c
net/netfilter/xt_LOG.c
net/netlink/af_netlink.c
net/netrom/af_netrom.c
net/openvswitch/actions.c
net/openvswitch/datapath.c
net/openvswitch/flow.h
net/packet/af_packet.c
net/sched/sch_cbq.c
net/sched/sch_fq_codel.c
net/sched/sch_gred.c
net/sctp/output.c
net/socket.c
net/sunrpc/xprt.c
net/sunrpc/xprtrdma/transport.c
net/sunrpc/xprtsock.c
net/wireless/nl80211.c
net/xfrm/xfrm_input.c
net/xfrm/xfrm_replay.c
net/xfrm/xfrm_state.c
scripts/Makefile.fwinst
scripts/link-vmlinux.sh
sound/core/compress_offload.c
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_intel.c
sound/pci/hda/patch_sigmatel.c
sound/pci/ice1712/prodigy_hifi.c
sound/soc/codecs/arizona.c
sound/soc/codecs/mc13783.c
sound/soc/codecs/wm8904.c
sound/soc/fsl/imx-sgtl5000.c
sound/soc/omap/am3517evm.c
sound/soc/omap/ams-delta.c
sound/soc/omap/igep0020.c
sound/soc/omap/mcbsp.c
sound/soc/omap/n810.c
sound/soc/omap/omap-abe-twl6040.c
sound/soc/omap/omap-mcbsp.c
sound/soc/omap/omap-mcpdm.c
sound/soc/omap/omap-pcm.c
sound/soc/omap/omap3beagle.c
sound/soc/omap/omap3evm.c
sound/soc/omap/omap3pandora.c
sound/soc/omap/osk5912.c
sound/soc/omap/overo.c
sound/soc/omap/rx51.c
sound/soc/omap/sdp3430.c
sound/soc/omap/zoom2.c
sound/soc/samsung/dma.c
sound/soc/soc-dapm.c
sound/soc/spear/spear_pcm.c
sound/soc/tegra/Kconfig
sound/soc/tegra/tegra_alc5632.c
sound/soc/tegra/tegra_pcm.c
sound/soc/tegra/tegra_pcm.h
sound/soc/ux500/ux500_msp_i2s.c
sound/usb/card.c
sound/usb/endpoint.c
sound/usb/endpoint.h
sound/usb/pcm.c

index 34f5110..dff1f48 100644 (file)
@@ -210,3 +210,15 @@ Users:
                firmware assigned instance number of the PCI
                device that can help in understanding the firmware
                intended order of the PCI device.
+
+What:          /sys/bus/pci/devices/.../d3cold_allowed
+Date:          July 2012
+Contact:       Huang Ying <ying.huang@intel.com>
+Description:
+               d3cold_allowed is bit to control whether the corresponding PCI
+               device can be put into D3Cold state.  If it is cleared, the
+               device will never be put into D3Cold state.  If it is set, the
+               device may be put into D3Cold state if other requirements are
+               satisfied too.  Reading this attribute will show the current
+               value of d3cold_allowed bit.  Writing this attribute will set
+               the value of d3cold_allowed bit.
index b138b66..0c43015 100644 (file)
@@ -17,3 +17,12 @@ Description:
                 device, like 'tty1'.
                 The file supports poll() to detect virtual
                 console switches.
+
+What:          /sys/class/tty/ttyS0/uartclk
+Date:          Sep 2012
+Contact:       Tomas Hlavacek <tmshlvck@gmail.com>
+Description:
+                Shows the current uartclk value associated with the
+                UART port in serial_core, that is bound to TTY like ttyS0.
+                uartclk = 16 * baud_base
+
index 816d607..8b46c79 100644 (file)
@@ -1,4 +1,4 @@
-                       S3C2410 GPIO Control
+                       S3C24XX GPIO Control
                        ====================
 
 Introduction
@@ -12,7 +12,7 @@ Introduction
   of the s3c2410 GPIO system, please read the Samsung provided
   data-sheet/users manual to find out the complete list.
 
-  See Documentation/arm/Samsung/GPIO.txt for the core implemetation.
+  See Documentation/arm/Samsung/GPIO.txt for the core implementation.
 
 
 GPIOLIB
@@ -41,8 +41,8 @@ GPIOLIB
 GPIOLIB conversion
 ------------------
 
-If you need to convert your board or driver to use gpiolib from the exiting
-s3c2410 api, then here are some notes on the process.
+If you need to convert your board or driver to use gpiolib from the phased
+out s3c2410 API, then here are some notes on the process.
 
 1) If your board is exclusively using an GPIO, say to control peripheral
    power, then it will require to claim the gpio with gpio_request() before
@@ -55,7 +55,7 @@ s3c2410 api, then here are some notes on the process.
    as they have the same arguments, and can either take the pin specific
    values, or the more generic special-function-number arguments.
 
-3) s3c2410_gpio_pullup() changs have the problem that whilst the 
+3) s3c2410_gpio_pullup() changes have the problem that whilst the
    s3c2410_gpio_pullup(x, 1) can be easily translated to the
    s3c_gpio_setpull(x, S3C_GPIO_PULL_NONE), the s3c2410_gpio_pullup(x, 0)
    are not so easy.
@@ -74,7 +74,7 @@ s3c2410 api, then here are some notes on the process.
    when using gpio_get_value() on an output pin (s3c2410_gpio_getpin
    would return the value the pin is supposed to be outputting).
 
-6) s3c2410_gpio_getirq() should be directly replacable with the
+6) s3c2410_gpio_getirq() should be directly replaceable with the
    gpio_to_irq() call.
 
 The s3c2410_gpio and gpio_ calls have always operated on the same gpio
@@ -105,7 +105,7 @@ PIN Numbers
 -----------
 
   Each pin has an unique number associated with it in regs-gpio.h,
-  eg S3C2410_GPA(0) or S3C2410_GPF(1). These defines are used to tell
+  e.g. S3C2410_GPA(0) or S3C2410_GPF(1). These defines are used to tell
   the GPIO functions which pin is to be used.
 
   With the conversion to gpiolib, there is no longer a direct conversion
@@ -120,31 +120,27 @@ Configuring a pin
   The following function allows the configuration of a given pin to
   be changed.
 
-    void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function);
+    void s3c_gpio_cfgpin(unsigned int pin, unsigned int function);
 
-  Eg:
+  e.g.:
 
-     s3c2410_gpio_cfgpin(S3C2410_GPA(0), S3C2410_GPA0_ADDR0);
-     s3c2410_gpio_cfgpin(S3C2410_GPE(8), S3C2410_GPE8_SDDAT1);
+     s3c_gpio_cfgpin(S3C2410_GPA(0), S3C_GPIO_SFN(1));
+     s3c_gpio_cfgpin(S3C2410_GPE(8), S3C_GPIO_SFN(2));
 
    which would turn GPA(0) into the lowest Address line A0, and set
    GPE(8) to be connected to the SDIO/MMC controller's SDDAT1 line.
 
-   The s3c_gpio_cfgpin() call is a functional replacement for this call.
-
 
 Reading the current configuration
 ---------------------------------
 
-  The current configuration of a pin can be read by using:
+  The current configuration of a pin can be read by using standard
+  gpiolib function:
 
-  s3c2410_gpio_getcfg(unsigned int pin);
+  s3c_gpio_getcfg(unsigned int pin);
 
   The return value will be from the same set of values which can be
-  passed to s3c2410_gpio_cfgpin().
-
-  The s3c_gpio_getcfg() call should be a functional replacement for
-  this call.
+  passed to s3c_gpio_cfgpin().
 
 
 Configuring a pull-up resistor
@@ -154,61 +150,33 @@ Configuring a pull-up resistor
   pull-up resistors enabled. This can be configured by the following
   function:
 
-    void s3c2410_gpio_pullup(unsigned int pin, unsigned int to);
-
-  Where the to value is zero to set the pull-up off, and 1 to enable
-  the specified pull-up. Any other values are currently undefined.
-
-  The s3c_gpio_setpull() offers similar functionality, but with the
-  ability to encode whether the pull is up or down. Currently there
-  is no 'just on' state, so up or down must be selected.
-
-
-Getting the state of a PIN
---------------------------
-
-  The state of a pin can be read by using the function:
-
-    unsigned int s3c2410_gpio_getpin(unsigned int pin);
+    void s3c_gpio_setpull(unsigned int pin, unsigned int to);
 
-  This will return either zero or non-zero. Do not count on this
-  function returning 1 if the pin is set.
+  Where the to value is S3C_GPIO_PULL_NONE to set the pull-up off,
+  and S3C_GPIO_PULL_UP to enable the specified pull-up. Any other
+  values are currently undefined.
 
-  This call is now implemented by the relevant gpiolib calls, convert
-  your board or driver to use gpiolib.
-
-
-Setting the state of a PIN
---------------------------
-
-  The value an pin is outputing can be modified by using the following:
 
-    void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);
+Getting and setting the state of a PIN
+--------------------------------------
 
-  Which sets the given pin to the value. Use 0 to write 0, and 1 to
-  set the output to 1.
-
-  This call is now implemented by the relevant gpiolib calls, convert
+  These calls are now implemented by the relevant gpiolib calls, convert
   your board or driver to use gpiolib.
 
 
 Getting the IRQ number associated with a PIN
 --------------------------------------------
 
-  The following function can map the given pin number to an IRQ
+  A standard gpiolib function can map the given pin number to an IRQ
   number to pass to the IRQ system.
 
-   int s3c2410_gpio_getirq(unsigned int pin);
+   int gpio_to_irq(unsigned int pin);
 
   Note, not all pins have an IRQ.
 
-  This call is now implemented by the relevant gpiolib calls, convert
-  your board or driver to use gpiolib.
-
 
-Authour
+Author
 -------
 
-
 Ben Dooks, 03 October 2004
 Copyright 2004 Ben Dooks, Simtec Electronics
index 513f256..795adfd 100644 (file)
@@ -5,14 +5,14 @@ Introduction
 ------------
 
 This outlines the Samsung GPIO implementation and the architecture
-specific calls provided alongisde the drivers/gpio core.
+specific calls provided alongside the drivers/gpio core.
 
 
 S3C24XX (Legacy)
 ----------------
 
 See Documentation/arm/Samsung-S3C24XX/GPIO.txt for more information
-about these devices. Their implementation is being brought into line
+about these devices. Their implementation has been brought into line
 with the core samsung implementation described in this document.
 
 
@@ -29,7 +29,7 @@ GPIO numbering is synchronised between the Samsung and gpiolib system.
 PIN configuration
 -----------------
 
-Pin configuration is specific to the Samsung architecutre, with each SoC
+Pin configuration is specific to the Samsung architecture, with each SoC
 registering the necessary information for the core gpio configuration
 implementation to configure pins as necessary.
 
@@ -38,5 +38,3 @@ driver or machine to change gpio configuration.
 
 See arch/arm/plat-samsung/include/plat/gpio-cfg.h for more information
 on these functions.
-
-
index 208a2d4..4bfb9ff 100644 (file)
@@ -51,6 +51,9 @@ ffc00000      ffefffff        DMA memory mapping region.  Memory returned
 ff000000       ffbfffff        Reserved for future expansion of DMA
                                mapping region.
 
+fee00000       feffffff        Mapping of PCI I/O space. This is a static
+                               mapping within the vmalloc space.
+
 VMALLOC_START  VMALLOC_END-1   vmalloc() / ioremap() space.
                                Memory returned by vmalloc/ioremap will
                                be dynamically placed in this region.
diff --git a/Documentation/devicetree/bindings/arm/bcm2835.txt b/Documentation/devicetree/bindings/arm/bcm2835.txt
new file mode 100644 (file)
index 0000000..ac68348
--- /dev/null
@@ -0,0 +1,8 @@
+Broadcom BCM2835 device tree bindings
+-------------------------------------------
+
+Boards with the BCM2835 SoC shall have the following properties:
+
+Required root node property:
+
+compatible = "brcm,bcm2835";
diff --git a/Documentation/devicetree/bindings/arm/mrvl/tauros2.txt b/Documentation/devicetree/bindings/arm/mrvl/tauros2.txt
new file mode 100644 (file)
index 0000000..31af1cb
--- /dev/null
@@ -0,0 +1,17 @@
+* Marvell Tauros2 Cache
+
+Required properties:
+- compatible : Should be "marvell,tauros2-cache".
+- marvell,tauros2-cache-features : Specify the features supported for the
+  tauros2 cache.
+  The features including
+    CACHE_TAUROS2_PREFETCH_ON       (1 << 0)
+    CACHE_TAUROS2_LINEFILL_BURST8   (1 << 1)
+  The definition can be found at
+  arch/arm/include/asm/hardware/cache-tauros2.h
+
+Example:
+       L2: l2-cache {
+               compatible = "marvell,tauros2-cache";
+               marvell,tauros2-cache-features = <0x3>;
+       };
diff --git a/Documentation/devicetree/bindings/arm/msm/timer.txt b/Documentation/devicetree/bindings/arm/msm/timer.txt
new file mode 100644 (file)
index 0000000..8c5907b
--- /dev/null
@@ -0,0 +1,38 @@
+* MSM Timer
+
+Properties:
+
+- compatible : Should at least contain "qcom,msm-timer". More specific
+  properties such as "qcom,msm-gpt" and "qcom,msm-dgt" specify a general
+  purpose timer and a debug timer respectively.
+
+- interrupts : Interrupt indicating a match event.
+
+- reg : Specifies the base address of the timer registers. The second region
+  specifies an optional register used to configure the clock divider.
+
+- clock-frequency : The frequency of the timer in Hz.
+
+Optional:
+
+- cpu-offset : per-cpu offset used when the timer is accessed without the
+  CPU remapping facilities. The offset is cpu-offset * cpu-nr.
+
+Example:
+
+       timer@200a004 {
+               compatible = "qcom,msm-gpt", "qcom,msm-timer";
+               interrupts = <1 2 0x301>;
+               reg = <0x0200a004 0x10>;
+               clock-frequency = <32768>;
+               cpu-offset = <0x40000>;
+       };
+
+       timer@200a024 {
+               compatible = "qcom,msm-dgt", "qcom,msm-timer";
+               interrupts = <1 3 0x301>;
+               reg = <0x0200a024 0x10>,
+                     <0x0200a034 0x4>;
+               clock-frequency = <6750000>;
+               cpu-offset = <0x40000>;
+       };
index ccdd0e5..d0051a7 100644 (file)
@@ -36,6 +36,9 @@ Boards:
 - OMAP3 BeagleBoard : Low cost community board
   compatible = "ti,omap3-beagle", "ti,omap3"
 
+- OMAP3 Tobi with Overo : Commercial expansion board with daughter board
+  compatible = "ti,omap3-tobi", "ti,omap3-overo", "ti,omap3"
+
 - OMAP4 SDP : Software Developement Board
   compatible = "ti,omap4-sdp", "ti,omap4430"
 
index 1c044eb..343781b 100644 (file)
@@ -7,8 +7,12 @@ representation in the device tree should be done as under:-
 Required properties:
 
 - compatible : should be one of
+       "arm,cortex-a15-pmu"
        "arm,cortex-a9-pmu"
        "arm,cortex-a8-pmu"
+       "arm,cortex-a7-pmu"
+       "arm,cortex-a5-pmu"
+       "arm,arm11mpcore-pmu"
        "arm,arm1176-pmu"
        "arm,arm1136-pmu"
 - interrupts : 1 combined interrupt or 1 per core.
diff --git a/Documentation/devicetree/bindings/clock/imx23-clock.txt b/Documentation/devicetree/bindings/clock/imx23-clock.txt
new file mode 100644 (file)
index 0000000..a0b867e
--- /dev/null
@@ -0,0 +1,76 @@
+* Clock bindings for Freescale i.MX23
+
+Required properties:
+- compatible: Should be "fsl,imx23-clkctrl"
+- 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.  The following is a full list of i.MX23
+clocks and IDs.
+
+       Clock           ID
+       ------------------
+       ref_xtal        0
+       pll             1
+       ref_cpu         2
+       ref_emi         3
+       ref_pix         4
+       ref_io          5
+       saif_sel        6
+       lcdif_sel       7
+       gpmi_sel        8
+       ssp_sel         9
+       emi_sel         10
+       cpu             11
+       etm_sel         12
+       cpu_pll         13
+       cpu_xtal        14
+       hbus            15
+       xbus            16
+       lcdif_div       17
+       ssp_div         18
+       gpmi_div        19
+       emi_pll         20
+       emi_xtal        21
+       etm_div         22
+       saif_div        23
+       clk32k_div      24
+       rtc             25
+       adc             26
+       spdif_div       27
+       clk32k          28
+       dri             29
+       pwm             30
+       filt            31
+       uart            32
+       ssp             33
+       gpmi            34
+       spdif           35
+       emi             36
+       saif            37
+       lcdif           38
+       etm             39
+       usb             40
+       usb_pwr         41
+
+Examples:
+
+clks: clkctrl@80040000 {
+       compatible = "fsl,imx23-clkctrl";
+       reg = <0x80040000 0x2000>;
+       #clock-cells = <1>;
+       clock-output-names =
+               ...
+               "uart",         /* 32 */
+               ...
+               "end_of_list";
+};
+
+auart0: serial@8006c000 {
+       compatible = "fsl,imx23-auart";
+       reg = <0x8006c000 0x2000>;
+       interrupts = <24 25 23>;
+       clocks = <&clks 32>;
+       status = "disabled";
+};
diff --git a/Documentation/devicetree/bindings/clock/imx28-clock.txt b/Documentation/devicetree/bindings/clock/imx28-clock.txt
new file mode 100644 (file)
index 0000000..aa2af28
--- /dev/null
@@ -0,0 +1,99 @@
+* Clock bindings for Freescale i.MX28
+
+Required properties:
+- compatible: Should be "fsl,imx28-clkctrl"
+- 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.  The following is a full list of i.MX28
+clocks and IDs.
+
+       Clock           ID
+       ------------------
+       ref_xtal        0
+       pll0            1
+       pll1            2
+       pll2            3
+       ref_cpu         4
+       ref_emi         5
+       ref_io0         6
+       ref_io1         7
+       ref_pix         8
+       ref_hsadc       9
+       ref_gpmi        10
+       saif0_sel       11
+       saif1_sel       12
+       gpmi_sel        13
+       ssp0_sel        14
+       ssp1_sel        15
+       ssp2_sel        16
+       ssp3_sel        17
+       emi_sel         18
+       etm_sel         19
+       lcdif_sel       20
+       cpu             21
+       ptp_sel         22
+       cpu_pll         23
+       cpu_xtal        24
+       hbus            25
+       xbus            26
+       ssp0_div        27
+       ssp1_div        28
+       ssp2_div        29
+       ssp3_div        30
+       gpmi_div        31
+       emi_pll         32
+       emi_xtal        33
+       lcdif_div       34
+       etm_div         35
+       ptp             36
+       saif0_div       37
+       saif1_div       38
+       clk32k_div      39
+       rtc             40
+       lradc           41
+       spdif_div       42
+       clk32k          43
+       pwm             44
+       uart            45
+       ssp0            46
+       ssp1            47
+       ssp2            48
+       ssp3            49
+       gpmi            50
+       spdif           51
+       emi             52
+       saif0           53
+       saif1           54
+       lcdif           55
+       etm             56
+       fec             57
+       can0            58
+       can1            59
+       usb0            60
+       usb1            61
+       usb0_pwr        62
+       usb1_pwr        63
+       enet_out        64
+
+Examples:
+
+clks: clkctrl@80040000 {
+       compatible = "fsl,imx28-clkctrl";
+       reg = <0x80040000 0x2000>;
+       #clock-cells = <1>;
+       clock-output-names =
+               ...
+               "uart",         /* 45 */
+               ...
+               "end_of_list";
+};
+
+auart0: serial@8006a000 {
+       compatible = "fsl,imx28-auart", "fsl,imx23-auart";
+       reg = <0x8006a000 0x2000>;
+       interrupts = <112 70 71>;
+       clocks = <&clks 45>;
+       status = "disabled";
+};
diff --git a/Documentation/devicetree/bindings/clock/imx6q-clock.txt b/Documentation/devicetree/bindings/clock/imx6q-clock.txt
new file mode 100644 (file)
index 0000000..492bd99
--- /dev/null
@@ -0,0 +1,222 @@
+* Clock bindings for Freescale i.MX6 Quad
+
+Required properties:
+- compatible: Should be "fsl,imx6q-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.  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
+       pll6_mlb                175
+       pll7_usb_host           176
+       pll8_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
+
+Examples:
+
+clks: ccm@020c4000 {
+       compatible = "fsl,imx6q-ccm";
+       reg = <0x020c4000 0x4000>;
+       interrupts = <0 87 0x04 0 88 0x04>;
+       #clock-cells = <1>;
+       clock-output-names = ...
+                            "uart_ipg",
+                            "uart_serial",
+                            ...;
+};
+
+uart1: serial@02020000 {
+       compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
+       reg = <0x02020000 0x4000>;
+       interrupts = <0 26 0x04>;
+       clocks = <&clks 160>, <&clks 161>;
+       clock-names = "ipg", "per";
+       status = "disabled";
+};
index 5375625..f1e5dfe 100644 (file)
@@ -39,3 +39,46 @@ Example:
                #gpio-cells = <4>;
                gpio-controller;
        };
+
+
+Samsung S3C24XX GPIO Controller
+
+Required properties:
+- compatible: Compatible property value should be "samsung,s3c24xx-gpio".
+
+- reg: Physical base address of the controller and length of memory mapped
+  region.
+
+- #gpio-cells: Should be 3. The syntax of the gpio specifier used by client nodes
+  should be the following with values derived from the SoC user manual.
+     <[phandle of the gpio controller node]
+      [pin number within the gpio controller]
+      [mux function]
+      [flags and pull up/down]
+
+  Values for gpio specifier:
+  - Pin number: depending on the controller a number from 0 up to 15.
+  - Mux function: Depending on the SoC and the gpio bank the gpio can be set
+                  as input, output or a special function
+  - Flags and Pull Up/Down: the values to use differ for the individual SoCs
+                    example S3C2416/S3C2450:
+                            0 - Pull Up/Down Disabled.
+                            1 - Pull Down Enabled.
+                            2 - Pull Up Enabled.
+          Bit 16 (0x00010000) - Input is active low.
+  Consult the user manual for the correct values of Mux and Pull Up/Down.
+
+- gpio-controller: Specifies that the node is a gpio controller.
+- #address-cells: should be 1.
+- #size-cells: should be 1.
+
+Example:
+
+       gpa: gpio-controller@56000000 {
+               #address-cells = <1>;
+               #size-cells = <1>;
+               compatible = "samsung,s3c24xx-gpio";
+               reg = <0x56000000 0x10>;
+               #gpio-cells = <3>;
+               gpio-controller;
+       };
index 16695d9..66788fd 100644 (file)
@@ -11,6 +11,11 @@ Required properties:
 - interrupt-controller: Mark the device node as an interrupt controller
   The first cell is the GPIO number.
   The second cell is not used.
+- ti,use-leds : Enables LEDA and LEDB outputs if set
+- ti,debounce : if n-th bit is set, debounces GPIO-n
+- ti,mmc-cd : if n-th bit is set, GPIO-n controls VMMC(n+1)
+- ti,pullups : if n-th bit is set, set a pullup on GPIO-n
+- ti,pulldowns : if n-th bit is set, set a pulldown on GPIO-n
 
 Example:
 
@@ -20,4 +25,5 @@ twl_gpio: gpio {
     gpio-controller;
     #interrupt-cells = <2>;
     interrupt-controller;
+    ti,use-leds;
 };
index 1a85f98..2f5322b 100644 (file)
@@ -56,3 +56,4 @@ stm,m41t00            Serial Access TIMEKEEPER
 stm,m41t62             Serial real-time clock (RTC) with alarm
 stm,m41t80             M41T80 - SERIAL ACCESS RTC WITH ALARMS
 ti,tsc2003             I2C Touch-Screen Controller
+ti,tmp102              Low Power Digital Temperature Sensor with SMBUS/Two Wire Serial Interface
diff --git a/Documentation/devicetree/bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt b/Documentation/devicetree/bindings/interrupt-controller/brcm,bcm2835-armctrl-ic.txt
new file mode 100644 (file)
index 0000000..548892c
--- /dev/null
@@ -0,0 +1,110 @@
+BCM2835 Top-Level ("ARMCTRL") Interrupt Controller
+
+The BCM2835 contains a custom top-level interrupt controller, which supports
+72 interrupt sources using a 2-level register scheme. The interrupt
+controller, or the HW block containing it, is referred to occasionally
+as "armctrl" in the SoC documentation, hence naming of this binding.
+
+Required properties:
+
+- compatible : should be "brcm,bcm2835-armctrl-ic.txt"
+- reg : Specifies base physical address and size of the registers.
+- interrupt-controller : Identifies the node as an interrupt controller
+- #interrupt-cells : Specifies the number of cells needed to encode an
+  interrupt source. The value shall be 2.
+
+  The 1st cell is the interrupt bank; 0 for interrupts in the "IRQ basic
+  pending" register, or 1/2 respectively for interrupts in the "IRQ pending
+  1/2" register.
+
+  The 2nd cell contains the interrupt number within the bank. Valid values
+  are 0..7 for bank 0, and 0..31 for bank 1.
+
+The interrupt sources are as follows:
+
+Bank 0:
+0: ARM_TIMER
+1: ARM_MAILBOX
+2: ARM_DOORBELL_0
+3: ARM_DOORBELL_1
+4: VPU0_HALTED
+5: VPU1_HALTED
+6: ILLEGAL_TYPE0
+7: ILLEGAL_TYPE1
+
+Bank 1:
+0: TIMER0
+1: TIMER1
+2: TIMER2
+3: TIMER3
+4: CODEC0
+5: CODEC1
+6: CODEC2
+7: VC_JPEG
+8: ISP
+9: VC_USB
+10: VC_3D
+11: TRANSPOSER
+12: MULTICORESYNC0
+13: MULTICORESYNC1
+14: MULTICORESYNC2
+15: MULTICORESYNC3
+16: DMA0
+17: DMA1
+18: VC_DMA2
+19: VC_DMA3
+20: DMA4
+21: DMA5
+22: DMA6
+23: DMA7
+24: DMA8
+25: DMA9
+26: DMA10
+27: DMA11
+28: DMA12
+29: AUX
+30: ARM
+31: VPUDMA
+
+Bank 2:
+0: HOSTPORT
+1: VIDEOSCALER
+2: CCP2TX
+3: SDC
+4: DSI0
+5: AVE
+6: CAM0
+7: CAM1
+8: HDMI0
+9: HDMI1
+10: PIXELVALVE1
+11: I2CSPISLV
+12: DSI1
+13: PWA0
+14: PWA1
+15: CPR
+16: SMI
+17: GPIO0
+18: GPIO1
+19: GPIO2
+20: GPIO3
+21: VC_I2C
+22: VC_SPI
+23: VC_I2SPCM
+24: VC_SDIO
+25: VC_UART
+26: SLIMBUS
+27: VEC
+28: CPG
+29: RNG
+30: VC_ARASANSDIO
+31: AVSPMON
+
+Example:
+
+intc: interrupt-controller {
+       compatible = "brcm,bcm2835-armctrl-ic";
+       reg = <0x7e00b200 0x200>;
+       interrupt-controller;
+       #interrupt-cells = <2>;
+};
diff --git a/Documentation/devicetree/bindings/lpddr2/lpddr2-timings.txt b/Documentation/devicetree/bindings/lpddr2/lpddr2-timings.txt
new file mode 100644 (file)
index 0000000..9ceb19e
--- /dev/null
@@ -0,0 +1,52 @@
+* AC timing parameters of LPDDR2(JESD209-2) memories for a given speed-bin
+
+Required properties:
+- compatible : Should be "jedec,lpddr2-timings"
+- min-freq : minimum DDR clock frequency for the speed-bin. Type is <u32>
+- max-freq : maximum DDR clock frequency for the speed-bin. Type is <u32>
+
+Optional properties:
+
+The following properties represent AC timing parameters from the memory
+data-sheet of the device for a given speed-bin. All these properties are
+of type <u32> and the default unit is ps (pico seconds). Parameters with
+a different unit have a suffix indicating the unit such as 'tRAS-max-ns'
+- tRCD
+- tWR
+- tRAS-min
+- tRRD
+- tWTR
+- tXP
+- tRTP
+- tDQSCK-max
+- tFAW
+- tZQCS
+- tZQinit
+- tRPab
+- tZQCL
+- tCKESR
+- tRAS-max-ns
+- tDQSCK-max-derated
+
+Example:
+
+timings_elpida_ECB240ABACN_400mhz: lpddr2-timings@0 {
+       compatible      = "jedec,lpddr2-timings";
+       min-freq        = <10000000>;
+       max-freq        = <400000000>;
+       tRPab           = <21000>;
+       tRCD            = <18000>;
+       tWR             = <15000>;
+       tRAS-min        = <42000>;
+       tRRD            = <10000>;
+       tWTR            = <7500>;
+       tXP             = <7500>;
+       tRTP            = <7500>;
+       tCKESR          = <15000>;
+       tDQSCK-max      = <5500>;
+       tFAW            = <50000>;
+       tZQCS           = <90000>;
+       tZQCL           = <360000>;
+       tZQinit         = <1000000>;
+       tRAS-max-ns     = <70000>;
+};
diff --git a/Documentation/devicetree/bindings/lpddr2/lpddr2.txt b/Documentation/devicetree/bindings/lpddr2/lpddr2.txt
new file mode 100644 (file)
index 0000000..58354a0
--- /dev/null
@@ -0,0 +1,102 @@
+* LPDDR2 SDRAM memories compliant to JEDEC JESD209-2
+
+Required properties:
+- compatible : Should be one of - "jedec,lpddr2-nvm", "jedec,lpddr2-s2",
+  "jedec,lpddr2-s4"
+
+  "ti,jedec-lpddr2-s2" should be listed if the memory part is LPDDR2-S2 type
+
+  "ti,jedec-lpddr2-s4" should be listed if the memory part is LPDDR2-S4 type
+
+  "ti,jedec-lpddr2-nvm" should be listed if the memory part is LPDDR2-NVM type
+
+- density  : <u32> representing density in Mb (Mega bits)
+
+- io-width : <u32> representing bus width. Possible values are 8, 16, and 32
+
+Optional properties:
+
+The following optional properties represent the minimum value of some AC
+timing parameters of the DDR device in terms of number of clock cycles.
+These values shall be obtained from the device data-sheet.
+- tRRD-min-tck
+- tWTR-min-tck
+- tXP-min-tck
+- tRTP-min-tck
+- tCKE-min-tck
+- tRPab-min-tck
+- tRCD-min-tck
+- tWR-min-tck
+- tRASmin-min-tck
+- tCKESR-min-tck
+- tFAW-min-tck
+
+Child nodes:
+- The lpddr2 node may have one or more child nodes of type "lpddr2-timings".
+  "lpddr2-timings" provides AC timing parameters of the device for
+  a given speed-bin. The user may provide the timings for as many
+  speed-bins as is required. Please see Documentation/devicetree/
+  bindings/lpddr2/lpddr2-timings.txt for more information on "lpddr2-timings"
+
+Example:
+
+elpida_ECB240ABACN : lpddr2 {
+       compatible      = "Elpida,ECB240ABACN","jedec,lpddr2-s4";
+       density         = <2048>;
+       io-width        = <32>;
+
+       tRPab-min-tck   = <3>;
+       tRCD-min-tck    = <3>;
+       tWR-min-tck     = <3>;
+       tRASmin-min-tck = <3>;
+       tRRD-min-tck    = <2>;
+       tWTR-min-tck    = <2>;
+       tXP-min-tck     = <2>;
+       tRTP-min-tck    = <2>;
+       tCKE-min-tck    = <3>;
+       tCKESR-min-tck  = <3>;
+       tFAW-min-tck    = <8>;
+
+       timings_elpida_ECB240ABACN_400mhz: lpddr2-timings@0 {
+               compatible      = "jedec,lpddr2-timings";
+               min-freq        = <10000000>;
+               max-freq        = <400000000>;
+               tRPab           = <21000>;
+               tRCD            = <18000>;
+               tWR             = <15000>;
+               tRAS-min        = <42000>;
+               tRRD            = <10000>;
+               tWTR            = <7500>;
+               tXP             = <7500>;
+               tRTP            = <7500>;
+               tCKESR          = <15000>;
+               tDQSCK-max      = <5500>;
+               tFAW            = <50000>;
+               tZQCS           = <90000>;
+               tZQCL           = <360000>;
+               tZQinit         = <1000000>;
+               tRAS-max-ns     = <70000>;
+       };
+
+       timings_elpida_ECB240ABACN_200mhz: lpddr2-timings@1 {
+               compatible      = "jedec,lpddr2-timings";
+               min-freq        = <10000000>;
+               max-freq        = <200000000>;
+               tRPab           = <21000>;
+               tRCD            = <18000>;
+               tWR             = <15000>;
+               tRAS-min        = <42000>;
+               tRRD            = <10000>;
+               tWTR            = <10000>;
+               tXP             = <7500>;
+               tRTP            = <7500>;
+               tCKESR          = <15000>;
+               tDQSCK-max      = <5500>;
+               tFAW            = <50000>;
+               tZQCS           = <90000>;
+               tZQCL           = <360000>;
+               tZQinit         = <1000000>;
+               tRAS-max-ns     = <70000>;
+       };
+
+}
diff --git a/Documentation/devicetree/bindings/memory-controllers/ti/emif.txt b/Documentation/devicetree/bindings/memory-controllers/ti/emif.txt
new file mode 100644 (file)
index 0000000..938f8e1
--- /dev/null
@@ -0,0 +1,55 @@
+* EMIF family of TI SDRAM controllers
+
+EMIF - External Memory Interface - is an SDRAM controller used in
+TI SoCs. EMIF supports, based on the IP revision, one or more of
+DDR2/DDR3/LPDDR2 protocols. This binding describes a given instance
+of the EMIF IP and memory parts attached to it.
+
+Required properties:
+- compatible   : Should be of the form "ti,emif-<ip-rev>" where <ip-rev>
+  is the IP revision of the specific EMIF instance.
+
+- phy-type     : <u32> indicating the DDR phy type. Following are the
+  allowed values
+  <1>  : Attila PHY
+  <2>  : Intelli PHY
+
+- device-handle        : phandle to a "lpddr2" node representing the memory part
+
+- ti,hwmods    : For TI hwmods processing and omap device creation
+  the value shall be "emif<n>" where <n> is the number of the EMIF
+  instance with base 1.
+
+Optional properties:
+- cs1-used             : Have this property if CS1 of this EMIF
+  instance has a memory part attached to it. If there is a memory
+  part attached to CS1, it should be the same type as the one on CS0,
+  so there is no need to give the details of this memory part.
+
+- cal-resistor-per-cs  : Have this property if the board has one
+  calibration resistor per chip-select.
+
+- hw-caps-read-idle-ctrl: Have this property if the controller
+  supports read idle window programming
+
+- hw-caps-dll-calib-ctrl: Have this property if the controller
+  supports dll calibration control
+
+- hw-caps-ll-interface : Have this property if the controller
+  has a low latency interface and corresponding interrupt events
+
+- hw-caps-temp-alert   : Have this property if the controller
+  has capability for generating SDRAM temperature alerts
+
+Example:
+
+emif1: emif@0x4c000000 {
+       compatible      = "ti,emif-4d";
+       ti,hwmods       = "emif2";
+       phy-type        = <1>;
+       device-handle   = <&elpida_ECB240ABACN>;
+       cs1-used;
+       hw-caps-read-idle-ctrl;
+       hw-caps-ll-interface;
+       hw-caps-temp-alert;
+};
diff --git a/Documentation/devicetree/bindings/mtd/pxa3xx-nand.txt b/Documentation/devicetree/bindings/mtd/pxa3xx-nand.txt
new file mode 100644 (file)
index 0000000..f1421e2
--- /dev/null
@@ -0,0 +1,31 @@
+PXA3xx NAND DT bindings
+
+Required properties:
+
+ - compatible:         Should be "marvell,pxa3xx-nand"
+ - reg:                The register base for the controller
+ - interrupts:         The interrupt to map
+ - #address-cells:     Set to <1> if the node includes partitions
+
+Optional properties:
+
+ - marvell,nand-enable-arbiter:        Set to enable the bus arbiter
+ - marvell,nand-keep-config:   Set to keep the NAND controller config as set
+                               by the bootloader
+ - num-cs:                     Number of chipselect lines to usw
+
+Example:
+
+       nand0: nand@43100000 {
+               compatible = "marvell,pxa3xx-nand";
+               reg = <0x43100000 90>;
+               interrupts = <45>;
+               #address-cells = <1>;
+
+               marvell,nand-enable-arbiter;
+               marvell,nand-keep-config;
+               num-cs = <1>;
+
+               /* partitions (optional) */
+       };
+
index da80c2a..a2436e1 100644 (file)
@@ -8,7 +8,8 @@ Required properties:
 - gpio-controller: mark the device as a GPIO controller
 - regulators: list of regulators provided by this controller, must have
   property "regulator-compatible" to match their hardware counterparts:
-  sm[0-2], ldo[0-9] and ldo_rtc
+  sys, sm[0-2], ldo[0-9] and ldo_rtc
+- sys-supply: The input supply for SYS.
 - vin-sm0-supply: The input supply for the SM0.
 - vin-sm1-supply: The input supply for the SM1.
 - vin-sm2-supply: The input supply for the SM2.
@@ -20,6 +21,9 @@ Required properties:
 
 Each regulator is defined using the standard binding for regulators.
 
+Note: LDO5 and LDO_RTC is supplied by SYS regulator internally and driver
+      take care of making proper parent child relationship.
+
 Example:
 
        pmu: tps6586x@34 {
@@ -30,6 +34,7 @@ Example:
                #gpio-cells = <2>;
                gpio-controller;
 
+               sys-supply = <&some_reg>;
                vin-sm0-supply = <&some_reg>;
                vin-sm1-supply = <&some_reg>;
                vin-sm2-supply = <&some_reg>;
@@ -43,8 +48,16 @@ Example:
                        #address-cells = <1>;
                        #size-cells = <0>;
 
-                       sm0_reg: regulator@0 {
+                       sys_reg: regulator@0 {
                                reg = <0>;
+                               regulator-compatible = "sys";
+                               regulator-name = "vdd_sys";
+                               regulator-boot-on;
+                               regulator-always-on;
+                       };
+
+                       sm0_reg: regulator@1 {
+                               reg = <1>;
                                regulator-compatible = "sm0";
                                regulator-min-microvolt = < 725000>;
                                regulator-max-microvolt = <1500000>;
@@ -52,8 +65,8 @@ Example:
                                regulator-always-on;
                        };
 
-                       sm1_reg: regulator@1 {
-                               reg = <1>;
+                       sm1_reg: regulator@2 {
+                               reg = <2>;
                                regulator-compatible = "sm1";
                                regulator-min-microvolt = < 725000>;
                                regulator-max-microvolt = <1500000>;
@@ -61,8 +74,8 @@ Example:
                                regulator-always-on;
                        };
 
-                       sm2_reg: regulator@2 {
-                               reg = <2>;
+                       sm2_reg: regulator@3 {
+                               reg = <3>;
                                regulator-compatible = "sm2";
                                regulator-min-microvolt = <3000000>;
                                regulator-max-microvolt = <4550000>;
@@ -70,72 +83,72 @@ Example:
                                regulator-always-on;
                        };
 
-                       ldo0_reg: regulator@3 {
-                               reg = <3>;
+                       ldo0_reg: regulator@4 {
+                               reg = <4>;
                                regulator-compatible = "ldo0";
                                regulator-name = "PCIE CLK";
                                regulator-min-microvolt = <3300000>;
                                regulator-max-microvolt = <3300000>;
                        };
 
-                       ldo1_reg: regulator@4 {
-                               reg = <4>;
+                       ldo1_reg: regulator@5 {
+                               reg = <5>;
                                regulator-compatible = "ldo1";
                                regulator-min-microvolt = < 725000>;
                                regulator-max-microvolt = <1500000>;
                        };
 
-                       ldo2_reg: regulator@5 {
-                               reg = <5>;
+                       ldo2_reg: regulator@6 {
+                               reg = <6>;
                                regulator-compatible = "ldo2";
                                regulator-min-microvolt = < 725000>;
                                regulator-max-microvolt = <1500000>;
                        };
 
-                       ldo3_reg: regulator@6 {
-                               reg = <6>;
+                       ldo3_reg: regulator@7 {
+                               reg = <7>;
                                regulator-compatible = "ldo3";
                                regulator-min-microvolt = <1250000>;
                                regulator-max-microvolt = <3300000>;
                        };
 
-                       ldo4_reg: regulator@7 {
-                               reg = <7>;
+                       ldo4_reg: regulator@8 {
+                               reg = <8>;
                                regulator-compatible = "ldo4";
                                regulator-min-microvolt = <1700000>;
                                regulator-max-microvolt = <2475000>;
                        };
 
-                       ldo5_reg: regulator@8 {
-                               reg = <8>;
+                       ldo5_reg: regulator@9 {
+                               reg = <9>;
                                regulator-compatible = "ldo5";
                                regulator-min-microvolt = <1250000>;
                                regulator-max-microvolt = <3300000>;
                        };
 
-                       ldo6_reg: regulator@9 {
-                               reg = <9>;
+                       ldo6_reg: regulator@10 {
+                               reg = <10>;
                                regulator-compatible = "ldo6";
                                regulator-min-microvolt = <1250000>;
                                regulator-max-microvolt = <3300000>;
                        };
 
-                       ldo7_reg: regulator@10 {
-                               reg = <10>;
+                       ldo7_reg: regulator@11 {
+                               reg = <11>;
                                regulator-compatible = "ldo7";
                                regulator-min-microvolt = <1250000>;
                                regulator-max-microvolt = <3300000>;
                        };
 
-                       ldo8_reg: regulator@11 {
-                               reg = <11>;
+                       ldo8_reg: regulator@12 {
+                               reg = <12>;
                                regulator-compatible = "ldo8";
                                regulator-min-microvolt = <1250000>;
                                regulator-max-microvolt = <3300000>;
                        };
 
-                       ldo9_reg: regulator@12 {
-                               reg = <12>;
+                       ldo9_reg: regulator@13 {
+                               reg = <13>;
                                regulator-compatible = "ldo9";
                                regulator-min-microvolt = <1250000>;
                                regulator-max-microvolt = <3300000>;
diff --git a/Documentation/devicetree/bindings/rtc/pxa-rtc.txt b/Documentation/devicetree/bindings/rtc/pxa-rtc.txt
new file mode 100644 (file)
index 0000000..8c6672a
--- /dev/null
@@ -0,0 +1,14 @@
+* PXA RTC
+
+PXA specific RTC driver.
+
+Required properties:
+- compatible : Should be "marvell,pxa-rtc"
+
+Examples:
+
+rtc@40900000 {
+       compatible = "marvell,pxa-rtc";
+       reg = <0x40900000 0x3c>;
+       interrupts = <30 31>;
+};
diff --git a/Documentation/devicetree/bindings/timer/brcm,bcm2835-system-timer.txt b/Documentation/devicetree/bindings/timer/brcm,bcm2835-system-timer.txt
new file mode 100644 (file)
index 0000000..2de21c2
--- /dev/null
@@ -0,0 +1,22 @@
+BCM2835 System Timer
+
+The System Timer peripheral provides four 32-bit timer channels and a
+single 64-bit free running counter. Each channel has an output compare
+register, which is compared against the 32 least significant bits of the
+free running counter values, and generates an interrupt.
+
+Required properties:
+
+- compatible : should be "brcm,bcm2835-system-timer.txt"
+- reg : Specifies base physical address and size of the registers.
+- interrupts : A list of 4 interrupt sinks; one per timer channel.
+- clock-frequency : The frequency of the clock that drives the counter, in Hz.
+
+Example:
+
+timer {
+       compatible = "brcm,bcm2835-system-timer";
+       reg = <0x7e003000 0x1000>;
+       interrupts = <1 0>, <1 1>, <1 2>, <1 3>;
+       clock-frequency = <1000000>;
+};
diff --git a/Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt b/Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt
new file mode 100644 (file)
index 0000000..0d439df
--- /dev/null
@@ -0,0 +1,14 @@
+* NXP LPC32xx SoC High Speed UART
+
+Required properties:
+- compatible: Should be "nxp,lpc3220-hsuart"
+- reg: Should contain registers location and length
+- interrupts: Should contain interrupt
+
+Example:
+
+       uart1: serial@40014000 {
+               compatible = "nxp,lpc3220-hsuart";
+               reg = <0x40014000 0x1000>;
+               interrupts = <26 0>;
+       };
index 0847fde..ba385f2 100644 (file)
@@ -25,6 +25,8 @@ Optional properties:
   accesses to the UART (e.g. TI davinci).
 - used-by-rtas : set to indicate that the port is in use by the OpenFirmware
   RTAS and should not be registered.
+- no-loopback-test: set to indicate that the port does not implements loopback
+  test mode
 
 Example:
 
index db4d3af..4f293e5 100644 (file)
@@ -10,6 +10,7 @@ apm   Applied Micro Circuits Corporation (APM)
 arm    ARM Ltd.
 atmel  Atmel Corporation
 bosch  Bosch Sensortec GmbH
+brcm   Broadcom Corporation
 cavium Cavium, Inc.
 chrp   Common Hardware Reference Platform
 cortina        Cortina Systems, Inc.
index afaff31..f4d8c71 100644 (file)
@@ -579,7 +579,7 @@ Why:        KVM tracepoints provide mostly equivalent information in a much more
 ----------------------------
 
 What:  at91-mci driver ("CONFIG_MMC_AT91")
-When:  3.7
+When:  3.8
 Why:   There are two mci drivers: at91-mci and atmel-mci. The PDC support
        was added to atmel-mci as a first step to support more chips.
        Then at91-mci was kept only for old IP versions (on at91rm9200 and
index 615142d..157416e 100644 (file)
@@ -21,6 +21,7 @@ Supported adapters:
   * Intel DH89xxCC (PCH)
   * Intel Panther Point (PCH)
   * Intel Lynx Point (PCH)
+  * Intel Lynx Point-LP (PCH)
    Datasheets: Publicly available at the Intel website
 
 On Intel Patsburg and later chipsets, both the normal host SMBus controller
index e09468a..f7b0c7d 100644 (file)
@@ -2,8 +2,6 @@
        - this file.
 README.cycladesZ
        - info on Cyclades-Z firmware loading.
-computone.txt
-       - info on Computone Intelliport II/Plus Multiport Serial Driver.
 digiepca.txt
        - info on Digi Intl. {PC,PCI,EISA}Xx and Xem series cards.
 hayes-esp.txt
diff --git a/Documentation/serial/computone.txt b/Documentation/serial/computone.txt
deleted file mode 100644 (file)
index a6a1158..0000000
+++ /dev/null
@@ -1,520 +0,0 @@
-NOTE: This is an unmaintained driver.  It is not guaranteed to work due to
-changes made in the tty layer in 2.6.  If you wish to take over maintenance of
-this driver, contact Michael Warfield <mhw@wittsend.com>.
-
-Changelog:
-----------
-11-01-2001:    Original Document
-
-10-29-2004:    Minor misspelling & format fix, update status of driver.
-               James Nelson <james4765@gmail.com>
-
-Computone Intelliport II/Plus Multiport Serial Driver
------------------------------------------------------
-
-Release Notes For Linux Kernel 2.2 and higher.
-These notes are for the drivers which have already been integrated into the
-kernel and have been tested on Linux kernels 2.0, 2.2, 2.3, and 2.4.
-
-Version: 1.2.14
-Date: 11/01/2001
-Historical Author: Andrew Manison <amanison@america.net>
-Primary Author: Doug McNash
-
-This file assumes that you are using the Computone drivers which are
-integrated into the kernel sources.  For updating the drivers or installing
-drivers into kernels which do not already have Computone drivers, please
-refer to the instructions in the README.computone file in the driver patch.
-
-
-1. INTRODUCTION
-
-This driver supports the entire family of Intelliport II/Plus controllers
-with the exception of the MicroChannel controllers.  It does not support
-products previous to the Intelliport II.
-
-This driver was developed on the v2.0.x Linux tree and has been tested up
-to v2.4.14; it will probably not work with earlier v1.X kernels,.
-
-
-2. QUICK INSTALLATION
-
-Hardware - If you have an ISA card, find a free interrupt and io port. 
-                  List those in use with `cat /proc/interrupts` and 
-                  `cat /proc/ioports`.  Set the card dip switches to a free 
-                  address.  You may need to configure your BIOS to reserve an
-                  irq for an ISA card.  PCI and EISA parameters are set
-                  automagically.  Insert card into computer with the power off 
-                  before or after drivers installation.
-
-       Note the hardware address from the Computone ISA cards installed into
-               the system.  These are required for editing ip2.c or editing
-               /etc/modprobe.d/*.conf, or for specification on the modprobe
-               command line.
-
-       Note that the /etc/modules.conf should be used for older (pre-2.6)
-               kernels.
-
-Software -
-
-Module installation:
-
-a) Determine free irq/address to use if any (configure BIOS if need be)
-b) Run "make config" or "make menuconfig" or "make xconfig"
-   Select (m) module for CONFIG_COMPUTONE under character
-   devices.  CONFIG_PCI and CONFIG_MODULES also may need to be set.
-c) Set address on ISA cards then:
-   edit /usr/src/linux/drivers/char/ip2.c if needed 
-       or
-   edit config file in  /etc/modprobe.d/ if needed (module).
-       or both to match this setting.
-d) Run "make modules"
-e) Run "make modules_install"
-f) Run "/sbin/depmod -a"
-g) install driver using `modprobe ip2 <options>` (options listed below)
-h) run ip2mkdev (either the script below or the binary version)
-
-
-Kernel installation:
-
-a) Determine free irq/address to use if any (configure BIOS if need be)
-b) Run "make config" or "make menuconfig" or "make xconfig"
-   Select (y) kernel for CONFIG_COMPUTONE under character
-   devices.  CONFIG_PCI may need to be set if you have PCI bus.
-c) Set address on ISA cards then:
-          edit /usr/src/linux/drivers/char/ip2.c  
-           (Optional - may be specified on kernel command line now)
-d) Run "make zImage" or whatever target you prefer.
-e) mv /usr/src/linux/arch/x86/boot/zImage to /boot.
-f) Add new config for this kernel into /etc/lilo.conf, run "lilo"
-       or copy to a floppy disk and boot from that floppy disk.
-g) Reboot using this kernel
-h) run ip2mkdev (either the script below or the binary version)
-
-Kernel command line options:
-
-When compiling the driver into the kernel, io and irq may be
-compiled into the driver by editing ip2.c and setting the values for
-io and irq in the appropriate array.  An alternative is to specify
-a command line parameter to the kernel at boot up.
-
-        ip2=io0,irq0,io1,irq1,io2,irq2,io3,irq3
-
-Note that this order is very different from the specifications for the
-modload parameters which have separate IRQ and IO specifiers.
-
-The io port also selects PCI (1) and EISA (2) boards.
-
-        io=0    No board
-        io=1    PCI board
-        io=2    EISA board
-        else    ISA board io address
-
-You only need to specify the boards which are present.
-
-        Examples:
-
-                2 PCI boards:
-
-                        ip2=1,0,1,0
-
-                1 ISA board at 0x310 irq 5:
-
-                        ip2=0x310,5
-
-This can be added to and "append" option in lilo.conf similar to this:
-
-        append="ip2=1,0,1,0"
-
-
-3. INSTALLATION
-
-Previously, the driver sources were packaged with a set of patch files
-to update the character drivers' makefile and configuration file, and other 
-kernel source files. A build script (ip2build) was included which applies 
-the patches if needed, and build any utilities needed.
-What you receive may be a single patch file in conventional kernel
-patch format build script. That form can also be applied by
-running patch -p1 < ThePatchFile.  Otherwise run ip2build.
-The driver can be installed as a module (recommended) or built into the 
-kernel. This is selected as for other drivers through the `make config`
-command from the root of the Linux source tree. If the driver is built 
-into the kernel you will need to edit the file ip2.c to match the boards 
-you are installing. See that file for instructions. If the driver is 
-installed as a module the configuration can also be specified on the
-modprobe command line as follows:
-
-       modprobe ip2 irq=irq1,irq2,irq3,irq4 io=addr1,addr2,addr3,addr4
-
-where irqnum is one of the valid Intelliport II interrupts (3,4,5,7,10,11,
-12,15) and addr1-4 are the base addresses for up to four controllers. If 
-the irqs are not specified the driver uses the default in ip2.c (which 
-selects polled mode). If no base addresses are specified the defaults in 
-ip2.c are used. If you are autoloading the driver module with kerneld or
-kmod the base addresses and interrupt number must also be set in ip2.c
-and recompile or just insert and options line in /etc/modprobe.d/*.conf or both.
-The options line is equivalent to the command line and takes precedence over
-what is in ip2.c. 
-
-config sample to put /etc/modprobe.d/*.conf:
-       options ip2 io=1,0x328 irq=1,10
-       alias char-major-71 ip2
-       alias char-major-72 ip2
-       alias char-major-73 ip2
-
-The equivalent in ip2.c:
-
-static int io[IP2_MAX_BOARDS]= { 1, 0x328, 0, 0 };
-static int irq[IP2_MAX_BOARDS] = { 1, 10, -1, -1 }; 
-
-The equivalent for the kernel command line (in lilo.conf):
-
-        append="ip2=1,1,0x328,10"
-
-
-Note:  Both io and irq should be updated to reflect YOUR system.  An "io"
-       address of 1 or 2 indicates a PCI or EISA card in the board table.
-       The PCI or EISA irq will be assigned automatically.
-
-Specifying an invalid or in-use irq will default the driver into
-running in polled mode for that card.  If all irq entries are 0 then
-all cards will operate in polled mode.
-
-If you select the driver as part of the kernel run :
-
-       make zlilo (or whatever you do to create a bootable kernel)
-
-If you selected a module run :
-
-       make modules && make modules_install
-
-The utility ip2mkdev (see 5 and 7 below) creates all the device nodes
-required by the driver.  For a device to be created it must be configured
-in the driver and the board must be installed. Only devices corresponding
-to real IntelliPort II ports are created. With multiple boards and expansion
-boxes this will leave gaps in the sequence of device names. ip2mkdev uses
-Linux tty naming conventions: ttyF0 - ttyF255 for normal devices, and
-cuf0 - cuf255 for callout devices.
-
-
-4. USING THE DRIVERS
-
-As noted above, the driver implements the ports in accordance with Linux
-conventions, and the devices should be interchangeable with the standard
-serial devices. (This is a key point for problem reporting: please make
-sure that what you are trying do works on the ttySx/cuax ports first; then 
-tell us what went wrong with the ip2 ports!)
-
-Higher speeds can be obtained using the setserial utility which remaps 
-38,400 bps (extb) to 57,600 bps, 115,200 bps, or a custom speed. 
-Intelliport II installations using the PowerPort expansion module can
-use the custom speed setting to select the highest speeds: 153,600 bps,
-230,400 bps, 307,200 bps, 460,800bps and 921,600 bps. The base for
-custom baud rate configuration is fixed at 921,600 for cards/expansion
-modules with ST654's and 115200 for those with Cirrus CD1400's.  This
-corresponds to the maximum bit rates those chips are capable.  
-For example if the baud base is 921600 and the baud divisor is 18 then
-the custom rate is 921600/18 = 51200 bps.  See the setserial man page for
-complete details. Of course if stty accepts the higher rates now you can
-use that as well as the standard ioctls().
-
-
-5. ip2mkdev and assorted utilities...
-
-Several utilities, including the source for a binary ip2mkdev utility are
-available under .../drivers/char/ip2.  These can be build by changing to
-that directory and typing "make" after the kernel has be built.  If you do
-not wish to compile the binary utilities, the shell script below can be
-cut out and run as "ip2mkdev" to create the necessary device files.  To
-use the ip2mkdev script, you must have procfs enabled and the proc file
-system mounted on /proc.
-
-
-6. NOTES
-
-This is a release version of the driver, but it is impossible to test it
-in all configurations of Linux. If there is any anomalous behaviour that 
-does not match the standard serial port's behaviour please let us know.
-
-
-7. ip2mkdev shell script
-
-Previously, this script was simply attached here.  It is now attached as a
-shar archive to make it easier to extract the script from the documentation.
-To create the ip2mkdev shell script change to a convenient directory (/tmp
-works just fine) and run the following command:
-
-       unshar Documentation/serial/computone.txt
-               (This file)
-
-You should now have a file ip2mkdev in your current working directory with
-permissions set to execute.  Running that script with then create the
-necessary devices for the Computone boards, interfaces, and ports which
-are present on you system at the time it is run.
-
-
-#!/bin/sh
-# This is a shell archive (produced by GNU sharutils 4.2.1).
-# To extract the files from this archive, save it to some FILE, remove
-# everything before the `!/bin/sh' line above, then type `sh FILE'.
-#
-# Made on 2001-10-29 10:32 EST by <mhw@alcove.wittsend.com>.
-# Source directory was `/home2/src/tmp'.
-#
-# Existing files will *not* be overwritten unless `-c' is specified.
-#
-# This shar contains:
-# length mode       name
-# ------ ---------- ------------------------------------------
-#   4251 -rwxr-xr-x ip2mkdev
-#
-save_IFS="${IFS}"
-IFS="${IFS}:"
-gettext_dir=FAILED
-locale_dir=FAILED
-first_param="$1"
-for dir in $PATH
-do
-  if test "$gettext_dir" = FAILED && test -f $dir/gettext \
-     && ($dir/gettext --version >/dev/null 2>&1)
-  then
-    set `$dir/gettext --version 2>&1`
-    if test "$3" = GNU
-    then
-      gettext_dir=$dir
-    fi
-  fi
-  if test "$locale_dir" = FAILED && test -f $dir/shar \
-     && ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
-  then
-    locale_dir=`$dir/shar --print-text-domain-dir`
-  fi
-done
-IFS="$save_IFS"
-if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
-then
-  echo=echo
-else
-  TEXTDOMAINDIR=$locale_dir
-  export TEXTDOMAINDIR
-  TEXTDOMAIN=sharutils
-  export TEXTDOMAIN
-  echo="$gettext_dir/gettext -s"
-fi
-if touch -am -t 200112312359.59 $$.touch >/dev/null 2>&1 && test ! -f 200112312359.59 -a -f $$.touch; then
-  shar_touch='touch -am -t $1$2$3$4$5$6.$7 "$8"'
-elif touch -am 123123592001.59 $$.touch >/dev/null 2>&1 && test ! -f 123123592001.59 -a ! -f 123123592001.5 -a -f $$.touch; then
-  shar_touch='touch -am $3$4$5$6$1$2.$7 "$8"'
-elif touch -am 1231235901 $$.touch >/dev/null 2>&1 && test ! -f 1231235901 -a -f $$.touch; then
-  shar_touch='touch -am $3$4$5$6$2 "$8"'
-else
-  shar_touch=:
-  echo
-  $echo 'WARNING: not restoring timestamps.  Consider getting and'
-  $echo "installing GNU \`touch', distributed in GNU File Utilities..."
-  echo
-fi
-rm -f 200112312359.59 123123592001.59 123123592001.5 1231235901 $$.touch
-#
-if mkdir _sh17581; then
-  $echo 'x -' 'creating lock directory'
-else
-  $echo 'failed to create lock directory'
-  exit 1
-fi
-# ============= ip2mkdev ==============
-if test -f 'ip2mkdev' && test "$first_param" != -c; then
-  $echo 'x -' SKIPPING 'ip2mkdev' '(file already exists)'
-else
-  $echo 'x -' extracting 'ip2mkdev' '(text)'
-  sed 's/^X//' << 'SHAR_EOF' > 'ip2mkdev' &&
-#!/bin/sh -
-#
-#      ip2mkdev
-#
-#      Make or remove devices as needed for Computone Intelliport drivers
-#
-#      First rule!  If the dev file exists and you need it, don't mess
-#      with it.  That prevents us from screwing up open ttys, ownership
-#      and permissions on a running system!
-#
-#      This script will NOT remove devices that no longer exist if their
-#      board or interface box has been removed.  If you want to get rid
-#      of them, you can manually do an "rm -f /dev/ttyF* /dev/cuaf*"
-#      before running this script.  Running this script will then recreate
-#      all the valid devices.
-#
-#      Michael H. Warfield
-#      /\/\|=mhw=|\/\/
-#      mhw@wittsend.com
-#
-#      Updated 10/29/2000 for version 1.2.13 naming convention
-#              under devfs.    /\/\|=mhw=|\/\/
-#
-#      Updated 03/09/2000 for devfs support in ip2 drivers. /\/\|=mhw=|\/\/
-#
-X
-if test -d /dev/ip2 ; then
-#      This is devfs mode...  We don't do anything except create symlinks
-#      from the real devices to the old names!
-X      cd /dev
-X      echo "Creating symbolic links to devfs devices"
-X      for i in `ls ip2` ; do
-X              if test ! -L ip2$i ; then
-X                      # Remove it incase it wasn't a symlink (old device)
-X                      rm -f ip2$i
-X                      ln -s ip2/$i ip2$i
-X              fi
-X      done
-X      for i in `( cd tts ; ls F* )` ; do
-X              if test ! -L tty$i ; then
-X                      # Remove it incase it wasn't a symlink (old device)
-X                      rm -f tty$i
-X                      ln -s tts/$i tty$i
-X              fi
-X      done
-X      for i in `( cd cua ; ls F* )` ; do
-X              DEVNUMBER=`expr $i : 'F\(.*\)'`
-X              if test ! -L cuf$DEVNUMBER ; then
-X                      # Remove it incase it wasn't a symlink (old device)
-X                      rm -f cuf$DEVNUMBER
-X                      ln -s cua/$i cuf$DEVNUMBER
-X              fi
-X      done
-X      exit 0
-fi
-X
-if test ! -f /proc/tty/drivers
-then
-X      echo "\
-Unable to check driver status.
-Make sure proc file system is mounted."
-X
-X      exit 255
-fi
-X
-if test ! -f /proc/tty/driver/ip2
-then
-X      echo "\
-Unable to locate ip2 proc file.
-Attempting to load driver"
-X
-X      if /sbin/insmod ip2
-X      then
-X              if test ! -f /proc/tty/driver/ip2
-X              then
-X                      echo "\
-Unable to locate ip2 proc file after loading driver.
-Driver initialization failure or driver version error.
-"
-X              exit 255
-X              fi
-X      else
-X              echo "Unable to load ip2 driver."
-X              exit 255
-X      fi
-fi
-X
-# Ok...  So we got the driver loaded and we can locate the procfs files.
-# Next we need our major numbers.
-X
-TTYMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/tt/!d' -e 's/.*tt[^    ]*[     ]*\([0-9]*\)[   ]*.*/\1/' < /proc/tty/drivers`
-CUAMAJOR=`sed -e '/^ip2/!d' -e '/\/dev\/cu/!d' -e 's/.*cu[^    ]*[     ]*\([0-9]*\)[   ]*.*/\1/' < /proc/tty/drivers`
-BRDMAJOR=`sed -e '/^Driver: /!d' -e 's/.*IMajor=\([0-9]*\)[    ]*.*/\1/' < /proc/tty/driver/ip2`
-X
-echo "\
-TTYMAJOR = $TTYMAJOR
-CUAMAJOR = $CUAMAJOR
-BRDMAJOR = $BRDMAJOR
-"
-X
-# Ok...  Now we should know our major numbers, if appropriate...
-# Now we need our boards and start the device loops.
-X
-grep '^Board [0-9]:' /proc/tty/driver/ip2 | while read token number type alltherest
-do
-X      # The test for blank "type" will catch the stats lead-in lines
-X      # if they exist in the file
-X      if test "$type" = "vacant" -o "$type" = "Vacant" -o "$type" = ""
-X      then
-X              continue
-X      fi
-X
-X      BOARDNO=`expr "$number" : '\([0-9]\):'`
-X      PORTS=`expr "$alltherest" : '.*ports=\([0-9]*\)' | tr ',' ' '`
-X      MINORS=`expr "$alltherest" : '.*minors=\([0-9,]*\)' | tr ',' ' '`
-X
-X      if test "$BOARDNO" = "" -o "$PORTS" = ""
-X      then
-#      This may be a bug.  We should at least get this much information
-X              echo "Unable to process board line"
-X              continue
-X      fi
-X
-X      if test "$MINORS" = ""
-X      then
-#      Silently skip this one.  This board seems to have no boxes
-X              continue
-X      fi
-X
-X      echo "board $BOARDNO: $type ports = $PORTS; port numbers = $MINORS"
-X
-X      if test "$BRDMAJOR" != ""
-X      then
-X              BRDMINOR=`expr $BOARDNO \* 4`
-X              STSMINOR=`expr $BRDMINOR + 1`
-X              if test ! -c /dev/ip2ipl$BOARDNO ; then
-X                      mknod /dev/ip2ipl$BOARDNO c $BRDMAJOR $BRDMINOR
-X              fi
-X              if test ! -c /dev/ip2stat$BOARDNO ; then
-X                      mknod /dev/ip2stat$BOARDNO c $BRDMAJOR $STSMINOR
-X              fi
-X      fi
-X
-X      if test "$TTYMAJOR" != ""
-X      then
-X              PORTNO=$BOARDBASE
-X
-X              for PORTNO in $MINORS
-X              do
-X                      if test ! -c /dev/ttyF$PORTNO ; then
-X                              # We got the hardware but no device - make it
-X                              mknod /dev/ttyF$PORTNO c $TTYMAJOR $PORTNO
-X                      fi      
-X              done
-X      fi
-X
-X      if test "$CUAMAJOR" != ""
-X      then
-X              PORTNO=$BOARDBASE
-X
-X              for PORTNO in $MINORS
-X              do
-X                      if test ! -c /dev/cuf$PORTNO ; then
-X                              # We got the hardware but no device - make it
-X                              mknod /dev/cuf$PORTNO c $CUAMAJOR $PORTNO
-X                      fi      
-X              done
-X      fi
-done
-X
-Xexit 0
-SHAR_EOF
-  (set 20 01 10 29 10 32 01 'ip2mkdev'; eval "$shar_touch") &&
-  chmod 0755 'ip2mkdev' ||
-  $echo 'restore of' 'ip2mkdev' 'failed'
-  if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
-  && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
-    md5sum -c << SHAR_EOF >/dev/null 2>&1 \
-    || $echo 'ip2mkdev:' 'MD5 check failed'
-cb5717134509f38bad9fde6b1f79b4a4  ip2mkdev
-SHAR_EOF
-  else
-    shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'ip2mkdev'`"
-    test 4251 -eq "$shar_count" ||
-    $echo 'ip2mkdev:' 'original size' '4251,' 'current size' "$shar_count!"
-  fi
-fi
-rm -fr _sh17581
-exit 0
index fdc0119..9d3965c 100644 (file)
@@ -595,7 +595,6 @@ M:  Will Deacon <will.deacon@arm.com>
 S:     Maintained
 F:     arch/arm/kernel/perf_event*
 F:     arch/arm/oprofile/common.c
-F:     arch/arm/kernel/pmu.c
 F:     arch/arm/include/asm/pmu.h
 F:     arch/arm/kernel/hw_breakpoint.c
 F:     arch/arm/include/asm/hw_breakpoint.h
@@ -1613,6 +1612,16 @@ L:       netdev@vger.kernel.org
 S:     Supported
 F:     drivers/net/ethernet/broadcom/bnx2x/
 
+BROADCOM BCM2835 ARM ARCHICTURE
+M:     Stephen Warren <swarren@wwwdotorg.org>
+L:     linux-rpi-kernel@lists.infradead.org (moderated for non-subscribers)
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/swarren/linux-rpi.git
+S:     Maintained
+F:     arch/arm/mach-bcm2835/
+F:     arch/arm/boot/dts/bcm2835*
+F:     arch/arm/configs/bcm2835_defconfig
+F:     drivers/*/*bcm2835*
+
 BROADCOM TG3 GIGABIT ETHERNET DRIVER
 M:     Matt Carlson <mcarlson@broadcom.com>
 M:     Michael Chan <mchan@broadcom.com>
@@ -3388,7 +3397,7 @@ M:        "Wolfram Sang (embedded platforms)" <w.sang@pengutronix.de>
 L:     linux-i2c@vger.kernel.org
 W:     http://i2c.wiki.kernel.org/
 T:     quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/
-T:     git git://git.fluff.org/bjdooks/linux.git
+T:     git git://git.pengutronix.de/git/wsa/linux.git
 S:     Maintained
 F:     Documentation/i2c/
 F:     drivers/i2c/
index 371ce88..ae6928c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 3
 PATCHLEVEL = 6
 SUBLEVEL = 0
-EXTRAVERSION = -rc4
+EXTRAVERSION = -rc6
 NAME = Saber-toothed Squirrel
 
 # *DOCUMENTATION*
index 3ea8094..5d58652 100644 (file)
@@ -223,6 +223,7 @@ srmcons_init(void)
                driver->subtype = SYSTEM_TYPE_SYSCONS;
                driver->init_termios = tty_std_termios;
                tty_set_operations(driver, &srmcons_ops);
+               tty_port_link_device(&srmcons_singleton.port, driver, 0);
                err = tty_register_driver(driver);
                if (err) {
                        put_tty_driver(driver);
index 16773aa..f416422 100644 (file)
@@ -6,7 +6,7 @@ config ARM
        select HAVE_DMA_API_DEBUG
        select HAVE_IDE if PCI || ISA || PCMCIA
        select HAVE_DMA_ATTRS
-       select HAVE_DMA_CONTIGUOUS if (CPU_V6 || CPU_V6K || CPU_V7)
+       select HAVE_DMA_CONTIGUOUS if MMU
        select HAVE_MEMBLOCK
        select RTC_LIB
        select SYS_SUPPORTS_APM_EMULATION
@@ -271,13 +271,12 @@ config ARCH_INTEGRATOR
        select ARM_AMBA
        select ARCH_HAS_CPUFREQ
        select COMMON_CLK
-       select CLK_VERSATILE
+       select COMMON_CLK_VERSATILE
        select HAVE_TCM
        select ICST
        select GENERIC_CLOCKEVENTS
        select PLAT_VERSATILE
        select PLAT_VERSATILE_FPGA_IRQ
-       select NEED_MACH_IO_H
        select NEED_MACH_MEMORY_H
        select SPARSE_IRQ
        select MULTI_IRQ_HANDLER
@@ -287,13 +286,12 @@ config ARCH_INTEGRATOR
 config ARCH_REALVIEW
        bool "ARM Ltd. RealView family"
        select ARM_AMBA
-       select CLKDEV_LOOKUP
-       select HAVE_MACH_CLKDEV
+       select COMMON_CLK
+       select COMMON_CLK_VERSATILE
        select ICST
        select GENERIC_CLOCKEVENTS
        select ARCH_WANT_OPTIONAL_GPIOLIB
        select PLAT_VERSATILE
-       select PLAT_VERSATILE_CLOCK
        select PLAT_VERSATILE_CLCD
        select ARM_TIMER_SP804
        select GPIO_PL061 if GPIOLIB
@@ -310,7 +308,6 @@ config ARCH_VERSATILE
        select ICST
        select GENERIC_CLOCKEVENTS
        select ARCH_WANT_OPTIONAL_GPIOLIB
-       select NEED_MACH_IO_H if PCI
        select PLAT_VERSATILE
        select PLAT_VERSATILE_CLOCK
        select PLAT_VERSATILE_CLCD
@@ -331,6 +328,23 @@ config ARCH_AT91
          This enables support for systems based on Atmel
          AT91RM9200 and AT91SAM9* processors.
 
+config ARCH_BCM2835
+       bool "Broadcom BCM2835 family"
+       select ARCH_WANT_OPTIONAL_GPIOLIB
+       select ARM_AMBA
+       select ARM_ERRATA_411920
+       select ARM_TIMER_SP804
+       select CLKDEV_LOOKUP
+       select COMMON_CLK
+       select CPU_V6
+       select GENERIC_CLOCKEVENTS
+       select MULTI_IRQ_HANDLER
+       select SPARSE_IRQ
+       select USE_OF
+       help
+         This enables support for the Broadcom BCM2835 SoC. This SoC is
+         use in the Raspberry Pi, and Roku 2 devices.
+
 config ARCH_BCMRING
        bool "Broadcom BCMRING"
        depends on MMU
@@ -370,21 +384,19 @@ config ARCH_GEMINI
        help
          Support for the Cortina Systems Gemini family SoCs
 
-config ARCH_PRIMA2
-       bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"
-       select CPU_V7
+config ARCH_SIRF
+       bool "CSR SiRF"
        select NO_IOPORT
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
-       select CLKDEV_LOOKUP
+       select COMMON_CLK
        select GENERIC_IRQ_CHIP
        select MIGHT_HAVE_CACHE_L2X0
        select PINCTRL
        select PINCTRL_SIRF
        select USE_OF
-       select ZONE_DMA
        help
-          Support for CSR SiRFSoC ARM Cortex A9 Platform
+         Support for CSR SiRFprimaII/Marco/Polo platforms
 
 config ARCH_EBSA110
        bool "EBSA-110"
@@ -419,7 +431,7 @@ config ARCH_FOOTBRIDGE
        select FOOTBRIDGE
        select GENERIC_CLOCKEVENTS
        select HAVE_IDE
-       select NEED_MACH_IO_H
+       select NEED_MACH_IO_H if !MMU
        select NEED_MACH_MEMORY_H
        help
          Support for systems based on the DC21285 companion chip
@@ -476,7 +488,6 @@ config ARCH_IOP13XX
        select PCI
        select ARCH_SUPPORTS_MSI
        select VMSPLIT_1G
-       select NEED_MACH_IO_H
        select NEED_MACH_MEMORY_H
        select NEED_RET_TO_USER
        help
@@ -529,7 +540,6 @@ config ARCH_DOVE
        select PCI
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
-       select NEED_MACH_IO_H
        select PLAT_ORION
        help
          Support for the Marvell Dove SoC 88AP510
@@ -540,7 +550,6 @@ config ARCH_KIRKWOOD
        select PCI
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
-       select NEED_MACH_IO_H
        select PLAT_ORION
        help
          Support for the following Marvell Kirkwood series SoCs:
@@ -567,7 +576,6 @@ config ARCH_MV78XX0
        select PCI
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
-       select NEED_MACH_IO_H
        select PLAT_ORION
        help
          Support for the following Marvell MV78xx0 series SoCs:
@@ -580,7 +588,6 @@ config ARCH_ORION5X
        select PCI
        select ARCH_REQUIRE_GPIOLIB
        select GENERIC_CLOCKEVENTS
-       select NEED_MACH_IO_H
        select PLAT_ORION
        help
          Support for the following Marvell Orion 5x series SoCs:
@@ -606,8 +613,9 @@ config ARCH_KS8695
        bool "Micrel/Kendin KS8695"
        select CPU_ARM922T
        select ARCH_REQUIRE_GPIOLIB
-       select ARCH_USES_GETTIMEOFFSET
        select NEED_MACH_MEMORY_H
+       select CLKSRC_MMIO
+       select GENERIC_CLOCKEVENTS
        help
          Support for Micrel/Kendin KS8695 "Centaur" (ARM922T) based
          System-on-Chip devices.
@@ -637,21 +645,13 @@ config ARCH_TEGRA
        select HAVE_CLK
        select HAVE_SMP
        select MIGHT_HAVE_CACHE_L2X0
-       select NEED_MACH_IO_H if PCI
        select ARCH_HAS_CPUFREQ
        select USE_OF
+       select COMMON_CLK
        help
          This enables support for NVIDIA Tegra based systems (Tegra APX,
          Tegra 6xx and Tegra 2 series).
 
-config ARCH_PNX4008
-       bool "Philips Nexperia PNX4008 Mobile"
-       select CPU_ARM926T
-       select CLKDEV_LOOKUP
-       select ARCH_USES_GETTIMEOFFSET
-       help
-         This enables support for Philips PNX4008 mobile platform.
-
 config ARCH_PXA
        bool "PXA2xx/PXA3xx-based"
        depends on MMU
@@ -855,7 +855,6 @@ config ARCH_SHARK
        select PCI
        select ARCH_USES_GETTIMEOFFSET
        select NEED_MACH_MEMORY_H
-       select NEED_MACH_IO_H
        help
          Support for the StrongARM based Digital DNARD machine, also known
          as "Shark" (<http://www.shark-linux.de/shark.html>).
@@ -874,6 +873,7 @@ config ARCH_U300
        select COMMON_CLK
        select GENERIC_GPIO
        select ARCH_REQUIRE_GPIOLIB
+       select SPARSE_IRQ
        help
          Support for ST-Ericsson U300 series mobile platforms.
 
@@ -1113,6 +1113,8 @@ source "arch/arm/mach-exynos/Kconfig"
 
 source "arch/arm/mach-shmobile/Kconfig"
 
+source "arch/arm/mach-prima2/Kconfig"
+
 source "arch/arm/mach-tegra/Kconfig"
 
 source "arch/arm/mach-u300/Kconfig"
@@ -1174,12 +1176,6 @@ config XSCALE_PMU
        depends on CPU_XSCALE
        default y
 
-config CPU_HAS_PMU
-       depends on (CPU_V6 || CPU_V6K || CPU_V7 || XSCALE_PMU) && \
-                  (!ARCH_OMAP3 || OMAP3_EMU)
-       default y
-       bool
-
 config MULTI_IRQ_HANDLER
        bool
        help
@@ -1752,7 +1748,7 @@ config HIGHPTE
 
 config HW_PERF_EVENTS
        bool "Enable hardware performance counter support for perf events"
-       depends on PERF_EVENTS && CPU_HAS_PMU
+       depends on PERF_EVENTS
        default y
        help
          Enable hardware performance counter support for perf events. If
index 3e57e9a..a7eb282 100644 (file)
@@ -378,15 +378,15 @@ choice
                  is nothing connected to read from the DCC.
 
        config DEBUG_SEMIHOSTING
-               bool "Kernel low-level debug output via semihosting I"
+               bool "Kernel low-level debug output via semihosting I/O"
                help
                  Semihosting enables code running on an ARM target to use
                  the I/O facilities on a host debugger/emulator through a
-                 simple SVC calls. The host debugger or emulator must have
+                 simple SVC call. The host debugger or emulator must have
                  semihosting enabled for the special svc call to be trapped
                  otherwise the kernel will crash.
 
-                 This is known to work with OpenOCD, as wellas
+                 This is known to work with OpenOCD, as well as
                  ARM's Fast Models, or any other controlling environment
                  that implements semihosting.
 
index 5f3c55a..1c974cf 100644 (file)
@@ -136,6 +136,7 @@ textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000
 # Machine directory name.  This list is sorted alphanumerically
 # by CONFIG_* macro name.
 machine-$(CONFIG_ARCH_AT91)            += at91
+machine-$(CONFIG_ARCH_BCM2835)         += bcm2835
 machine-$(CONFIG_ARCH_BCMRING)         += bcmring
 machine-$(CONFIG_ARCH_CLPS711X)                += clps711x
 machine-$(CONFIG_ARCH_CNS3XXX)         += cns3xxx
@@ -166,7 +167,6 @@ machine-$(CONFIG_ARCH_OMAP1)                += omap1
 machine-$(CONFIG_ARCH_OMAP2PLUS)       += omap2
 machine-$(CONFIG_ARCH_ORION5X)         += orion5x
 machine-$(CONFIG_ARCH_PICOXCELL)       += picoxcell
-machine-$(CONFIG_ARCH_PNX4008)         += pnx4008
 machine-$(CONFIG_ARCH_PRIMA2)          += prima2
 machine-$(CONFIG_ARCH_PXA)             += pxa
 machine-$(CONFIG_ARCH_REALVIEW)                += realview
@@ -284,10 +284,10 @@ zImage Image xipImage bootpImage uImage: vmlinux
 zinstall uinstall install: vmlinux
        $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@
 
-%.dtb:
+%.dtb: scripts
        $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
 
-dtbs:
+dtbs: scripts
        $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@
 
 # We use MRPROPER_FILES and CLEAN_FILES now
index b8c64b8..81769c1 100644 (file)
@@ -659,10 +659,14 @@ __armv7_mmu_cache_on:
 #ifdef CONFIG_CPU_ENDIAN_BE8
                orr     r0, r0, #1 << 25        @ big-endian page tables
 #endif
+               mrcne   p15, 0, r6, c2, c0, 2   @ read ttb control reg
                orrne   r0, r0, #1              @ MMU enabled
                movne   r1, #0xfffffffd         @ domain 0 = client
+               bic     r6, r6, #1 << 31        @ 32-bit translation system
+               bic     r6, r6, #3 << 0         @ use only ttbr0
                mcrne   p15, 0, r3, c2, c0, 0   @ load page table pointer
                mcrne   p15, 0, r1, c3, c0, 0   @ load domain access control
+               mcrne   p15, 0, r6, c2, c0, 2   @ load ttb control
 #endif
                mcr     p15, 0, r0, c7, c5, 4   @ ISB
                mcr     p15, 0, r0, c1, c0, 0   @ load control register
index d081e6a..eda7b55 100644 (file)
@@ -20,6 +20,14 @@ dtb-$(CONFIG_ARCH_EXYNOS) += exynos4210-origen.dtb \
        exynos4210-smdkv310.dtb \
        exynos5250-smdk5250.dtb
 dtb-$(CONFIG_ARCH_HIGHBANK) += highbank.dtb
+dtb-$(CONFIG_ARCH_IMX5) += imx51-babbage.dtb \
+       imx53-ard.dtb \
+       imx53-evk.dtb \
+       imx53-qsb.dtb \
+       imx53-smd.dtb
+dtb-$(CONFIG_SOC_IMX6Q) += imx6q-arm2.dtb \
+       imx6q-sabrelite.dtb \
+       imx6q-sabresd.dtb
 dtb-$(CONFIG_ARCH_LPC32XX) += ea3250.dtb phy3250.dtb
 dtb-$(CONFIG_ARCH_KIRKWOOD) += kirkwood-dns320.dtb \
        kirkwood-dns325.dtb \
@@ -46,6 +54,7 @@ dtb-$(CONFIG_ARCH_MXS) += imx23-evk.dtb \
        imx23-stmp378x_devb.dtb \
        imx28-apx4devkit.dtb \
        imx28-cfa10036.dtb \
+       imx28-cfa10049.dtb \
        imx28-evk.dtb \
        imx28-m28evk.dtb \
        imx28-tx28.dtb
@@ -57,12 +66,16 @@ dtb-$(CONFIG_ARCH_SPEAR3XX)+= spear300-evb.dtb \
        spear320-evb.dtb
 dtb-$(CONFIG_ARCH_SPEAR6XX)+= spear600-evb.dtb
 dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
+       tegra20-medcom-wide.dtb \
        tegra20-paz00.dtb \
+       tegra20-plutux.dtb \
        tegra20-seaboard.dtb \
+       tegra20-tec.dtb \
        tegra20-trimslice.dtb \
        tegra20-ventana.dtb \
        tegra20-whistler.dtb \
-       tegra30-cardhu.dtb
+       tegra30-cardhu-a02.dtb \
+       tegra30-cardhu-a04.dtb
 dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2p-ca5s.dtb \
        vexpress-v2p-ca9.dtb \
        vexpress-v2p-ca15-tc1.dtb \
index a9af4db..c634f87 100644 (file)
                device_type = "memory";
                reg = <0x80000000 0x10000000>; /* 256 MB */
        };
+
+       ocp {
+               uart1: serial@44e09000 {
+                       status = "okay";
+               };
+
+               i2c1: i2c@44e0b000 {
+                       status = "okay";
+                       clock-frequency = <400000>;
+
+                       tps: tps@24 {
+                               reg = <0x24>;
+                       };
+
+               };
+       };
+};
+
+/include/ "tps65217.dtsi"
+
+&tps {
+       regulators {
+               dcdc1_reg: regulator@0 {
+                       regulator-always-on;
+               };
+
+               dcdc2_reg: regulator@1 {
+                       /* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
+                       regulator-name = "vdd_mpu";
+                       regulator-min-microvolt = <925000>;
+                       regulator-max-microvolt = <1325000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               dcdc3_reg: regulator@2 {
+                       /* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
+                       regulator-name = "vdd_core";
+                       regulator-min-microvolt = <925000>;
+                       regulator-max-microvolt = <1150000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               ldo1_reg: regulator@3 {
+                       regulator-always-on;
+               };
+
+               ldo2_reg: regulator@4 {
+                       regulator-always-on;
+               };
+
+               ldo3_reg: regulator@5 {
+                       regulator-always-on;
+               };
+
+               ldo4_reg: regulator@6 {
+                       regulator-always-on;
+               };
+       };
 };
index d6a97d9..185d632 100644 (file)
                device_type = "memory";
                reg = <0x80000000 0x10000000>; /* 256 MB */
        };
+
+       ocp {
+               uart1: serial@44e09000 {
+                       status = "okay";
+               };
+
+               i2c1: i2c@44e0b000 {
+                       status = "okay";
+                       clock-frequency = <400000>;
+
+                       tps: tps@2d {
+                               reg = <0x2d>;
+                       };
+               };
+       };
+
+       vbat: fixedregulator@0 {
+               compatible = "regulator-fixed";
+               regulator-name = "vbat";
+               regulator-min-microvolt = <5000000>;
+               regulator-max-microvolt = <5000000>;
+               regulator-boot-on;
+       };
+};
+
+/include/ "tps65910.dtsi"
+
+&tps {
+       vcc1-supply = <&vbat>;
+       vcc2-supply = <&vbat>;
+       vcc3-supply = <&vbat>;
+       vcc4-supply = <&vbat>;
+       vcc5-supply = <&vbat>;
+       vcc6-supply = <&vbat>;
+       vcc7-supply = <&vbat>;
+       vccio-supply = <&vbat>;
+
+       regulators {
+               vrtc_reg: regulator@0 {
+                       regulator-always-on;
+               };
+
+               vio_reg: regulator@1 {
+                       regulator-always-on;
+               };
+
+               vdd1_reg: regulator@2 {
+                       /* VDD_MPU voltage limits 0.95V - 1.26V with +/-4% tolerance */
+                       regulator-name = "vdd_mpu";
+                       regulator-min-microvolt = <912500>;
+                       regulator-max-microvolt = <1312500>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               vdd2_reg: regulator@3 {
+                       /* VDD_CORE voltage limits 0.95V - 1.1V with +/-4% tolerance */
+                       regulator-name = "vdd_core";
+                       regulator-min-microvolt = <912500>;
+                       regulator-max-microvolt = <1150000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+               };
+
+               vdd3_reg: regulator@4 {
+                       regulator-always-on;
+               };
+
+               vdig1_reg: regulator@5 {
+                       regulator-always-on;
+               };
+
+               vdig2_reg: regulator@6 {
+                       regulator-always-on;
+               };
+
+               vpll_reg: regulator@7 {
+                       regulator-always-on;
+               };
+
+               vdac_reg: regulator@8 {
+                       regulator-always-on;
+               };
+
+               vaux1_reg: regulator@9 {
+                       regulator-always-on;
+               };
+
+               vaux2_reg: regulator@10 {
+                       regulator-always-on;
+               };
+
+               vaux33_reg: regulator@11 {
+                       regulator-always-on;
+               };
+
+               vmmc_reg: regulator@12 {
+                       regulator-always-on;
+               };
+       };
 };
index bd0cff3..bb31bff 100644 (file)
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <1>;
+                       reg = <0x44e07000 0x1000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <96>;
                };
 
-               gpio2: gpio@4804C000 {
+               gpio2: gpio@4804c000 {
                        compatible = "ti,omap4-gpio";
                        ti,hwmods = "gpio2";
                        gpio-controller;
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <1>;
+                       reg = <0x4804c000 0x1000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <98>;
                };
 
-               gpio3: gpio@481AC000 {
+               gpio3: gpio@481ac000 {
                        compatible = "ti,omap4-gpio";
                        ti,hwmods = "gpio3";
                        gpio-controller;
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <1>;
+                       reg = <0x481ac000 0x1000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <32>;
                };
 
-               gpio4: gpio@481AE000 {
+               gpio4: gpio@481ae000 {
                        compatible = "ti,omap4-gpio";
                        ti,hwmods = "gpio4";
                        gpio-controller;
                        #gpio-cells = <2>;
                        interrupt-controller;
                        #interrupt-cells = <1>;
+                       reg = <0x481ae000 0x1000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <62>;
                };
 
-               uart1: serial@44E09000 {
+               uart1: serial@44e09000 {
                        compatible = "ti,omap3-uart";
                        ti,hwmods = "uart1";
                        clock-frequency = <48000000>;
+                       reg = <0x44e09000 0x2000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <72>;
+                       status = "disabled";
                };
 
                uart2: serial@48022000 {
                        compatible = "ti,omap3-uart";
                        ti,hwmods = "uart2";
                        clock-frequency = <48000000>;
+                       reg = <0x48022000 0x2000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <73>;
+                       status = "disabled";
                };
 
                uart3: serial@48024000 {
                        compatible = "ti,omap3-uart";
                        ti,hwmods = "uart3";
                        clock-frequency = <48000000>;
+                       reg = <0x48024000 0x2000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <74>;
+                       status = "disabled";
                };
 
-               uart4: serial@481A6000 {
+               uart4: serial@481a6000 {
                        compatible = "ti,omap3-uart";
                        ti,hwmods = "uart4";
                        clock-frequency = <48000000>;
+                       reg = <0x481a6000 0x2000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <44>;
+                       status = "disabled";
                };
 
-               uart5: serial@481A8000 {
+               uart5: serial@481a8000 {
                        compatible = "ti,omap3-uart";
                        ti,hwmods = "uart5";
                        clock-frequency = <48000000>;
+                       reg = <0x481a8000 0x2000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <45>;
+                       status = "disabled";
                };
 
-               uart6: serial@481AA000 {
+               uart6: serial@481aa000 {
                        compatible = "ti,omap3-uart";
                        ti,hwmods = "uart6";
                        clock-frequency = <48000000>;
+                       reg = <0x481aa000 0x2000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <46>;
+                       status = "disabled";
                };
 
-               i2c1: i2c@44E0B000 {
+               i2c1: i2c@44e0b000 {
                        compatible = "ti,omap4-i2c";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c1";
+                       reg = <0x44e0b000 0x1000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <70>;
+                       status = "disabled";
                };
 
-               i2c2: i2c@4802A000 {
+               i2c2: i2c@4802a000 {
                        compatible = "ti,omap4-i2c";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c2";
+                       reg = <0x4802a000 0x1000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <71>;
+                       status = "disabled";
                };
 
-               i2c3: i2c@4819C000 {
+               i2c3: i2c@4819c000 {
                        compatible = "ti,omap4-i2c";
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c3";
+                       reg = <0x4819c000 0x1000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <30>;
+                       status = "disabled";
                };
 
                wdt2: wdt@44e35000 {
                        compatible = "ti,omap3-wdt";
                        ti,hwmods = "wd_timer2";
+                       reg = <0x44e35000 0x1000>;
+                       interrupt-parent = <&intc>;
+                       interrupts = <91>;
                };
        };
 };
index 7829a4d..96514c1 100644 (file)
@@ -15,7 +15,7 @@
        compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9";
 
        chosen {
-               bootargs = "128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs";
+               bootargs = "console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs";
        };
 
        ahb {
diff --git a/arch/arm/boot/dts/bcm2835-rpi-b.dts b/arch/arm/boot/dts/bcm2835-rpi-b.dts
new file mode 100644 (file)
index 0000000..7dd860f
--- /dev/null
@@ -0,0 +1,12 @@
+/dts-v1/;
+/memreserve/ 0x0c000000 0x04000000;
+/include/ "bcm2835.dtsi"
+
+/ {
+       compatible = "raspberrypi,model-b", "brcm,bcm2835";
+       model = "Raspberry Pi Model B";
+
+       memory {
+               reg = <0 0x10000000>;
+       };
+};
diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi
new file mode 100644 (file)
index 0000000..0b61939
--- /dev/null
@@ -0,0 +1,39 @@
+/include/ "skeleton.dtsi"
+
+/ {
+       compatible = "brcm,bcm2835";
+       model = "BCM2835";
+       interrupt-parent = <&intc>;
+
+       chosen {
+               bootargs = "earlyprintk console=ttyAMA0";
+       };
+
+       soc {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x7e000000 0x20000000 0x02000000>;
+
+               timer {
+                       compatible = "brcm,bcm2835-system-timer";
+                       reg = <0x7e003000 0x1000>;
+                       interrupts = <1 0>, <1 1>, <1 2>, <1 3>;
+                       clock-frequency = <1000000>;
+               };
+
+               intc: interrupt-controller {
+                       compatible = "brcm,bcm2835-armctrl-ic";
+                       reg = <0x7e00b200 0x200>;
+                       interrupt-controller;
+                       #interrupt-cells = <2>;
+               };
+
+               uart@20201000 {
+                       compatible = "brcm,bcm2835-pl011", "arm,pl011", "arm,primecell";
+                       reg = <0x7e201000 0x1000>;
+                       interrupts = <2 25>;
+                       clock-frequency = <3000000>;
+               };
+       };
+};
index d79b28d..a4ba31b 100644 (file)
                #size-cells = <0>;
                autorepeat;
                button@21 {
-                       label = "GPIO Key UP";
+                       label = "Interrupt Key";
                        linux,code = <103>;
                        gpios = <&gpio 4 1 0>; /* GPI_P3 1 */
                };
+               key1 {
+                       label = "KEY1";
+                       linux,code = <1>;
+                       gpios = <&pca9532 0 0>;
+               };
+               key2 {
+                       label = "KEY2";
+                       linux,code = <2>;
+                       gpios = <&pca9532 1 0>;
+               };
+               key3 {
+                       label = "KEY3";
+                       linux,code = <3>;
+                       gpios = <&pca9532 2 0>;
+               };
+               key4 {
+                       label = "KEY4";
+                       linux,code = <4>;
+                       gpios = <&pca9532 3 0>;
+               };
+               joy0 {
+                       label = "Joystick Key 0";
+                       linux,code = <10>;
+                       gpios = <&gpio 2 0 0>; /* P2.0 */
+               };
+               joy1 {
+                       label = "Joystick Key 1";
+                       linux,code = <11>;
+                       gpios = <&gpio 2 1 0>; /* P2.1 */
+               };
+               joy2 {
+                       label = "Joystick Key 2";
+                       linux,code = <12>;
+                       gpios = <&gpio 2 2 0>; /* P2.2 */
+               };
+               joy3 {
+                       label = "Joystick Key 3";
+                       linux,code = <13>;
+                       gpios = <&gpio 2 3 0>; /* P2.3 */
+               };
+               joy4 {
+                       label = "Joystick Key 4";
+                       linux,code = <14>;
+                       gpios = <&gpio 2 4 0>; /* P2.4 */
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               /* LEDs on OEM Board */
+
+               led1 {
+                       gpios = <&gpio 5 14 1>; /* GPO_P3 14, GPIO 93, active low */
+                       linux,default-trigger = "timer";
+                       default-state = "off";
+               };
+
+               led2 {
+                       gpios = <&gpio 2 10 1>; /* P2.10, active low */
+                       default-state = "off";
+               };
+
+               led3 {
+                       gpios = <&gpio 2 11 1>; /* P2.11, active low */
+                       default-state = "off";
+               };
+
+               led4 {
+                       gpios = <&gpio 2 12 1>; /* P2.12, active low */
+                       default-state = "off";
+               };
+
+               /* LEDs on Base Board */
+
+               lede1 {
+                       gpios = <&pca9532 8 0>;
+                       default-state = "off";
+               };
+               lede2 {
+                       gpios = <&pca9532 9 0>;
+                       default-state = "off";
+               };
+               lede3 {
+                       gpios = <&pca9532 10 0>;
+                       default-state = "off";
+               };
+               lede4 {
+                       gpios = <&pca9532 11 0>;
+                       default-state = "off";
+               };
+               lede5 {
+                       gpios = <&pca9532 12 0>;
+                       default-state = "off";
+               };
+               lede6 {
+                       gpios = <&pca9532 13 0>;
+                       default-state = "off";
+               };
+               lede7 {
+                       gpios = <&pca9532 14 0>;
+                       default-state = "off";
+               };
+               lede8 {
+                       gpios = <&pca9532 15 0>;
+                       default-state = "off";
+               };
        };
 };
diff --git a/arch/arm/boot/dts/elpida_ecb240abacn.dtsi b/arch/arm/boot/dts/elpida_ecb240abacn.dtsi
new file mode 100644 (file)
index 0000000..f97f70f
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * Common devices used in different OMAP boards
+ */
+
+/ {
+       elpida_ECB240ABACN: lpddr2 {
+               compatible      = "Elpida,ECB240ABACN","jedec,lpddr2-s4";
+               density         = <2048>;
+               io-width        = <32>;
+
+               tRPab-min-tck   = <3>;
+               tRCD-min-tck    = <3>;
+               tWR-min-tck     = <3>;
+               tRASmin-min-tck = <3>;
+               tRRD-min-tck    = <2>;
+               tWTR-min-tck    = <2>;
+               tXP-min-tck     = <2>;
+               tRTP-min-tck    = <2>;
+               tCKE-min-tck    = <3>;
+               tCKESR-min-tck  = <3>;
+               tFAW-min-tck    = <8>;
+
+               timings_elpida_ECB240ABACN_400mhz: lpddr2-timings@0 {
+                       compatible      = "jedec,lpddr2-timings";
+                       min-freq        = <10000000>;
+                       max-freq        = <400000000>;
+                       tRPab           = <21000>;
+                       tRCD            = <18000>;
+                       tWR             = <15000>;
+                       tRAS-min        = <42000>;
+                       tRRD            = <10000>;
+                       tWTR            = <7500>;
+                       tXP             = <7500>;
+                       tRTP            = <7500>;
+                       tCKESR          = <15000>;
+                       tDQSCK-max      = <5500>;
+                       tFAW            = <50000>;
+                       tZQCS           = <90000>;
+                       tZQCL           = <360000>;
+                       tZQinit         = <1000000>;
+                       tRAS-max-ns     = <70000>;
+                       tDQSCK-max-derated = <6000>;
+               };
+
+               timings_elpida_ECB240ABACN_200mhz: lpddr2-timings@1 {
+                       compatible      = "jedec,lpddr2-timings";
+                       min-freq        = <10000000>;
+                       max-freq        = <200000000>;
+                       tRPab           = <21000>;
+                       tRCD            = <18000>;
+                       tWR             = <15000>;
+                       tRAS-min        = <42000>;
+                       tRRD            = <10000>;
+                       tWTR            = <10000>;
+                       tXP             = <7500>;
+                       tRTP            = <7500>;
+                       tCKESR          = <15000>;
+                       tDQSCK-max      = <5500>;
+                       tFAW            = <50000>;
+                       tZQCS           = <90000>;
+                       tZQCL           = <360000>;
+                       tZQinit         = <1000000>;
+                       tRAS-max-ns     = <70000>;
+                       tDQSCK-max-derated = <6000>;
+               };
+       };
+};
index e3486f4..035c13f 100644 (file)
                                pinctrl-names = "default";
                                pinctrl-0 = <&hog_pins_a>;
 
-                               hog_pins_a: hog-gpios@0 {
+                               hog_pins_a: hog@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
                                                0x1123 /* MX23_PAD_LCD_RESET__GPIO_1_18 */
                                                0x11d3 /* MX23_PAD_PWM3__GPIO_1_29 */
                                                0x11e3 /* MX23_PAD_PWM4__GPIO_1_30 */
+                                               0x2010 /* MX23_PAD_SSP1_DETECT__SSP1_DETECT */
                                        >;
                                        fsl,drive-strength = <0>;
                                        fsl,voltage = <1>;
index 20912b1..384d8b6 100644 (file)
                                bus-width = <4>;
                                status = "okay";
                        };
+
+                       pinctrl@80018000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&hog_pins_a>;
+
+                               hog_pins_a: hog@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x2013 /* MX23_PAD_SSP1_DETECT__GPIO_2_1 */
+                                               0x0113 /* MX23_PAD_GPMI_ALE__GPIO_0_17 */
+                                       >;
+                                       fsl,drive-strength = <0>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <0>;
+                               };
+                       };
                };
 
                apbx@80040000 {
                                pinctrl-0 = <&duart_pins_a>;
                                status = "okay";
                        };
+
+                       auart0: serial@8006c000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&auart0_2pins_a>;
+                               status = "okay";
+                       };
+
+                       usbphy0: usbphy@8007c000 {
+                               status = "okay";
+                       };
+               };
+       };
+
+       ahb@80080000 {
+               usb0: usb@80080000 {
+                       vbus-supply = <&reg_usb0_vbus>;
+                       status = "okay";
+               };
+       };
+
+       regulators {
+               compatible = "simple-bus";
+
+               reg_usb0_vbus: usb0_vbus {
+                       compatible = "regulator-fixed";
+                       regulator-name = "usb0_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       startup-delay-us = <300>; /* LAN9215 requires a POR of 200us minimum */
+                       gpio = <&gpio0 17 0>;
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               user {
+                       label = "green";
+                       gpios = <&gpio2 1 0>;
+                       linux,default-trigger = "default-on";
                };
        };
 };
index 757a327..85c3864 100644 (file)
@@ -36,7 +36,7 @@
                                pinctrl-names = "default";
                                pinctrl-0 = <&hog_pins_a>;
 
-                               hog_pins_a: hog-gpios@0 {
+                               hog_pins_a: hog@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
                                                0x11d3 /* MX23_PAD_PWM3__GPIO_1_29 */
index e613831..3f3b6fc 100644 (file)
@@ -52,6 +52,7 @@
                        dma-apbh@80004000 {
                                compatible = "fsl,imx23-dma-apbh";
                                reg = <0x80004000 0x2000>;
+                               clocks = <&clks 15>;
                        };
 
                        ecc@80008000 {
@@ -67,6 +68,7 @@
                                reg-names = "gpmi-nand", "bch";
                                interrupts = <13>, <56>;
                                interrupt-names = "gpmi-dma", "bch";
+                               clocks = <&clks 34>;
                                fsl,gpmi-dma-channel = <4>;
                                status = "disabled";
                        };
@@ -74,6 +76,7 @@
                        ssp0: ssp@80010000 {
                                reg = <0x80010000 0x2000>;
                                interrupts = <15 14>;
+                               clocks = <&clks 33>;
                                fsl,ssp-dma-channel = <1>;
                                status = "disabled";
                        };
                                        fsl,pull-up = <0>;
                                };
 
+                               auart0_2pins_a: auart0-2pins@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x01e2 /* MX23_PAD_I2C_SCL__AUART1_TX */
+                                               0x01f2 /* MX23_PAD_I2C_SDA__AUART1_RX */
+                                       >;
+                                       fsl,drive-strength = <0>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <0>;
+                               };
+
                                gpmi_pins_a: gpmi-nand@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
                                                0x2040 /* MX23_PAD_SSP1_DATA2__SSP1_DATA2 */
                                                0x2050 /* MX23_PAD_SSP1_DATA3__SSP1_DATA3 */
                                                0x2000 /* MX23_PAD_SSP1_CMD__SSP1_CMD */
-                                               0x2010 /* MX23_PAD_SSP1_DETECT__SSP1_DETECT */
                                                0x2060 /* MX23_PAD_SSP1_SCK__SSP1_SCK */
                                        >;
                                        fsl,drive-strength = <1>;
                        dma-apbx@80024000 {
                                compatible = "fsl,imx23-dma-apbx";
                                reg = <0x80024000 0x2000>;
+                               clocks = <&clks 16>;
                        };
 
                        dcp@80028000 {
                                compatible = "fsl,imx23-lcdif";
                                reg = <0x80030000 2000>;
                                interrupts = <46 45>;
+                               clocks = <&clks 38>;
                                status = "disabled";
                        };
 
                        ssp1: ssp@80034000 {
                                reg = <0x80034000 0x2000>;
                                interrupts = <2 20>;
+                               clocks = <&clks 33>;
                                fsl,ssp-dma-channel = <2>;
                                status = "disabled";
                        };
                        reg = <0x80040000 0x40000>;
                        ranges;
 
-                       clkctl@80040000 {
+                       clks: clkctrl@80040000 {
+                               compatible = "fsl,imx23-clkctrl";
                                reg = <0x80040000 0x2000>;
-                               status = "disabled";
+                               #clock-cells = <1>;
                        };
 
                        saif0: saif@80042000 {
                        pwm: pwm@80064000 {
                                compatible = "fsl,imx23-pwm";
                                reg = <0x80064000 0x2000>;
+                               clocks = <&clks 30>;
                                #pwm-cells = <2>;
                                fsl,pwm-number = <5>;
                                status = "disabled";
                                compatible = "fsl,imx23-auart";
                                reg = <0x8006c000 0x2000>;
                                interrupts = <24 25 23>;
+                               clocks = <&clks 32>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx23-auart";
                                reg = <0x8006e000 0x2000>;
                                interrupts = <59 60 58>;
+                               clocks = <&clks 32>;
                                status = "disabled";
                        };
 
                                compatible = "arm,pl011", "arm,primecell";
                                reg = <0x80070000 0x2000>;
                                interrupts = <0>;
+                               clocks = <&clks 32>, <&clks 16>;
+                               clock-names = "uart", "apb_pclk";
                                status = "disabled";
                        };
 
-                       usbphy@8007c000 {
+                       usbphy0: usbphy@8007c000 {
+                               compatible = "fsl,imx23-usbphy";
                                reg = <0x8007c000 0x2000>;
+                               clocks = <&clks 41>;
                                status = "disabled";
                        };
                };
                reg = <0x80080000 0x80000>;
                ranges;
 
-               usbctrl@80080000 {
+               usb0: usb@80080000 {
+                       compatible = "fsl,imx23-usb", "fsl,imx27-usb";
                        reg = <0x80080000 0x40000>;
+                       interrupts = <11>;
+                       fsl,usbphy = <&usbphy0>;
+                       clocks = <&clks 40>;
                        status = "disabled";
                };
        };
index 2b0ff60..af50469 100644 (file)
        soc {
                aipi@10000000 { /* aipi */
 
-                       wdog@10002000 {
-                               status = "okay";
-                       };
-
                        serial@1000a000 {
                                fsl,uart-has-rtscts;
                                status = "okay";
@@ -49,7 +45,7 @@
                        i2c@1001d000 {
                                clock-frequency = <400000>;
                                status = "okay";
-                               at24@4c {
+                               at24@52 {
                                        compatible = "at,24c32";
                                        pagesize = <32>;
                                        reg = <0x52>;
index 5303ab6..3e54f14 100644 (file)
@@ -62,7 +62,6 @@
                                compatible = "fsl,imx27-wdt", "fsl,imx21-wdt";
                                reg = <0x10002000 0x4000>;
                                interrupts = <27>;
-                               status = "disabled";
                        };
 
                        uart1: serial@1000a000 {
index b383417..5171667 100644 (file)
@@ -37,7 +37,7 @@
                                pinctrl-names = "default";
                                pinctrl-0 = <&hog_pins_a>;
 
-                               hog_pins_a: hog-gpios@0 {
+                               hog_pins_a: hog@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
                                                0x0113 /* MX28_PAD_GPMI_CE1N__GPIO_0_17 */
diff --git a/arch/arm/boot/dts/imx28-cfa10049.dts b/arch/arm/boot/dts/imx28-cfa10049.dts
new file mode 100644 (file)
index 0000000..05c892e
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2012 Free Electrons
+ *
+ * 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
+ */
+
+/*
+ * The CFA-10049 is an expansion board for the CFA-10036 module, thus we
+ * need to include the CFA-10036 DTS.
+ */
+/include/ "imx28-cfa10036.dts"
+
+/ {
+       model = "Crystalfontz CFA-10049 Board";
+       compatible = "crystalfontz,cfa10049", "crystalfontz,cfa10036", "fsl,imx28";
+
+       apb@80000000 {
+               apbh@80000000 {
+                       pinctrl@80018000 {
+                               spi3_pins_cfa10049: spi3-cfa10049@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x0181 /* MX28_PAD_GPMI_RDN__SSP3_SCK */
+                                               0x01c1 /* MX28_PAD_GPMI_RESETN__SSP3_CMD */
+                                               0x0111 /* MX28_PAD_GPMI_CE1N__SSP3_D3 */
+                                               0x01a2 /* MX28_PAD_GPMI_ALE__SSP3_D4 */
+                                       >;
+                                       fsl,drive-strength = <1>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <1>;
+                               };
+                       };
+
+                       ssp3: ssp@80016000 {
+                               compatible = "fsl,imx28-spi";
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&spi3_pins_cfa10049>;
+                               status = "okay";
+
+                               gpio5: gpio5@0 {
+                                       compatible = "fairchild,74hc595";
+                                       gpio-controller;
+                                       #gpio-cells = <2>;
+                                       reg = <0>;
+                                       registers-number = <2>;
+                                       spi-max-frequency = <100000>;
+                               };
+
+                               gpio6: gpio6@1 {
+                                       compatible = "fairchild,74hc595";
+                                       gpio-controller;
+                                       #gpio-cells = <2>;
+                                       reg = <1>;
+                                       registers-number = <4>;
+                                       spi-max-frequency = <100000>;
+                               };
+
+                       };
+               };
+
+               apbx@80040000 {
+                       i2c1: i2c@8005a000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&i2c1_pins_a>;
+                               status = "okay";
+                       };
+
+                       usbphy1: usbphy@8007e000 {
+                               status = "okay";
+                       };
+               };
+       };
+
+       ahb@80080000 {
+               usb1: usb@80090000 {
+                       vbus-supply = <&reg_usb1_vbus>;
+                       pinctrl-0 = <&usbphy1_pins_a>;
+                       pinctrl-names = "default";
+                       status = "okay";
+               };
+       };
+
+       regulators {
+               compatible = "simple-bus";
+
+               reg_usb1_vbus: usb1_vbus {
+                       compatible = "regulator-fixed";
+                       regulator-name = "usb1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio0 7 1>;
+               };
+       };
+};
index 773c0e8..a0ad71c 100644 (file)
                                wp-gpios = <&gpio0 28 0>;
                        };
 
+                       ssp2: ssp@80014000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx28-spi";
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&spi2_pins_a>;
+                               status = "okay";
+
+                               flash: m25p80@0 {
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       compatible = "sst,sst25vf016b";
+                                       spi-max-frequency = <40000000>;
+                                       reg = <0>;
+                               };
+                       };
+
                        pinctrl@80018000 {
                                pinctrl-names = "default";
                                pinctrl-0 = <&hog_pins_a>;
 
-                               hog_pins_a: hog-gpios@0 {
+                               hog_pins_a: hog@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
                                                0x20d3 /* MX28_PAD_SSP1_CMD__GPIO_2_13 */
                                status = "okay";
                        };
 
+                       lradc@80050000 {
+                               status = "okay";
+                       };
+
                        i2c0: i2c@80058000 {
                                pinctrl-names = "default";
                                pinctrl-0 = <&i2c0_pins_a>;
                                        VDDIO-supply = <&reg_3p3v>;
 
                                };
+
+                               at24@51 {
+                                       compatible = "at24,24c32";
+                                       pagesize = <32>;
+                                       reg = <0x51>;
+                               };
                        };
 
                        pwm: pwm@80064000 {
index 183a3fd..3bab6b0 100644 (file)
@@ -23,6 +23,8 @@
        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";
                                             &mmc0_cd_cfg
                                             &mmc0_sck_cfg>;
                                bus-width = <8>;
-                               wp-gpios = <&gpio3 10 1>;
+                               wp-gpios = <&gpio3 10 0>;
+                               vmmc-supply = <&reg_vddio_sd0>;
                                status = "okay";
                        };
 
+                       ssp2: ssp@80014000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "fsl,imx28-spi";
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&spi2_pins_a>;
+                               status = "okay";
+
+                               flash: m25p80@0 {
+                                       #address-cells = <1>;
+                                       #size-cells = <1>;
+                                       compatible = "m25p80";
+                                       spi-max-frequency = <40000000>;
+                                       reg = <0>;
+                               };
+                       };
+
                        pinctrl@80018000 {
                                pinctrl-names = "default";
                                pinctrl-0 = <&hog_pins_a>;
 
-                               hog_pins_a: hog-gpios@0 {
+                               hog_pins_a: hog@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
+                                               0x31c3 /* MX28_PAD_PWM3__GPIO_3_28 */
                                                0x30a3 /* MX28_PAD_AUART2_CTS__GPIO_3_10 */
                                                0x30b3 /* MX28_PAD_AUART2_RTS__GPIO_3_11 */
+                                               0x30c3 /* MX28_PAD_AUART3_RX__GPIO_3_12 */
+                                               0x30d3 /* MX28_PAD_AUART3_TX__GPIO_3_13 */
                                        >;
                                        fsl,drive-strength = <0>;
                                        fsl,voltage = <1>;
                        i2c0: i2c@80058000 {
                                pinctrl-names = "default";
                                pinctrl-0 = <&i2c0_pins_a>;
+                               clock-frequency = <400000>;
                                status = "okay";
 
                                sgtl5000: codec@0a {
                                };
                        };
 
+                       lradc@80050000 {
+                               status = "okay";
+                       };
+
                        duart: serial@80074000 {
                                pinctrl-names = "default";
                                pinctrl-0 = <&duart_pins_a>;
                                status = "okay";
                        };
 
-                       auart0: serial@8006a000 {
-                               pinctrl-names = "default";
-                               pinctrl-0 = <&auart0_2pins_a>;
+                       usbphy0: usbphy@8007c000 {
                                status = "okay";
                        };
 
-                       auart3: serial@80070000 {
+                       usbphy1: usbphy@8007e000 {
+                               status = "okay";
+                       };
+
+                       auart0: serial@8006a000 {
                                pinctrl-names = "default";
-                               pinctrl-0 = <&auart3_pins_a>;
+                               pinctrl-0 = <&auart0_2pins_a>;
                                status = "okay";
                        };
                };
        };
 
        ahb@80080000 {
+               usb0: usb@80080000 {
+                       vbus-supply = <&reg_usb0_vbus>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&usbphy0_pins_a>;
+                       status = "okay";
+               };
+
+               usb1: usb@80090000 {
+                       vbus-supply = <&reg_usb1_vbus>;
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&usbphy1_pins_a>;
+                       status = "okay";
+               };
+
                mac0: ethernet@800f0000 {
                        phy-mode = "rmii";
                        pinctrl-names = "default";
                        pinctrl-0 = <&mac0_pins_a>;
-                       phy-reset-gpios = <&gpio3 11 0>;
                        status = "okay";
                };
 
                        regulator-max-microvolt = <3300000>;
                        regulator-always-on;
                };
+
+               reg_vddio_sd0: vddio-sd0 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "vddio-sd0";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       gpio = <&gpio3 28 0>;
+               };
+
+               reg_usb0_vbus: usb0_vbus {
+                       compatible = "regulator-fixed";
+                       regulator-name = "usb0_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio3 12 0>;
+               };
+
+               reg_usb1_vbus: usb1_vbus {
+                       compatible = "regulator-fixed";
+                       regulator-name = "usb1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       gpio = <&gpio3 13 0>;
+               };
        };
 
        sound {
index 62bf767..37be532 100644 (file)
@@ -25,7 +25,7 @@
                                pinctrl-names = "default";
                                pinctrl-0 = <&hog_pins_a>;
 
-                               hog_pins_a: hog-gpios@0 {
+                               hog_pins_a: hog@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
                                                0x40a3 /* MX28_PAD_ENET0_RXD3__GPIO_4_10 */
                                        fsl,voltage = <1>;
                                        fsl,pull-up = <0>;
                                };
+
+                               mac0_pins_gpio: mac0-gpio-mode@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x4003 /* MX28_PAD_ENET0_MDC__GPIO_4_0 */
+                                               0x4013 /* MX28_PAD_ENET0_MDIO__GPIO_4_1 */
+                                               0x4023 /* MX28_PAD_ENET0_RX_EN__GPIO_4_2 */
+                                               0x4033 /* MX28_PAD_ENET0_RXD0__GPIO_4_3 */
+                                               0x4043 /* MX28_PAD_ENET0_RXD1__GPIO_4_4 */
+                                               0x4063 /* MX28_PAD_ENET0_TX_EN__GPIO_4_6 */
+                                               0x4073 /* MX28_PAD_ENET0_TXD0__GPIO_4_7 */
+                                               0x4083 /* MX28_PAD_ENET0_TXD1__GPIO_4_8 */
+                                               0x4103 /* MX28_PAD_ENET_CLK__GPIO_4_16 */
+                                       >;
+                                       fsl,drive-strength = <0>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <0>;
+                               };
                        };
                };
 
@@ -72,8 +90,9 @@
        ahb@80080000 {
                mac0: ethernet@800f0000 {
                        phy-mode = "rmii";
-                       pinctrl-names = "default";
+                       pinctrl-names = "default", "gpio_mode";
                        pinctrl-0 = <&mac0_pins_a>;
+                       pinctrl-1 = <&mac0_pins_gpio>;
                        status = "okay";
                };
        };
index 3fa6d19..724147e 100644 (file)
@@ -27,6 +27,8 @@
                serial2 = &auart2;
                serial3 = &auart3;
                serial4 = &auart4;
+               ethernet0 = &mac0;
+               ethernet1 = &mac1;
        };
 
        cpus {
@@ -65,6 +67,7 @@
                        dma-apbh@80004000 {
                                compatible = "fsl,imx28-dma-apbh";
                                reg = <0x80004000 0x2000>;
+                               clocks = <&clks 25>;
                        };
 
                        perfmon@80006000 {
                                reg-names = "gpmi-nand", "bch";
                                interrupts = <88>, <41>;
                                interrupt-names = "gpmi-dma", "bch";
+                               clocks = <&clks 50>;
                                fsl,gpmi-dma-channel = <4>;
                                status = "disabled";
                        };
 
                        ssp0: ssp@80010000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
                                reg = <0x80010000 0x2000>;
                                interrupts = <96 82>;
+                               clocks = <&clks 46>;
                                fsl,ssp-dma-channel = <0>;
                                status = "disabled";
                        };
 
                        ssp1: ssp@80012000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
                                reg = <0x80012000 0x2000>;
                                interrupts = <97 83>;
+                               clocks = <&clks 47>;
                                fsl,ssp-dma-channel = <1>;
                                status = "disabled";
                        };
 
                        ssp2: ssp@80014000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
                                reg = <0x80014000 0x2000>;
                                interrupts = <98 84>;
+                               clocks = <&clks 48>;
                                fsl,ssp-dma-channel = <2>;
                                status = "disabled";
                        };
 
                        ssp3: ssp@80016000 {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
                                reg = <0x80016000 0x2000>;
                                interrupts = <99 85>;
+                               clocks = <&clks 49>;
                                fsl,ssp-dma-channel = <3>;
                                status = "disabled";
                        };
                                        fsl,pull-up = <1>;
                                };
 
+                               i2c0_pins_b: i2c0@1 {
+                                       reg = <1>;
+                                       fsl,pinmux-ids = <
+                                               0x3001 /* MX28_PAD_AUART0_RX__I2C0_SCL */
+                                               0x3011 /* MX28_PAD_AUART0_TX__I2C0_SDA */
+                                       >;
+                                       fsl,drive-strength = <1>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <1>;
+                               };
+
+                               i2c1_pins_a: i2c1@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x3101 /* MX28_PAD_PWM0__I2C1_SCL */
+                                               0x3111 /* MX28_PAD_PWM1__I2C1_SDA */
+                                       >;
+                                       fsl,drive-strength = <1>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <1>;
+                               };
+
                                saif0_pins_a: saif0@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
                                        fsl,pull-up = <0>;
                                };
 
+                               pwm4_pins_a: pwm4@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x31d0 /* MX28_PAD_PWM4__PWM_4 */
+                                       >;
+                                       fsl,drive-strength = <0>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <0>;
+                               };
+
                                lcdif_24bit_pins_a: lcdif-24bit@0 {
                                        reg = <0>;
                                        fsl,pinmux-ids = <
                                        fsl,voltage = <1>;
                                        fsl,pull-up = <0>;
                                };
+
+                               spi2_pins_a: spi2@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x2100 /* MX28_PAD_SSP2_SCK__SSP2_SCK */
+                                               0x2110 /* MX28_PAD_SSP2_MOSI__SSP2_CMD */
+                                               0x2120 /* MX28_PAD_SSP2_MISO__SSP2_D0 */
+                                               0x2130 /* MX28_PAD_SSP2_SS0__SSP2_D3 */
+                                       >;
+                                       fsl,drive-strength = <1>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <1>;
+                               };
+
+                               usbphy0_pins_a: usbphy0@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x2152 /* MX28_PAD_SSP2_SS2__USB0_OVERCURRENT */
+                                       >;
+                                       fsl,drive-strength = <2>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <0>;
+                               };
+
+                               usbphy0_pins_b: usbphy0@1 {
+                                       reg = <1>;
+                                       fsl,pinmux-ids = <
+                                               0x3061 /* MX28_PAD_AUART1_CTS__USB0_OVERCURRENT */
+                                       >;
+                                       fsl,drive-strength = <2>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <0>;
+                               };
+
+                               usbphy1_pins_a: usbphy1@0 {
+                                       reg = <0>;
+                                       fsl,pinmux-ids = <
+                                               0x2142 /* MX28_PAD_SSP2_SS1__USB1_OVERCURRENT */
+                                       >;
+                                       fsl,drive-strength = <2>;
+                                       fsl,voltage = <1>;
+                                       fsl,pull-up = <0>;
+                               };
                        };
 
                        digctl@8001c000 {
                        dma-apbx@80024000 {
                                compatible = "fsl,imx28-dma-apbx";
                                reg = <0x80024000 0x2000>;
+                               clocks = <&clks 26>;
                        };
 
                        dcp@80028000 {
                                compatible = "fsl,imx28-lcdif";
                                reg = <0x80030000 0x2000>;
                                interrupts = <38 86>;
+                               clocks = <&clks 55>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";
                                reg = <0x80032000 0x2000>;
                                interrupts = <8>;
+                               clocks = <&clks 58>, <&clks 58>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx28-flexcan", "fsl,p1010-flexcan";
                                reg = <0x80034000 0x2000>;
                                interrupts = <9>;
+                               clocks = <&clks 59>, <&clks 59>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
 
                        reg = <0x80040000 0x40000>;
                        ranges;
 
-                       clkctl@80040000 {
+                       clks: clkctrl@80040000 {
+                               compatible = "fsl,imx28-clkctrl";
                                reg = <0x80040000 0x2000>;
-                               status = "disabled";
+                               #clock-cells = <1>;
                        };
 
                        saif0: saif@80042000 {
                                compatible = "fsl,imx28-saif";
                                reg = <0x80042000 0x2000>;
                                interrupts = <59 80>;
+                               clocks = <&clks 53>;
                                fsl,saif-dma-channel = <4>;
                                status = "disabled";
                        };
                                compatible = "fsl,imx28-saif";
                                reg = <0x80046000 0x2000>;
                                interrupts = <58 81>;
+                               clocks = <&clks 54>;
                                fsl,saif-dma-channel = <5>;
                                status = "disabled";
                        };
 
                        lradc@80050000 {
+                               compatible = "fsl,imx28-lradc";
                                reg = <0x80050000 0x2000>;
+                               interrupts = <10 14 15 16 17 18 19
+                                               20 21 22 23 24 25>;
                                status = "disabled";
                        };
 
                        pwm: pwm@80064000 {
                                compatible = "fsl,imx28-pwm", "fsl,imx23-pwm";
                                reg = <0x80064000 0x2000>;
+                               clocks = <&clks 44>;
                                #pwm-cells = <2>;
                                fsl,pwm-number = <8>;
                                status = "disabled";
                                compatible = "fsl,imx28-auart", "fsl,imx23-auart";
                                reg = <0x8006a000 0x2000>;
                                interrupts = <112 70 71>;
+                               clocks = <&clks 45>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx28-auart", "fsl,imx23-auart";
                                reg = <0x8006c000 0x2000>;
                                interrupts = <113 72 73>;
+                               clocks = <&clks 45>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx28-auart", "fsl,imx23-auart";
                                reg = <0x8006e000 0x2000>;
                                interrupts = <114 74 75>;
+                               clocks = <&clks 45>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx28-auart", "fsl,imx23-auart";
                                reg = <0x80070000 0x2000>;
                                interrupts = <115 76 77>;
+                               clocks = <&clks 45>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx28-auart", "fsl,imx23-auart";
                                reg = <0x80072000 0x2000>;
                                interrupts = <116 78 79>;
+                               clocks = <&clks 45>;
                                status = "disabled";
                        };
 
                                compatible = "arm,pl011", "arm,primecell";
                                reg = <0x80074000 0x1000>;
                                interrupts = <47>;
+                               clocks = <&clks 45>, <&clks 26>;
+                               clock-names = "uart", "apb_pclk";
                                status = "disabled";
                        };
 
                        usbphy0: usbphy@8007c000 {
                                compatible = "fsl,imx28-usbphy", "fsl,imx23-usbphy";
                                reg = <0x8007c000 0x2000>;
+                               clocks = <&clks 62>;
                                status = "disabled";
                        };
 
                        usbphy1: usbphy@8007e000 {
                                compatible = "fsl,imx28-usbphy", "fsl,imx23-usbphy";
                                reg = <0x8007e000 0x2000>;
+                               clocks = <&clks 63>;
                                status = "disabled";
                        };
                };
                        compatible = "fsl,imx28-usb", "fsl,imx27-usb";
                        reg = <0x80080000 0x10000>;
                        interrupts = <93>;
+                       clocks = <&clks 60>;
                        fsl,usbphy = <&usbphy0>;
                        status = "disabled";
                };
                        compatible = "fsl,imx28-usb", "fsl,imx27-usb";
                        reg = <0x80090000 0x10000>;
                        interrupts = <92>;
+                       clocks = <&clks 61>;
                        fsl,usbphy = <&usbphy1>;
                        status = "disabled";
                };
                        compatible = "fsl,imx28-fec";
                        reg = <0x800f0000 0x4000>;
                        interrupts = <101>;
+                       clocks = <&clks 57>, <&clks 57>;
+                       clock-names = "ipg", "ahb";
                        status = "disabled";
                };
 
                        compatible = "fsl,imx28-fec";
                        reg = <0x800f4000 0x4000>;
                        interrupts = <102>;
+                       clocks = <&clks 57>, <&clks 57>;
+                       clock-names = "ipg", "ahb";
                        status = "disabled";
                };
 
index 59d9789..cbd2b1c 100644 (file)
                aips@70000000 { /* aips-1 */
                        spba@70000000 {
                                esdhc@70004000 { /* ESDHC1 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc1_1>;
                                        fsl,cd-controller;
                                        fsl,wp-controller;
                                        status = "okay";
                                };
 
                                esdhc@70008000 { /* ESDHC2 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc2_1>;
                                        cd-gpios = <&gpio1 6 0>;
                                        wp-gpios = <&gpio1 5 0>;
                                        status = "okay";
                                };
 
                                uart3: serial@7000c000 {
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_uart3_1>;
                                        fsl,uart-has-rtscts;
                                        status = "okay";
                                };
 
                                ecspi@70010000 { /* ECSPI1 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_ecspi1_1>;
                                        fsl,spi-num-chipselects = <2>;
                                        cs-gpios = <&gpio4 24 0>, <&gpio4 25 0>;
                                        status = "okay";
                                };
                        };
 
-                       wdog@73f98000 { /* WDOG1 */
-                               status = "okay";
-                       };
-
                        iomuxc@73fa8000 {
-                               compatible = "fsl,imx51-iomuxc-babbage";
-                               reg = <0x73fa8000 0x4000>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_hog>;
+
+                               hog {
+                                       pinctrl_hog: hoggrp {
+                                               fsl,pins = <
+                                                       694  0x20d5     /* MX51_PAD_GPIO1_0__SD1_CD */
+                                                       697  0x20d5     /* MX51_PAD_GPIO1_1__SD1_WP */
+                                                       737  0x100      /* MX51_PAD_GPIO1_5__GPIO1_5 */
+                                                       740  0x100      /* MX51_PAD_GPIO1_6__GPIO1_6 */
+                                                       121  0x5        /* MX51_PAD_EIM_A27__GPIO2_21 */
+                                                       402  0x85       /* MX51_PAD_CSPI1_SS0__GPIO4_24 */
+                                                       405  0x85       /* MX51_PAD_CSPI1_SS1__GPIO4_25 */
+                                               >;
+                                       };
+                               };
                        };
 
                        uart1: serial@73fbc000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_uart1_1>;
                                fsl,uart-has-rtscts;
                                status = "okay";
                        };
 
                        uart2: serial@73fc0000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_uart2_1>;
                                status = "okay";
                        };
                };
 
                aips@80000000 { /* aips-2 */
-                       sdma@83fb0000 {
-                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin";
-                       };
-
                        i2c@83fc4000 { /* I2C2 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c2_1>;
                                status = "okay";
 
                                sgtl5000: codec@0a {
                        };
 
                        audmux@83fd0000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_audmux_1>;
                                status = "okay";
                        };
 
                        ethernet@83fec000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_fec_1>;
                                phy-mode = "mii";
                                status = "okay";
                        };
index aba28dc..2f71a91 100644 (file)
                                };
                        };
 
+                       usb@73f80000 {
+                               compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+                               reg = <0x73f80000 0x0200>;
+                               interrupts = <18>;
+                               status = "disabled";
+                       };
+
+                       usb@73f80200 {
+                               compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+                               reg = <0x73f80200 0x0200>;
+                               interrupts = <14>;
+                               status = "disabled";
+                       };
+
+                       usb@73f80400 {
+                               compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+                               reg = <0x73f80400 0x0200>;
+                               interrupts = <16>;
+                               status = "disabled";
+                       };
+
+                       usb@73f80600 {
+                               compatible = "fsl,imx51-usb", "fsl,imx27-usb";
+                               reg = <0x73f80600 0x0200>;
+                               interrupts = <17>;
+                               status = "disabled";
+                       };
+
                        gpio1: gpio@73f84000 {
                                compatible = "fsl,imx51-gpio", "fsl,imx35-gpio";
                                reg = <0x73f84000 0x4000>;
                                compatible = "fsl,imx51-wdt", "fsl,imx21-wdt";
                                reg = <0x73f98000 0x4000>;
                                interrupts = <58>;
-                               status = "disabled";
                        };
 
                        wdog@73f9c000 { /* WDOG2 */
                                status = "disabled";
                        };
 
+                       iomuxc@73fa8000 {
+                               compatible = "fsl,imx51-iomuxc";
+                               reg = <0x73fa8000 0x4000>;
+
+                               audmux {
+                                       pinctrl_audmux_1: audmuxgrp-1 {
+                                               fsl,pins = <
+                                                       384 0x80000000  /* MX51_PAD_AUD3_BB_TXD__AUD3_TXD */
+                                                       386 0x80000000  /* MX51_PAD_AUD3_BB_RXD__AUD3_RXD */
+                                                       389 0x80000000  /* MX51_PAD_AUD3_BB_CK__AUD3_TXC */
+                                                       391 0x80000000  /* MX51_PAD_AUD3_BB_FS__AUD3_TXFS */
+                                               >;
+                                       };
+                               };
+
+                               fec {
+                                       pinctrl_fec_1: fecgrp-1 {
+                                               fsl,pins = <
+                                                       128 0x80000000  /* MX51_PAD_EIM_EB2__FEC_MDIO */
+                                                       134 0x80000000  /* MX51_PAD_EIM_EB3__FEC_RDATA1 */
+                                                       146 0x80000000  /* MX51_PAD_EIM_CS2__FEC_RDATA2 */
+                                                       152 0x80000000  /* MX51_PAD_EIM_CS3__FEC_RDATA3 */
+                                                       158 0x80000000  /* MX51_PAD_EIM_CS4__FEC_RX_ER */
+                                                       165 0x80000000  /* MX51_PAD_EIM_CS5__FEC_CRS */
+                                                       206 0x80000000  /* MX51_PAD_NANDF_RB2__FEC_COL */
+                                                       213 0x80000000  /* MX51_PAD_NANDF_RB3__FEC_RX_CLK */
+                                                       293 0x80000000  /* MX51_PAD_NANDF_D9__FEC_RDATA0 */
+                                                       298 0x80000000  /* MX51_PAD_NANDF_D8__FEC_TDATA0 */
+                                                       225 0x80000000  /* MX51_PAD_NANDF_CS2__FEC_TX_ER */
+                                                       231 0x80000000  /* MX51_PAD_NANDF_CS3__FEC_MDC */
+                                                       237 0x80000000  /* MX51_PAD_NANDF_CS4__FEC_TDATA1 */
+                                                       243 0x80000000  /* MX51_PAD_NANDF_CS5__FEC_TDATA2 */
+                                                       250 0x80000000  /* MX51_PAD_NANDF_CS6__FEC_TDATA3 */
+                                                       255 0x80000000  /* MX51_PAD_NANDF_CS7__FEC_TX_EN */
+                                                       260 0x80000000  /* MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK */
+                                               >;
+                                       };
+                               };
+
+                               ecspi1 {
+                                       pinctrl_ecspi1_1: ecspi1grp-1 {
+                                               fsl,pins = <
+                                                       398 0x185       /* MX51_PAD_CSPI1_MISO__ECSPI1_MISO */
+                                                       394 0x185       /* MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI */
+                                                       409 0x185       /* MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK */
+                                               >;
+                                       };
+                               };
+
+                               esdhc1 {
+                                       pinctrl_esdhc1_1: esdhc1grp-1 {
+                                               fsl,pins = <
+                                                       666 0x400020d5  /* MX51_PAD_SD1_CMD__SD1_CMD */
+                                                       669 0x20d5      /* MX51_PAD_SD1_CLK__SD1_CLK */
+                                                       672 0x20d5      /* MX51_PAD_SD1_DATA0__SD1_DATA0 */
+                                                       678 0x20d5      /* MX51_PAD_SD1_DATA1__SD1_DATA1 */
+                                                       684 0x20d5      /* MX51_PAD_SD1_DATA2__SD1_DATA2 */
+                                                       691 0x20d5      /* MX51_PAD_SD1_DATA3__SD1_DATA3 */
+                                               >;
+                                       };
+                               };
+
+                               esdhc2 {
+                                       pinctrl_esdhc2_1: esdhc2grp-1 {
+                                               fsl,pins = <
+                                                       704 0x400020d5  /* MX51_PAD_SD2_CMD__SD2_CMD */
+                                                       707 0x20d5      /* MX51_PAD_SD2_CLK__SD2_CLK */
+                                                       710 0x20d5      /* MX51_PAD_SD2_DATA0__SD2_DATA0 */
+                                                       712 0x20d5      /* MX51_PAD_SD2_DATA1__SD2_DATA1 */
+                                                       715 0x20d5      /* MX51_PAD_SD2_DATA2__SD2_DATA2 */
+                                                       719 0x20d5      /* MX51_PAD_SD2_DATA3__SD2_DATA3 */
+                                               >;
+                                       };
+                               };
+
+                               i2c2 {
+                                       pinctrl_i2c2_1: i2c2grp-1 {
+                                               fsl,pins = <
+                                                       449 0x400001ed  /* MX51_PAD_KEY_COL4__I2C2_SCL */
+                                                       454 0x400001ed  /* MX51_PAD_KEY_COL5__I2C2_SDA */
+                                               >;
+                                       };
+                               };
+
+                               uart1 {
+                                       pinctrl_uart1_1: uart1grp-1 {
+                                               fsl,pins = <
+                                                       413 0x1c5       /* MX51_PAD_UART1_RXD__UART1_RXD */
+                                                       416 0x1c5       /* MX51_PAD_UART1_TXD__UART1_TXD */
+                                                       418 0x1c5       /* MX51_PAD_UART1_RTS__UART1_RTS */
+                                                       420 0x1c5       /* MX51_PAD_UART1_CTS__UART1_CTS */
+                                               >;
+                                       };
+                               };
+
+                               uart2 {
+                                       pinctrl_uart2_1: uart2grp-1 {
+                                               fsl,pins = <
+                                                       423 0x1c5       /* MX51_PAD_UART2_RXD__UART2_RXD */
+                                                       426 0x1c5       /* MX51_PAD_UART2_TXD__UART2_TXD */
+                                               >;
+                                       };
+                               };
+
+                               uart3 {
+                                       pinctrl_uart3_1: uart3grp-1 {
+                                               fsl,pins = <
+                                                       54 0x1c5        /* MX51_PAD_EIM_D25__UART3_RXD */
+                                                       59 0x1c5        /* MX51_PAD_EIM_D26__UART3_TXD */
+                                                       65 0x1c5        /* MX51_PAD_EIM_D27__UART3_RTS */
+                                                       49 0x1c5        /* MX51_PAD_EIM_D24__UART3_CTS */
+                                               >;
+                                       };
+                               };
+                       };
+
                        uart1: serial@73fbc000 {
                                compatible = "fsl,imx51-uart", "fsl,imx21-uart";
                                reg = <0x73fbc000 0x4000>;
                                compatible = "fsl,imx51-sdma", "fsl,imx35-sdma";
                                reg = <0x83fb0000 0x4000>;
                                interrupts = <6>;
+                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx51.bin";
                        };
 
                        cspi@83fc0000 {
index da895e9..4be76f2 100644 (file)
                aips@50000000 { /* AIPS1 */
                        spba@50000000 {
                                esdhc@50004000 { /* ESDHC1 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc1_2>;
                                        cd-gpios = <&gpio1 1 0>;
                                        wp-gpios = <&gpio1 9 0>;
                                        status = "okay";
                                };
                        };
 
-                       wdog@53f98000 { /* WDOG1 */
-                               status = "okay";
-                       };
-
                        iomuxc@53fa8000 {
-                               compatible = "fsl,imx53-iomuxc-ard";
-                               reg = <0x53fa8000 0x4000>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_hog>;
+
+                               hog {
+                                       pinctrl_hog: hoggrp {
+                                               fsl,pins = <
+                                                       1077 0x80000000 /* MX53_PAD_GPIO_1__GPIO1_1 */
+                                                       1085 0x80000000 /* MX53_PAD_GPIO_9__GPIO1_9 */
+                                                       486  0x80000000 /* MX53_PAD_EIM_EB3__GPIO2_31 */
+                                                       739  0x80000000 /* MX53_PAD_GPIO_10__GPIO4_0 */
+                                                       218  0x80000000 /* MX53_PAD_DISP0_DAT16__GPIO5_10 */
+                                                       226  0x80000000 /* MX53_PAD_DISP0_DAT17__GPIO5_11 */
+                                                       233  0x80000000 /* MX53_PAD_DISP0_DAT18__GPIO5_12 */
+                                                       241  0x80000000 /* MX53_PAD_DISP0_DAT19__GPIO5_13 */
+                                                       429  0x80000000 /* MX53_PAD_EIM_D16__EMI_WEIM_D_16 */
+                                                       435  0x80000000 /* MX53_PAD_EIM_D17__EMI_WEIM_D_17 */
+                                                       441  0x80000000 /* MX53_PAD_EIM_D18__EMI_WEIM_D_18 */
+                                                       448  0x80000000 /* MX53_PAD_EIM_D19__EMI_WEIM_D_19 */
+                                                       456  0x80000000 /* MX53_PAD_EIM_D20__EMI_WEIM_D_20 */
+                                                       464  0x80000000 /* MX53_PAD_EIM_D21__EMI_WEIM_D_21 */
+                                                       471  0x80000000 /* MX53_PAD_EIM_D22__EMI_WEIM_D_22 */
+                                                       477  0x80000000 /* MX53_PAD_EIM_D23__EMI_WEIM_D_23 */
+                                                       492  0x80000000 /* MX53_PAD_EIM_D24__EMI_WEIM_D_24 */
+                                                       500  0x80000000 /* MX53_PAD_EIM_D25__EMI_WEIM_D_25 */
+                                                       508  0x80000000 /* MX53_PAD_EIM_D26__EMI_WEIM_D_26 */
+                                                       516  0x80000000 /* MX53_PAD_EIM_D27__EMI_WEIM_D_27 */
+                                                       524  0x80000000 /* MX53_PAD_EIM_D28__EMI_WEIM_D_28 */
+                                                       532  0x80000000 /* MX53_PAD_EIM_D29__EMI_WEIM_D_29 */
+                                                       540  0x80000000 /* MX53_PAD_EIM_D30__EMI_WEIM_D_30 */
+                                                       548  0x80000000 /* MX53_PAD_EIM_D31__EMI_WEIM_D_31 */
+                                                       637  0x80000000 /* MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0 */
+                                                       642  0x80000000 /* MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1 */
+                                                       647  0x80000000 /* MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2 */
+                                                       652  0x80000000 /* MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3 */
+                                                       657  0x80000000 /* MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4 */
+                                                       662  0x80000000 /* MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5 */
+                                                       667  0x80000000 /* MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6 */
+                                                       611  0x80000000 /* MX53_PAD_EIM_OE__EMI_WEIM_OE */
+                                                       616  0x80000000 /* MX53_PAD_EIM_RW__EMI_WEIM_RW */
+                                                       607  0x80000000 /* MX53_PAD_EIM_CS1__EMI_WEIM_CS_1 */
+                                               >;
+                                       };
+                               };
                        };
 
                        uart1: serial@53fbc000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_uart1_2>;
                                status = "okay";
                        };
                };
-
-               aips@60000000 { /* AIPS2 */
-                       sdma@63fb0000 {
-                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
-                       };
-               };
        };
 
        eim-cs1@f4000000 {
index 9c79803..a124d1e 100644 (file)
                aips@50000000 { /* AIPS1 */
                        spba@50000000 {
                                esdhc@50004000 { /* ESDHC1 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc1_1>;
                                        cd-gpios = <&gpio3 13 0>;
                                        wp-gpios = <&gpio3 14 0>;
                                        status = "okay";
                                };
 
                                ecspi@50010000 { /* ECSPI1 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_ecspi1_1>;
                                        fsl,spi-num-chipselects = <2>;
                                        cs-gpios = <&gpio2 30 0>, <&gpio3 19 0>;
                                        status = "okay";
                                };
 
                                esdhc@50020000 { /* ESDHC3 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc3_1>;
                                        cd-gpios = <&gpio3 11 0>;
                                        wp-gpios = <&gpio3 12 0>;
                                        status = "okay";
                                };
                        };
 
-                       wdog@53f98000 { /* WDOG1 */
-                               status = "okay";
-                       };
-
                        iomuxc@53fa8000 {
-                               compatible = "fsl,imx53-iomuxc-evk";
-                               reg = <0x53fa8000 0x4000>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_hog>;
+
+                               hog {
+                                       pinctrl_hog: hoggrp {
+                                               fsl,pins = <
+                                                       424  0x80000000 /* MX53_PAD_EIM_EB2__GPIO2_30 */
+                                                       449  0x80000000 /* MX53_PAD_EIM_D19__GPIO3_19 */
+                                                       693  0x80000000 /* MX53_PAD_EIM_DA11__GPIO3_11 */
+                                                       697  0x80000000 /* MX53_PAD_EIM_DA12__GPIO3_12 */
+                                                       701  0x80000000 /* MX53_PAD_EIM_DA13__GPIO3_13 */
+                                                       705  0x80000000 /* MX53_PAD_EIM_DA14__GPIO3_14 */
+                                                       868  0x80000000 /* MX53_PAD_PATA_DA_0__GPIO7_6 */
+                                                       873  0x80000000 /* MX53_PAD_PATA_DA_1__GPIO7_7 */
+                                               >;
+                                       };
+                               };
                        };
 
                        uart1: serial@53fbc000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_uart1_1>;
                                status = "okay";
                        };
                };
 
                aips@60000000 { /* AIPS2 */
-                       sdma@63fb0000 {
-                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
-                       };
-
                        i2c@63fc4000 { /* I2C2 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c2_1>;
                                status = "okay";
 
                                pmic: mc13892@08 {
                        };
 
                        ethernet@63fec000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_fec_1>;
                                phy-mode = "rmii";
                                phy-reset-gpios = <&gpio7 6 0>;
                                status = "okay";
index 2d803a9..08948af 100644 (file)
@@ -25,6 +25,8 @@
                aips@50000000 { /* AIPS1 */
                        spba@50000000 {
                                esdhc@50004000 { /* ESDHC1 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc1_1>;
                                        cd-gpios = <&gpio3 13 0>;
                                        status = "okay";
                                };
                                };
 
                                esdhc@50020000 { /* ESDHC3 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc3_1>;
                                        cd-gpios = <&gpio3 11 0>;
                                        wp-gpios = <&gpio3 12 0>;
                                        status = "okay";
                                };
                        };
 
-                       wdog@53f98000 { /* WDOG1 */
-                               status = "okay";
-                       };
-
                        iomuxc@53fa8000 {
-                               compatible = "fsl,imx53-iomuxc-qsb";
-                               reg = <0x53fa8000 0x4000>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_hog>;
+
+                               hog {
+                                       pinctrl_hog: hoggrp {
+                                               fsl,pins = <
+                                                       1071 0x80000000 /* MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK */
+                                                       1141 0x80000000 /* MX53_PAD_GPIO_8__GPIO1_8 */
+                                                       982  0x80000000 /* MX53_PAD_PATA_DATA14__GPIO2_14 */
+                                                       989  0x80000000 /* MX53_PAD_PATA_DATA15__GPIO2_15 */
+                                                       693  0x80000000 /* MX53_PAD_EIM_DA11__GPIO3_11 */
+                                                       697  0x80000000 /* MX53_PAD_EIM_DA12__GPIO3_12 */
+                                                       701  0x80000000 /* MX53_PAD_EIM_DA13__GPIO3_13 */
+                                                       868  0x80000000 /* MX53_PAD_PATA_DA_0__GPIO7_6 */
+                                                       873  0x80000000 /* MX53_PAD_PATA_DA_1__GPIO7_7 */
+                                               >;
+                                       };
+                               };
                        };
 
                        uart1: serial@53fbc000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_uart1_1>;
                                status = "okay";
                        };
                };
 
                aips@60000000 { /* AIPS2 */
-                       sdma@63fb0000 {
-                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
-                       };
-
                        i2c@63fc4000 { /* I2C2 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c2_1>;
                                status = "okay";
 
                                sgtl5000: codec@0a {
@@ -72,6 +88,8 @@
                        };
 
                        i2c@63fc8000 { /* I2C1 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c1_1>;
                                status = "okay";
 
                                accelerometer: mma8450@1c {
                        };
 
                        audmux@63fd0000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_audmux_1>;
                                status = "okay";
                        };
 
                        ethernet@63fec000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_fec_1>;
                                phy-mode = "rmii";
                                phy-reset-gpios = <&gpio7 6 0>;
                                status = "okay";
index 0809102..06c6858 100644 (file)
                aips@50000000 { /* AIPS1 */
                        spba@50000000 {
                                esdhc@50004000 { /* ESDHC1 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc1_1>;
                                        cd-gpios = <&gpio3 13 0>;
                                        wp-gpios = <&gpio4 11 0>;
                                        status = "okay";
                                };
 
                                esdhc@50008000 { /* ESDHC2 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc2_1>;
                                        non-removable;
                                        status = "okay";
                                };
 
                                uart3: serial@5000c000 {
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_uart3_1>;
                                        fsl,uart-has-rtscts;
                                        status = "okay";
                                };
 
                                ecspi@50010000 { /* ECSPI1 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_ecspi1_1>;
                                        fsl,spi-num-chipselects = <2>;
                                        cs-gpios = <&gpio2 30 0>, <&gpio3 19 0>;
                                        status = "okay";
                                };
 
                                esdhc@50020000 { /* ESDHC3 */
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_esdhc3_1>;
                                        non-removable;
                                        status = "okay";
                                };
                        };
 
-                       wdog@53f98000 { /* WDOG1 */
-                               status = "okay";
-                       };
-
                        iomuxc@53fa8000 {
-                               compatible = "fsl,imx53-iomuxc-smd";
-                               reg = <0x53fa8000 0x4000>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_hog>;
+
+                               hog {
+                                       pinctrl_hog: hoggrp {
+                                               fsl,pins = <
+                                                       982  0x80000000 /* MX53_PAD_PATA_DATA14__GPIO2_14 */
+                                                       989  0x80000000 /* MX53_PAD_PATA_DATA15__GPIO2_15 */
+                                                       424  0x80000000 /* MX53_PAD_EIM_EB2__GPIO2_30 */
+                                                       701  0x80000000 /* MX53_PAD_EIM_DA13__GPIO3_13 */
+                                                       449  0x80000000 /* MX53_PAD_EIM_D19__GPIO3_19 */
+                                                       43   0x80000000 /* MX53_PAD_KEY_ROW2__GPIO4_11 */
+                                                       868  0x80000000 /* MX53_PAD_PATA_DA_0__GPIO7_6 */
+                                               >;
+                                       };
+                               };
                        };
 
                        uart1: serial@53fbc000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_uart1_1>;
                                status = "okay";
                        };
 
                        uart2: serial@53fc0000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_uart2_1>;
                                status = "okay";
                        };
                };
 
                aips@60000000 { /* AIPS2 */
-                       sdma@63fb0000 {
-                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
-                       };
-
                        i2c@63fc4000 { /* I2C2 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c2_1>;
                                status = "okay";
 
                                codec: sgtl5000@0a {
                        };
 
                        i2c@63fc8000 { /* I2C1 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_i2c1_1>;
                                status = "okay";
 
                                accelerometer: mma8450@1c {
                        };
 
                        ethernet@63fec000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_fec_1>;
                                phy-mode = "rmii";
                                phy-reset-gpios = <&gpio7 6 0>;
                                status = "okay";
index cd37165..221cf33 100644 (file)
                                };
                        };
 
+                       usb@53f80000 {
+                               compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+                               reg = <0x53f80000 0x0200>;
+                               interrupts = <18>;
+                               status = "disabled";
+                       };
+
+                       usb@53f80200 {
+                               compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+                               reg = <0x53f80200 0x0200>;
+                               interrupts = <14>;
+                               status = "disabled";
+                       };
+
+                       usb@53f80400 {
+                               compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+                               reg = <0x53f80400 0x0200>;
+                               interrupts = <16>;
+                               status = "disabled";
+                       };
+
+                       usb@53f80600 {
+                               compatible = "fsl,imx53-usb", "fsl,imx27-usb";
+                               reg = <0x53f80600 0x0200>;
+                               interrupts = <17>;
+                               status = "disabled";
+                       };
+
                        gpio1: gpio@53f84000 {
                                compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";
                                reg = <0x53f84000 0x4000>;
                                compatible = "fsl,imx53-wdt", "fsl,imx21-wdt";
                                reg = <0x53f98000 0x4000>;
                                interrupts = <58>;
-                               status = "disabled";
                        };
 
                        wdog@53f9c000 { /* WDOG2 */
                                status = "disabled";
                        };
 
+                       iomuxc@53fa8000 {
+                               compatible = "fsl,imx53-iomuxc";
+                               reg = <0x53fa8000 0x4000>;
+
+                               audmux {
+                                       pinctrl_audmux_1: audmuxgrp-1 {
+                                               fsl,pins = <
+                                                       10 0x80000000   /* MX53_PAD_KEY_COL0__AUDMUX_AUD5_TXC */
+                                                       17 0x80000000   /* MX53_PAD_KEY_ROW0__AUDMUX_AUD5_TXD */
+                                                       23 0x80000000   /* MX53_PAD_KEY_COL1__AUDMUX_AUD5_TXFS */
+                                                       30 0x80000000   /* MX53_PAD_KEY_ROW1__AUDMUX_AUD5_RXD */
+                                               >;
+                                       };
+                               };
+
+                               fec {
+                                       pinctrl_fec_1: fecgrp-1 {
+                                               fsl,pins = <
+                                                       820 0x80000000  /* MX53_PAD_FEC_MDC__FEC_MDC */
+                                                       779 0x80000000  /* MX53_PAD_FEC_MDIO__FEC_MDIO */
+                                                       786 0x80000000  /* MX53_PAD_FEC_REF_CLK__FEC_TX_CLK */
+                                                       791 0x80000000  /* MX53_PAD_FEC_RX_ER__FEC_RX_ER */
+                                                       796 0x80000000  /* MX53_PAD_FEC_CRS_DV__FEC_RX_DV */
+                                                       799 0x80000000  /* MX53_PAD_FEC_RXD1__FEC_RDATA_1 */
+                                                       804 0x80000000  /* MX53_PAD_FEC_RXD0__FEC_RDATA_0 */
+                                                       808 0x80000000  /* MX53_PAD_FEC_TX_EN__FEC_TX_EN */
+                                                       811 0x80000000  /* MX53_PAD_FEC_TXD1__FEC_TDATA_1 */
+                                                       816 0x80000000  /* MX53_PAD_FEC_TXD0__FEC_TDATA_0 */
+                                               >;
+                                       };
+                               };
+
+                               ecspi1 {
+                                       pinctrl_ecspi1_1: ecspi1grp-1 {
+                                               fsl,pins = <
+                                                       433 0x80000000  /* MX53_PAD_EIM_D16__ECSPI1_SCLK */
+                                                       439 0x80000000  /* MX53_PAD_EIM_D17__ECSPI1_MISO */
+                                                       445 0x80000000  /* MX53_PAD_EIM_D18__ECSPI1_MOSI */
+                                               >;
+                                       };
+                               };
+
+                               esdhc1 {
+                                       pinctrl_esdhc1_1: esdhc1grp-1 {
+                                               fsl,pins = <
+                                                       995  0x1d5      /* MX53_PAD_SD1_DATA0__ESDHC1_DAT0 */
+                                                       1000 0x1d5      /* MX53_PAD_SD1_DATA1__ESDHC1_DAT1 */
+                                                       1010 0x1d5      /* MX53_PAD_SD1_DATA2__ESDHC1_DAT2 */
+                                                       1024 0x1d5      /* MX53_PAD_SD1_DATA3__ESDHC1_DAT3 */
+                                                       1005 0x1d5      /* MX53_PAD_SD1_CMD__ESDHC1_CMD */
+                                                       1018 0x1d5      /* MX53_PAD_SD1_CLK__ESDHC1_CLK */
+                                               >;
+                                       };
+
+                                       pinctrl_esdhc1_2: esdhc1grp-2 {
+                                               fsl,pins = <
+                                                       995  0x1d5      /* MX53_PAD_SD1_DATA0__ESDHC1_DAT0 */
+                                                       1000 0x1d5      /* MX53_PAD_SD1_DATA1__ESDHC1_DAT1 */
+                                                       1010 0x1d5      /* MX53_PAD_SD1_DATA2__ESDHC1_DAT2 */
+                                                       1024 0x1d5      /* MX53_PAD_SD1_DATA3__ESDHC1_DAT3 */
+                                                       941  0x1d5      /* MX53_PAD_PATA_DATA8__ESDHC1_DAT4 */
+                                                       948  0x1d5      /* MX53_PAD_PATA_DATA9__ESDHC1_DAT5 */
+                                                       955  0x1d5      /* MX53_PAD_PATA_DATA10__ESDHC1_DAT6 */
+                                                       962  0x1d5      /* MX53_PAD_PATA_DATA11__ESDHC1_DAT7 */
+                                                       1005 0x1d5      /* MX53_PAD_SD1_CMD__ESDHC1_CMD */
+                                                       1018 0x1d5      /* MX53_PAD_SD1_CLK__ESDHC1_CLK */
+                                               >;
+                                       };
+                               };
+
+                               esdhc2 {
+                                       pinctrl_esdhc2_1: esdhc2grp-1 {
+                                               fsl,pins = <
+                                                       1038 0x1d5      /* MX53_PAD_SD2_CMD__ESDHC2_CMD */
+                                                       1032 0x1d5      /* MX53_PAD_SD2_CLK__ESDHC2_CLK */
+                                                       1062 0x1d5      /* MX53_PAD_SD2_DATA0__ESDHC2_DAT0 */
+                                                       1056 0x1d5      /* MX53_PAD_SD2_DATA1__ESDHC2_DAT1 */
+                                                       1050 0x1d5      /* MX53_PAD_SD2_DATA2__ESDHC2_DAT2 */
+                                                       1044 0x1d5      /* MX53_PAD_SD2_DATA3__ESDHC2_DAT3 */
+                                               >;
+                                       };
+                               };
+
+                               esdhc3 {
+                                       pinctrl_esdhc3_1: esdhc3grp-1 {
+                                               fsl,pins = <
+                                                       943 0x1d5       /* MX53_PAD_PATA_DATA8__ESDHC3_DAT0 */
+                                                       950 0x1d5       /* MX53_PAD_PATA_DATA9__ESDHC3_DAT1 */
+                                                       957 0x1d5       /* MX53_PAD_PATA_DATA10__ESDHC3_DAT2 */
+                                                       964 0x1d5       /* MX53_PAD_PATA_DATA11__ESDHC3_DAT3 */
+                                                       893 0x1d5       /* MX53_PAD_PATA_DATA0__ESDHC3_DAT4 */
+                                                       900 0x1d5       /* MX53_PAD_PATA_DATA1__ESDHC3_DAT5 */
+                                                       906 0x1d5       /* MX53_PAD_PATA_DATA2__ESDHC3_DAT6 */
+                                                       912 0x1d5       /* MX53_PAD_PATA_DATA3__ESDHC3_DAT7 */
+                                                       857 0x1d5       /* MX53_PAD_PATA_RESET_B__ESDHC3_CMD */
+                                                       863 0x1d5       /* MX53_PAD_PATA_IORDY__ESDHC3_CLK */
+                                               >;
+                                       };
+                               };
+
+                               i2c1 {
+                                       pinctrl_i2c1_1: i2c1grp-1 {
+                                               fsl,pins = <
+                                                       333 0xc0000000  /* MX53_PAD_CSI0_DAT8__I2C1_SDA */
+                                                       341 0xc0000000  /* MX53_PAD_CSI0_DAT9__I2C1_SCL */
+                                               >;
+                                       };
+                               };
+
+                               i2c2 {
+                                       pinctrl_i2c2_1: i2c2grp-1 {
+                                               fsl,pins = <
+                                                       61 0xc0000000   /* MX53_PAD_KEY_ROW3__I2C2_SDA */
+                                                       53 0xc0000000   /* MX53_PAD_KEY_COL3__I2C2_SCL */
+                                               >;
+                                       };
+                               };
+
+                               uart1 {
+                                       pinctrl_uart1_1: uart1grp-1 {
+                                               fsl,pins = <
+                                                       346 0x1c5       /* MX53_PAD_CSI0_DAT10__UART1_TXD_MUX */
+                                                       354 0x1c5       /* MX53_PAD_CSI0_DAT11__UART1_RXD_MUX */
+                                               >;
+                                       };
+
+                                       pinctrl_uart1_2: uart1grp-2 {
+                                               fsl,pins = <
+                                                       828 0x1c5       /* MX53_PAD_PATA_DIOW__UART1_TXD_MUX */
+                                                       832 0x1c5       /* MX53_PAD_PATA_DMACK__UART1_RXD_MUX */
+                                               >;
+                                       };
+                               };
+
+                               uart2 {
+                                       pinctrl_uart2_1: uart2grp-1 {
+                                               fsl,pins = <
+                                                       841 0x1c5       /* MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX */
+                                                       836 0x1c5       /* MX53_PAD_PATA_DMARQ__UART2_TXD_MUX */
+                                               >;
+                                       };
+                               };
+
+                               uart3 {
+                                       pinctrl_uart3_1: uart3grp-1 {
+                                               fsl,pins = <
+                                                       884 0x1c5       /* MX53_PAD_PATA_CS_0__UART3_TXD_MUX */
+                                                       888 0x1c5       /* MX53_PAD_PATA_CS_1__UART3_RXD_MUX */
+                                                       875 0x1c5       /* MX53_PAD_PATA_DA_1__UART3_CTS */
+                                                       880 0x1c5       /* MX53_PAD_PATA_DA_2__UART3_RTS */
+                                               >;
+                                       };
+                               };
+                       };
+
                        uart1: serial@53fbc000 {
                                compatible = "fsl,imx53-uart", "fsl,imx21-uart";
                                reg = <0x53fbc000 0x4000>;
                                status = "disabled";
                        };
 
+                       can1: can@53fc8000 {
+                               compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan";
+                               reg = <0x53fc8000 0x4000>;
+                               interrupts = <82>;
+                               status = "disabled";
+                       };
+
+                       can2: can@53fcc000 {
+                               compatible = "fsl,imx53-flexcan", "fsl,p1010-flexcan";
+                               reg = <0x53fcc000 0x4000>;
+                               interrupts = <83>;
+                               status = "disabled";
+                       };
+
                        gpio5: gpio@53fdc000 {
                                compatible = "fsl,imx53-gpio", "fsl,imx35-gpio";
                                reg = <0x53fdc000 0x4000>;
                                compatible = "fsl,imx53-sdma", "fsl,imx35-sdma";
                                reg = <0x63fb0000 0x4000>;
                                interrupts = <6>;
+                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx53.bin";
                        };
 
                        cspi@63fc0000 {
index d792581..15df4c1 100644 (file)
                        status = "disabled"; /* gpmi nand conflicts with SD */
                };
 
+               aips-bus@02000000 { /* AIPS1 */
+                       iomuxc@020e0000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_hog>;
+
+                               hog {
+                                       pinctrl_hog: hoggrp {
+                                               fsl,pins = <
+                                                       176  0x80000000 /* MX6Q_PAD_EIM_D25__GPIO_3_25 */
+                                                       1363 0x80000000 /* MX6Q_PAD_NANDF_CS0__GPIO_6_11 */
+                                                       1369 0x80000000 /* MX6Q_PAD_NANDF_CS1__GPIO_6_14 */
+                                               >;
+                                       };
+                               };
+                       };
+               };
+
                aips-bus@02100000 { /* AIPS2 */
                        ethernet@02188000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_enet_2>;
                                phy-mode = "rgmii";
                                status = "okay";
                        };
@@ -52,6 +71,8 @@
                        };
 
                        uart4: serial@021f0000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_uart4_1>;
                                status = "okay";
                        };
                };
index 72f30f3..d152328 100644 (file)
 
                        iomuxc@020e0000 {
                                pinctrl-names = "default";
-                               pinctrl-0 = <&pinctrl_gpio_hog>;
+                               pinctrl-0 = <&pinctrl_hog>;
 
-                               gpios {
-                                       pinctrl_gpio_hog: gpiohog {
+                               hog {
+                                       pinctrl_hog: hoggrp {
                                                fsl,pins = <
-                                                          144  0x80000000      /* MX6Q_PAD_EIM_D22__GPIO_3_22 */
-                                                          121  0x80000000      /* MX6Q_PAD_EIM_D19__GPIO_3_19 */
-                                                          953  0x80000000      /* MX6Q_PAD_GPIO_0__CCM_CLKO */
-                                                          >;
+                                                       1450 0x80000000 /* MX6Q_PAD_NANDF_D6__GPIO_2_6 */
+                                                       1458 0x80000000 /* MX6Q_PAD_NANDF_D7__GPIO_2_7 */
+                                                       121  0x80000000 /* MX6Q_PAD_EIM_D19__GPIO_3_19 */
+                                                       144  0x80000000 /* MX6Q_PAD_EIM_D22__GPIO_3_22 */
+                                                       152  0x80000000 /* MX6Q_PAD_EIM_D23__GPIO_3_23 */
+                                                       1262 0x80000000 /* MX6Q_PAD_SD3_DAT5__GPIO_7_0 */
+                                                       1270 0x1f0b0    /* MX6Q_PAD_SD3_DAT4__GPIO_7_1 */
+                                                       953  0x80000000 /* MX6Q_PAD_GPIO_0__CCM_CLKO */
+                                               >;
                                        };
                                };
                        };
@@ -63,6 +68,9 @@
                aips-bus@02100000 { /* AIPS2 */
                        usb@02184000 { /* USB OTG */
                                vbus-supply = <&reg_usb_otg_vbus>;
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_usbotg_1>;
+                               disable-over-current;
                                status = "okay";
                        };
 
                        };
 
                        ethernet@02188000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_enet_1>;
                                phy-mode = "rgmii";
                                phy-reset-gpios = <&gpio3 23 0>;
                                status = "okay";
                        };
 
                        usdhc@02198000 { /* uSDHC3 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_usdhc3_2>;
                                cd-gpios = <&gpio7 0 0>;
                                wp-gpios = <&gpio7 1 0>;
                                vmmc-supply = <&reg_3p3v>;
@@ -84,6 +96,8 @@
                        };
 
                        usdhc@0219c000 { /* uSDHC4 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_usdhc4_2>;
                                cd-gpios = <&gpio2 6 0>;
                                wp-gpios = <&gpio2 7 0>;
                                vmmc-supply = <&reg_3p3v>;
                        uart2: serial@021e8000 {
                                status = "okay";
                                pinctrl-names = "default";
-                               pinctrl-0 = <&pinctrl_serial2_1>;
+                               pinctrl-0 = <&pinctrl_uart2_1>;
                        };
 
                        i2c@021a0000 { /* I2C1 */
                                codec: sgtl5000@0a {
                                        compatible = "fsl,sgtl5000";
                                        reg = <0x0a>;
+                                       clocks = <&clks 169>;
                                        VDDA-supply = <&reg_2p5v>;
                                        VDDIO-supply = <&reg_3p3v>;
                                };
index 07509a1..e596c28 100644 (file)
        };
 
        soc {
-
                aips-bus@02000000 { /* AIPS1 */
                        spba-bus@02000000 {
                                uart1: serial@02020000 {
+                                       pinctrl-names = "default";
+                                       pinctrl-0 = <&pinctrl_uart1_1>;
                                        status = "okay";
                                };
                        };
+
+                       iomuxc@020e0000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_hog>;
+
+                               hog {
+                                       pinctrl_hog: hoggrp {
+                                               fsl,pins = <
+                                                       1402 0x80000000 /* MX6Q_PAD_NANDF_D0__GPIO_2_0 */
+                                                       1410 0x80000000 /* MX6Q_PAD_NANDF_D1__GPIO_2_1 */
+                                                       1418 0x80000000 /* MX6Q_PAD_NANDF_D2__GPIO_2_2 */
+                                                       1426 0x80000000 /* MX6Q_PAD_NANDF_D3__GPIO_2_3 */
+                                               >;
+                                       };
+                               };
+                       };
                };
 
                aips-bus@02100000 { /* AIPS2 */
                        ethernet@02188000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_enet_1>;
                                phy-mode = "rgmii";
                                status = "okay";
                        };
 
                        usdhc@02194000 { /* uSDHC2 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_usdhc2_1>;
                                cd-gpios = <&gpio2 2 0>;
                                wp-gpios = <&gpio2 3 0>;
                                status = "okay";
                        };
 
                        usdhc@02198000 { /* uSDHC3 */
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&pinctrl_usdhc3_1>;
                                cd-gpios = <&gpio2 0 0>;
                                wp-gpios = <&gpio2 1 0>;
                                status = "okay";
index fd57079..35e5895 100644 (file)
                dma-apbh@00110000 {
                        compatible = "fsl,imx6q-dma-apbh", "fsl,imx28-dma-apbh";
                        reg = <0x00110000 0x2000>;
+                       clocks = <&clks 106>;
                };
 
                gpmi-nand@00112000 {
-                      compatible = "fsl,imx6q-gpmi-nand";
-                      #address-cells = <1>;
-                      #size-cells = <1>;
-                      reg = <0x00112000 0x2000>, <0x00114000 0x2000>;
-                      reg-names = "gpmi-nand", "bch";
-                      interrupts = <0 13 0x04>, <0 15 0x04>;
-                      interrupt-names = "gpmi-dma", "bch";
-                      fsl,gpmi-dma-channel = <0>;
-                      status = "disabled";
+                       compatible = "fsl,imx6q-gpmi-nand";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x00112000 0x2000>, <0x00114000 0x2000>;
+                       reg-names = "gpmi-nand", "bch";
+                       interrupts = <0 13 0x04>, <0 15 0x04>;
+                       interrupt-names = "gpmi-dma", "bch";
+                       clocks = <&clks 152>, <&clks 153>, <&clks 151>,
+                                <&clks 150>, <&clks 149>;
+                       clock-names = "gpmi_io", "gpmi_apb", "gpmi_bch",
+                                     "gpmi_bch_apb", "per1_bch";
+                       fsl,gpmi-dma-channel = <0>;
+                       status = "disabled";
                };
 
                timer@00a00600 {
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x02008000 0x4000>;
                                        interrupts = <0 31 0x04>;
+                                       clocks = <&clks 112>, <&clks 112>;
+                                       clock-names = "ipg", "per";
                                        status = "disabled";
                                };
 
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x0200c000 0x4000>;
                                        interrupts = <0 32 0x04>;
+                                       clocks = <&clks 113>, <&clks 113>;
+                                       clock-names = "ipg", "per";
                                        status = "disabled";
                                };
 
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x02010000 0x4000>;
                                        interrupts = <0 33 0x04>;
+                                       clocks = <&clks 114>, <&clks 114>;
+                                       clock-names = "ipg", "per";
                                        status = "disabled";
                                };
 
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x02014000 0x4000>;
                                        interrupts = <0 34 0x04>;
+                                       clocks = <&clks 115>, <&clks 115>;
+                                       clock-names = "ipg", "per";
                                        status = "disabled";
                                };
 
                                        compatible = "fsl,imx6q-ecspi", "fsl,imx51-ecspi";
                                        reg = <0x02018000 0x4000>;
                                        interrupts = <0 35 0x04>;
+                                       clocks = <&clks 116>, <&clks 116>;
+                                       clock-names = "ipg", "per";
                                        status = "disabled";
                                };
 
                                        compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                        reg = <0x02020000 0x4000>;
                                        interrupts = <0 26 0x04>;
+                                       clocks = <&clks 160>, <&clks 161>;
+                                       clock-names = "ipg", "per";
                                        status = "disabled";
                                };
 
                                        compatible = "fsl,imx6q-ssi","fsl,imx21-ssi";
                                        reg = <0x02028000 0x4000>;
                                        interrupts = <0 46 0x04>;
+                                       clocks = <&clks 178>;
                                        fsl,fifo-depth = <15>;
                                        fsl,ssi-dma-events = <38 37>;
                                        status = "disabled";
                                        compatible = "fsl,imx6q-ssi","fsl,imx21-ssi";
                                        reg = <0x0202c000 0x4000>;
                                        interrupts = <0 47 0x04>;
+                                       clocks = <&clks 179>;
                                        fsl,fifo-depth = <15>;
                                        fsl,ssi-dma-events = <42 41>;
                                        status = "disabled";
                                        compatible = "fsl,imx6q-ssi","fsl,imx21-ssi";
                                        reg = <0x02030000 0x4000>;
                                        interrupts = <0 48 0x04>;
+                                       clocks = <&clks 180>;
                                        fsl,fifo-depth = <15>;
                                        fsl,ssi-dma-events = <46 45>;
                                        status = "disabled";
                                compatible = "fsl,imx6q-wdt", "fsl,imx21-wdt";
                                reg = <0x020bc000 0x4000>;
                                interrupts = <0 80 0x04>;
-                               status = "disabled";
+                               clocks = <&clks 0>;
                        };
 
                        wdog@020c0000 { /* WDOG2 */
                                compatible = "fsl,imx6q-wdt", "fsl,imx21-wdt";
                                reg = <0x020c0000 0x4000>;
                                interrupts = <0 81 0x04>;
+                               clocks = <&clks 0>;
                                status = "disabled";
                        };
 
-                       ccm@020c4000 {
+                       clks: ccm@020c4000 {
                                compatible = "fsl,imx6q-ccm";
                                reg = <0x020c4000 0x4000>;
                                interrupts = <0 87 0x04 0 88 0x04>;
+                               #clock-cells = <1>;
                        };
 
                        anatop@020c8000 {
                                compatible = "fsl,imx6q-usbphy", "fsl,imx23-usbphy";
                                reg = <0x020c9000 0x1000>;
                                interrupts = <0 44 0x04>;
+                               clocks = <&clks 182>;
                        };
 
                        usbphy2: usbphy@020ca000 {
                                compatible = "fsl,imx6q-usbphy", "fsl,imx23-usbphy";
                                reg = <0x020ca000 0x1000>;
                                interrupts = <0 45 0x04>;
+                               clocks = <&clks 183>;
                        };
 
                        snvs@020cc000 {
                                /* shared pinctrl settings */
                                audmux {
                                        pinctrl_audmux_1: audmux-1 {
-                                               fsl,pins = <18   0x80000000     /* MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD */
-                                                           1586 0x80000000     /* MX6Q_PAD_SD2_DAT3__AUDMUX_AUD4_TXC */
-                                                           11   0x80000000     /* MX6Q_PAD_SD2_DAT2__AUDMUX_AUD4_TXD */
-                                                           3    0x80000000>;   /* MX6Q_PAD_SD2_DAT1__AUDMUX_AUD4_TXFS */
+                                               fsl,pins = <
+                                                       18   0x80000000 /* MX6Q_PAD_SD2_DAT0__AUDMUX_AUD4_RXD */
+                                                       1586 0x80000000 /* MX6Q_PAD_SD2_DAT3__AUDMUX_AUD4_TXC */
+                                                       11   0x80000000 /* MX6Q_PAD_SD2_DAT2__AUDMUX_AUD4_TXD */
+                                                       3    0x80000000 /* MX6Q_PAD_SD2_DAT1__AUDMUX_AUD4_TXFS */
+                                               >;
+                                       };
+                               };
+
+                               ecspi1 {
+                                       pinctrl_ecspi1_1: ecspi1grp-1 {
+                                               fsl,pins = <
+                                                       101 0x100b1     /* MX6Q_PAD_EIM_D17__ECSPI1_MISO */
+                                                       109 0x100b1     /* MX6Q_PAD_EIM_D18__ECSPI1_MOSI */
+                                                       94  0x100b1     /* MX6Q_PAD_EIM_D16__ECSPI1_SCLK */
+                                               >;
+                                       };
+                               };
+
+                               enet {
+                                       pinctrl_enet_1: enetgrp-1 {
+                                               fsl,pins = <
+                                                       695 0x1b0b0     /* MX6Q_PAD_ENET_MDIO__ENET_MDIO */
+                                                       756 0x1b0b0     /* MX6Q_PAD_ENET_MDC__ENET_MDC */
+                                                       24  0x1b0b0     /* MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC */
+                                                       30  0x1b0b0     /* MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0 */
+                                                       34  0x1b0b0     /* MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1 */
+                                                       39  0x1b0b0     /* MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2 */
+                                                       44  0x1b0b0     /* MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3 */
+                                                       56  0x1b0b0     /* MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL */
+                                                       702 0x1b0b0     /* MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK */
+                                                       74  0x1b0b0     /* MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC */
+                                                       52  0x1b0b0     /* MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0 */
+                                                       61  0x1b0b0     /* MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1 */
+                                                       66  0x1b0b0     /* MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2 */
+                                                       70  0x1b0b0     /* MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3 */
+                                                       48  0x1b0b0     /* MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL */
+                                               >;
+                                       };
+
+                                       pinctrl_enet_2: enetgrp-2 {
+                                               fsl,pins = <
+                                                       890 0x1b0b0     /* MX6Q_PAD_KEY_COL1__ENET_MDIO */
+                                                       909 0x1b0b0     /* MX6Q_PAD_KEY_COL2__ENET_MDC */
+                                                       24  0x1b0b0     /* MX6Q_PAD_RGMII_TXC__ENET_RGMII_TXC */
+                                                       30  0x1b0b0     /* MX6Q_PAD_RGMII_TD0__ENET_RGMII_TD0 */
+                                                       34  0x1b0b0     /* MX6Q_PAD_RGMII_TD1__ENET_RGMII_TD1 */
+                                                       39  0x1b0b0     /* MX6Q_PAD_RGMII_TD2__ENET_RGMII_TD2 */
+                                                       44  0x1b0b0     /* MX6Q_PAD_RGMII_TD3__ENET_RGMII_TD3 */
+                                                       56  0x1b0b0     /* MX6Q_PAD_RGMII_TX_CTL__RGMII_TX_CTL */
+                                                       702 0x1b0b0     /* MX6Q_PAD_ENET_REF_CLK__ENET_TX_CLK */
+                                                       74  0x1b0b0     /* MX6Q_PAD_RGMII_RXC__ENET_RGMII_RXC */
+                                                       52  0x1b0b0     /* MX6Q_PAD_RGMII_RD0__ENET_RGMII_RD0 */
+                                                       61  0x1b0b0     /* MX6Q_PAD_RGMII_RD1__ENET_RGMII_RD1 */
+                                                       66  0x1b0b0     /* MX6Q_PAD_RGMII_RD2__ENET_RGMII_RD2 */
+                                                       70  0x1b0b0     /* MX6Q_PAD_RGMII_RD3__ENET_RGMII_RD3 */
+                                                       48  0x1b0b0     /* MX6Q_PAD_RGMII_RX_CTL__RGMII_RX_CTL */
+                                               >;
                                        };
                                };
 
                                gpmi-nand {
                                        pinctrl_gpmi_nand_1: gpmi-nand-1 {
-                                               fsl,pins = <1328 0xb0b1         /* MX6Q_PAD_NANDF_CLE__RAWNAND_CLE */
-                                                           1336 0xb0b1         /* MX6Q_PAD_NANDF_ALE__RAWNAND_ALE */
-                                                           1344 0xb0b1         /* MX6Q_PAD_NANDF_WP_B__RAWNAND_RESETN */
-                                                           1352 0xb000         /* MX6Q_PAD_NANDF_RB0__RAWNAND_READY0 */
-                                                           1360 0xb0b1         /* MX6Q_PAD_NANDF_CS0__RAWNAND_CE0N */
-                                                           1365 0xb0b1         /* MX6Q_PAD_NANDF_CS1__RAWNAND_CE1N */
-                                                           1371 0xb0b1         /* MX6Q_PAD_NANDF_CS2__RAWNAND_CE2N */
-                                                           1378 0xb0b1         /* MX6Q_PAD_NANDF_CS3__RAWNAND_CE3N */
-                                                           1387 0xb0b1         /* MX6Q_PAD_SD4_CMD__RAWNAND_RDN */
-                                                           1393 0xb0b1         /* MX6Q_PAD_SD4_CLK__RAWNAND_WRN */
-                                                           1397 0xb0b1         /* MX6Q_PAD_NANDF_D0__RAWNAND_D0 */
-                                                           1405 0xb0b1         /* MX6Q_PAD_NANDF_D1__RAWNAND_D1 */
-                                                           1413 0xb0b1         /* MX6Q_PAD_NANDF_D2__RAWNAND_D2 */
-                                                           1421 0xb0b1         /* MX6Q_PAD_NANDF_D3__RAWNAND_D3 */
-                                                           1429 0xb0b1         /* MX6Q_PAD_NANDF_D4__RAWNAND_D4 */
-                                                           1437 0xb0b1         /* MX6Q_PAD_NANDF_D5__RAWNAND_D5 */
-                                                           1445 0xb0b1         /* MX6Q_PAD_NANDF_D6__RAWNAND_D6 */
-                                                           1453 0xb0b1         /* MX6Q_PAD_NANDF_D7__RAWNAND_D7 */
-                                                           1463 0x00b1>;       /* MX6Q_PAD_SD4_DAT0__RAWNAND_DQS */
+                                               fsl,pins = <
+                                                       1328 0xb0b1     /* MX6Q_PAD_NANDF_CLE__RAWNAND_CLE */
+                                                       1336 0xb0b1     /* MX6Q_PAD_NANDF_ALE__RAWNAND_ALE */
+                                                       1344 0xb0b1     /* MX6Q_PAD_NANDF_WP_B__RAWNAND_RESETN */
+                                                       1352 0xb000     /* MX6Q_PAD_NANDF_RB0__RAWNAND_READY0 */
+                                                       1360 0xb0b1     /* MX6Q_PAD_NANDF_CS0__RAWNAND_CE0N */
+                                                       1365 0xb0b1     /* MX6Q_PAD_NANDF_CS1__RAWNAND_CE1N */
+                                                       1371 0xb0b1     /* MX6Q_PAD_NANDF_CS2__RAWNAND_CE2N */
+                                                       1378 0xb0b1     /* MX6Q_PAD_NANDF_CS3__RAWNAND_CE3N */
+                                                       1387 0xb0b1     /* MX6Q_PAD_SD4_CMD__RAWNAND_RDN */
+                                                       1393 0xb0b1     /* MX6Q_PAD_SD4_CLK__RAWNAND_WRN */
+                                                       1397 0xb0b1     /* MX6Q_PAD_NANDF_D0__RAWNAND_D0 */
+                                                       1405 0xb0b1     /* MX6Q_PAD_NANDF_D1__RAWNAND_D1 */
+                                                       1413 0xb0b1     /* MX6Q_PAD_NANDF_D2__RAWNAND_D2 */
+                                                       1421 0xb0b1     /* MX6Q_PAD_NANDF_D3__RAWNAND_D3 */
+                                                       1429 0xb0b1     /* MX6Q_PAD_NANDF_D4__RAWNAND_D4 */
+                                                       1437 0xb0b1     /* MX6Q_PAD_NANDF_D5__RAWNAND_D5 */
+                                                       1445 0xb0b1     /* MX6Q_PAD_NANDF_D6__RAWNAND_D6 */
+                                                       1453 0xb0b1     /* MX6Q_PAD_NANDF_D7__RAWNAND_D7 */
+                                                       1463 0x00b1     /* MX6Q_PAD_SD4_DAT0__RAWNAND_DQS */
+                                               >;
                                        };
                                };
 
                                i2c1 {
                                        pinctrl_i2c1_1: i2c1grp-1 {
-                                               fsl,pins = <137 0x4001b8b1      /* MX6Q_PAD_EIM_D21__I2C1_SCL */
-                                                           196 0x4001b8b1>;    /* MX6Q_PAD_EIM_D28__I2C1_SDA */
+                                               fsl,pins = <
+                                                       137 0x4001b8b1  /* MX6Q_PAD_EIM_D21__I2C1_SCL */
+                                                       196 0x4001b8b1  /* MX6Q_PAD_EIM_D28__I2C1_SDA */
+                                               >;
+                                       };
+                               };
+
+                               uart1 {
+                                       pinctrl_uart1_1: uart1grp-1 {
+                                               fsl,pins = <
+                                                       1140 0x1b0b1    /* MX6Q_PAD_CSI0_DAT10__UART1_TXD */
+                                                       1148 0x1b0b1    /* MX6Q_PAD_CSI0_DAT11__UART1_RXD */
+                                               >;
                                        };
                                };
 
-                               serial2 {
-                                       pinctrl_serial2_1: serial2grp-1 {
-                                               fsl,pins = <183 0x1b0b1         /* MX6Q_PAD_EIM_D26__UART2_TXD */
-                                                           191 0x1b0b1>;       /* MX6Q_PAD_EIM_D27__UART2_RXD */
+                               uart2 {
+                                       pinctrl_uart2_1: uart2grp-1 {
+                                               fsl,pins = <
+                                                       183 0x1b0b1     /* MX6Q_PAD_EIM_D26__UART2_TXD */
+                                                       191 0x1b0b1     /* MX6Q_PAD_EIM_D27__UART2_RXD */
+                                               >;
+                                       };
+                               };
+
+                               uart4 {
+                                       pinctrl_uart4_1: uart4grp-1 {
+                                               fsl,pins = <
+                                                       877 0x1b0b1     /* MX6Q_PAD_KEY_COL0__UART4_TXD */
+                                                       885 0x1b0b1     /* MX6Q_PAD_KEY_ROW0__UART4_RXD */
+                                               >;
+                                       };
+                               };
+
+                               usbotg {
+                                       pinctrl_usbotg_1: usbotggrp-1 {
+                                               fsl,pins = <
+                                                       1592 0x17059    /* MX6Q_PAD_GPIO_1__ANATOP_USBOTG_ID */
+                                               >;
+                                       };
+                               };
+
+                               usdhc2 {
+                                       pinctrl_usdhc2_1: usdhc2grp-1 {
+                                               fsl,pins = <
+                                                       1577 0x17059    /* MX6Q_PAD_SD2_CMD__USDHC2_CMD */
+                                                       1569 0x10059    /* MX6Q_PAD_SD2_CLK__USDHC2_CLK */
+                                                       16   0x17059    /* MX6Q_PAD_SD2_DAT0__USDHC2_DAT0 */
+                                                       0    0x17059    /* MX6Q_PAD_SD2_DAT1__USDHC2_DAT1 */
+                                                       8    0x17059    /* MX6Q_PAD_SD2_DAT2__USDHC2_DAT2 */
+                                                       1583 0x17059    /* MX6Q_PAD_SD2_DAT3__USDHC2_DAT3 */
+                                                       1430 0x17059    /* MX6Q_PAD_NANDF_D4__USDHC2_DAT4 */
+                                                       1438 0x17059    /* MX6Q_PAD_NANDF_D5__USDHC2_DAT5 */
+                                                       1446 0x17059    /* MX6Q_PAD_NANDF_D6__USDHC2_DAT6 */
+                                                       1454 0x17059    /* MX6Q_PAD_NANDF_D7__USDHC2_DAT7 */
+                                               >;
                                        };
                                };
 
                                usdhc3 {
                                        pinctrl_usdhc3_1: usdhc3grp-1 {
-                                               fsl,pins = <1273 0x17059        /* MX6Q_PAD_SD3_CMD__USDHC3_CMD */
-                                                           1281 0x10059        /* MX6Q_PAD_SD3_CLK__USDHC3_CLK */
-                                                           1289 0x17059        /* MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 */
-                                                           1297 0x17059        /* MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 */
-                                                           1305 0x17059        /* MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 */
-                                                           1312 0x17059        /* MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 */
-                                                           1265 0x17059        /* MX6Q_PAD_SD3_DAT4__USDHC3_DAT4 */
-                                                           1257 0x17059        /* MX6Q_PAD_SD3_DAT5__USDHC3_DAT5 */
-                                                           1249 0x17059        /* MX6Q_PAD_SD3_DAT6__USDHC3_DAT6 */
-                                                           1241 0x17059>;      /* MX6Q_PAD_SD3_DAT7__USDHC3_DAT7 */
+                                               fsl,pins = <
+                                                       1273 0x17059    /* MX6Q_PAD_SD3_CMD__USDHC3_CMD */
+                                                       1281 0x10059    /* MX6Q_PAD_SD3_CLK__USDHC3_CLK */
+                                                       1289 0x17059    /* MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 */
+                                                       1297 0x17059    /* MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 */
+                                                       1305 0x17059    /* MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 */
+                                                       1312 0x17059    /* MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 */
+                                                       1265 0x17059    /* MX6Q_PAD_SD3_DAT4__USDHC3_DAT4 */
+                                                       1257 0x17059    /* MX6Q_PAD_SD3_DAT5__USDHC3_DAT5 */
+                                                       1249 0x17059    /* MX6Q_PAD_SD3_DAT6__USDHC3_DAT6 */
+                                                       1241 0x17059    /* MX6Q_PAD_SD3_DAT7__USDHC3_DAT7 */
+                                               >;
+                                       };
+
+                                       pinctrl_usdhc3_2: usdhc3grp-2 {
+                                               fsl,pins = <
+                                                       1273 0x17059    /* MX6Q_PAD_SD3_CMD__USDHC3_CMD */
+                                                       1281 0x10059    /* MX6Q_PAD_SD3_CLK__USDHC3_CLK */
+                                                       1289 0x17059    /* MX6Q_PAD_SD3_DAT0__USDHC3_DAT0 */
+                                                       1297 0x17059    /* MX6Q_PAD_SD3_DAT1__USDHC3_DAT1 */
+                                                       1305 0x17059    /* MX6Q_PAD_SD3_DAT2__USDHC3_DAT2 */
+                                                       1312 0x17059    /* MX6Q_PAD_SD3_DAT3__USDHC3_DAT3 */
+                                               >;
                                        };
                                };
 
                                usdhc4 {
                                        pinctrl_usdhc4_1: usdhc4grp-1 {
-                                               fsl,pins = <1386 0x17059        /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
-                                                           1392 0x10059        /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
-                                                           1462 0x17059        /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
-                                                           1470 0x17059        /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
-                                                           1478 0x17059        /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
-                                                           1486 0x17059        /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
-                                                           1493 0x17059        /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
-                                                           1501 0x17059        /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
-                                                           1509 0x17059        /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
-                                                           1517 0x17059>;      /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
+                                               fsl,pins = <
+                                                       1386 0x17059    /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
+                                                       1392 0x10059    /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
+                                                       1462 0x17059    /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
+                                                       1470 0x17059    /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
+                                                       1478 0x17059    /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
+                                                       1486 0x17059    /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
+                                                       1493 0x17059    /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */
+                                                       1501 0x17059    /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */
+                                                       1509 0x17059    /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */
+                                                       1517 0x17059    /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */
+                                               >;
                                        };
-                               };
 
-                               ecspi1 {
-                                       pinctrl_ecspi1_1: ecspi1grp-1 {
-                                               fsl,pins = <101 0x100b1         /* MX6Q_PAD_EIM_D17__ECSPI1_MISO */
-                                                           109 0x100b1         /* MX6Q_PAD_EIM_D18__ECSPI1_MOSI */
-                                                           94  0x100b1>;       /* MX6Q_PAD_EIM_D16__ECSPI1_SCLK */
+                                       pinctrl_usdhc4_2: usdhc4grp-2 {
+                                               fsl,pins = <
+                                                       1386 0x17059    /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */
+                                                       1392 0x10059    /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */
+                                                       1462 0x17059    /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */
+                                                       1470 0x17059    /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */
+                                                       1478 0x17059    /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */
+                                                       1486 0x17059    /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */
+                                               >;
                                        };
                                };
                        };
                                compatible = "fsl,imx6q-sdma", "fsl,imx35-sdma";
                                reg = <0x020ec000 0x4000>;
                                interrupts = <0 2 0x04>;
+                               clocks = <&clks 155>, <&clks 155>;
+                               clock-names = "ipg", "ahb";
+                               fsl,sdma-ram-script-name = "imx/sdma/sdma-imx6q-to1.bin";
                        };
                };
 
                                compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
                                reg = <0x02184000 0x200>;
                                interrupts = <0 43 0x04>;
+                               clocks = <&clks 162>;
                                fsl,usbphy = <&usbphy1>;
+                               fsl,usbmisc = <&usbmisc 0>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
                                reg = <0x02184200 0x200>;
                                interrupts = <0 40 0x04>;
+                               clocks = <&clks 162>;
                                fsl,usbphy = <&usbphy2>;
+                               fsl,usbmisc = <&usbmisc 1>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
                                reg = <0x02184400 0x200>;
                                interrupts = <0 41 0x04>;
+                               clocks = <&clks 162>;
+                               fsl,usbmisc = <&usbmisc 2>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-usb", "fsl,imx27-usb";
                                reg = <0x02184600 0x200>;
                                interrupts = <0 42 0x04>;
+                               clocks = <&clks 162>;
+                               fsl,usbmisc = <&usbmisc 3>;
                                status = "disabled";
                        };
 
+                       usbmisc: usbmisc@02184800 {
+                               #index-cells = <1>;
+                               compatible = "fsl,imx6q-usbmisc";
+                               reg = <0x02184800 0x200>;
+                               clocks = <&clks 162>;
+                       };
+
                        ethernet@02188000 {
                                compatible = "fsl,imx6q-fec";
                                reg = <0x02188000 0x4000>;
                                interrupts = <0 118 0x04 0 119 0x04>;
+                               clocks = <&clks 117>, <&clks 117>;
+                               clock-names = "ipg", "ahb";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-usdhc";
                                reg = <0x02190000 0x4000>;
                                interrupts = <0 22 0x04>;
+                               clocks = <&clks 163>, <&clks 163>, <&clks 163>;
+                               clock-names = "ipg", "ahb", "per";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-usdhc";
                                reg = <0x02194000 0x4000>;
                                interrupts = <0 23 0x04>;
+                               clocks = <&clks 164>, <&clks 164>, <&clks 164>;
+                               clock-names = "ipg", "ahb", "per";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-usdhc";
                                reg = <0x02198000 0x4000>;
                                interrupts = <0 24 0x04>;
+                               clocks = <&clks 165>, <&clks 165>, <&clks 165>;
+                               clock-names = "ipg", "ahb", "per";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-usdhc";
                                reg = <0x0219c000 0x4000>;
                                interrupts = <0 25 0x04>;
+                               clocks = <&clks 166>, <&clks 166>, <&clks 166>;
+                               clock-names = "ipg", "ahb", "per";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-i2c", "fsl,imx1-i2c";
                                reg = <0x021a0000 0x4000>;
                                interrupts = <0 36 0x04>;
+                               clocks = <&clks 125>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-i2c", "fsl,imx1-i2c";
                                reg = <0x021a4000 0x4000>;
                                interrupts = <0 37 0x04>;
+                               clocks = <&clks 126>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-i2c", "fsl,imx1-i2c";
                                reg = <0x021a8000 0x4000>;
                                interrupts = <0 38 0x04>;
+                               clocks = <&clks 127>;
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                reg = <0x021e8000 0x4000>;
                                interrupts = <0 27 0x04>;
+                               clocks = <&clks 160>, <&clks 161>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                reg = <0x021ec000 0x4000>;
                                interrupts = <0 28 0x04>;
+                               clocks = <&clks 160>, <&clks 161>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                reg = <0x021f0000 0x4000>;
                                interrupts = <0 29 0x04>;
+                               clocks = <&clks 160>, <&clks 161>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
 
                                compatible = "fsl,imx6q-uart", "fsl,imx21-uart";
                                reg = <0x021f4000 0x4000>;
                                interrupts = <0 30 0x04>;
+                               clocks = <&clks 160>, <&clks 161>;
+                               clock-names = "ipg", "per";
                                status = "disabled";
                        };
                };
index 80f74e2..0514fb4 100644 (file)
                interrupt-parent = <&intc>;
                ranges;
 
+               L2: l2-cache {
+                       compatible = "marvell,tauros2-cache";
+                       marvell,tauros2-cache-features = <0x3>;
+               };
+
                axi@d4200000 {  /* AXI */
                        compatible = "mrvl,axi-bus", "simple-bus";
                        #address-cells = <1>;
index 45bc4bb..31f2157 100644 (file)
@@ -7,7 +7,7 @@
        compatible = "qcom,msm8660-surf", "qcom,msm8660";
        interrupt-parent = <&intc>;
 
-       intc: interrupt-controller@02080000 {
+       intc: interrupt-controller@2080000 {
                compatible = "qcom,msm-8660-qgic";
                interrupt-controller;
                #interrupt-cells = <3>;
                      < 0x02081000 0x1000 >;
        };
 
+       timer@2000004 {
+               compatible = "qcom,msm-gpt", "qcom,msm-timer";
+               interrupts = <1 1 0x301>;
+               reg = <0x02000004 0x10>;
+               clock-frequency = <32768>;
+               cpu-offset = <0x40000>;
+       };
+
+       timer@2000024 {
+               compatible = "qcom,msm-dgt", "qcom,msm-timer";
+               interrupts = <1 0 0x301>;
+               reg = <0x02000024 0x10>,
+                     <0x02000034 0x4>;
+               clock-frequency = <6750000>;
+               cpu-offset = <0x40000>;
+       };
+
        serial@19c400000 {
                compatible = "qcom,msm-hsuart", "qcom,msm-uart";
                reg = <0x19c40000 0x1000>,
diff --git a/arch/arm/boot/dts/msm8960-cdp.dts b/arch/arm/boot/dts/msm8960-cdp.dts
new file mode 100644 (file)
index 0000000..9e621b5
--- /dev/null
@@ -0,0 +1,41 @@
+/dts-v1/;
+
+/include/ "skeleton.dtsi"
+
+/ {
+       model = "Qualcomm MSM8960 CDP";
+       compatible = "qcom,msm8960-cdp", "qcom,msm8960";
+       interrupt-parent = <&intc>;
+
+       intc: interrupt-controller@2000000 {
+               compatible = "qcom,msm-qgic2";
+               interrupt-controller;
+               #interrupt-cells = <3>;
+               reg = < 0x02000000 0x1000 >,
+                     < 0x02002000 0x1000 >;
+       };
+
+       timer@200a004 {
+               compatible = "qcom,msm-gpt", "qcom,msm-timer";
+               interrupts = <1 2 0x301>;
+               reg = <0x0200a004 0x10>;
+               clock-frequency = <32768>;
+               cpu-offset = <0x80000>;
+       };
+
+       timer@200a024 {
+               compatible = "qcom,msm-dgt", "qcom,msm-timer";
+               interrupts = <1 1 0x301>;
+               reg = <0x0200a024 0x10>,
+                     <0x0200a034 0x4>;
+               clock-frequency = <6750000>;
+               cpu-offset = <0x80000>;
+       };
+
+       serial@19c400000 {
+               compatible = "qcom,msm-hsuart", "qcom,msm-uart";
+               reg = <0x16440000 0x1000>,
+                     <0x16400000 0x1000>;
+               interrupts = <0 154 0x0>;
+       };
+};
index 25b50b7..77b84e1 100644 (file)
@@ -7,7 +7,7 @@
  */
 /dts-v1/;
 
-/include/ "omap2.dtsi"
+/include/ "omap2420.dtsi"
 
 / {
        model = "TI OMAP2420 H4 board";
diff --git a/arch/arm/boot/dts/omap2420.dtsi b/arch/arm/boot/dts/omap2420.dtsi
new file mode 100644 (file)
index 0000000..bfd76b4
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Device Tree Source for OMAP2420 SoC
+ *
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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/ "omap2.dtsi"
+
+/ {
+       compatible = "ti,omap2420", "ti,omap2";
+
+       ocp {
+               omap2420_pmx: pinmux@48000030 {
+                       compatible = "ti,omap2420-padconf", "pinctrl-single";
+                       reg = <0x48000030 0x0113>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       pinctrl-single,register-width = <8>;
+                       pinctrl-single,function-mask = <0x3f>;
+               };
+
+               mcbsp1: mcbsp@48074000 {
+                       compatible = "ti,omap2420-mcbsp";
+                       reg = <0x48074000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <59>, /* TX interrupt */
+                                    <60>; /* RX interrupt */
+                       interrupt-names = "tx", "rx";
+                       interrupt-parent = <&intc>;
+                       ti,hwmods = "mcbsp1";
+               };
+
+               mcbsp2: mcbsp@48076000 {
+                       compatible = "ti,omap2420-mcbsp";
+                       reg = <0x48076000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <62>, /* TX interrupt */
+                                    <63>; /* RX interrupt */
+                       interrupt-names = "tx", "rx";
+                       interrupt-parent = <&intc>;
+                       ti,hwmods = "mcbsp2";
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/omap2430.dtsi b/arch/arm/boot/dts/omap2430.dtsi
new file mode 100644 (file)
index 0000000..4565d97
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Device Tree Source for OMAP243x SoC
+ *
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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/ "omap2.dtsi"
+
+/ {
+       compatible = "ti,omap2430", "ti,omap2";
+
+       ocp {
+               omap2430_pmx: pinmux@49002030 {
+                       compatible = "ti,omap2430-padconf", "pinctrl-single";
+                       reg = <0x49002030 0x0154>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       pinctrl-single,register-width = <8>;
+                       pinctrl-single,function-mask = <0x3f>;
+               };
+
+               mcbsp1: mcbsp@48074000 {
+                       compatible = "ti,omap2430-mcbsp";
+                       reg = <0x48074000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <64>, /* OCP compliant interrupt */
+                                    <59>, /* TX interrupt */
+                                    <60>, /* RX interrupt */
+                                    <61>; /* RX overflow interrupt */
+                       interrupt-names = "common", "tx", "rx", "rx_overflow";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp1";
+               };
+
+               mcbsp2: mcbsp@48076000 {
+                       compatible = "ti,omap2430-mcbsp";
+                       reg = <0x48076000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <16>, /* OCP compliant interrupt */
+                                    <62>, /* TX interrupt */
+                                    <63>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp2";
+               };
+
+               mcbsp3: mcbsp@4808c000 {
+                       compatible = "ti,omap2430-mcbsp";
+                       reg = <0x4808c000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <17>, /* OCP compliant interrupt */
+                                    <89>, /* TX interrupt */
+                                    <90>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp3";
+               };
+
+               mcbsp4: mcbsp@4808e000 {
+                       compatible = "ti,omap2430-mcbsp";
+                       reg = <0x4808e000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <18>, /* OCP compliant interrupt */
+                                    <54>, /* TX interrupt */
+                                    <55>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp4";
+               };
+
+               mcbsp5: mcbsp@48096000 {
+                       compatible = "ti,omap2430-mcbsp";
+                       reg = <0x48096000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <19>, /* OCP compliant interrupt */
+                                    <81>, /* TX interrupt */
+                                    <82>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp5";
+               };
+       };
+};
similarity index 52%
rename from arch/arm/boot/dts/omap3-beagle.dts
rename to arch/arm/boot/dts/omap3-beagle-xm.dts
index cdcb98c..c38cf76 100644 (file)
@@ -7,16 +7,44 @@
  */
 /dts-v1/;
 
-/include/ "omap3.dtsi"
+/include/ "omap36xx.dtsi"
 
 / {
-       model = "TI OMAP3 BeagleBoard";
-       compatible = "ti,omap3-beagle", "ti,omap3";
+       model = "TI OMAP3 BeagleBoard xM";
+       compatible = "ti,omap3-beagle-xm, ti,omap3-beagle", "ti,omap3";
 
        memory {
                device_type = "memory";
                reg = <0x80000000 0x20000000>; /* 512 MB */
        };
+
+       leds {
+               compatible = "gpio-leds";
+               pmu_stat {
+                       label = "beagleboard::pmu_stat";
+                       gpios = <&twl_gpio 19 0>; /* LEDB */
+               };
+
+               heartbeat {
+                       label = "beagleboard::usr0";
+                       gpios = <&gpio5 22 0>; /* 150 -> D6 LED */
+                       linux,default-trigger = "heartbeat";
+               };
+
+               mmc {
+                       label = "beagleboard::usr1";
+                       gpios = <&gpio5 21 0>; /* 149 -> D7 LED */
+                       linux,default-trigger = "mmc0";
+               };
+       };
+
+       sound {
+               compatible = "ti,omap-twl4030";
+               ti,model = "omap3beagle";
+
+               ti,mcbsp = <&mcbsp2>;
+               ti,codec = <&twl_audio>;
+       };
 };
 
 &i2c1 {
                interrupts = <7>; /* SYS_NIRQ cascaded to intc */
                interrupt-parent = <&intc>;
 
-               vsim: regulator@10 {
+               vsim: regulator-vsim {
                        compatible = "ti,twl4030-vsim";
                        regulator-min-microvolt = <1800000>;
                        regulator-max-microvolt = <3000000>;
                };
+
+               twl_audio: audio {
+                       compatible = "ti,twl4030-audio";
+                       codec {
+                       };
+               };
        };
 };
 
 &mmc3 {
        status = "disabled";
 };
+
+&twl_gpio {
+       ti,use-leds;
+       /* pullups: BIT(1) */
+       ti,pullups = <0x000002>;
+       /*
+        * pulldowns:
+        * BIT(2), BIT(6), BIT(7), BIT(8), BIT(13)
+        * BIT(15), BIT(16), BIT(17)
+        */
+       ti,pulldowns = <0x03a1c4>;
+};
index f349ee9..e8ba1c2 100644 (file)
                device_type = "memory";
                reg = <0x80000000 0x10000000>; /* 256 MB */
        };
+
+       leds {
+               compatible = "gpio-leds";
+               ledb {
+                       label = "omap3evm::ledb";
+                       gpios = <&twl_gpio 19 0>; /* LEDB */
+                       linux,default-trigger = "default-on";
+               };
+       };
 };
 
 &i2c1 {
@@ -46,3 +55,7 @@
                reg = <0x5c>;
        };
 };
+
+&twl_gpio {
+       ti,use-leds;
+};
diff --git a/arch/arm/boot/dts/omap3-overo.dtsi b/arch/arm/boot/dts/omap3-overo.dtsi
new file mode 100644 (file)
index 0000000..89808ce
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group
+ *
+ * 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.
+ */
+
+/*
+ * The Gumstix Overo must be combined with an expansion board.
+ */
+/dts-v1/;
+
+/include/ "omap3.dtsi"
+
+/ {
+       leds {
+               compatible = "gpio-leds";
+               overo {
+                       label = "overo:blue:COM";
+                       gpios = <&twl_gpio 19 0>;
+                       linux,default-trigger = "mmc0";
+               };
+       };
+};
+
+&i2c1 {
+       clock-frequency = <2600000>;
+
+       twl: twl@48 {
+               reg = <0x48>;
+               interrupts = <7>; /* SYS_NIRQ cascaded to intc */
+               interrupt-parent = <&intc>;
+       };
+};
+
+/include/ "twl4030.dtsi"
+
+/* i2c2 pins are used for gpio */
+&i2c2 {
+       status = "disabled";
+};
+
+/* on board microSD slot */
+&mmc1 {
+       vmmc-supply = <&vmmc1>;
+       bus-width = <4>;
+};
+
+/* optional on board WiFi */
+&mmc2 {
+       bus-width = <4>;
+};
+
+&twl_gpio {
+       ti,use-leds;
+};
diff --git a/arch/arm/boot/dts/omap3-tobi.dts b/arch/arm/boot/dts/omap3-tobi.dts
new file mode 100644 (file)
index 0000000..a13d12d
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group
+ *
+ * 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.
+ */
+
+/*
+ * Tobi expansion board is manufactured by Gumstix Inc.
+ */
+
+/include/ "omap3-overo.dtsi"
+
+/ {
+       model = "TI OMAP3 Gumstix Overo on Tobi";
+       compatible = "ti,omap3-tobi", "ti,omap3-overo", "ti,omap3";
+
+       leds {
+               compatible = "gpio-leds";
+               heartbeat {
+                       label = "overo:red:gpio21";
+                       gpios = <&gpio1 21 0>;
+                       linux,default-trigger = "heartbeat";
+               };
+       };
+};
+
+&i2c3 {
+       clock-frequency = <100000>;
+};
+
+&mmc3 {
+       status = "disabled";
+};
index 8109471..f38ea87 100644 (file)
@@ -17,7 +17,6 @@
                serial0 = &uart1;
                serial1 = &uart2;
                serial2 = &uart3;
-               serial3 = &uart4;
        };
 
        cpus {
                        reg = <0x48200000 0x1000>;
                };
 
+               omap3_pmx_core: pinmux@48002030 {
+                       compatible = "ti,omap3-padconf", "pinctrl-single";
+                       reg = <0x48002030 0x05cc>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       pinctrl-single,register-width = <16>;
+                       pinctrl-single,function-mask = <0x7fff>;
+               };
+
+               omap3_pmx_wkup: pinmux@0x48002a58 {
+                       compatible = "ti,omap3-padconf", "pinctrl-single";
+                       reg = <0x48002a58 0x5c>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       pinctrl-single,register-width = <16>;
+                       pinctrl-single,function-mask = <0x7fff>;
+               };
+
                gpio1: gpio@48310000 {
                        compatible = "ti,omap3-gpio";
                        ti,hwmods = "gpio1";
                        clock-frequency = <48000000>;
                };
 
-               uart4: serial@49042000 {
-                       compatible = "ti,omap3-uart";
-                       ti,hwmods = "uart4";
-                       clock-frequency = <48000000>;
-               };
-
                i2c1: i2c@48070000 {
                        compatible = "ti,omap3-i2c";
                        #address-cells = <1>;
                        compatible = "ti,omap3-wdt";
                        ti,hwmods = "wd_timer2";
                };
+
+               mcbsp1: mcbsp@48074000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x48074000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <16>, /* OCP compliant interrupt */
+                                    <59>, /* TX interrupt */
+                                    <60>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp1";
+               };
+
+               mcbsp2: mcbsp@49022000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x49022000 0xff>,
+                             <0x49028000 0xff>;
+                       reg-names = "mpu", "sidetone";
+                       interrupts = <17>, /* OCP compliant interrupt */
+                                    <62>, /* TX interrupt */
+                                    <63>, /* RX interrupt */
+                                    <4>;  /* Sidetone */
+                       interrupt-names = "common", "tx", "rx", "sidetone";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <1280>;
+                       ti,hwmods = "mcbsp2";
+               };
+
+               mcbsp3: mcbsp@49024000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x49024000 0xff>,
+                             <0x4902a000 0xff>;
+                       reg-names = "mpu", "sidetone";
+                       interrupts = <22>, /* OCP compliant interrupt */
+                                    <89>, /* TX interrupt */
+                                    <90>, /* RX interrupt */
+                                    <5>;  /* Sidetone */
+                       interrupt-names = "common", "tx", "rx", "sidetone";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp3";
+               };
+
+               mcbsp4: mcbsp@49026000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x49026000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <23>, /* OCP compliant interrupt */
+                                    <54>, /* TX interrupt */
+                                    <55>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp4";
+               };
+
+               mcbsp5: mcbsp@48096000 {
+                       compatible = "ti,omap3-mcbsp";
+                       reg = <0x48096000 0xff>;
+                       reg-names = "mpu";
+                       interrupts = <27>, /* OCP compliant interrupt */
+                                    <81>, /* TX interrupt */
+                                    <82>; /* RX interrupt */
+                       interrupt-names = "common", "tx", "rx";
+                       interrupt-parent = <&intc>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp5";
+               };
        };
 };
diff --git a/arch/arm/boot/dts/omap36xx.dtsi b/arch/arm/boot/dts/omap36xx.dtsi
new file mode 100644 (file)
index 0000000..96bf028
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Device Tree Source for OMAP3 SoC
+ *
+ * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.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/ "omap3.dtsi"
+
+/ {
+       aliases {
+               serial3 = &uart4;
+       };
+
+       ocp {
+               uart4: serial@49042000 {
+                       compatible = "ti,omap3-uart";
+                       ti,hwmods = "uart4";
+                       clock-frequency = <48000000>;
+               };
+       };
+};
index 9880c12..20b966e 100644 (file)
@@ -8,6 +8,7 @@
 /dts-v1/;
 
 /include/ "omap4.dtsi"
+/include/ "elpida_ecb240abacn.dtsi"
 
 / {
        model = "TI OMAP4 PandaBoard";
        ti,non-removable;
        bus-width = <4>;
 };
+
+&emif1 {
+       cs1-used;
+       device-handle = <&elpida_ECB240ABACN>;
+};
+
+&emif2 {
+       cs1-used;
+       device-handle = <&elpida_ECB240ABACN>;
+};
index 72216e9..94a23b3 100644 (file)
@@ -8,6 +8,7 @@
 /dts-v1/;
 
 /include/ "omap4.dtsi"
+/include/ "elpida_ecb240abacn.dtsi"
 
 / {
        model = "TI OMAP4 SDP board";
@@ -18,7 +19,7 @@
                reg = <0x80000000 0x40000000>; /* 1 GB */
        };
 
-       vdd_eth: fixedregulator@0 {
+       vdd_eth: fixedregulator-vdd-eth {
                compatible = "regulator-fixed";
                regulator-name = "VDD_ETH";
                regulator-min-microvolt = <3300000>;
@@ -28,7 +29,7 @@
                regulator-boot-on;
        };
 
-       vbat: fixedregulator@2 {
+       vbat: fixedregulator-vbat {
                compatible = "regulator-fixed";
                regulator-name = "VBAT";
                regulator-min-microvolt = <3750000>;
        };
 };
 
+&omap4_pmx_core {
+       uart2_pins: pinmux_uart2_pins {
+               pinctrl-single,pins = <
+                       0xd8 0x118      /* uart2_cts.uart2_cts INPUT_PULLUP | MODE0 */
+                       0xda 0          /* uart2_rts.uart2_rts OUTPUT | MODE0 */
+                       0xdc 0x118      /* uart2_rx.uart2_rx INPUT_PULLUP | MODE0 */
+                       0xde 0          /* uart2_tx.uart2_tx OUTPUT | MODE0 */
+               >;
+       };
+
+       uart3_pins: pinmux_uart3_pins {
+               pinctrl-single,pins = <
+                       0x100 0x118     /* uart3_cts_rctx.uart3_cts_rctx INPUT_PULLUP | MODE0 */
+                       0x102 0         /* uart3_rts_sd.uart3_rts_sd OUTPUT | MODE0 */
+                       0x104 0x100     /* uart3_rx_irrx.uart3_rx_irrx INPUT | MODE0 */
+                       0x106 0         /* uart3_tx_irtx.uart3_tx_irtx OUTPUT | MODE0 */
+               >;
+       };
+
+       uart4_pins: pinmux_uart4_pins {
+               pinctrl-single,pins = <
+                       0x11c 0x100     /* uart4_rx.uart4_rx INPUT | MODE0 */
+                       0x11e 0         /* uart4_tx.uart4_tx OUTPUT | MODE0 */
+               >;
+       };
+};
+
 &i2c1 {
        clock-frequency = <400000>;
 
        bus-width = <4>;
        ti,non-removable;
 };
+
+&emif1 {
+       cs1-used;
+       device-handle = <&elpida_ECB240ABACN>;
+};
+
+&emif2 {
+       cs1-used;
+       device-handle = <&elpida_ECB240ABACN>;
+};
+
+&keypad {
+       keypad,num-rows = <8>;
+       keypad,num-columns = <8>;
+       linux,keymap = <0x00000012      /* KEY_E */
+                       0x00010013      /* KEY_R */
+                       0x00020014      /* KEY_T */
+                       0x00030066      /* KEY_HOME */
+                       0x0004003f      /* KEY_F5 */
+                       0x000500f0      /* KEY_UNKNOWN */
+                       0x00060017      /* KEY_I */
+                       0x0007002a      /* KEY_LEFTSHIFT */
+                       0x01000020      /* KEY_D*/
+                       0x01010021      /* KEY_F */
+                       0x01020022      /* KEY_G */
+                       0x010300e7      /* KEY_SEND */
+                       0x01040040      /* KEY_F6 */
+                       0x010500f0      /* KEY_UNKNOWN */
+                       0x01060025      /* KEY_K */
+                       0x0107001c      /* KEY_ENTER */
+                       0x0200002d      /* KEY_X */
+                       0x0201002e      /* KEY_C */
+                       0x0202002f      /* KEY_V */
+                       0x0203006b      /* KEY_END */
+                       0x02040041      /* KEY_F7 */
+                       0x020500f0      /* KEY_UNKNOWN */
+                       0x02060034      /* KEY_DOT */
+                       0x0207003a      /* KEY_CAPSLOCK */
+                       0x0300002c      /* KEY_Z */
+                       0x0301004e      /* KEY_KPLUS */
+                       0x03020030      /* KEY_B */
+                       0x0303003b      /* KEY_F1 */
+                       0x03040042      /* KEY_F8 */
+                       0x030500f0      /* KEY_UNKNOWN */
+                       0x03060018      /* KEY_O */
+                       0x03070039      /* KEY_SPACE */
+                       0x04000011      /* KEY_W */
+                       0x04010015      /* KEY_Y */
+                       0x04020016      /* KEY_U */
+                       0x0403003c      /* KEY_F2 */
+                       0x04040073      /* KEY_VOLUMEUP */
+                       0x040500f0      /* KEY_UNKNOWN */
+                       0x04060026      /* KEY_L */
+                       0x04070069      /* KEY_LEFT */
+                       0x0500001f      /* KEY_S */
+                       0x05010023      /* KEY_H */
+                       0x05020024      /* KEY_J */
+                       0x0503003d      /* KEY_F3 */
+                       0x05040043      /* KEY_F9 */
+                       0x05050072      /* KEY_VOLUMEDOWN */
+                       0x05060032      /* KEY_M */
+                       0x0507006a      /* KEY_RIGHT */
+                       0x06000010      /* KEY_Q */
+                       0x0601001e      /* KEY_A */
+                       0x06020031      /* KEY_N */
+                       0x0603009e      /* KEY_BACK */
+                       0x0604000e      /* KEY_BACKSPACE */
+                       0x060500f0      /* KEY_UNKNOWN */
+                       0x06060019      /* KEY_P */
+                       0x06070067      /* KEY_UP */
+                       0x07000094      /* KEY_PROG1 */
+                       0x07010095      /* KEY_PROG2 */
+                       0x070200ca      /* KEY_PROG3 */
+                       0x070300cb      /* KEY_PROG4 */
+                       0x0704003e      /* KEY_F4 */
+                       0x070500f0      /* KEY_UNKNOWN */
+                       0x07060160      /* KEY_OK */
+                       0x0707006c>;    /* KEY_DOWN */
+       linux,input-no-autorepeat;
+};
+
+&uart2 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart2_pins>;
+};
+
+&uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart3_pins>;
+};
+
+&uart4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&uart4_pins>;
+};
index 04cbbcb..5d1c484 100644 (file)
        cpus {
                cpu@0 {
                        compatible = "arm,cortex-a9";
+                       next-level-cache = <&L2>;
                };
                cpu@1 {
                        compatible = "arm,cortex-a9";
+                       next-level-cache = <&L2>;
                };
        };
 
+       gic: interrupt-controller@48241000 {
+               compatible = "arm,cortex-a9-gic";
+               interrupt-controller;
+               #interrupt-cells = <3>;
+               reg = <0x48241000 0x1000>,
+                     <0x48240100 0x0100>;
+       };
+
+       L2: l2-cache-controller@48242000 {
+               compatible = "arm,pl310-cache";
+               reg = <0x48242000 0x1000>;
+               cache-unified;
+               cache-level = <2>;
+       };
+
+       local-timer@0x48240600 {
+               compatible = "arm,cortex-a9-twd-timer";
+               reg = <0x48240600 0x20>;
+               interrupts = <1 13 0x304>;
+       };
+
        /*
         * The soc node represents the soc top level view. It is uses for IPs
         * that are not memory mapped in the MPU view or for the MPU itself.
        /*
         * XXX: Use a flat representation of the OMAP4 interconnect.
         * The real OMAP interconnect network is quite complex.
-        *
-        * MPU -+-- MPU_PRIVATE - GIC, L2
-        *      |
-        *      +----------------+----------+
-        *      |                |          |
-        *      +            +- EMIF - DDR  |
-        *      |            |              |
-        *      |            +     +--------+
-        *      |            |     |
-        *      |            +- L4_ABE - AESS, MCBSP, TIMERs...
-        *      |            |
-        *      +- L3_MAIN --+- L4_CORE - IPs...
-        *                   |
-        *                   +- L4_PER - IPs...
-        *                   |
-        *                   +- L4_CFG -+- L4_WKUP - IPs...
-        *                   |          |
-        *                   |          +- IPs...
-        *                   +- IPU ----+
-        *                   |          |
-        *                   +- DSP ----+
-        *                   |          |
-        *                   +- DSS ----+
-        *
         * Since that will not bring real advantage to represent that in DT for
         * the moment, just use a fake OCP bus entry to represent the whole bus
         * hierarchy.
                ranges;
                ti,hwmods = "l3_main_1", "l3_main_2", "l3_main_3";
 
-               gic: interrupt-controller@48241000 {
-                       compatible = "arm,cortex-a9-gic";
-                       interrupt-controller;
-                       #interrupt-cells = <3>;
-                       reg = <0x48241000 0x1000>,
-                             <0x48240100 0x0100>;
+               omap4_pmx_core: pinmux@4a100040 {
+                       compatible = "ti,omap4-padconf", "pinctrl-single";
+                       reg = <0x4a100040 0x0196>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       pinctrl-single,register-width = <16>;
+                       pinctrl-single,function-mask = <0x7fff>;
+               };
+               omap4_pmx_wkup: pinmux@4a31e040 {
+                       compatible = "ti,omap4-padconf", "pinctrl-single";
+                       reg = <0x4a31e040 0x0038>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       pinctrl-single,register-width = <16>;
+                       pinctrl-single,function-mask = <0x7fff>;
                };
 
                gpio1: gpio@4a310000 {
                        compatible = "ti,omap4-gpio";
+                       reg = <0x4a310000 0x200>;
+                       interrupts = <0 29 0x4>;
                        ti,hwmods = "gpio1";
                        gpio-controller;
                        #gpio-cells = <2>;
 
                gpio2: gpio@48055000 {
                        compatible = "ti,omap4-gpio";
+                       reg = <0x48055000 0x200>;
+                       interrupts = <0 30 0x4>;
                        ti,hwmods = "gpio2";
                        gpio-controller;
                        #gpio-cells = <2>;
 
                gpio3: gpio@48057000 {
                        compatible = "ti,omap4-gpio";
+                       reg = <0x48057000 0x200>;
+                       interrupts = <0 31 0x4>;
                        ti,hwmods = "gpio3";
                        gpio-controller;
                        #gpio-cells = <2>;
 
                gpio4: gpio@48059000 {
                        compatible = "ti,omap4-gpio";
+                       reg = <0x48059000 0x200>;
+                       interrupts = <0 32 0x4>;
                        ti,hwmods = "gpio4";
                        gpio-controller;
                        #gpio-cells = <2>;
 
                gpio5: gpio@4805b000 {
                        compatible = "ti,omap4-gpio";
+                       reg = <0x4805b000 0x200>;
+                       interrupts = <0 33 0x4>;
                        ti,hwmods = "gpio5";
                        gpio-controller;
                        #gpio-cells = <2>;
 
                gpio6: gpio@4805d000 {
                        compatible = "ti,omap4-gpio";
+                       reg = <0x4805d000 0x200>;
+                       interrupts = <0 34 0x4>;
                        ti,hwmods = "gpio6";
                        gpio-controller;
                        #gpio-cells = <2>;
 
                uart1: serial@4806a000 {
                        compatible = "ti,omap4-uart";
+                       reg = <0x4806a000 0x100>;
+                       interrupts = <0 72 0x4>;
                        ti,hwmods = "uart1";
                        clock-frequency = <48000000>;
                };
 
                uart2: serial@4806c000 {
                        compatible = "ti,omap4-uart";
+                       reg = <0x4806c000 0x100>;
+                       interrupts = <0 73 0x4>;
                        ti,hwmods = "uart2";
                        clock-frequency = <48000000>;
                };
 
                uart3: serial@48020000 {
                        compatible = "ti,omap4-uart";
+                       reg = <0x48020000 0x100>;
+                       interrupts = <0 74 0x4>;
                        ti,hwmods = "uart3";
                        clock-frequency = <48000000>;
                };
 
                uart4: serial@4806e000 {
                        compatible = "ti,omap4-uart";
+                       reg = <0x4806e000 0x100>;
+                       interrupts = <0 70 0x4>;
                        ti,hwmods = "uart4";
                        clock-frequency = <48000000>;
                };
 
                i2c1: i2c@48070000 {
                        compatible = "ti,omap4-i2c";
+                       reg = <0x48070000 0x100>;
+                       interrupts = <0 56 0x4>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c1";
 
                i2c2: i2c@48072000 {
                        compatible = "ti,omap4-i2c";
+                       reg = <0x48072000 0x100>;
+                       interrupts = <0 57 0x4>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c2";
 
                i2c3: i2c@48060000 {
                        compatible = "ti,omap4-i2c";
+                       reg = <0x48060000 0x100>;
+                       interrupts = <0 61 0x4>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c3";
 
                i2c4: i2c@48350000 {
                        compatible = "ti,omap4-i2c";
+                       reg = <0x48350000 0x100>;
+                       interrupts = <0 62 0x4>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "i2c4";
 
                mcspi1: spi@48098000 {
                        compatible = "ti,omap4-mcspi";
+                       reg = <0x48098000 0x200>;
+                       interrupts = <0 65 0x4>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "mcspi1";
 
                mcspi2: spi@4809a000 {
                        compatible = "ti,omap4-mcspi";
+                       reg = <0x4809a000 0x200>;
+                       interrupts = <0 66 0x4>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "mcspi2";
 
                mcspi3: spi@480b8000 {
                        compatible = "ti,omap4-mcspi";
+                       reg = <0x480b8000 0x200>;
+                       interrupts = <0 91 0x4>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "mcspi3";
 
                mcspi4: spi@480ba000 {
                        compatible = "ti,omap4-mcspi";
+                       reg = <0x480ba000 0x200>;
+                       interrupts = <0 48 0x4>;
                        #address-cells = <1>;
                        #size-cells = <0>;
                        ti,hwmods = "mcspi4";
 
                mmc1: mmc@4809c000 {
                        compatible = "ti,omap4-hsmmc";
+                       reg = <0x4809c000 0x400>;
+                       interrupts = <0 83 0x4>;
                        ti,hwmods = "mmc1";
                        ti,dual-volt;
                        ti,needs-special-reset;
 
                mmc2: mmc@480b4000 {
                        compatible = "ti,omap4-hsmmc";
+                       reg = <0x480b4000 0x400>;
+                       interrupts = <0 86 0x4>;
                        ti,hwmods = "mmc2";
                        ti,needs-special-reset;
                };
 
                mmc3: mmc@480ad000 {
                        compatible = "ti,omap4-hsmmc";
+                       reg = <0x480ad000 0x400>;
+                       interrupts = <0 94 0x4>;
                        ti,hwmods = "mmc3";
                        ti,needs-special-reset;
                };
 
                mmc4: mmc@480d1000 {
                        compatible = "ti,omap4-hsmmc";
+                       reg = <0x480d1000 0x400>;
+                       interrupts = <0 96 0x4>;
                        ti,hwmods = "mmc4";
                        ti,needs-special-reset;
                };
 
                mmc5: mmc@480d5000 {
                        compatible = "ti,omap4-hsmmc";
+                       reg = <0x480d5000 0x400>;
+                       interrupts = <0 59 0x4>;
                        ti,hwmods = "mmc5";
                        ti,needs-special-reset;
                };
 
                wdt2: wdt@4a314000 {
                        compatible = "ti,omap4-wdt", "ti,omap3-wdt";
+                       reg = <0x4a314000 0x80>;
+                       interrupts = <0 80 0x4>;
                        ti,hwmods = "wd_timer2";
                };
 
                        compatible = "ti,omap4-mcpdm";
                        reg = <0x40132000 0x7f>, /* MPU private access */
                              <0x49032000 0x7f>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
                        interrupts = <0 112 0x4>;
                        interrupt-parent = <&gic>;
                        ti,hwmods = "mcpdm";
                        compatible = "ti,omap4-dmic";
                        reg = <0x4012e000 0x7f>, /* MPU private access */
                              <0x4902e000 0x7f>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
                        interrupts = <0 114 0x4>;
                        interrupt-parent = <&gic>;
                        ti,hwmods = "dmic";
                };
+
+               mcbsp1: mcbsp@40122000 {
+                       compatible = "ti,omap4-mcbsp";
+                       reg = <0x40122000 0xff>, /* MPU private access */
+                             <0x49022000 0xff>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
+                       interrupts = <0 17 0x4>;
+                       interrupt-names = "common";
+                       interrupt-parent = <&gic>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp1";
+               };
+
+               mcbsp2: mcbsp@40124000 {
+                       compatible = "ti,omap4-mcbsp";
+                       reg = <0x40124000 0xff>, /* MPU private access */
+                             <0x49024000 0xff>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
+                       interrupts = <0 22 0x4>;
+                       interrupt-names = "common";
+                       interrupt-parent = <&gic>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp2";
+               };
+
+               mcbsp3: mcbsp@40126000 {
+                       compatible = "ti,omap4-mcbsp";
+                       reg = <0x40126000 0xff>, /* MPU private access */
+                             <0x49026000 0xff>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
+                       interrupts = <0 23 0x4>;
+                       interrupt-names = "common";
+                       interrupt-parent = <&gic>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp3";
+               };
+
+               mcbsp4: mcbsp@48096000 {
+                       compatible = "ti,omap4-mcbsp";
+                       reg = <0x48096000 0xff>; /* L4 Interconnect */
+                       reg-names = "mpu";
+                       interrupts = <0 16 0x4>;
+                       interrupt-names = "common";
+                       interrupt-parent = <&gic>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp4";
+               };
+
+               keypad: keypad@4a31c000 {
+                       compatible = "ti,omap4-keypad";
+                       reg = <0x4a31c000 0x80>;
+                       interrupts = <0 120 0x4>;
+                       reg-names = "mpu";
+                       ti,hwmods = "kbd";
+               };
+
+               emif1: emif@4c000000 {
+                       compatible = "ti,emif-4d";
+                       reg = <0x4c000000 0x100>;
+                       interrupts = <0 110 0x4>;
+                       ti,hwmods = "emif1";
+                       phy-type = <1>;
+                       hw-caps-read-idle-ctrl;
+                       hw-caps-ll-interface;
+                       hw-caps-temp-alert;
+               };
+
+               emif2: emif@4d000000 {
+                       compatible = "ti,emif-4d";
+                       reg = <0x4d000000 0x100>;
+                       interrupts = <0 111 0x4>;
+                       ti,hwmods = "emif2";
+                       phy-type = <1>;
+                       hw-caps-read-idle-ctrl;
+                       hw-caps-ll-interface;
+                       hw-caps-temp-alert;
+               };
        };
 };
index 200c39a..9c41a3f 100644 (file)
                device_type = "memory";
                reg = <0x80000000 0x40000000>; /* 1 GB */
        };
+
+       vmmcsd_fixed: fixedregulator-mmcsd {
+               compatible = "regulator-fixed";
+               regulator-name = "vmmcsd_fixed";
+               regulator-min-microvolt = <3000000>;
+               regulator-max-microvolt = <3000000>;
+       };
+
+};
+
+&mmc1 {
+       vmmc-supply = <&vmmcsd_fixed>;
+       bus-width = <4>;
+};
+
+&mmc2 {
+       vmmc-supply = <&vmmcsd_fixed>;
+       bus-width = <8>;
+       ti,non-removable;
+};
+
+&mmc3 {
+       bus-width = <4>;
+       ti,non-removable;
+};
+
+&mmc4 {
+       status = "disabled";
+};
+
+&mmc5 {
+       status = "disabled";
+};
+
+&i2c2 {
+       clock-frequency = <400000>;
+
+       /* Pressure Sensor */
+       bmp085@77 {
+               compatible = "bosch,bmp085";
+               reg = <0x77>;
+       };
+};
+
+&i2c4 {
+       clock-frequency = <400000>;
+
+       /* Temperature Sensor */
+       tmp102@48{
+               compatible = "ti,tmp102";
+               reg = <0x48>;
+       };
+};
+
+&keypad {
+       keypad,num-rows = <8>;
+       keypad,num-columns = <8>;
+       linux,keymap = <0x02020073      /* VOLUP */
+                       0x02030072      /* VOLDOWM */
+                       0x020400e7      /* SEND */
+                       0x02050066      /* HOME */
+                       0x0206006b      /* END */
+                       0x020700d9>;    /* SEARCH */
+       linux,input-no-autorepeat;
 };
index 57e5270..9ac75b3 100644 (file)
                        #interrupt-cells = <1>;
                };
 
+               i2c1: i2c@48070000 {
+                       compatible = "ti,omap4-i2c";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "i2c1";
+               };
+
+               i2c2: i2c@48072000 {
+                       compatible = "ti,omap4-i2c";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "i2c2";
+               };
+
+               i2c3: i2c@48060000 {
+                       compatible = "ti,omap4-i2c";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "i2c3";
+               };
+
+               i2c4: i2c@4807A000 {
+                       compatible = "ti,omap4-i2c";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "i2c4";
+               };
+
+               i2c5: i2c@4807C000 {
+                       compatible = "ti,omap4-i2c";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       ti,hwmods = "i2c5";
+               };
+
                uart1: serial@4806a000 {
                        compatible = "ti,omap4-uart";
                        ti,hwmods = "uart1";
                        ti,hwmods = "uart6";
                        clock-frequency = <48000000>;
                };
+
+               mmc1: mmc@4809c000 {
+                       compatible = "ti,omap4-hsmmc";
+                       ti,hwmods = "mmc1";
+                       ti,dual-volt;
+                       ti,needs-special-reset;
+               };
+
+               mmc2: mmc@480b4000 {
+                       compatible = "ti,omap4-hsmmc";
+                       ti,hwmods = "mmc2";
+                       ti,needs-special-reset;
+               };
+
+               mmc3: mmc@480ad000 {
+                       compatible = "ti,omap4-hsmmc";
+                       ti,hwmods = "mmc3";
+                       ti,needs-special-reset;
+               };
+
+               mmc4: mmc@480d1000 {
+                       compatible = "ti,omap4-hsmmc";
+                       ti,hwmods = "mmc4";
+                       ti,needs-special-reset;
+               };
+
+               mmc5: mmc@480d5000 {
+                       compatible = "ti,omap4-hsmmc";
+                       ti,hwmods = "mmc5";
+                       ti,needs-special-reset;
+               };
+
+               keypad: keypad@4ae1c000 {
+                       compatible = "ti,omap4-keypad";
+                       ti,hwmods = "kbd";
+               };
+
+               mcpdm: mcpdm@40132000 {
+                       compatible = "ti,omap4-mcpdm";
+                       reg = <0x40132000 0x7f>, /* MPU private access */
+                             <0x49032000 0x7f>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
+                       interrupts = <0 112 0x4>;
+                       interrupt-parent = <&gic>;
+                       ti,hwmods = "mcpdm";
+               };
+
+               dmic: dmic@4012e000 {
+                       compatible = "ti,omap4-dmic";
+                       reg = <0x4012e000 0x7f>, /* MPU private access */
+                             <0x4902e000 0x7f>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
+                       interrupts = <0 114 0x4>;
+                       interrupt-parent = <&gic>;
+                       ti,hwmods = "dmic";
+               };
+
+               mcbsp1: mcbsp@40122000 {
+                       compatible = "ti,omap4-mcbsp";
+                       reg = <0x40122000 0xff>, /* MPU private access */
+                             <0x49022000 0xff>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
+                       interrupts = <0 17 0x4>;
+                       interrupt-names = "common";
+                       interrupt-parent = <&gic>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp1";
+               };
+
+               mcbsp2: mcbsp@40124000 {
+                       compatible = "ti,omap4-mcbsp";
+                       reg = <0x40124000 0xff>, /* MPU private access */
+                             <0x49024000 0xff>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
+                       interrupts = <0 22 0x4>;
+                       interrupt-names = "common";
+                       interrupt-parent = <&gic>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp2";
+               };
+
+               mcbsp3: mcbsp@40126000 {
+                       compatible = "ti,omap4-mcbsp";
+                       reg = <0x40126000 0xff>, /* MPU private access */
+                             <0x49026000 0xff>; /* L3 Interconnect */
+                       reg-names = "mpu", "dma";
+                       interrupts = <0 23 0x4>;
+                       interrupt-names = "common";
+                       interrupt-parent = <&gic>;
+                       ti,buffer-size = <128>;
+                       ti,hwmods = "mcbsp3";
+               };
        };
 };
index 802ec5b..a7ad85e 100644 (file)
                        ssp0: ssp@20084000 {
                                #address-cells = <1>;
                                #size-cells = <0>;
-                               pl022,num-chipselects = <1>;
+                               num-cs = <1>;
                                cs-gpios = <&gpio 3 5 0>;
 
                                eeprom: at25@0 {
-                                       pl022,hierarchy = <0>;
                                        pl022,interface = <0>;
-                                       pl022,slave-tx-disable = <0>;
                                        pl022,com-mode = <0>;
                                        pl022,rx-level-trig = <1>;
                                        pl022,tx-level-trig = <1>;
diff --git a/arch/arm/boot/dts/prima2-cb.dts b/arch/arm/boot/dts/prima2-cb.dts
deleted file mode 100644 (file)
index 34ae3a6..0000000
+++ /dev/null
@@ -1,424 +0,0 @@
-/dts-v1/;
-/ {
-       model = "SiRF Prima2 eVB";
-       compatible = "sirf,prima2-cb", "sirf,prima2";
-       #address-cells = <1>;
-       #size-cells = <1>;
-       interrupt-parent = <&intc>;
-
-       memory {
-               reg = <0x00000000 0x20000000>;
-       };
-
-       chosen {
-               bootargs = "mem=512M real_root=/dev/mmcblk0p2 console=ttyS0 panel=1 bootsplash=true bpp=16 androidboot.console=ttyS1";
-               linux,stdout-path = &uart1;
-       };
-
-       cpus {
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               cpu@0 {
-                       reg = <0x0>;
-                       d-cache-line-size = <32>;
-                       i-cache-line-size = <32>;
-                       d-cache-size = <32768>;
-                       i-cache-size = <32768>;
-                       /* from bootloader */
-                       timebase-frequency = <0>;
-                       bus-frequency = <0>;
-                       clock-frequency = <0>;
-               };
-       };
-
-       axi {
-               compatible = "simple-bus";
-               #address-cells = <1>;
-               #size-cells = <1>;
-               ranges = <0x40000000 0x40000000 0x80000000>;
-
-               l2-cache-controller@80040000 {
-                       compatible = "arm,pl310-cache", "sirf,prima2-pl310-cache";
-                       reg = <0x80040000 0x1000>;
-                       interrupts = <59>;
-                       arm,tag-latency = <1 1 1>;
-                       arm,data-latency = <1 1 1>;
-                       arm,filter-ranges = <0 0x40000000>;
-               };
-
-               intc: interrupt-controller@80020000 {
-                       #interrupt-cells = <1>;
-                       interrupt-controller;
-                       compatible = "sirf,prima2-intc";
-                       reg = <0x80020000 0x1000>;
-               };
-
-               sys-iobg {
-                       compatible = "simple-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0x88000000 0x88000000 0x40000>;
-
-                       clock-controller@88000000 {
-                               compatible = "sirf,prima2-clkc";
-                               reg = <0x88000000 0x1000>;
-                               interrupts = <3>;
-                       };
-
-                       reset-controller@88010000 {
-                               compatible = "sirf,prima2-rstc";
-                               reg = <0x88010000 0x1000>;
-                       };
-
-                       rsc-controller@88020000 {
-                               compatible = "sirf,prima2-rsc";
-                               reg = <0x88020000 0x1000>;
-                       };
-               };
-
-               mem-iobg {
-                       compatible = "simple-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0x90000000 0x90000000 0x10000>;
-
-                       memory-controller@90000000 {
-                               compatible = "sirf,prima2-memc";
-                               reg = <0x90000000 0x10000>;
-                               interrupts = <27>;
-                       };
-               };
-
-               disp-iobg {
-                       compatible = "simple-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0x90010000 0x90010000 0x30000>;
-
-                       display@90010000 {
-                               compatible = "sirf,prima2-lcd";
-                               reg = <0x90010000 0x20000>;
-                               interrupts = <30>;
-                       };
-
-                       vpp@90020000 {
-                               compatible = "sirf,prima2-vpp";
-                               reg = <0x90020000 0x10000>;
-                               interrupts = <31>;
-                       };
-               };
-
-               graphics-iobg {
-                       compatible = "simple-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0x98000000 0x98000000 0x8000000>;
-
-                       graphics@98000000 {
-                               compatible = "powervr,sgx531";
-                               reg = <0x98000000 0x8000000>;
-                               interrupts = <6>;
-                       };
-               };
-
-               multimedia-iobg {
-                       compatible = "simple-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0xa0000000 0xa0000000 0x8000000>;
-
-                       multimedia@a0000000 {
-                               compatible = "sirf,prima2-video-codec";
-                               reg = <0xa0000000 0x8000000>;
-                               interrupts = <5>;
-                       };
-               };
-
-               dsp-iobg {
-                       compatible = "simple-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0xa8000000 0xa8000000 0x2000000>;
-
-                       dspif@a8000000 {
-                               compatible = "sirf,prima2-dspif";
-                               reg = <0xa8000000 0x10000>;
-                               interrupts = <9>;
-                       };
-
-                       gps@a8010000 {
-                               compatible = "sirf,prima2-gps";
-                               reg = <0xa8010000 0x10000>;
-                               interrupts = <7>;
-                       };
-
-                       dsp@a9000000 {
-                               compatible = "sirf,prima2-dsp";
-                               reg = <0xa9000000 0x1000000>;
-                               interrupts = <8>;
-                       };
-               };
-
-               peri-iobg {
-                       compatible = "simple-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0xb0000000 0xb0000000 0x180000>;
-
-                       timer@b0020000 {
-                               compatible = "sirf,prima2-tick";
-                               reg = <0xb0020000 0x1000>;
-                               interrupts = <0>;
-                       };
-
-                       nand@b0030000 {
-                               compatible = "sirf,prima2-nand";
-                               reg = <0xb0030000 0x10000>;
-                               interrupts = <41>;
-                       };
-
-                       audio@b0040000 {
-                               compatible = "sirf,prima2-audio";
-                               reg = <0xb0040000 0x10000>;
-                               interrupts = <35>;
-                       };
-
-                       uart0: uart@b0050000 {
-                               cell-index = <0>;
-                               compatible = "sirf,prima2-uart";
-                               reg = <0xb0050000 0x10000>;
-                               interrupts = <17>;
-                       };
-
-                       uart1: uart@b0060000 {
-                               cell-index = <1>;
-                               compatible = "sirf,prima2-uart";
-                               reg = <0xb0060000 0x10000>;
-                               interrupts = <18>;
-                       };
-
-                       uart2: uart@b0070000 {
-                               cell-index = <2>;
-                               compatible = "sirf,prima2-uart";
-                               reg = <0xb0070000 0x10000>;
-                               interrupts = <19>;
-                       };
-
-                       usp0: usp@b0080000 {
-                               cell-index = <0>;
-                               compatible = "sirf,prima2-usp";
-                               reg = <0xb0080000 0x10000>;
-                               interrupts = <20>;
-                       };
-
-                       usp1: usp@b0090000 {
-                               cell-index = <1>;
-                               compatible = "sirf,prima2-usp";
-                               reg = <0xb0090000 0x10000>;
-                               interrupts = <21>;
-                       };
-
-                       usp2: usp@b00a0000 {
-                               cell-index = <2>;
-                               compatible = "sirf,prima2-usp";
-                               reg = <0xb00a0000 0x10000>;
-                               interrupts = <22>;
-                       };
-
-                       dmac0: dma-controller@b00b0000 {
-                               cell-index = <0>;
-                               compatible = "sirf,prima2-dmac";
-                               reg = <0xb00b0000 0x10000>;
-                               interrupts = <12>;
-                       };
-
-                       dmac1: dma-controller@b0160000 {
-                               cell-index = <1>;
-                               compatible = "sirf,prima2-dmac";
-                               reg = <0xb0160000 0x10000>;
-                               interrupts = <13>;
-                       };
-
-                       vip@b00C0000 {
-                               compatible = "sirf,prima2-vip";
-                               reg = <0xb00C0000 0x10000>;
-                       };
-
-                       spi0: spi@b00d0000 {
-                               cell-index = <0>;
-                               compatible = "sirf,prima2-spi";
-                               reg = <0xb00d0000 0x10000>;
-                               interrupts = <15>;
-                       };
-
-                       spi1: spi@b0170000 {
-                               cell-index = <1>;
-                               compatible = "sirf,prima2-spi";
-                               reg = <0xb0170000 0x10000>;
-                               interrupts = <16>;
-                       };
-
-                       i2c0: i2c@b00e0000 {
-                               cell-index = <0>;
-                               compatible = "sirf,prima2-i2c";
-                               reg = <0xb00e0000 0x10000>;
-                               interrupts = <24>;
-                       };
-
-                       i2c1: i2c@b00f0000 {
-                               cell-index = <1>;
-                               compatible = "sirf,prima2-i2c";
-                               reg = <0xb00f0000 0x10000>;
-                               interrupts = <25>;
-                       };
-
-                       tsc@b0110000 {
-                               compatible = "sirf,prima2-tsc";
-                               reg = <0xb0110000 0x10000>;
-                               interrupts = <33>;
-                       };
-
-                       gpio: gpio-controller@b0120000 {
-                               #gpio-cells = <2>;
-                               #interrupt-cells = <2>;
-                               compatible = "sirf,prima2-gpio-pinmux";
-                               reg = <0xb0120000 0x10000>;
-                               gpio-controller;
-                               interrupt-controller;
-                       };
-
-                       pwm@b0130000 {
-                               compatible = "sirf,prima2-pwm";
-                               reg = <0xb0130000 0x10000>;
-                       };
-
-                       efusesys@b0140000 {
-                               compatible = "sirf,prima2-efuse";
-                               reg = <0xb0140000 0x10000>;
-                       };
-
-                       pulsec@b0150000 {
-                               compatible = "sirf,prima2-pulsec";
-                               reg = <0xb0150000 0x10000>;
-                               interrupts = <48>;
-                       };
-
-                       pci-iobg {
-                               compatible = "sirf,prima2-pciiobg", "simple-bus";
-                               #address-cells = <1>;
-                               #size-cells = <1>;
-                               ranges = <0x56000000 0x56000000 0x1b00000>;
-
-                               sd0: sdhci@56000000 {
-                                       cell-index = <0>;
-                                       compatible = "sirf,prima2-sdhc";
-                                       reg = <0x56000000 0x100000>;
-                                       interrupts = <38>;
-                               };
-
-                               sd1: sdhci@56100000 {
-                                       cell-index = <1>;
-                                       compatible = "sirf,prima2-sdhc";
-                                       reg = <0x56100000 0x100000>;
-                                       interrupts = <38>;
-                               };
-
-                               sd2: sdhci@56200000 {
-                                       cell-index = <2>;
-                                       compatible = "sirf,prima2-sdhc";
-                                       reg = <0x56200000 0x100000>;
-                                       interrupts = <23>;
-                               };
-
-                               sd3: sdhci@56300000 {
-                                       cell-index = <3>;
-                                       compatible = "sirf,prima2-sdhc";
-                                       reg = <0x56300000 0x100000>;
-                                       interrupts = <23>;
-                               };
-
-                               sd4: sdhci@56400000 {
-                                       cell-index = <4>;
-                                       compatible = "sirf,prima2-sdhc";
-                                       reg = <0x56400000 0x100000>;
-                                       interrupts = <39>;
-                               };
-
-                               sd5: sdhci@56500000 {
-                                       cell-index = <5>;
-                                       compatible = "sirf,prima2-sdhc";
-                                       reg = <0x56500000 0x100000>;
-                                       interrupts = <39>;
-                               };
-
-                               pci-copy@57900000 {
-                                       compatible = "sirf,prima2-pcicp";
-                                       reg = <0x57900000 0x100000>;
-                                       interrupts = <40>;
-                               };
-
-                               rom-interface@57a00000 {
-                                       compatible = "sirf,prima2-romif";
-                                       reg = <0x57a00000 0x100000>;
-                               };
-                       };
-               };
-
-               rtc-iobg {
-                       compatible = "sirf,prima2-rtciobg", "sirf-prima2-rtciobg-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       reg = <0x80030000 0x10000>;
-
-                       gpsrtc@1000 {
-                               compatible = "sirf,prima2-gpsrtc";
-                               reg = <0x1000 0x1000>;
-                               interrupts = <55 56 57>;
-                       };
-
-                       sysrtc@2000 {
-                               compatible = "sirf,prima2-sysrtc";
-                               reg = <0x2000 0x1000>;
-                               interrupts = <52 53 54>;
-                       };
-
-                       pwrc@3000 {
-                               compatible = "sirf,prima2-pwrc";
-                               reg = <0x3000 0x1000>;
-                               interrupts = <32>;
-                       };
-               };
-
-               uus-iobg {
-                       compatible = "simple-bus";
-                       #address-cells = <1>;
-                       #size-cells = <1>;
-                       ranges = <0xb8000000 0xb8000000 0x40000>;
-
-                       usb0: usb@b00e0000 {
-                               compatible = "chipidea,ci13611a-prima2";
-                               reg = <0xb8000000 0x10000>;
-                               interrupts = <10>;
-                       };
-
-                       usb1: usb@b00f0000 {
-                               compatible = "chipidea,ci13611a-prima2";
-                               reg = <0xb8010000 0x10000>;
-                               interrupts = <11>;
-                       };
-
-                       sata@b00f0000 {
-                               compatible = "synopsys,dwc-ahsata";
-                               reg = <0xb8020000 0x10000>;
-                               interrupts = <37>;
-                       };
-
-                       security@b00f0000 {
-                               compatible = "sirf,prima2-security";
-                               reg = <0xb8030000 0x10000>;
-                               interrupts = <42>;
-                       };
-               };
-       };
-};
diff --git a/arch/arm/boot/dts/prima2-evb.dts b/arch/arm/boot/dts/prima2-evb.dts
new file mode 100644 (file)
index 0000000..57286b4
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * DTS file for CSR SiRFprimaII Evaluation Board
+ *
+ * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+/dts-v1/;
+
+/include/ "prima2.dtsi"
+
+/ {
+       model = "CSR SiRFprimaII Evaluation Board";
+       compatible = "sirf,prima2", "sirf,prima2-cb";
+
+       memory {
+               reg = <0x00000000 0x20000000>;
+       };
+
+       axi {
+               peri-iobg {
+                       uart@b0060000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&uart1_pins_a>;
+                       };
+                       spi@b00d0000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&spi0_pins_a>;
+                       };
+                       spi@b0170000 {
+                               pinctrl-names = "default";
+                               pinctrl-0 = <&spi1_pins_a>;
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/prima2.dtsi b/arch/arm/boot/dts/prima2.dtsi
new file mode 100644 (file)
index 0000000..055fca5
--- /dev/null
@@ -0,0 +1,640 @@
+/*
+ * DTS file for CSR SiRFprimaII SoC
+ *
+ * Copyright (c) 2012 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+/include/ "skeleton.dtsi"
+/ {
+       compatible = "sirf,prima2";
+       #address-cells = <1>;
+       #size-cells = <1>;
+       interrupt-parent = <&intc>;
+
+       cpus {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               cpu@0 {
+                       reg = <0x0>;
+                       d-cache-line-size = <32>;
+                       i-cache-line-size = <32>;
+                       d-cache-size = <32768>;
+                       i-cache-size = <32768>;
+                       /* from bootloader */
+                       timebase-frequency = <0>;
+                       bus-frequency = <0>;
+                       clock-frequency = <0>;
+               };
+       };
+
+       axi {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges = <0x40000000 0x40000000 0x80000000>;
+
+               l2-cache-controller@80040000 {
+                       compatible = "arm,pl310-cache", "sirf,prima2-pl310-cache";
+                       reg = <0x80040000 0x1000>;
+                       interrupts = <59>;
+                       arm,tag-latency = <1 1 1>;
+                       arm,data-latency = <1 1 1>;
+                       arm,filter-ranges = <0 0x40000000>;
+               };
+
+               intc: interrupt-controller@80020000 {
+                       #interrupt-cells = <1>;
+                       interrupt-controller;
+                       compatible = "sirf,prima2-intc";
+                       reg = <0x80020000 0x1000>;
+               };
+
+               sys-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x88000000 0x88000000 0x40000>;
+
+                       clock-controller@88000000 {
+                               compatible = "sirf,prima2-clkc";
+                               reg = <0x88000000 0x1000>;
+                               interrupts = <3>;
+                       };
+
+                       reset-controller@88010000 {
+                               compatible = "sirf,prima2-rstc";
+                               reg = <0x88010000 0x1000>;
+                       };
+
+                       rsc-controller@88020000 {
+                               compatible = "sirf,prima2-rsc";
+                               reg = <0x88020000 0x1000>;
+                       };
+               };
+
+               mem-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x90000000 0x90000000 0x10000>;
+
+                       memory-controller@90000000 {
+                               compatible = "sirf,prima2-memc";
+                               reg = <0x90000000 0x10000>;
+                               interrupts = <27>;
+                       };
+               };
+
+               disp-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x90010000 0x90010000 0x30000>;
+
+                       display@90010000 {
+                               compatible = "sirf,prima2-lcd";
+                               reg = <0x90010000 0x20000>;
+                               interrupts = <30>;
+                       };
+
+                       vpp@90020000 {
+                               compatible = "sirf,prima2-vpp";
+                               reg = <0x90020000 0x10000>;
+                               interrupts = <31>;
+                       };
+               };
+
+               graphics-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0x98000000 0x98000000 0x8000000>;
+
+                       graphics@98000000 {
+                               compatible = "powervr,sgx531";
+                               reg = <0x98000000 0x8000000>;
+                               interrupts = <6>;
+                       };
+               };
+
+               multimedia-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xa0000000 0xa0000000 0x8000000>;
+
+                       multimedia@a0000000 {
+                               compatible = "sirf,prima2-video-codec";
+                               reg = <0xa0000000 0x8000000>;
+                               interrupts = <5>;
+                       };
+               };
+
+               dsp-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xa8000000 0xa8000000 0x2000000>;
+
+                       dspif@a8000000 {
+                               compatible = "sirf,prima2-dspif";
+                               reg = <0xa8000000 0x10000>;
+                               interrupts = <9>;
+                       };
+
+                       gps@a8010000 {
+                               compatible = "sirf,prima2-gps";
+                               reg = <0xa8010000 0x10000>;
+                               interrupts = <7>;
+                       };
+
+                       dsp@a9000000 {
+                               compatible = "sirf,prima2-dsp";
+                               reg = <0xa9000000 0x1000000>;
+                               interrupts = <8>;
+                       };
+               };
+
+               peri-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xb0000000 0xb0000000 0x180000>;
+
+                       timer@b0020000 {
+                               compatible = "sirf,prima2-tick";
+                               reg = <0xb0020000 0x1000>;
+                               interrupts = <0>;
+                       };
+
+                       nand@b0030000 {
+                               compatible = "sirf,prima2-nand";
+                               reg = <0xb0030000 0x10000>;
+                               interrupts = <41>;
+                       };
+
+                       audio@b0040000 {
+                               compatible = "sirf,prima2-audio";
+                               reg = <0xb0040000 0x10000>;
+                               interrupts = <35>;
+                       };
+
+                       uart0: uart@b0050000 {
+                               cell-index = <0>;
+                               compatible = "sirf,prima2-uart";
+                               reg = <0xb0050000 0x10000>;
+                               interrupts = <17>;
+                       };
+
+                       uart1: uart@b0060000 {
+                               cell-index = <1>;
+                               compatible = "sirf,prima2-uart";
+                               reg = <0xb0060000 0x10000>;
+                               interrupts = <18>;
+                       };
+
+                       uart2: uart@b0070000 {
+                               cell-index = <2>;
+                               compatible = "sirf,prima2-uart";
+                               reg = <0xb0070000 0x10000>;
+                               interrupts = <19>;
+                       };
+
+                       usp0: usp@b0080000 {
+                               cell-index = <0>;
+                               compatible = "sirf,prima2-usp";
+                               reg = <0xb0080000 0x10000>;
+                               interrupts = <20>;
+                       };
+
+                       usp1: usp@b0090000 {
+                               cell-index = <1>;
+                               compatible = "sirf,prima2-usp";
+                               reg = <0xb0090000 0x10000>;
+                               interrupts = <21>;
+                       };
+
+                       usp2: usp@b00a0000 {
+                               cell-index = <2>;
+                               compatible = "sirf,prima2-usp";
+                               reg = <0xb00a0000 0x10000>;
+                               interrupts = <22>;
+                       };
+
+                       dmac0: dma-controller@b00b0000 {
+                               cell-index = <0>;
+                               compatible = "sirf,prima2-dmac";
+                               reg = <0xb00b0000 0x10000>;
+                               interrupts = <12>;
+                       };
+
+                       dmac1: dma-controller@b0160000 {
+                               cell-index = <1>;
+                               compatible = "sirf,prima2-dmac";
+                               reg = <0xb0160000 0x10000>;
+                               interrupts = <13>;
+                       };
+
+                       vip@b00C0000 {
+                               compatible = "sirf,prima2-vip";
+                               reg = <0xb00C0000 0x10000>;
+                       };
+
+                       spi0: spi@b00d0000 {
+                               cell-index = <0>;
+                               compatible = "sirf,prima2-spi";
+                               reg = <0xb00d0000 0x10000>;
+                               interrupts = <15>;
+                       };
+
+                       spi1: spi@b0170000 {
+                               cell-index = <1>;
+                               compatible = "sirf,prima2-spi";
+                               reg = <0xb0170000 0x10000>;
+                               interrupts = <16>;
+                       };
+
+                       i2c0: i2c@b00e0000 {
+                               cell-index = <0>;
+                               compatible = "sirf,prima2-i2c";
+                               reg = <0xb00e0000 0x10000>;
+                               interrupts = <24>;
+                       };
+
+                       i2c1: i2c@b00f0000 {
+                               cell-index = <1>;
+                               compatible = "sirf,prima2-i2c";
+                               reg = <0xb00f0000 0x10000>;
+                               interrupts = <25>;
+                       };
+
+                       tsc@b0110000 {
+                               compatible = "sirf,prima2-tsc";
+                               reg = <0xb0110000 0x10000>;
+                               interrupts = <33>;
+                       };
+
+                       gpio: pinctrl@b0120000 {
+                               #gpio-cells = <2>;
+                               #interrupt-cells = <2>;
+                               compatible = "sirf,prima2-pinctrl";
+                               reg = <0xb0120000 0x10000>;
+                               interrupts = <43 44 45 46 47>;
+                               gpio-controller;
+                               interrupt-controller;
+
+                               lcd_16pins_a: lcd0@0 {
+                                       lcd {
+                                               sirf,pins = "lcd_16bitsgrp";
+                                               sirf,function = "lcd_16bits";
+                                       };
+                               };
+                               lcd_18pins_a: lcd0@1 {
+                                       lcd {
+                                               sirf,pins = "lcd_18bitsgrp";
+                                               sirf,function = "lcd_18bits";
+                                       };
+                               };
+                               lcd_24pins_a: lcd0@2 {
+                                       lcd {
+                                               sirf,pins = "lcd_24bitsgrp";
+                                               sirf,function = "lcd_24bits";
+                                       };
+                               };
+                               lcdrom_pins_a: lcdrom0@0 {
+                                       lcd {
+                                               sirf,pins = "lcdromgrp";
+                                               sirf,function = "lcdrom";
+                                       };
+                               };
+                               uart0_pins_a: uart0@0 {
+                                       uart {
+                                               sirf,pins = "uart0grp";
+                                               sirf,function = "uart0";
+                                       };
+                               };
+                               uart1_pins_a: uart1@0 {
+                                       uart {
+                                               sirf,pins = "uart1grp";
+                                               sirf,function = "uart1";
+                                       };
+                               };
+                               uart2_pins_a: uart2@0 {
+                                       uart {
+                                               sirf,pins = "uart2grp";
+                                               sirf,function = "uart2";
+                                       };
+                               };
+                               uart2_noflow_pins_a: uart2@1 {
+                                       uart {
+                                               sirf,pins = "uart2_nostreamctrlgrp";
+                                               sirf,function = "uart2_nostreamctrl";
+                                       };
+                               };
+                               spi0_pins_a: spi0@0 {
+                                       spi {
+                                               sirf,pins = "spi0grp";
+                                               sirf,function = "spi0";
+                                       };
+                               };
+                               spi1_pins_a: spi1@0 {
+                                       spi {
+                                               sirf,pins = "spi1grp";
+                                               sirf,function = "spi1";
+                                       };
+                               };
+                               i2c0_pins_a: i2c0@0 {
+                                       i2c {
+                                               sirf,pins = "i2c0grp";
+                                               sirf,function = "i2c0";
+                                       };
+                               };
+                               i2c1_pins_a: i2c1@0 {
+                                       i2c {
+                                               sirf,pins = "i2c1grp";
+                                               sirf,function = "i2c1";
+                                       };
+                               };
+                                pwm0_pins_a: pwm0@0 {
+                                        pwm {
+                                                sirf,pins = "pwm0grp";
+                                                sirf,function = "pwm0";
+                                        };
+                                };
+                                pwm1_pins_a: pwm1@0 {
+                                        pwm {
+                                                sirf,pins = "pwm1grp";
+                                                sirf,function = "pwm1";
+                                        };
+                                };
+                                pwm2_pins_a: pwm2@0 {
+                                        pwm {
+                                                sirf,pins = "pwm2grp";
+                                                sirf,function = "pwm2";
+                                        };
+                                };
+                                pwm3_pins_a: pwm3@0 {
+                                        pwm {
+                                                sirf,pins = "pwm3grp";
+                                                sirf,function = "pwm3";
+                                        };
+                                };
+                                gps_pins_a: gps@0 {
+                                        gps {
+                                                sirf,pins = "gpsgrp";
+                                                sirf,function = "gps";
+                                        };
+                                };
+                                vip_pins_a: vip@0 {
+                                        vip {
+                                                sirf,pins = "vipgrp";
+                                                sirf,function = "vip";
+                                        };
+                                };
+                                sdmmc0_pins_a: sdmmc0@0 {
+                                        sdmmc0 {
+                                                sirf,pins = "sdmmc0grp";
+                                                sirf,function = "sdmmc0";
+                                        };
+                                };
+                                sdmmc1_pins_a: sdmmc1@0 {
+                                        sdmmc1 {
+                                                sirf,pins = "sdmmc1grp";
+                                                sirf,function = "sdmmc1";
+                                        };
+                                };
+                                sdmmc2_pins_a: sdmmc2@0 {
+                                        sdmmc2 {
+                                                sirf,pins = "sdmmc2grp";
+                                                sirf,function = "sdmmc2";
+                                        };
+                                };
+                                sdmmc3_pins_a: sdmmc3@0 {
+                                        sdmmc3 {
+                                                sirf,pins = "sdmmc3grp";
+                                                sirf,function = "sdmmc3";
+                                        };
+                                };
+                                sdmmc4_pins_a: sdmmc4@0 {
+                                        sdmmc4 {
+                                                sirf,pins = "sdmmc4grp";
+                                                sirf,function = "sdmmc4";
+                                        };
+                                };
+                                sdmmc5_pins_a: sdmmc5@0 {
+                                        sdmmc5 {
+                                                sirf,pins = "sdmmc5grp";
+                                                sirf,function = "sdmmc5";
+                                        };
+                                };
+                                i2s_pins_a: i2s@0 {
+                                        i2s {
+                                                sirf,pins = "i2sgrp";
+                                                sirf,function = "i2s";
+                                        };
+                                };
+                                ac97_pins_a: ac97@0 {
+                                        ac97 {
+                                                sirf,pins = "ac97grp";
+                                                sirf,function = "ac97";
+                                        };
+                                };
+                                nand_pins_a: nand@0 {
+                                        nand {
+                                                sirf,pins = "nandgrp";
+                                                sirf,function = "nand";
+                                        };
+                                };
+                                usp0_pins_a: usp0@0 {
+                                        usp0 {
+                                                sirf,pins = "usp0grp";
+                                                sirf,function = "usp0";
+                                        };
+                                };
+                                usp1_pins_a: usp1@0 {
+                                        usp1 {
+                                                sirf,pins = "usp1grp";
+                                                sirf,function = "usp1";
+                                        };
+                                };
+                                usp2_pins_a: usp2@0 {
+                                        usp2 {
+                                                sirf,pins = "usp2grp";
+                                                sirf,function = "usp2";
+                                        };
+                                };
+                                usb0_utmi_drvbus_pins_a: usb0_utmi_drvbus@0 {
+                                        usb0_utmi_drvbus {
+                                                sirf,pins = "usb0_utmi_drvbusgrp";
+                                                sirf,function = "usb0_utmi_drvbus";
+                                        };
+                                };
+                                usb1_utmi_drvbus_pins_a: usb1_utmi_drvbus@0 {
+                                        usb1_utmi_drvbus {
+                                                sirf,pins = "usb1_utmi_drvbusgrp";
+                                                sirf,function = "usb1_utmi_drvbus";
+                                        };
+                                };
+                                warm_rst_pins_a: warm_rst@0 {
+                                        warm_rst {
+                                                sirf,pins = "warm_rstgrp";
+                                                sirf,function = "warm_rst";
+                                        };
+                                };
+                                pulse_count_pins_a: pulse_count@0 {
+                                        pulse_count {
+                                                sirf,pins = "pulse_countgrp";
+                                                sirf,function = "pulse_count";
+                                        };
+                                };
+                                cko0_rst_pins_a: cko0_rst@0 {
+                                        cko0_rst {
+                                                sirf,pins = "cko0_rstgrp";
+                                                sirf,function = "cko0_rst";
+                                        };
+                                };
+                                cko1_rst_pins_a: cko1_rst@0 {
+                                        cko1_rst {
+                                                sirf,pins = "cko1_rstgrp";
+                                                sirf,function = "cko1_rst";
+                                        };
+                                };
+                       };
+
+                       pwm@b0130000 {
+                               compatible = "sirf,prima2-pwm";
+                               reg = <0xb0130000 0x10000>;
+                       };
+
+                       efusesys@b0140000 {
+                               compatible = "sirf,prima2-efuse";
+                               reg = <0xb0140000 0x10000>;
+                       };
+
+                       pulsec@b0150000 {
+                               compatible = "sirf,prima2-pulsec";
+                               reg = <0xb0150000 0x10000>;
+                               interrupts = <48>;
+                       };
+
+                       pci-iobg {
+                               compatible = "sirf,prima2-pciiobg", "simple-bus";
+                               #address-cells = <1>;
+                               #size-cells = <1>;
+                               ranges = <0x56000000 0x56000000 0x1b00000>;
+
+                               sd0: sdhci@56000000 {
+                                       cell-index = <0>;
+                                       compatible = "sirf,prima2-sdhc";
+                                       reg = <0x56000000 0x100000>;
+                                       interrupts = <38>;
+                               };
+
+                               sd1: sdhci@56100000 {
+                                       cell-index = <1>;
+                                       compatible = "sirf,prima2-sdhc";
+                                       reg = <0x56100000 0x100000>;
+                                       interrupts = <38>;
+                               };
+
+                               sd2: sdhci@56200000 {
+                                       cell-index = <2>;
+                                       compatible = "sirf,prima2-sdhc";
+                                       reg = <0x56200000 0x100000>;
+                                       interrupts = <23>;
+                               };
+
+                               sd3: sdhci@56300000 {
+                                       cell-index = <3>;
+                                       compatible = "sirf,prima2-sdhc";
+                                       reg = <0x56300000 0x100000>;
+                                       interrupts = <23>;
+                               };
+
+                               sd4: sdhci@56400000 {
+                                       cell-index = <4>;
+                                       compatible = "sirf,prima2-sdhc";
+                                       reg = <0x56400000 0x100000>;
+                                       interrupts = <39>;
+                               };
+
+                               sd5: sdhci@56500000 {
+                                       cell-index = <5>;
+                                       compatible = "sirf,prima2-sdhc";
+                                       reg = <0x56500000 0x100000>;
+                                       interrupts = <39>;
+                               };
+
+                               pci-copy@57900000 {
+                                       compatible = "sirf,prima2-pcicp";
+                                       reg = <0x57900000 0x100000>;
+                                       interrupts = <40>;
+                               };
+
+                               rom-interface@57a00000 {
+                                       compatible = "sirf,prima2-romif";
+                                       reg = <0x57a00000 0x100000>;
+                               };
+                       };
+               };
+
+               rtc-iobg {
+                       compatible = "sirf,prima2-rtciobg", "sirf-prima2-rtciobg-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       reg = <0x80030000 0x10000>;
+
+                       gpsrtc@1000 {
+                               compatible = "sirf,prima2-gpsrtc";
+                               reg = <0x1000 0x1000>;
+                               interrupts = <55 56 57>;
+                       };
+
+                       sysrtc@2000 {
+                               compatible = "sirf,prima2-sysrtc";
+                               reg = <0x2000 0x1000>;
+                               interrupts = <52 53 54>;
+                       };
+
+                       pwrc@3000 {
+                               compatible = "sirf,prima2-pwrc";
+                               reg = <0x3000 0x1000>;
+                               interrupts = <32>;
+                       };
+               };
+
+               uus-iobg {
+                       compatible = "simple-bus";
+                       #address-cells = <1>;
+                       #size-cells = <1>;
+                       ranges = <0xb8000000 0xb8000000 0x40000>;
+
+                       usb0: usb@b00e0000 {
+                               compatible = "chipidea,ci13611a-prima2";
+                               reg = <0xb8000000 0x10000>;
+                               interrupts = <10>;
+                       };
+
+                       usb1: usb@b00f0000 {
+                               compatible = "chipidea,ci13611a-prima2";
+                               reg = <0xb8010000 0x10000>;
+                               interrupts = <11>;
+                       };
+
+                       sata@b00f0000 {
+                               compatible = "synopsys,dwc-ahsata";
+                               reg = <0xb8020000 0x10000>;
+                               interrupts = <37>;
+                       };
+
+                       security@b00f0000 {
+                               compatible = "sirf,prima2-security";
+                               reg = <0xb8030000 0x10000>;
+                               interrupts = <42>;
+                       };
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/pxa27x.dtsi b/arch/arm/boot/dts/pxa27x.dtsi
new file mode 100644 (file)
index 0000000..d7c5d72
--- /dev/null
@@ -0,0 +1,14 @@
+/* The pxa3xx skeleton simply augments the 2xx version */
+/include/ "pxa2xx.dtsi"
+
+/ {
+       model = "Marvell PXA27x familiy SoC";
+       compatible = "marvell,pxa27x";
+
+       pxabus {
+               pxairq: interrupt-controller@40d00000 {
+                       marvell,intc-priority;
+                       marvell,intc-nr-irqs = <34>;
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/pxa2xx.dtsi b/arch/arm/boot/dts/pxa2xx.dtsi
new file mode 100644 (file)
index 0000000..f18aad3
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * pxa2xx.dtsi - Device Tree Include file for Marvell PXA2xx family SoC
+ *
+ * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+/include/ "skeleton.dtsi"
+
+/ {
+       model = "Marvell PXA2xx family SoC";
+       compatible = "marvell,pxa2xx";
+       interrupt-parent = <&pxairq>;
+
+       aliases {
+               serial0 = &ffuart;
+               serial1 = &btuart;
+               serial2 = &stuart;
+               serial3 = &hwuart;
+               i2c0 = &pwri2c;
+               i2c1 = &pxai2c1;
+       };
+
+       cpus {
+               cpu@0 {
+                       compatible = "arm,xscale";
+               };
+       };
+
+       pxabus {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <1>;
+               ranges;
+
+               pxairq: interrupt-controller@40d00000 {
+                       #interrupt-cells = <1>;
+                       compatible = "marvell,pxa-intc";
+                       interrupt-controller;
+                       interrupt-parent;
+                       marvell,intc-nr-irqs = <32>;
+                       reg = <0x40d00000 0xd0>;
+               };
+
+               gpio: gpio@40e00000 {
+                       compatible = "mrvl,pxa-gpio";
+                       #address-cells = <0x1>;
+                       #size-cells = <0x1>;
+                       reg = <0x40e00000 0x10000>;
+                       gpio-controller;
+                       #gpio-cells = <0x2>;
+                       interrupts = <10>;
+                       interrupt-names = "gpio_mux";
+                       interrupt-controller;
+                       #interrupt-cells = <0x2>;
+                       ranges;
+
+                       gcb0: gpio@40e00000 {
+                               reg = <0x40e00000 0x4>;
+                       };
+
+                       gcb1: gpio@40e00004 {
+                               reg = <0x40e00004 0x4>;
+                       };
+
+                       gcb2: gpio@40e00008 {
+                               reg = <0x40e00008 0x4>;
+                       };
+                       gcb3: gpio@40e0000c {
+                               reg = <0x40e0000c 0x4>;
+                       };
+               };
+
+               ffuart: uart@40100000 {
+                       compatible = "mrvl,pxa-uart";
+                       reg = <0x40100000 0x30>;
+                       interrupts = <22>;
+                       status = "disabled";
+               };
+
+               btuart: uart@40200000 {
+                       compatible = "mrvl,pxa-uart";
+                       reg = <0x40200000 0x30>;
+                       interrupts = <21>;
+                       status = "disabled";
+               };
+
+               stuart: uart@40700000 {
+                       compatible = "mrvl,pxa-uart";
+                       reg = <0x40700000 0x30>;
+                       interrupts = <20>;
+                       status = "disabled";
+               };
+
+               hwuart: uart@41100000 {
+                       compatible = "mrvl,pxa-uart";
+                       reg = <0x41100000 0x30>;
+                       interrupts = <7>;
+                       status = "disabled";
+               };
+
+               pxai2c1: i2c@40301680 {
+                       compatible = "mrvl,pxa-i2c";
+                       reg = <0x40301680 0x30>;
+                       interrupts = <18>;
+                       #address-cells = <0x1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               usb0: ohci@4c000000 {
+                       compatible = "mrvl,pxa-ohci";
+                       reg = <0x4c000000 0x10000>;
+                       interrupts = <3>;
+                       status = "disabled";
+               };
+
+               mmc0: mmc@41100000 {
+                       compatible = "mrvl,pxa-mmc";
+                       reg = <0x41100000 0x1000>;
+                       interrupts = <23>;
+                       status = "disabled";
+               };
+
+               rtc@40900000 {
+                       compatible = "marvell,pxa-rtc";
+                       reg = <0x40900000 0x3c>;
+                       interrupts = <30 31>;
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/pxa3xx.dtsi b/arch/arm/boot/dts/pxa3xx.dtsi
new file mode 100644 (file)
index 0000000..f9d92da
--- /dev/null
@@ -0,0 +1,32 @@
+/* The pxa3xx skeleton simply augments the 2xx version */
+/include/ "pxa2xx.dtsi"
+
+/ {
+       model = "Marvell PXA3xx familiy SoC";
+       compatible = "marvell,pxa3xx";
+
+       pxabus {
+               pwri2c: i2c@40f500c0 {
+                       compatible = "mrvl,pwri2c";
+                       reg = <0x40f500c0 0x30>;
+                       interrupts = <6>;
+                       #address-cells = <0x1>;
+                       #size-cells = <0>;
+                       status = "disabled";
+               };
+
+               nand0: nand@43100000 {
+                       compatible = "marvell,pxa3xx-nand";
+                       reg = <0x43100000 90>;
+                       interrupts = <45>;
+                       #address-cells = <1>;
+                       #size-cells = <1>;      
+                       status = "disabled";
+               };
+
+               pxairq: interrupt-controller@40d00000 {
+                       marvell,intc-priority;
+                       marvell,intc-nr-irqs = <56>;
+               };
+       };
+};
index aebf32d..a3be44d 100644 (file)
                interrupt-parent = <&intc>;
                ranges;
 
+               L2: l2-cache {
+                       compatible = "marvell,tauros2-cache";
+                       marvell,tauros2-cache-features = <0x3>;
+               };
+
                axi@d4200000 {  /* AXI */
                        compatible = "mrvl,axi-bus", "simple-bus";
                        #address-cells = <1>;
index f146dbf..c3ef1ad 100644 (file)
        i2c@7000d000 {
                status = "okay";
                clock-frequency = <400000>;
+
+               pmic: tps6586x@34 {
+                       compatible = "ti,tps6586x";
+                       reg = <0x34>;
+                       interrupts = <0 86 0x4>;
+
+                       ti,system-power-controller;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       sys-supply = <&vdd_5v0_reg>;
+                       vin-sm0-supply = <&sys_reg>;
+                       vin-sm1-supply = <&sys_reg>;
+                       vin-sm2-supply = <&sys_reg>;
+                       vinldo01-supply = <&sm2_reg>;
+                       vinldo23-supply = <&sm2_reg>;
+                       vinldo4-supply = <&sm2_reg>;
+                       vinldo678-supply = <&sm2_reg>;
+                       vinldo9-supply = <&sm2_reg>;
+
+                       regulators {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               sys_reg: regulator@0 {
+                                       reg = <0>;
+                                       regulator-compatible = "sys";
+                                       regulator-name = "vdd_sys";
+                                       regulator-always-on;
+                               };
+
+                               regulator@1 {
+                                       reg = <1>;
+                                       regulator-compatible = "sm0";
+                                       regulator-name = "vdd_sm0,vdd_core";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@2 {
+                                       reg = <2>;
+                                       regulator-compatible = "sm1";
+                                       regulator-name = "vdd_sm1,vdd_cpu";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               sm2_reg: regulator@3 {
+                                       reg = <3>;
+                                       regulator-compatible = "sm2";
+                                       regulator-name = "vdd_sm2,vin_ldo*";
+                                       regulator-min-microvolt = <3700000>;
+                                       regulator-max-microvolt = <3700000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@4 {
+                                       reg = <4>;
+                                       regulator-compatible = "ldo0";
+                                       regulator-name = "vdd_ldo0,vddio_pex_clk";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               regulator@5 {
+                                       reg = <5>;
+                                       regulator-compatible = "ldo1";
+                                       regulator-name = "vdd_ldo1,avdd_pll*";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@6 {
+                                       reg = <6>;
+                                       regulator-compatible = "ldo2";
+                                       regulator-name = "vdd_ldo2,vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               regulator@7 {
+                                       reg = <7>;
+                                       regulator-compatible = "ldo3";
+                                       regulator-name = "vdd_ldo3,avdd_usb*";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@8 {
+                                       reg = <8>;
+                                       regulator-compatible = "ldo4";
+                                       regulator-name = "vdd_ldo4,avdd_osc,vddio_sys";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@9 {
+                                       reg = <9>;
+                                       regulator-compatible = "ldo5";
+                                       regulator-name = "vdd_ldo5,vcore_mmc";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@10 {
+                                       reg = <10>;
+                                       regulator-compatible = "ldo6";
+                                       regulator-name = "vdd_ldo6,avdd_vdac";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@11 {
+                                       reg = <11>;
+                                       regulator-compatible = "ldo7";
+                                       regulator-name = "vdd_ldo7,avdd_hdmi";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               regulator@12 {
+                                       reg = <12>;
+                                       regulator-compatible = "ldo8";
+                                       regulator-name = "vdd_ldo8,avdd_hdmi_pll";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@13 {
+                                       reg = <13>;
+                                       regulator-compatible = "ldo9";
+                                       regulator-name = "vdd_ldo9,avdd_2v85,vdd_ddr_rx";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@14 {
+                                       reg = <14>;
+                                       regulator-compatible = "ldo_rtc";
+                                       regulator-name = "vdd_rtc_out,vdd_cell";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
        };
 
        pmc {
                bus-width = <8>;
        };
 
+       regulators {
+               compatible = "simple-bus";
+               #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;
+               };
+
+               regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "vdd_1v5";
+                       regulator-min-microvolt = <1500000>;
+                       regulator-max-microvolt = <1500000>;
+                       gpio = <&pmic 0 0>;
+               };
+
+               regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       regulator-name = "vdd_1v2";
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       gpio = <&pmic 1 0>;
+                       enable-active-high;
+               };
+
+               regulator@3 {
+                       compatible = "regulator-fixed";
+                       reg = <3>;
+                       regulator-name = "vdd_1v05";
+                       regulator-min-microvolt = <1050000>;
+                       regulator-max-microvolt = <1050000>;
+                       gpio = <&pmic 2 0>;
+                       enable-active-high;
+                       /* Hack until board-harmony-pcie.c is removed */
+                       status = "disabled";
+               };
+
+               regulator@4 {
+                       compatible = "regulator-fixed";
+                       reg = <4>;
+                       regulator-name = "vdd_pnl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio 22 0>; /* gpio PC6 */
+                       enable-active-high;
+               };
+
+               regulator@5 {
+                       compatible = "regulator-fixed";
+                       reg = <5>;
+                       regulator-name = "vdd_bl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio 176 0>; /* gpio PW0 */
+                       enable-active-high;
+               };
+       };
+
        sound {
                compatible = "nvidia,tegra-audio-wm8903-harmony",
                             "nvidia,tegra-audio-wm8903";
diff --git a/arch/arm/boot/dts/tegra20-medcom-wide.dts b/arch/arm/boot/dts/tegra20-medcom-wide.dts
new file mode 100644 (file)
index 0000000..a2d6d65
--- /dev/null
@@ -0,0 +1,58 @@
+/dts-v1/;
+
+/include/ "tegra20-tamonten.dtsi"
+
+/ {
+       model = "Avionic Design Medcom-Wide board";
+       compatible = "ad,medcom-wide", "ad,tamonten", "nvidia,tegra20";
+
+       i2c@7000c000 {
+               wm8903: wm8903@1a {
+                       compatible = "wlf,wm8903";
+                       reg = <0x1a>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <187 0x04>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       micdet-cfg = <0>;
+                       micdet-delay = <100>;
+                       gpio-cfg = <0xffffffff
+                                   0xffffffff
+                                   0
+                                   0xffffffff
+                                   0xffffffff>;
+               };
+       };
+
+       backlight {
+               compatible = "pwm-backlight";
+               pwms = <&pwm 0 5000000>;
+
+               brightness-levels = <0 4 8 16 32 64 128 255>;
+               default-brightness-level = <6>;
+       };
+
+       sound {
+               compatible = "ad,tegra-audio-wm8903-medcom-wide",
+                            "nvidia,tegra-audio-wm8903";
+               nvidia,model = "Avionic Design Medcom-Wide";
+
+               nvidia,audio-routing =
+                       "Headphone Jack", "HPOUTR",
+                       "Headphone Jack", "HPOUTL",
+                       "Int Spk", "ROP",
+                       "Int Spk", "RON",
+                       "Int Spk", "LOP",
+                       "Int Spk", "LON",
+                       "Mic Jack", "MICBIAS",
+                       "IN1L", "Mic Jack";
+
+               nvidia,i2s-controller = <&tegra_i2s1>;
+               nvidia,audio-codec = <&wm8903>;
+
+               nvidia,spkr-en-gpios = <&wm8903 2 0>;
+               nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */
+       };
+};
index 684a9e1..ddf287f 100644 (file)
                status = "okay";
                clock-frequency = <400000>;
 
+               pmic: tps6586x@34 {
+                       compatible = "ti,tps6586x";
+                       reg = <0x34>;
+                       interrupts = <0 86 0x4>;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       sys-supply = <&p5valw_reg>;
+                       vin-sm0-supply = <&sys_reg>;
+                       vin-sm1-supply = <&sys_reg>;
+                       vin-sm2-supply = <&sys_reg>;
+                       vinldo01-supply = <&sm2_reg>;
+                       vinldo23-supply = <&sm2_reg>;
+                       vinldo4-supply = <&sm2_reg>;
+                       vinldo678-supply = <&sm2_reg>;
+                       vinldo9-supply = <&sm2_reg>;
+
+                       regulators {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               sys_reg: regulator@0 {
+                                       reg = <0>;
+                                       regulator-compatible = "sys";
+                                       regulator-name = "vdd_sys";
+                                       regulator-always-on;
+                               };
+
+                               regulator@1 {
+                                       reg = <1>;
+                                       regulator-compatible = "sm0";
+                                       regulator-name = "+1.2vs_sm0,vdd_core";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@2 {
+                                       reg = <2>;
+                                       regulator-compatible = "sm1";
+                                       regulator-name = "+1.0vs_sm1,vdd_cpu";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               sm2_reg: regulator@3 {
+                                       reg = <3>;
+                                       regulator-compatible = "sm2";
+                                       regulator-name = "+3.7vs_sm2,vin_ldo*";
+                                       regulator-min-microvolt = <3700000>;
+                                       regulator-max-microvolt = <3700000>;
+                                       regulator-always-on;
+                               };
+
+                               /* LDO0 is not connected to anything */
+
+                               regulator@5 {
+                                       reg = <5>;
+                                       regulator-compatible = "ldo1";
+                                       regulator-name = "+1.1vs_ldo1,avdd_pll*";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@6 {
+                                       reg = <6>;
+                                       regulator-compatible = "ldo2";
+                                       regulator-name = "+1.2vs_ldo2,vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               regulator@7 {
+                                       reg = <7>;
+                                       regulator-compatible = "ldo3";
+                                       regulator-name = "+3.3vs_ldo3,avdd_usb*";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@8 {
+                                       reg = <8>;
+                                       regulator-compatible = "ldo4";
+                                       regulator-name = "+1.8vs_ldo4,avdd_osc,vddio_sys";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@9 {
+                                       reg = <9>;
+                                       regulator-compatible = "ldo5";
+                                       regulator-name = "+2.85vs_ldo5,vcore_mmc";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@10 {
+                                       reg = <10>;
+                                       regulator-compatible = "ldo6";
+                                       /*
+                                        * Research indicates this should be
+                                        * 1.8v; other boards that use this
+                                        * rail for the same purpose need it
+                                        * set to 1.8v. The schematic signal
+                                        * name is incorrect; perhaps copied
+                                        * from an incorrect NVIDIA reference.
+                                        */
+                                       regulator-name = "+2.85vs_ldo6,avdd_vdac";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@11 {
+                                       reg = <11>;
+                                       regulator-compatible = "ldo7";
+                                       regulator-name = "+3.3vs_ldo7,avdd_hdmi";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               regulator@12 {
+                                       reg = <12>;
+                                       regulator-compatible = "ldo8";
+                                       regulator-name = "+1.8vs_ldo8,avdd_hdmi_pll";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@13 {
+                                       reg = <13>;
+                                       regulator-compatible = "ldo9";
+                                       regulator-name = "+2.85vs_ldo9,vdd_ddr_rx";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@14 {
+                                       reg = <14>;
+                                       regulator-compatible = "ldo_rtc";
+                                       regulator-name = "+3.3vs_rtc";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+
                adt7461@4c {
                        compatible = "adi,adt7461";
                        reg = <0x4c>;
                };
        };
 
+       pmc {
+               nvidia,invert-interrupt;
+       };
+
        usb@c5000000 {
                status = "okay";
        };
                };
        };
 
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               p5valw_reg: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "+5valw";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+       };
+
        sound {
                compatible = "nvidia,tegra-audio-alc5632-paz00",
                        "nvidia,tegra-audio-alc5632";
diff --git a/arch/arm/boot/dts/tegra20-plutux.dts b/arch/arm/boot/dts/tegra20-plutux.dts
new file mode 100644 (file)
index 0000000..331a3ef
--- /dev/null
@@ -0,0 +1,50 @@
+/dts-v1/;
+
+/include/ "tegra20-tamonten.dtsi"
+
+/ {
+       model = "Avionic Design Plutux board";
+       compatible = "ad,plutux", "ad,tamonten", "nvidia,tegra20";
+
+       i2c@7000c000 {
+               wm8903: wm8903@1a {
+                       compatible = "wlf,wm8903";
+                       reg = <0x1a>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <187 0x04>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       micdet-cfg = <0>;
+                       micdet-delay = <100>;
+                       gpio-cfg = <0xffffffff
+                                   0xffffffff
+                                   0
+                                   0xffffffff
+                                   0xffffffff>;
+               };
+       };
+
+       sound {
+               compatible = "ad,tegra-audio-plutux",
+                            "nvidia,tegra-audio-wm8903";
+               nvidia,model = "Avionic Design Plutux";
+
+               nvidia,audio-routing =
+                       "Headphone Jack", "HPOUTR",
+                       "Headphone Jack", "HPOUTL",
+                       "Int Spk", "ROP",
+                       "Int Spk", "RON",
+                       "Int Spk", "LOP",
+                       "Int Spk", "LON",
+                       "Mic Jack", "MICBIAS",
+                       "IN1L", "Mic Jack";
+
+               nvidia,i2s-controller = <&tegra_i2s1>;
+               nvidia,audio-codec = <&wm8903>;
+
+               nvidia,spkr-en-gpios = <&wm8903 2 0>;
+               nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */
+       };
+};
index 85e621a..e60dc71 100644 (file)
                status = "okay";
                clock-frequency = <400000>;
 
+               pmic: tps6586x@34 {
+                       compatible = "ti,tps6586x";
+                       reg = <0x34>;
+                       interrupts = <0 86 0x4>;
+
+                       ti,system-power-controller;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       sys-supply = <&vdd_5v0_reg>;
+                       vin-sm0-supply = <&sys_reg>;
+                       vin-sm1-supply = <&sys_reg>;
+                       vin-sm2-supply = <&sys_reg>;
+                       vinldo01-supply = <&sm2_reg>;
+                       vinldo23-supply = <&sm2_reg>;
+                       vinldo4-supply = <&sm2_reg>;
+                       vinldo678-supply = <&sm2_reg>;
+                       vinldo9-supply = <&sm2_reg>;
+
+                       regulators {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               sys_reg: regulator@0 {
+                                       reg = <0>;
+                                       regulator-compatible = "sys";
+                                       regulator-name = "vdd_sys";
+                                       regulator-always-on;
+                               };
+
+                               regulator@1 {
+                                       reg = <1>;
+                                       regulator-compatible = "sm0";
+                                       regulator-name = "vdd_sm0,vdd_core";
+                                       regulator-min-microvolt = <1300000>;
+                                       regulator-max-microvolt = <1300000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@2 {
+                                       reg = <2>;
+                                       regulator-compatible = "sm1";
+                                       regulator-name = "vdd_sm1,vdd_cpu";
+                                       regulator-min-microvolt = <1125000>;
+                                       regulator-max-microvolt = <1125000>;
+                                       regulator-always-on;
+                               };
+
+                               sm2_reg: regulator@3 {
+                                       reg = <3>;
+                                       regulator-compatible = "sm2";
+                                       regulator-name = "vdd_sm2,vin_ldo*";
+                                       regulator-min-microvolt = <3700000>;
+                                       regulator-max-microvolt = <3700000>;
+                                       regulator-always-on;
+                               };
+
+                               /* LDO0 is not connected to anything */
+
+                               regulator@5 {
+                                       reg = <5>;
+                                       regulator-compatible = "ldo1";
+                                       regulator-name = "vdd_ldo1,avdd_pll*";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@6 {
+                                       reg = <6>;
+                                       regulator-compatible = "ldo2";
+                                       regulator-name = "vdd_ldo2,vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               regulator@7 {
+                                       reg = <7>;
+                                       regulator-compatible = "ldo3";
+                                       regulator-name = "vdd_ldo3,avdd_usb*";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@8 {
+                                       reg = <8>;
+                                       regulator-compatible = "ldo4";
+                                       regulator-name = "vdd_ldo4,avdd_osc,vddio_sys";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@9 {
+                                       reg = <9>;
+                                       regulator-compatible = "ldo5";
+                                       regulator-name = "vdd_ldo5,vcore_mmc";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@10 {
+                                       reg = <10>;
+                                       regulator-compatible = "ldo6";
+                                       regulator-name = "vdd_ldo6,avdd_vdac,vddio_vi,vddio_cam";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@11 {
+                                       reg = <11>;
+                                       regulator-compatible = "ldo7";
+                                       regulator-name = "vdd_ldo7,avdd_hdmi,vdd_fuse";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               regulator@12 {
+                                       reg = <12>;
+                                       regulator-compatible = "ldo8";
+                                       regulator-name = "vdd_ldo8,avdd_hdmi_pll";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@13 {
+                                       reg = <13>;
+                                       regulator-compatible = "ldo9";
+                                       regulator-name = "vdd_ldo9,avdd_2v85,vdd_ddr_rx";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@14 {
+                                       reg = <14>;
+                                       regulator-compatible = "ldo_rtc";
+                                       regulator-name = "vdd_rtc_out,vdd_cell";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+
                temperature-sensor@4c {
                        compatible = "nct1008";
                        reg = <0x4c>;
                };
        };
 
+       pmc {
+               nvidia,invert-interrupt;
+       };
+
        memory-controller@0x7000f400 {
                emc-table@190000 {
                        reg = <190000>;
                };
        };
 
+       regulators {
+               compatible = "simple-bus";
+               #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;
+               };
+
+               regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "vdd_1v5";
+                       regulator-min-microvolt = <1500000>;
+                       regulator-max-microvolt = <1500000>;
+                       gpio = <&pmic 0 0>;
+               };
+
+               regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       regulator-name = "vdd_1v2";
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       gpio = <&pmic 1 0>;
+                       enable-active-high;
+               };
+       };
+
        sound {
                compatible = "nvidia,tegra-audio-wm8903-seaboard",
                             "nvidia,tegra-audio-wm8903";
diff --git a/arch/arm/boot/dts/tegra20-tamonten.dtsi b/arch/arm/boot/dts/tegra20-tamonten.dtsi
new file mode 100644 (file)
index 0000000..f18cec9
--- /dev/null
@@ -0,0 +1,449 @@
+/include/ "tegra20.dtsi"
+
+/ {
+       model = "Avionic Design Tamonten SOM";
+       compatible = "ad,tamonten", "nvidia,tegra20";
+
+       memory {
+               reg = <0x00000000 0x20000000>;
+       };
+
+       pinmux {
+               pinctrl-names = "default";
+               pinctrl-0 = <&state_default>;
+
+               state_default: pinmux {
+                       ata {
+                               nvidia,pins = "ata";
+                               nvidia,function = "ide";
+                       };
+                       atb {
+                               nvidia,pins = "atb", "gma", "gme";
+                               nvidia,function = "sdio4";
+                       };
+                       atc {
+                               nvidia,pins = "atc";
+                               nvidia,function = "nand";
+                       };
+                       atd {
+                               nvidia,pins = "atd", "ate", "gmb", "gmd", "gpu",
+                                       "spia", "spib", "spic";
+                               nvidia,function = "gmi";
+                       };
+                       cdev1 {
+                               nvidia,pins = "cdev1";
+                               nvidia,function = "plla_out";
+                       };
+                       cdev2 {
+                               nvidia,pins = "cdev2";
+                               nvidia,function = "pllp_out4";
+                       };
+                       crtp {
+                               nvidia,pins = "crtp";
+                               nvidia,function = "crt";
+                       };
+                       csus {
+                               nvidia,pins = "csus";
+                               nvidia,function = "vi_sensor_clk";
+                       };
+                       dap1 {
+                               nvidia,pins = "dap1";
+                               nvidia,function = "dap1";
+                       };
+                       dap2 {
+                               nvidia,pins = "dap2";
+                               nvidia,function = "dap2";
+                       };
+                       dap3 {
+                               nvidia,pins = "dap3";
+                               nvidia,function = "dap3";
+                       };
+                       dap4 {
+                               nvidia,pins = "dap4";
+                               nvidia,function = "dap4";
+                       };
+                       ddc {
+                               nvidia,pins = "ddc";
+                               nvidia,function = "i2c2";
+                       };
+                       dta {
+                               nvidia,pins = "dta", "dtd";
+                               nvidia,function = "sdio2";
+                       };
+                       dtb {
+                               nvidia,pins = "dtb", "dtc", "dte";
+                               nvidia,function = "rsvd1";
+                       };
+                       dtf {
+                               nvidia,pins = "dtf";
+                               nvidia,function = "i2c3";
+                       };
+                       gmc {
+                               nvidia,pins = "gmc";
+                               nvidia,function = "uartd";
+                       };
+                       gpu7 {
+                               nvidia,pins = "gpu7";
+                               nvidia,function = "rtck";
+                       };
+                       gpv {
+                               nvidia,pins = "gpv", "slxa", "slxk";
+                               nvidia,function = "pcie";
+                       };
+                       hdint {
+                               nvidia,pins = "hdint", "pta";
+                               nvidia,function = "hdmi";
+                       };
+                       i2cp {
+                               nvidia,pins = "i2cp";
+                               nvidia,function = "i2cp";
+                       };
+                       irrx {
+                               nvidia,pins = "irrx", "irtx";
+                               nvidia,function = "uarta";
+                       };
+                       kbca {
+                               nvidia,pins = "kbca", "kbcb", "kbcc", "kbcd",
+                                       "kbce", "kbcf";
+                               nvidia,function = "kbc";
+                       };
+                       lcsn {
+                               nvidia,pins = "lcsn", "ld0", "ld1", "ld2",
+                                       "ld3", "ld4", "ld5", "ld6", "ld7",
+                                       "ld8", "ld9", "ld10", "ld11", "ld12",
+                                       "ld13", "ld14", "ld15", "ld16", "ld17",
+                                       "ldc", "ldi", "lhp0", "lhp1", "lhp2",
+                                       "lhs", "lm0", "lm1", "lpp", "lpw0",
+                                       "lpw1", "lpw2", "lsc0", "lsc1", "lsck",
+                                       "lsda", "lsdi", "lspi", "lvp0", "lvp1",
+                                       "lvs";
+                               nvidia,function = "displaya";
+                       };
+                       owc {
+                               nvidia,pins = "owc", "spdi", "spdo", "uac";
+                               nvidia,function = "rsvd2";
+                       };
+                       pmc {
+                               nvidia,pins = "pmc";
+                               nvidia,function = "pwr_on";
+                       };
+                       rm {
+                               nvidia,pins = "rm";
+                               nvidia,function = "i2c1";
+                       };
+                       sdb {
+                               nvidia,pins = "sdb", "sdc", "sdd";
+                               nvidia,function = "pwm";
+                       };
+                       sdio1 {
+                               nvidia,pins = "sdio1";
+                               nvidia,function = "sdio1";
+                       };
+                       slxc {
+                               nvidia,pins = "slxc", "slxd";
+                               nvidia,function = "spdif";
+                       };
+                       spid {
+                               nvidia,pins = "spid", "spie", "spif";
+                               nvidia,function = "spi1";
+                       };
+                       spig {
+                               nvidia,pins = "spig", "spih";
+                               nvidia,function = "spi2_alt";
+                       };
+                       uaa {
+                               nvidia,pins = "uaa", "uab", "uda";
+                               nvidia,function = "ulpi";
+                       };
+                       uad {
+                               nvidia,pins = "uad";
+                               nvidia,function = "irda";
+                       };
+                       uca {
+                               nvidia,pins = "uca", "ucb";
+                               nvidia,function = "uartc";
+                       };
+                       conf_ata {
+                               nvidia,pins = "ata", "atb", "atc", "atd", "ate",
+                                       "cdev1", "cdev2", "dap1", "dtb", "gma",
+                                       "gmb", "gmc", "gmd", "gme", "gpu7",
+                                       "gpv", "i2cp", "pta", "rm", "slxa",
+                                       "slxk", "spia", "spib", "uac";
+                               nvidia,pull = <0>;
+                               nvidia,tristate = <0>;
+                       };
+                       conf_ck32 {
+                               nvidia,pins = "ck32", "ddrc", "pmca", "pmcb",
+                                       "pmcc", "pmcd", "pmce", "xm2c", "xm2d";
+                               nvidia,pull = <0>;
+                       };
+                       conf_csus {
+                               nvidia,pins = "csus", "spid", "spif";
+                               nvidia,pull = <1>;
+                               nvidia,tristate = <1>;
+                       };
+                       conf_crtp {
+                               nvidia,pins = "crtp", "dap2", "dap3", "dap4",
+                                       "dtc", "dte", "dtf", "gpu", "sdio1",
+                                       "slxc", "slxd", "spdi", "spdo", "spig",
+                                       "uda";
+                               nvidia,pull = <0>;
+                               nvidia,tristate = <1>;
+                       };
+                       conf_ddc {
+                               nvidia,pins = "ddc", "dta", "dtd", "kbca",
+                                       "kbcb", "kbcc", "kbcd", "kbce", "kbcf",
+                                       "sdc";
+                               nvidia,pull = <2>;
+                               nvidia,tristate = <0>;
+                       };
+                       conf_hdint {
+                               nvidia,pins = "hdint", "lcsn", "ldc", "lm1",
+                                       "lpw1", "lsc1", "lsck", "lsda", "lsdi",
+                                       "lvp0", "owc", "sdb";
+                               nvidia,tristate = <1>;
+                       };
+                       conf_irrx {
+                               nvidia,pins = "irrx", "irtx", "sdd", "spic",
+                                       "spie", "spih", "uaa", "uab", "uad",
+                                       "uca", "ucb";
+                               nvidia,pull = <2>;
+                               nvidia,tristate = <1>;
+                       };
+                       conf_lc {
+                               nvidia,pins = "lc", "ls";
+                               nvidia,pull = <2>;
+                       };
+                       conf_ld0 {
+                               nvidia,pins = "ld0", "ld1", "ld2", "ld3", "ld4",
+                                       "ld5", "ld6", "ld7", "ld8", "ld9",
+                                       "ld10", "ld11", "ld12", "ld13", "ld14",
+                                       "ld15", "ld16", "ld17", "ldi", "lhp0",
+                                       "lhp1", "lhp2", "lhs", "lm0", "lpp",
+                                       "lpw0", "lpw2", "lsc0", "lspi", "lvp1",
+                                       "lvs", "pmc";
+                               nvidia,tristate = <0>;
+                       };
+                       conf_ld17_0 {
+                               nvidia,pins = "ld17_0", "ld19_18", "ld21_20",
+                                       "ld23_22";
+                               nvidia,pull = <1>;
+                       };
+               };
+       };
+
+       i2s@70002800 {
+               status = "okay";
+       };
+
+       serial@70006300 {
+               clock-frequency = <216000000>;
+               status = "okay";
+       };
+
+       i2c@7000c000 {
+               clock-frequency = <400000>;
+               status = "okay";
+       };
+
+       i2c@7000d000 {
+               clock-frequency = <400000>;
+               status = "okay";
+
+               pmic: tps6586x@34 {
+                       compatible = "ti,tps6586x";
+                       reg = <0x34>;
+                       interrupts = <0 86 0x4>;
+
+                       ti,system-power-controller;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       sys-supply = <&vdd_5v0_reg>;
+                       vin-sm0-supply = <&sys_reg>;
+                       vin-sm1-supply = <&sys_reg>;
+                       vin-sm2-supply = <&sys_reg>;
+                       vinldo01-supply = <&sm2_reg>;
+                       vinldo23-supply = <&sm2_reg>;
+                       vinldo4-supply = <&sm2_reg>;
+                       vinldo678-supply = <&sm2_reg>;
+                       vinldo9-supply = <&sm2_reg>;
+
+                       regulators {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               sys_reg: regulator@0 {
+                                       reg = <0>;
+                                       regulator-compatible = "sys";
+                                       regulator-name = "vdd_sys";
+                                       regulator-always-on;
+                               };
+
+                               regulator@1 {
+                                       reg = <1>;
+                                       regulator-compatible = "sm0";
+                                       regulator-name = "vdd_sys_sm0,vdd_core";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@2 {
+                                       reg = <2>;
+                                       regulator-compatible = "sm1";
+                                       regulator-name = "vdd_sys_sm1,vdd_cpu";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               sm2_reg: regulator@3 {
+                                       reg = <3>;
+                                       regulator-compatible = "sm2";
+                                       regulator-name = "vdd_sys_sm2,vin_ldo*";
+                                       regulator-min-microvolt = <3700000>;
+                                       regulator-max-microvolt = <3700000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@4 {
+                                       reg = <4>;
+                                       regulator-compatible = "ldo0";
+                                       regulator-name = "vdd_ldo0,vddio_pex_clk";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               regulator@5 {
+                                       reg = <5>;
+                                       regulator-compatible = "ldo1";
+                                       regulator-name = "vdd_ldo1,avdd_pll*";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@6 {
+                                       reg = <6>;
+                                       regulator-compatible = "ldo2";
+                                       regulator-name = "vdd_ldo2,vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               regulator@7 {
+                                       reg = <7>;
+                                       regulator-compatible = "ldo3";
+                                       regulator-name = "vdd_ldo3,avdd_usb*";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@8 {
+                                       reg = <8>;
+                                       regulator-compatible = "ldo4";
+                                       regulator-name = "vdd_ldo4,avdd_osc,vddio_sys";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@9 {
+                                       reg = <9>;
+                                       regulator-compatible = "ldo5";
+                                       regulator-name = "vdd_ldo5,vcore_mmc";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                               };
+
+                               regulator@10 {
+                                       reg = <10>;
+                                       regulator-compatible = "ldo6";
+                                       regulator-name = "vdd_ldo6,avdd_vdac";
+                                       /*
+                                        * According to the Tegra 2 Automotive
+                                        * DataSheet, a typical value for this
+                                        * would be 2.8V, but the PMIC only
+                                        * supports 2.85V.
+                                        */
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                               };
+
+                               regulator@11 {
+                                       reg = <11>;
+                                       regulator-compatible = "ldo7";
+                                       regulator-name = "vdd_ldo7,avdd_hdmi";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               regulator@12 {
+                                       reg = <12>;
+                                       regulator-compatible = "ldo8";
+                                       regulator-name = "vdd_ldo8,avdd_hdmi_pll";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@13 {
+                                       reg = <13>;
+                                       regulator-compatible = "ldo9";
+                                       regulator-name = "vdd_ldo9,vdd_ddr_rx,avdd_cam";
+                                       /*
+                                        * According to the Tegra 2 Automotive
+                                        * DataSheet, a typical value for this
+                                        * would be 2.8V, but the PMIC only
+                                        * supports 2.85V.
+                                        */
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@14 {
+                                       reg = <14>;
+                                       regulator-compatible = "ldo_rtc";
+                                       regulator-name = "vdd_rtc_out";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+       };
+
+       pmc {
+               nvidia,invert-interrupt;
+       };
+
+       usb@c5008000 {
+               status = "okay";
+       };
+
+       sdhci@c8000600 {
+               cd-gpios = <&gpio 58 0>; /* gpio PH2 */
+               wp-gpios = <&gpio 59 0>; /* gpio PH3 */
+               bus-width = <4>;
+               status = "okay";
+       };
+
+       regulators {
+               compatible = "simple-bus";
+
+               #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;
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/tegra20-tec.dts b/arch/arm/boot/dts/tegra20-tec.dts
new file mode 100644 (file)
index 0000000..9aff31b
--- /dev/null
@@ -0,0 +1,53 @@
+/dts-v1/;
+
+/include/ "tegra20-tamonten.dtsi"
+
+/ {
+       model = "Avionic Design Tamonten Evaluation Carrier";
+       compatible = "ad,tec", "ad,tamonten", "nvidia,tegra20";
+
+       i2c@7000c000 {
+               clock-frequency = <400000>;
+               status = "okay";
+
+               wm8903: wm8903@1a {
+                       compatible = "wlf,wm8903";
+                       reg = <0x1a>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <187 0x04>;
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       micdet-cfg = <0>;
+                       micdet-delay = <100>;
+                       gpio-cfg = <0xffffffff
+                                   0xffffffff
+                                   0
+                                   0xffffffff
+                                   0xffffffff>;
+               };
+       };
+
+       sound {
+               compatible = "ad,tegra-audio-wm8903-tec",
+                            "nvidia,tegra-audio-wm8903";
+               nvidia,model = "Avionic Design TEC";
+
+               nvidia,audio-routing =
+                       "Headphone Jack", "HPOUTR",
+                       "Headphone Jack", "HPOUTL",
+                       "Int Spk", "ROP",
+                       "Int Spk", "RON",
+                       "Int Spk", "LOP",
+                       "Int Spk", "LON",
+                       "Mic Jack", "MICBIAS",
+                       "IN1L", "Mic Jack";
+
+               nvidia,i2s-controller = <&tegra_i2s1>;
+               nvidia,audio-codec = <&wm8903>;
+
+               nvidia,spkr-en-gpios = <&wm8903 2 0>;
+               nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */
+       };
+};
index be90544..3e5952f 100644 (file)
        i2c@7000d000 {
                status = "okay";
                clock-frequency = <400000>;
+
+               pmic: tps6586x@34 {
+                       compatible = "ti,tps6586x";
+                       reg = <0x34>;
+                       interrupts = <0 86 0x4>;
+
+                       ti,system-power-controller;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       sys-supply = <&vdd_5v0_reg>;
+                       vin-sm0-supply = <&sys_reg>;
+                       vin-sm1-supply = <&sys_reg>;
+                       vin-sm2-supply = <&sys_reg>;
+                       vinldo01-supply = <&sm2_reg>;
+                       vinldo23-supply = <&sm2_reg>;
+                       vinldo4-supply = <&sm2_reg>;
+                       vinldo678-supply = <&sm2_reg>;
+                       vinldo9-supply = <&sm2_reg>;
+
+                       regulators {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               sys_reg: regulator@0 {
+                                       reg = <0>;
+                                       regulator-compatible = "sys";
+                                       regulator-name = "vdd_sys";
+                                       regulator-always-on;
+                               };
+
+                               regulator@1 {
+                                       reg = <1>;
+                                       regulator-compatible = "sm0";
+                                       regulator-name = "vdd_sm0,vdd_core";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@2 {
+                                       reg = <2>;
+                                       regulator-compatible = "sm1";
+                                       regulator-name = "vdd_sm1,vdd_cpu";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               sm2_reg: regulator@3 {
+                                       reg = <3>;
+                                       regulator-compatible = "sm2";
+                                       regulator-name = "vdd_sm2,vin_ldo*";
+                                       regulator-min-microvolt = <3700000>;
+                                       regulator-max-microvolt = <3700000>;
+                                       regulator-always-on;
+                               };
+
+                               /* LDO0 is not connected to anything */
+
+                               regulator@5 {
+                                       reg = <5>;
+                                       regulator-compatible = "ldo1";
+                                       regulator-name = "vdd_ldo1,avdd_pll*";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@6 {
+                                       reg = <6>;
+                                       regulator-compatible = "ldo2";
+                                       regulator-name = "vdd_ldo2,vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               regulator@7 {
+                                       reg = <7>;
+                                       regulator-compatible = "ldo3";
+                                       regulator-name = "vdd_ldo3,avdd_usb*";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@8 {
+                                       reg = <8>;
+                                       regulator-compatible = "ldo4";
+                                       regulator-name = "vdd_ldo4,avdd_osc,vddio_sys";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@9 {
+                                       reg = <9>;
+                                       regulator-compatible = "ldo5";
+                                       regulator-name = "vdd_ldo5,vcore_mmc";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@10 {
+                                       reg = <10>;
+                                       regulator-compatible = "ldo6";
+                                       regulator-name = "vdd_ldo6,avdd_vdac";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@11 {
+                                       reg = <11>;
+                                       regulator-compatible = "ldo7";
+                                       regulator-name = "vdd_ldo7,avdd_hdmi,vdd_fuse";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               regulator@12 {
+                                       reg = <12>;
+                                       regulator-compatible = "ldo8";
+                                       regulator-name = "vdd_ldo8,avdd_hdmi_pll";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@13 {
+                                       reg = <13>;
+                                       regulator-compatible = "ldo9";
+                                       regulator-name = "vdd_ldo9,avdd_2v85,vdd_ddr_rx";
+                                       regulator-min-microvolt = <2850000>;
+                                       regulator-max-microvolt = <2850000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@14 {
+                                       reg = <14>;
+                                       regulator-compatible = "ldo_rtc";
+                                       regulator-name = "vdd_rtc_out,vdd_cell";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+       };
+
+       pmc {
+               nvidia,invert-interrupt;
        };
 
        usb@c5000000 {
                bus-width = <8>;
        };
 
+       regulators {
+               compatible = "simple-bus";
+               #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;
+               };
+
+               regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "vdd_1v5";
+                       regulator-min-microvolt = <1500000>;
+                       regulator-max-microvolt = <1500000>;
+                       gpio = <&pmic 0 0>;
+               };
+
+               regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       regulator-name = "vdd_1v2";
+                       regulator-min-microvolt = <1200000>;
+                       regulator-max-microvolt = <1200000>;
+                       gpio = <&pmic 1 0>;
+                       enable-active-high;
+               };
+
+               regulator@3 {
+                       compatible = "regulator-fixed";
+                       reg = <3>;
+                       regulator-name = "vdd_pnl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio 22 0>; /* gpio PC6 */
+                       enable-active-high;
+               };
+
+               regulator@4 {
+                       compatible = "regulator-fixed";
+                       reg = <4>;
+                       regulator-name = "vdd_bl";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       gpio = <&gpio 176 0>; /* gpio PW0 */
+                       enable-active-high;
+               };
+       };
+
        sound {
                compatible = "nvidia,tegra-audio-wm8903-ventana",
                             "nvidia,tegra-audio-wm8903";
index 6916310..c636d00 100644 (file)
                        gpio-controller;
                        #gpio-cells = <2>;
                };
+
+               max8907@3c {
+                       compatible = "maxim,max8907";
+                       reg = <0x3c>;
+                       interrupts = <0 86 0x4>;
+
+                       maxim,system-power-controller;
+
+                       mbatt-supply = <&usb0_vbus_reg>;
+                       in-v1-supply = <&mbatt_reg>;
+                       in-v2-supply = <&mbatt_reg>;
+                       in-v3-supply = <&mbatt_reg>;
+                       in1-supply = <&mbatt_reg>;
+                       in2-supply = <&nvvdd_sv3_reg>;
+                       in3-supply = <&mbatt_reg>;
+                       in4-supply = <&mbatt_reg>;
+                       in5-supply = <&mbatt_reg>;
+                       in6-supply = <&mbatt_reg>;
+                       in7-supply = <&mbatt_reg>;
+                       in8-supply = <&mbatt_reg>;
+                       in9-supply = <&mbatt_reg>;
+                       in10-supply = <&mbatt_reg>;
+                       in11-supply = <&mbatt_reg>;
+                       in12-supply = <&mbatt_reg>;
+                       in13-supply = <&mbatt_reg>;
+                       in14-supply = <&mbatt_reg>;
+                       in15-supply = <&mbatt_reg>;
+                       in16-supply = <&mbatt_reg>;
+                       in17-supply = <&nvvdd_sv3_reg>;
+                       in18-supply = <&nvvdd_sv3_reg>;
+                       in19-supply = <&mbatt_reg>;
+                       in20-supply = <&mbatt_reg>;
+
+                       regulators {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               mbatt_reg: regulator@0 {
+                                       reg = <0>;
+                                       regulator-compatible = "mbatt";
+                                       regulator-name = "vbat_pmu";
+                                       regulator-always-on;
+                               };
+
+                               regulator@1 {
+                                       reg = <1>;
+                                       regulator-compatible = "sd1";
+                                       regulator-name = "nvvdd_sv1,vdd_cpu_pmu";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@2 {
+                                       reg = <2>;
+                                       regulator-compatible = "sd2";
+                                       regulator-name = "nvvdd_sv2,vdd_core";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               nvvdd_sv3_reg: regulator@3 {
+                                       reg = <3>;
+                                       regulator-compatible = "sd3";
+                                       regulator-name = "nvvdd_sv3";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@4 {
+                                       reg = <4>;
+                                       regulator-compatible = "ldo1";
+                                       regulator-name = "nvvdd_ldo1,vddio_rx_ddr,vcore_acc";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@5 {
+                                       reg = <5>;
+                                       regulator-compatible = "ldo2";
+                                       regulator-name = "nvvdd_ldo2,avdd_pll*";
+                                       regulator-min-microvolt = <1100000>;
+                                       regulator-max-microvolt = <1100000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@6 {
+                                       reg = <6>;
+                                       regulator-compatible = "ldo3";
+                                       regulator-name = "nvvdd_ldo3,vcom_1v8b";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@7 {
+                                       reg = <7>;
+                                       regulator-compatible = "ldo4";
+                                       regulator-name = "nvvdd_ldo4,avdd_usb*";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@8 {
+                                       reg = <8>;
+                                       regulator-compatible = "ldo5";
+                                       regulator-name = "nvvdd_ldo5,vcore_mmc,avdd_lcd1,vddio_1wire";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@9 {
+                                       reg = <9>;
+                                       regulator-compatible = "ldo6";
+                                       regulator-name = "nvvdd_ldo6,avdd_hdmi_pll";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@10 {
+                                       reg = <10>;
+                                       regulator-compatible = "ldo7";
+                                       regulator-name = "nvvdd_ldo7,avddio_audio";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@11 {
+                                       reg = <11>;
+                                       regulator-compatible = "ldo8";
+                                       regulator-name = "nvvdd_ldo8,vcom_3v0,vcore_cmps";
+                                       regulator-min-microvolt = <3000000>;
+                                       regulator-max-microvolt = <3000000>;
+                               };
+
+                               regulator@12 {
+                                       reg = <12>;
+                                       regulator-compatible = "ldo9";
+                                       regulator-name = "nvvdd_ldo9,avdd_cam*";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                               };
+
+                               regulator@13 {
+                                       reg = <13>;
+                                       regulator-compatible = "ldo10";
+                                       regulator-name = "nvvdd_ldo10,avdd_usb_ic_3v0";
+                                       regulator-min-microvolt = <3000000>;
+                                       regulator-max-microvolt = <3000000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@14 {
+                                       reg = <14>;
+                                       regulator-compatible = "ldo11";
+                                       regulator-name = "nvvdd_ldo11,vddio_pex_clk,vcom_33,avdd_hdmi";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               regulator@15 {
+                                       reg = <15>;
+                                       regulator-compatible = "ldo12";
+                                       regulator-name = "nvvdd_ldo12,vddio_sdio";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@16 {
+                                       reg = <16>;
+                                       regulator-compatible = "ldo13";
+                                       regulator-name = "nvvdd_ldo13,vcore_phtn,vdd_af";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                               };
+
+                               regulator@17 {
+                                       reg = <17>;
+                                       regulator-compatible = "ldo14";
+                                       regulator-name = "nvvdd_ldo14,avdd_vdac";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                               };
+
+                               regulator@18 {
+                                       reg = <18>;
+                                       regulator-compatible = "ldo15";
+                                       regulator-name = "nvvdd_ldo15,vcore_temp,vddio_hdcp";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                               };
+
+                               regulator@19 {
+                                       reg = <19>;
+                                       regulator-compatible = "ldo16";
+                                       regulator-name = "nvvdd_ldo16,vdd_dbrtr";
+                                       regulator-min-microvolt = <1300000>;
+                                       regulator-max-microvolt = <1300000>;
+                               };
+
+                               regulator@20 {
+                                       reg = <20>;
+                                       regulator-compatible = "ldo17";
+                                       regulator-name = "nvvdd_ldo17,vddio_mipi";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               regulator@21 {
+                                       reg = <21>;
+                                       regulator-compatible = "ldo18";
+                                       regulator-name = "nvvdd_ldo18,vddio_vi,vcore_cam*";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                               };
+
+                               regulator@22 {
+                                       reg = <22>;
+                                       regulator-compatible = "ldo19";
+                                       regulator-name = "nvvdd_ldo19,avdd_lcd2,vddio_lx";
+                                       regulator-min-microvolt = <2800000>;
+                                       regulator-max-microvolt = <2800000>;
+                               };
+
+                               regulator@23 {
+                                       reg = <23>;
+                                       regulator-compatible = "ldo20";
+                                       regulator-name = "nvvdd_ldo20,vddio_ddr_1v2,vddio_hsic,vcom_1v2";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@24 {
+                                       reg = <24>;
+                                       regulator-compatible = "out5v";
+                                       regulator-name = "usb0_vbus_reg";
+                               };
+
+                               regulator@25 {
+                                       reg = <25>;
+                                       regulator-compatible = "out33v";
+                                       regulator-name = "pmu_out3v3";
+                               };
+
+                               regulator@26 {
+                                       reg = <26>;
+                                       regulator-compatible = "bbat";
+                                       regulator-name = "pmu_bbat";
+                                       regulator-min-microvolt = <2400000>;
+                                       regulator-max-microvolt = <2400000>;
+                                       regulator-always-on;
+                               };
+
+                               regulator@27 {
+                                       reg = <27>;
+                                       regulator-compatible = "sdby";
+                                       regulator-name = "vdd_aon";
+                                       regulator-always-on;
+                               };
+
+                               regulator@28 {
+                                       reg = <28>;
+                                       regulator-compatible = "vrtc";
+                                       regulator-name = "vrtc,pmu_vccadc";
+                                       regulator-always-on;
+                               };
+                       };
+               };
+       };
+
+       pmc {
+               nvidia,invert-interrupt;
        };
 
        usb@c5000000 {
                bus-width = <8>;
        };
 
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               usb0_vbus_reg: regulator {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "usb0_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+       };
+
        sound {
                compatible = "nvidia,tegra-audio-wm8753-whistler",
                             "nvidia,tegra-audio-wm8753";
index 405d167..67a6cd9 100644 (file)
                status = "disabled";
        };
 
-       pwm {
+       pwm: pwm {
                compatible = "nvidia,tegra20-pwm";
                reg = <0x7000a000 0x100>;
                #pwm-cells = <2>;
diff --git a/arch/arm/boot/dts/tegra30-cardhu-a02.dts b/arch/arm/boot/dts/tegra30-cardhu-a02.dts
new file mode 100644 (file)
index 0000000..dd4222f
--- /dev/null
@@ -0,0 +1,87 @@
+/dts-v1/;
+
+/include/ "tegra30-cardhu.dtsi"
+
+/* This dts file support the cardhu A02 version of board */
+
+/ {
+       model = "NVIDIA Tegra30 Cardhu A02 evaluation board";
+       compatible = "nvidia,cardhu-a02", "nvidia,cardhu", "nvidia,tegra30";
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ddr_reg: regulator@100 {
+                       compatible = "regulator-fixed";
+                       reg = <100>;
+                       regulator-name = "vdd_ddr";
+                       regulator-min-microvolt = <1500000>;
+                       regulator-max-microvolt = <1500000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       enable-active-high;
+                       gpio = <&pmic 6 0>;
+               };
+
+               sys_3v3_reg: regulator@101 {
+                       compatible = "regulator-fixed";
+                       reg = <101>;
+                       regulator-name = "sys_3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       enable-active-high;
+                       gpio = <&pmic 7 0>;
+               };
+
+               usb1_vbus_reg: regulator@102 {
+                       compatible = "regulator-fixed";
+                       reg = <102>;
+                       regulator-name = "usb1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       gpio = <&gpio 68 0>; /* GPIO PI4 */
+                       gpio-open-drain;
+                       vin-supply = <&vdd_5v0_reg>;
+               };
+
+               usb3_vbus_reg: regulator@103 {
+                       compatible = "regulator-fixed";
+                       reg = <103>;
+                       regulator-name = "usb3_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       gpio = <&gpio 63 0>; /* GPIO PH7 */
+                       gpio-open-drain;
+                       vin-supply = <&vdd_5v0_reg>;
+               };
+
+               vdd_5v0_reg: regulator@104 {
+                       compatible = "regulator-fixed";
+                       reg = <104>;
+                       regulator-name = "5v0";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       gpio = <&pmic 2 0>;
+               };
+
+               vdd_bl_reg: regulator@105 {
+                       compatible = "regulator-fixed";
+                       reg = <105>;
+                       regulator-name = "vdd_bl";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       enable-active-high;
+                       gpio = <&gpio 83 0>; /* GPIO PK3 */
+               };
+       };
+};
+
diff --git a/arch/arm/boot/dts/tegra30-cardhu-a04.dts b/arch/arm/boot/dts/tegra30-cardhu-a04.dts
new file mode 100644 (file)
index 0000000..0828f09
--- /dev/null
@@ -0,0 +1,98 @@
+/dts-v1/;
+
+/include/ "tegra30-cardhu.dtsi"
+
+/* This dts file support the cardhu A04 and later versions of board */
+
+/ {
+       model = "NVIDIA Tegra30 Cardhu A04 (A05, A06, A07) evaluation board";
+       compatible = "nvidia,cardhu-a04", "nvidia,cardhu", "nvidia,tegra30";
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               ddr_reg: regulator@100 {
+                       compatible = "regulator-fixed";
+                       regulator-name = "ddr";
+                       reg = <100>;
+                       regulator-min-microvolt = <1500000>;
+                       regulator-max-microvolt = <1500000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       enable-active-high;
+                       gpio = <&pmic 7 0>;
+               };
+
+               sys_3v3_reg: regulator@101 {
+                       compatible = "regulator-fixed";
+                       reg = <101>;
+                       regulator-name = "sys_3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       enable-active-high;
+                       gpio = <&pmic 6 0>;
+               };
+
+               usb1_vbus_reg: regulator@102 {
+                       compatible = "regulator-fixed";
+                       reg = <102>;
+                       regulator-name = "usb1_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       gpio = <&gpio 238 0>; /* GPIO PDD6 */
+                       gpio-open-drain;
+                       vin-supply = <&vdd_5v0_reg>;
+               };
+
+               usb3_vbus_reg: regulator@103 {
+                       compatible = "regulator-fixed";
+                       reg = <103>;
+                       regulator-name = "usb3_vbus";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       gpio = <&gpio 236 0>; /* GPIO PDD4 */
+                       gpio-open-drain;
+                       vin-supply = <&vdd_5v0_reg>;
+               };
+
+               vdd_5v0_reg: regulator@104 {
+                       compatible = "regulator-fixed";
+                       reg = <104>;
+                       regulator-name = "5v0";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       gpio = <&pmic 8 0>;
+               };
+
+               vdd_bl_reg: regulator@105 {
+                       compatible = "regulator-fixed";
+                       reg = <105>;
+                       regulator-name = "vdd_bl";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       enable-active-high;
+                       gpio = <&gpio 234 0>; /* GPIO PDD2 */
+               };
+
+               vdd_bl2_reg: regulator@106 {
+                       compatible = "regulator-fixed";
+                       reg = <106>;
+                       regulator-name = "vdd_bl2";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       enable-active-high;
+                       gpio = <&gpio 232 0>; /* GPIO PDD0 */
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/tegra30-cardhu.dts b/arch/arm/boot/dts/tegra30-cardhu.dts
deleted file mode 100644 (file)
index c169bce..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-/dts-v1/;
-
-/include/ "tegra30.dtsi"
-
-/ {
-       model = "NVIDIA Tegra30 Cardhu evaluation board";
-       compatible = "nvidia,cardhu", "nvidia,tegra30";
-
-       memory {
-               reg = <0x80000000 0x40000000>;
-       };
-
-       pinmux {
-               pinctrl-names = "default";
-               pinctrl-0 = <&state_default>;
-
-               state_default: pinmux {
-                       sdmmc1_clk_pz0 {
-                               nvidia,pins = "sdmmc1_clk_pz0";
-                               nvidia,function = "sdmmc1";
-                               nvidia,pull = <0>;
-                               nvidia,tristate = <0>;
-                       };
-                       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 = <2>;
-                               nvidia,tristate = <0>;
-                       };
-                       sdmmc4_clk_pcc4 {
-                               nvidia,pins =   "sdmmc4_clk_pcc4",
-                                               "sdmmc4_rst_n_pcc3";
-                               nvidia,function = "sdmmc4";
-                               nvidia,pull = <0>;
-                               nvidia,tristate = <0>;
-                       };
-                       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 = <2>;
-                               nvidia,tristate = <0>;
-                       };
-                       dap2_fs_pa2 {
-                               nvidia,pins =   "dap2_fs_pa2",
-                                               "dap2_sclk_pa3",
-                                               "dap2_din_pa4",
-                                               "dap2_dout_pa5";
-                               nvidia,function = "i2s1";
-                               nvidia,pull = <0>;
-                               nvidia,tristate = <0>;
-                       };
-               };
-       };
-
-       serial@70006000 {
-               status = "okay";
-               clock-frequency = <408000000>;
-       };
-
-       i2c@7000c000 {
-               status = "okay";
-               clock-frequency = <100000>;
-       };
-
-       i2c@7000c400 {
-               status = "okay";
-               clock-frequency = <100000>;
-       };
-
-       i2c@7000c500 {
-               status = "okay";
-               clock-frequency = <100000>;
-
-               /* ALS and Proximity sensor */
-               isl29028@44 {
-                       compatible = "isil,isl29028";
-                       reg = <0x44>;
-                       interrupt-parent = <&gpio>;
-                       interrupts = <88 0x04>; /*gpio PL0 */
-               };
-       };
-
-       i2c@7000c700 {
-               status = "okay";
-               clock-frequency = <100000>;
-       };
-
-       i2c@7000d000 {
-               status = "okay";
-               clock-frequency = <100000>;
-
-               wm8903: wm8903@1a {
-                       compatible = "wlf,wm8903";
-                       reg = <0x1a>;
-                       interrupt-parent = <&gpio>;
-                       interrupts = <179 0x04>; /* gpio PW3 */
-
-                       gpio-controller;
-                       #gpio-cells = <2>;
-
-                       micdet-cfg = <0>;
-                       micdet-delay = <100>;
-                       gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>;
-               };
-
-               tps62361 {
-                       compatible = "ti,tps62361";
-                       reg = <0x60>;
-
-                       regulator-name = "tps62361-vout";
-                       regulator-min-microvolt = <500000>;
-                       regulator-max-microvolt = <1500000>;
-                       regulator-boot-on;
-                       regulator-always-on;
-                       ti,vsel0-state-high;
-                       ti,vsel1-state-high;
-               };
-       };
-
-       ahub {
-               i2s@70080400 {
-                       status = "okay";
-               };
-       };
-
-       sdhci@78000000 {
-               status = "okay";
-               cd-gpios = <&gpio 69 0>; /* gpio PI5 */
-               wp-gpios = <&gpio 155 0>; /* gpio PT3 */
-               power-gpios = <&gpio 31 0>; /* gpio PD7 */
-               bus-width = <4>;
-       };
-
-       sdhci@78000600 {
-               status = "okay";
-               bus-width = <8>;
-       };
-
-       sound {
-               compatible = "nvidia,tegra-audio-wm8903-cardhu",
-                            "nvidia,tegra-audio-wm8903";
-               nvidia,model = "NVIDIA Tegra Cardhu";
-
-               nvidia,audio-routing =
-                       "Headphone Jack", "HPOUTR",
-                       "Headphone Jack", "HPOUTL",
-                       "Int Spk", "ROP",
-                       "Int Spk", "RON",
-                       "Int Spk", "LOP",
-                       "Int Spk", "LON",
-                       "Mic Jack", "MICBIAS",
-                       "IN1L", "Mic Jack";
-
-               nvidia,i2s-controller = <&tegra_i2s1>;
-               nvidia,audio-codec = <&wm8903>;
-
-               nvidia,spkr-en-gpios = <&wm8903 2 0>;
-               nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */
-       };
-};
diff --git a/arch/arm/boot/dts/tegra30-cardhu.dtsi b/arch/arm/boot/dts/tegra30-cardhu.dtsi
new file mode 100644 (file)
index 0000000..d10c9c5
--- /dev/null
@@ -0,0 +1,475 @@
+/include/ "tegra30.dtsi"
+
+/**
+ * This file contains common DT entry for all fab version of Cardhu.
+ * There is multiple fab version of Cardhu starting from A01 to A07.
+ * Cardhu fab version A01 and A03 are not supported. Cardhu fab version
+ * A02 will have different sets of GPIOs for fixed regulator compare to
+ * Cardhu fab version A04. The Cardhu fab version A05, A06, A07 are
+ * compatible with fab version A04. Based on Cardhu fab version, the
+ * related dts file need to be chosen like for Cardhu fab version A02,
+ * use tegra30-cardhu-a02.dts, Cardhu fab version A04 and later, use
+ * tegra30-cardhu-a04.dts.
+ * The identification of board is done in two ways, by looking the sticker
+ * on PCB and by reading board id eeprom.
+ * The stciker will have number like 600-81291-1000-002 C.3. In this 4th
+ * number is the fab version like here it is 002 and hence fab version A02.
+ * The (downstream internal) U-Boot of Cardhu display the board-id as
+ * follows:
+ * BoardID: 0C5B, SKU: 0A01, Fab: 02, Rev: 45.00
+ * In this Fab version is 02 i.e. A02.
+ * The BoardID I2C eeprom is interfaced through i2c5 (pwr_i2c address 0x56).
+ * The location 0x8 of this eeprom contains the Fab version. It is 1 byte
+ * wide.
+ */
+
+/ {
+       model = "NVIDIA Tegra30 Cardhu evaluation board";
+       compatible = "nvidia,cardhu", "nvidia,tegra30";
+
+       memory {
+               reg = <0x80000000 0x40000000>;
+       };
+
+       pinmux {
+               pinctrl-names = "default";
+               pinctrl-0 = <&state_default>;
+
+               state_default: pinmux {
+                       sdmmc1_clk_pz0 {
+                               nvidia,pins = "sdmmc1_clk_pz0";
+                               nvidia,function = "sdmmc1";
+                               nvidia,pull = <0>;
+                               nvidia,tristate = <0>;
+                       };
+                       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 = <2>;
+                               nvidia,tristate = <0>;
+                       };
+                       sdmmc4_clk_pcc4 {
+                               nvidia,pins =   "sdmmc4_clk_pcc4",
+                                               "sdmmc4_rst_n_pcc3";
+                               nvidia,function = "sdmmc4";
+                               nvidia,pull = <0>;
+                               nvidia,tristate = <0>;
+                       };
+                       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 = <2>;
+                               nvidia,tristate = <0>;
+                       };
+                       dap2_fs_pa2 {
+                               nvidia,pins =   "dap2_fs_pa2",
+                                               "dap2_sclk_pa3",
+                                               "dap2_din_pa4",
+                                               "dap2_dout_pa5";
+                               nvidia,function = "i2s1";
+                               nvidia,pull = <0>;
+                               nvidia,tristate = <0>;
+                       };
+               };
+       };
+
+       serial@70006000 {
+               status = "okay";
+               clock-frequency = <408000000>;
+       };
+
+       i2c@7000c000 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       i2c@7000c400 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       i2c@7000c500 {
+               status = "okay";
+               clock-frequency = <100000>;
+
+               /* ALS and Proximity sensor */
+               isl29028@44 {
+                       compatible = "isil,isl29028";
+                       reg = <0x44>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <88 0x04>; /*gpio PL0 */
+               };
+       };
+
+       i2c@7000c700 {
+               status = "okay";
+               clock-frequency = <100000>;
+       };
+
+       i2c@7000d000 {
+               status = "okay";
+               clock-frequency = <100000>;
+
+               wm8903: wm8903@1a {
+                       compatible = "wlf,wm8903";
+                       reg = <0x1a>;
+                       interrupt-parent = <&gpio>;
+                       interrupts = <179 0x04>; /* gpio PW3 */
+
+                       gpio-controller;
+                       #gpio-cells = <2>;
+
+                       micdet-cfg = <0>;
+                       micdet-delay = <100>;
+                       gpio-cfg = <0xffffffff 0xffffffff 0 0xffffffff 0xffffffff>;
+               };
+
+               tps62361 {
+                       compatible = "ti,tps62361";
+                       reg = <0x60>;
+
+                       regulator-name = "tps62361-vout";
+                       regulator-min-microvolt = <500000>;
+                       regulator-max-microvolt = <1500000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+                       ti,vsel0-state-high;
+                       ti,vsel1-state-high;
+               };
+
+               pmic: tps65911@2d {
+                       compatible = "ti,tps65911";
+                       reg = <0x2d>;
+
+                       interrupts = <0 86 0x4>;
+                       #interrupt-cells = <2>;
+                       interrupt-controller;
+
+                       ti,system-power-controller;
+
+                       #gpio-cells = <2>;
+                       gpio-controller;
+
+                       vcc1-supply = <&vdd_ac_bat_reg>;
+                       vcc2-supply = <&vdd_ac_bat_reg>;
+                       vcc3-supply = <&vio_reg>;
+                       vcc4-supply = <&vdd_5v0_reg>;
+                       vcc5-supply = <&vdd_ac_bat_reg>;
+                       vcc6-supply = <&vdd2_reg>;
+                       vcc7-supply = <&vdd_ac_bat_reg>;
+                       vccio-supply = <&vdd_ac_bat_reg>;
+
+                       regulators {
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+
+                               vdd1_reg: regulator@0 {
+                                       reg = <0>;
+                                       regulator-compatible = "vdd1";
+                                       regulator-name = "vddio_ddr_1v2";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               vdd2_reg: regulator@1 {
+                                       reg = <1>;
+                                       regulator-compatible = "vdd2";
+                                       regulator-name = "vdd_1v5_gen";
+                                       regulator-min-microvolt = <1500000>;
+                                       regulator-max-microvolt = <1500000>;
+                                       regulator-always-on;
+                               };
+
+                               vddctrl_reg: regulator@2 {
+                                       reg = <2>;
+                                       regulator-compatible = "vddctrl";
+                                       regulator-name = "vdd_cpu,vdd_sys";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+
+                               vio_reg: regulator@3 {
+                                       reg = <3>;
+                                       regulator-compatible = "vio";
+                                       regulator-name = "vdd_1v8_gen";
+                                       regulator-min-microvolt = <1800000>;
+                                       regulator-max-microvolt = <1800000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo1_reg: regulator@4 {
+                                       reg = <4>;
+                                       regulator-compatible = "ldo1";
+                                       regulator-name = "vdd_pexa,vdd_pexb";
+                                       regulator-min-microvolt = <1050000>;
+                                       regulator-max-microvolt = <1050000>;
+                               };
+
+                               ldo2_reg: regulator@5 {
+                                       reg = <5>;
+                                       regulator-compatible = "ldo2";
+                                       regulator-name = "vdd_sata,avdd_plle";
+                                       regulator-min-microvolt = <1050000>;
+                                       regulator-max-microvolt = <1050000>;
+                               };
+
+                               /* LDO3 is not connected to anything */
+
+                               ldo4_reg: regulator@7 {
+                                       reg = <7>;
+                                       regulator-compatible = "ldo4";
+                                       regulator-name = "vdd_rtc";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo5_reg: regulator@8 {
+                                       reg = <8>;
+                                       regulator-compatible = "ldo5";
+                                       regulator-name = "vddio_sdmmc,avdd_vdac";
+                                       regulator-min-microvolt = <3300000>;
+                                       regulator-max-microvolt = <3300000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo6_reg: regulator@9 {
+                                       reg = <9>;
+                                       regulator-compatible = "ldo6";
+                                       regulator-name = "avdd_dsi_csi,pwrdet_mipi";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                               };
+
+                               ldo7_reg: regulator@10 {
+                                       reg = <10>;
+                                       regulator-compatible = "ldo7";
+                                       regulator-name = "vdd_pllm,x,u,a_p_c_s";
+                                       regulator-min-microvolt = <1200000>;
+                                       regulator-max-microvolt = <1200000>;
+                                       regulator-always-on;
+                               };
+
+                               ldo8_reg: regulator@11 {
+                                       reg = <11>;
+                                       regulator-compatible = "ldo8";
+                                       regulator-name = "vdd_ddr_hs";
+                                       regulator-min-microvolt = <1000000>;
+                                       regulator-max-microvolt = <1000000>;
+                                       regulator-always-on;
+                               };
+                       };
+               };
+       };
+
+       ahub {
+               i2s@70080400 {
+                       status = "okay";
+               };
+       };
+
+       pmc {
+               status = "okay";
+               nvidia,invert-interrupt;
+       };
+
+       sdhci@78000000 {
+               status = "okay";
+               cd-gpios = <&gpio 69 0>; /* gpio PI5 */
+               wp-gpios = <&gpio 155 0>; /* gpio PT3 */
+               power-gpios = <&gpio 31 0>; /* gpio PD7 */
+               bus-width = <4>;
+       };
+
+       sdhci@78000600 {
+               status = "okay";
+               bus-width = <8>;
+       };
+
+       regulators {
+               compatible = "simple-bus";
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               vdd_ac_bat_reg: regulator@0 {
+                       compatible = "regulator-fixed";
+                       reg = <0>;
+                       regulator-name = "vdd_ac_bat";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-always-on;
+               };
+
+               cam_1v8_reg: regulator@1 {
+                       compatible = "regulator-fixed";
+                       reg = <1>;
+                       regulator-name = "cam_1v8";
+                       regulator-min-microvolt = <1800000>;
+                       regulator-max-microvolt = <1800000>;
+                       enable-active-high;
+                       gpio = <&gpio 220 0>; /* gpio PBB4 */
+                       vin-supply = <&vio_reg>;
+               };
+
+               cp_5v_reg: regulator@2 {
+                       compatible = "regulator-fixed";
+                       reg = <2>;
+                       regulator-name = "cp_5v";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       regulator-boot-on;
+                       regulator-always-on;
+                       enable-active-high;
+                       gpio = <&pmic 0 0>; /* PMIC TPS65911 GPIO0 */
+               };
+
+               emmc_3v3_reg: regulator@3 {
+                       compatible = "regulator-fixed";
+                       reg = <3>;
+                       regulator-name = "emmc_3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       enable-active-high;
+                       gpio = <&gpio 25 0>; /* gpio PD1 */
+                       vin-supply = <&sys_3v3_reg>;
+               };
+
+               modem_3v3_reg: regulator@4 {
+                       compatible = "regulator-fixed";
+                       reg = <4>;
+                       regulator-name = "modem_3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       enable-active-high;
+                       gpio = <&gpio 30 0>; /* gpio PD6 */
+               };
+
+               pex_hvdd_3v3_reg: regulator@5 {
+                       compatible = "regulator-fixed";
+                       reg = <5>;
+                       regulator-name = "pex_hvdd_3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       enable-active-high;
+                       gpio = <&gpio 95 0>; /* gpio PL7 */
+                       vin-supply = <&sys_3v3_reg>;
+               };
+
+               vdd_cam1_ldo_reg: regulator@6 {
+                       compatible = "regulator-fixed";
+                       reg = <6>;
+                       regulator-name = "vdd_cam1_ldo";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       enable-active-high;
+                       gpio = <&gpio 142 0>; /* gpio PR6 */
+                       vin-supply = <&sys_3v3_reg>;
+               };
+
+               vdd_cam2_ldo_reg: regulator@7 {
+                       compatible = "regulator-fixed";
+                       reg = <7>;
+                       regulator-name = "vdd_cam2_ldo";
+                       regulator-min-microvolt = <2800000>;
+                       regulator-max-microvolt = <2800000>;
+                       enable-active-high;
+                       gpio = <&gpio 143 0>; /* gpio PR7 */
+                       vin-supply = <&sys_3v3_reg>;
+               };
+
+               vdd_cam3_ldo_reg: regulator@8 {
+                       compatible = "regulator-fixed";
+                       reg = <8>;
+                       regulator-name = "vdd_cam3_ldo";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       enable-active-high;
+                       gpio = <&gpio 144 0>; /* gpio PS0 */
+                       vin-supply = <&sys_3v3_reg>;
+               };
+
+               vdd_com_reg: regulator@9 {
+                       compatible = "regulator-fixed";
+                       reg = <9>;
+                       regulator-name = "vdd_com";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       enable-active-high;
+                       gpio = <&gpio 24 0>; /* gpio PD0 */
+                       vin-supply = <&sys_3v3_reg>;
+               };
+
+               vdd_fuse_3v3_reg: regulator@10 {
+                       compatible = "regulator-fixed";
+                       reg = <10>;
+                       regulator-name = "vdd_fuse_3v3";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       enable-active-high;
+                       gpio = <&gpio 94 0>; /* gpio PL6 */
+                       vin-supply = <&sys_3v3_reg>;
+               };
+
+               vdd_pnl1_reg: regulator@11 {
+                       compatible = "regulator-fixed";
+                       reg = <11>;
+                       regulator-name = "vdd_pnl1";
+                       regulator-min-microvolt = <3300000>;
+                       regulator-max-microvolt = <3300000>;
+                       regulator-always-on;
+                       regulator-boot-on;
+                       enable-active-high;
+                       gpio = <&gpio 92 0>; /* gpio PL4 */
+                       vin-supply = <&sys_3v3_reg>;
+               };
+
+               vdd_vid_reg: regulator@12 {
+                       compatible = "regulator-fixed";
+                       reg = <12>;
+                       regulator-name = "vddio_vid";
+                       regulator-min-microvolt = <5000000>;
+                       regulator-max-microvolt = <5000000>;
+                       enable-active-high;
+                       gpio = <&gpio 152 0>; /* GPIO PT0 */
+                       gpio-open-drain;
+                       vin-supply = <&vdd_5v0_reg>;
+               };
+       };
+
+       sound {
+               compatible = "nvidia,tegra-audio-wm8903-cardhu",
+                            "nvidia,tegra-audio-wm8903";
+               nvidia,model = "NVIDIA Tegra Cardhu";
+
+               nvidia,audio-routing =
+                       "Headphone Jack", "HPOUTR",
+                       "Headphone Jack", "HPOUTL",
+                       "Int Spk", "ROP",
+                       "Int Spk", "RON",
+                       "Int Spk", "LOP",
+                       "Int Spk", "LON",
+                       "Mic Jack", "MICBIAS",
+                       "IN1L", "Mic Jack";
+
+               nvidia,i2s-controller = <&tegra_i2s1>;
+               nvidia,audio-codec = <&wm8903>;
+
+               nvidia,spkr-en-gpios = <&wm8903 2 0>;
+               nvidia,hp-det-gpios = <&gpio 178 0>; /* gpio PW2 */
+       };
+};
index 3e4334d..b1497c7 100644 (file)
                status = "disabled";
        };
 
-       pwm {
+       pwm: pwm {
                compatible = "nvidia,tegra30-pwm", "nvidia,tegra20-pwm";
                reg = <0x7000a000 0x100>;
                #pwm-cells = <2>;
diff --git a/arch/arm/boot/dts/tps65217.dtsi b/arch/arm/boot/dts/tps65217.dtsi
new file mode 100644 (file)
index 0000000..a632724
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+/*
+ * Integrated Power Management Chip
+ * http://www.ti.com/lit/ds/symlink/tps65217.pdf
+ */
+
+&tps {
+       compatible = "ti,tps65217";
+
+       regulators {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               dcdc1_reg: regulator@0 {
+                       reg = <0>;
+                       regulator-compatible = "dcdc1";
+               };
+
+               dcdc2_reg: regulator@1 {
+                       reg = <1>;
+                       regulator-compatible = "dcdc2";
+               };
+
+               dcdc3_reg: regulator@2 {
+                       reg = <2>;
+                       regulator-compatible = "dcdc3";
+               };
+
+               ldo1_reg: regulator@3 {
+                       reg = <3>;
+                       regulator-compatible = "ldo1";
+               };
+
+               ldo2_reg: regulator@4 {
+                       reg = <4>;
+                       regulator-compatible = "ldo2";
+               };
+
+               ldo3_reg: regulator@5 {
+                       reg = <5>;
+                       regulator-compatible = "ldo3";
+               };
+
+               ldo4_reg: regulator@6 {
+                       reg = <6>;
+                       regulator-compatible = "ldo4";
+               };
+       };
+};
diff --git a/arch/arm/boot/dts/tps65910.dtsi b/arch/arm/boot/dts/tps65910.dtsi
new file mode 100644 (file)
index 0000000..92693a8
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2012 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.
+ */
+
+/*
+ * Integrated Power Management Chip
+ * http://www.ti.com/lit/ds/symlink/tps65910.pdf
+ */
+
+&tps {
+       compatible = "ti,tps65910";
+
+       regulators {
+               #address-cells = <1>;
+               #size-cells = <0>;
+
+               vrtc_reg: regulator@0 {
+                       reg = <0>;
+                       regulator-compatible = "vrtc";
+               };
+
+               vio_reg: regulator@1 {
+                       reg = <1>;
+                       regulator-compatible = "vio";
+               };
+
+               vdd1_reg: regulator@2 {
+                       reg = <2>;
+                       regulator-compatible = "vdd1";
+               };
+
+               vdd2_reg: regulator@3 {
+                       reg = <3>;
+                       regulator-compatible = "vdd2";
+               };
+
+               vdd3_reg: regulator@4 {
+                       reg = <4>;
+                       regulator-compatible = "vdd3";
+               };
+
+               vdig1_reg: regulator@5 {
+                       reg = <5>;
+                       regulator-compatible = "vdig1";
+               };
+
+               vdig2_reg: regulator@6 {
+                       reg = <6>;
+                       regulator-compatible = "vdig2";
+               };
+
+               vpll_reg: regulator@7 {
+                       reg = <7>;
+                       regulator-compatible = "vpll";
+               };
+
+               vdac_reg: regulator@8 {
+                       reg = <8>;
+                       regulator-compatible = "vdac";
+               };
+
+               vaux1_reg: regulator@9 {
+                       reg = <9>;
+                       regulator-compatible = "vaux1";
+               };
+
+               vaux2_reg: regulator@10 {
+                       reg = <10>;
+                       regulator-compatible = "vaux2";
+               };
+
+               vaux33_reg: regulator@11 {
+                       reg = <11>;
+                       regulator-compatible = "vaux33";
+               };
+
+               vmmc_reg: regulator@12 {
+                       reg = <12>;
+                       regulator-compatible = "vmmc";
+               };
+       };
+};
index 22f4d13..ff00017 100644 (file)
                interrupts = <11>;
        };
 
-       vdac: regulator@0 {
+       vdac: regulator-vdac {
                compatible = "ti,twl4030-vdac";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <1800000>;
        };
 
-       vpll2: regulator@1 {
+       vpll2: regulator-vpll2 {
                compatible = "ti,twl4030-vpll2";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <1800000>;
        };
 
-       vmmc1: regulator@2 {
+       vmmc1: regulator-vmmc1 {
                compatible = "ti,twl4030-vmmc1";
                regulator-min-microvolt = <1850000>;
                regulator-max-microvolt = <3150000>;
index d351b27..123e2c4 100644 (file)
                interrupts = <11>;
        };
 
-       vaux1: regulator@0 {
+       vaux1: regulator-vaux1 {
                compatible = "ti,twl6030-vaux1";
                regulator-min-microvolt = <1000000>;
                regulator-max-microvolt = <3000000>;
        };
 
-       vaux2: regulator@1 {
+       vaux2: regulator-vaux2 {
                compatible = "ti,twl6030-vaux2";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <2800000>;
        };
 
-       vaux3: regulator@2 {
+       vaux3: regulator-vaux3 {
                compatible = "ti,twl6030-vaux3";
                regulator-min-microvolt = <1000000>;
                regulator-max-microvolt = <3000000>;
        };
 
-       vmmc: regulator@3 {
+       vmmc: regulator-vmmc {
                compatible = "ti,twl6030-vmmc";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <3000000>;
        };
 
-       vpp: regulator@4 {
+       vpp: regulator-vpp {
                compatible = "ti,twl6030-vpp";
                regulator-min-microvolt = <1800000>;
                regulator-max-microvolt = <2500000>;
        };
 
-       vusim: regulator@5 {
+       vusim: regulator-vusim {
                compatible = "ti,twl6030-vusim";
                regulator-min-microvolt = <1200000>;
                regulator-max-microvolt = <2900000>;
        };
 
-       vdac: regulator@6 {
+       vdac: regulator-vdac {
                compatible = "ti,twl6030-vdac";
        };
 
-       vana: regulator@7 {
+       vana: regulator-vana {
                compatible = "ti,twl6030-vana";
        };
 
-       vcxio: regulator@8 {
+       vcxio: regulator-vcxio {
                compatible = "ti,twl6030-vcxio";
                regulator-always-on;
        };
 
-       vusb: regulator@9 {
+       vusb: regulator-vusb {
                compatible = "ti,twl6030-vusb";
        };
 
-       v1v8: regulator@10 {
+       v1v8: regulator-v1v8 {
                compatible = "ti,twl6030-v1v8";
                regulator-always-on;
        };
 
-       v2v1: regulator@11 {
+       v2v1: regulator-v2v1 {
                compatible = "ti,twl6030-v2v1";
                regulator-always-on;
        };
 
-       clk32kg: regulator@12 {
+       clk32kg: regulator-clk32kg {
                compatible = "ti,twl6030-clk32kg";
        };
 };
index 7d87184..90610c7 100644 (file)
@@ -33,7 +33,7 @@ CONFIG_AEABI=y
 CONFIG_FORCE_MAX_ZONEORDER=13
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096"
+CONFIG_CMDLINE="console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096 rw"
 CONFIG_CMDLINE_FORCE=y
 CONFIG_KEXEC=y
 CONFIG_VFP=y
diff --git a/arch/arm/configs/bcm2835_defconfig b/arch/arm/configs/bcm2835_defconfig
new file mode 100644 (file)
index 0000000..7aea702
--- /dev/null
@@ -0,0 +1,95 @@
+CONFIG_EXPERIMENTAL=y
+# CONFIG_LOCALVERSION_AUTO is not set
+CONFIG_SYSVIPC=y
+CONFIG_BSD_PROCESS_ACCT=y
+CONFIG_BSD_PROCESS_ACCT_V3=y
+CONFIG_FHANDLE=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_LOG_BUF_SHIFT=18
+CONFIG_CGROUP_FREEZER=y
+CONFIG_CGROUP_DEVICE=y
+CONFIG_CPUSETS=y
+CONFIG_CGROUP_CPUACCT=y
+CONFIG_RESOURCE_COUNTERS=y
+CONFIG_CGROUP_PERF=y
+CONFIG_CFS_BANDWIDTH=y
+CONFIG_RT_GROUP_SCHED=y
+CONFIG_NAMESPACES=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_RELAY=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_KALLSYMS_ALL=y
+CONFIG_EMBEDDED=y
+# CONFIG_COMPAT_BRK is not set
+CONFIG_PROFILING=y
+CONFIG_OPROFILE=y
+CONFIG_JUMP_LABEL=y
+# CONFIG_BLOCK is not set
+CONFIG_ARCH_BCM2835=y
+CONFIG_PREEMPT_VOLUNTARY=y
+CONFIG_AEABI=y
+CONFIG_COMPACTION=y
+CONFIG_KSM=y
+CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
+CONFIG_CLEANCACHE=y
+CONFIG_SECCOMP=y
+CONFIG_CC_STACKPROTECTOR=y
+CONFIG_KEXEC=y
+CONFIG_CRASH_DUMP=y
+CONFIG_VFP=y
+# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
+# CONFIG_SUSPEND is not set
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_STANDALONE is not set
+# CONFIG_INPUT_MOUSEDEV is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_SERIO is not set
+# CONFIG_VT is not set
+# CONFIG_UNIX98_PTYS is not set
+# CONFIG_LEGACY_PTYS is not set
+# CONFIG_DEVKMEM is not set
+CONFIG_SERIAL_AMBA_PL011=y
+CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
+CONFIG_TTY_PRINTK=y
+# CONFIG_HW_RANDOM is not set
+# CONFIG_HWMON is not set
+# CONFIG_USB_SUPPORT is not set
+# CONFIG_IOMMU_SUPPORT is not set
+# CONFIG_FILE_LOCKING is not set
+# CONFIG_DNOTIFY is not set
+# CONFIG_INOTIFY_USER is not set
+# CONFIG_PROC_FS is not set
+# CONFIG_SYSFS is not set
+# CONFIG_MISC_FILESYSTEMS is not set
+CONFIG_PRINTK_TIME=y
+# CONFIG_ENABLE_WARN_DEPRECATED is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_UNUSED_SYMBOLS=y
+CONFIG_LOCKUP_DETECTOR=y
+CONFIG_DEBUG_INFO=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_BOOT_PRINTK_DELAY=y
+CONFIG_SCHED_TRACER=y
+CONFIG_STACK_TRACER=y
+CONFIG_FUNCTION_PROFILER=y
+CONFIG_DYNAMIC_DEBUG=y
+CONFIG_KGDB=y
+CONFIG_KGDB_KDB=y
+CONFIG_TEST_KSTRTOX=y
+CONFIG_STRICT_DEVMEM=y
+CONFIG_DEBUG_LL=y
+CONFIG_EARLY_PRINTK=y
+# CONFIG_XZ_DEC_X86 is not set
+# CONFIG_XZ_DEC_POWERPC is not set
+# CONFIG_XZ_DEC_IA64 is not set
+# CONFIG_XZ_DEC_ARM is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+# CONFIG_XZ_DEC_SPARC is not set
index 3c9f32f..565132d 100644 (file)
@@ -32,9 +32,7 @@ CONFIG_MACH_VPR200=y
 CONFIG_MACH_IMX51_DT=y
 CONFIG_MACH_MX51_3DS=y
 CONFIG_MACH_EUKREA_CPUIMX51SD=y
-CONFIG_MACH_MX51_EFIKAMX=y
-CONFIG_MACH_MX51_EFIKASB=y
-CONFIG_MACH_IMX53_DT=y
+CONFIG_SOC_IMX53=y
 CONFIG_SOC_IMX6Q=y
 CONFIG_MXC_PWM=y
 CONFIG_SMP=y
index 26146ff..8c49df6 100644 (file)
@@ -8,6 +8,7 @@ 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_BLK_DEV_BSG is not set
 # CONFIG_IOSCHED_DEADLINE is not set
index 2388c86..5d0c667 100644 (file)
@@ -14,6 +14,7 @@ CONFIG_NAMESPACES=y
 CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_SYSCTL_SYSCALL=y
 CONFIG_EMBEDDED=y
+CONFIG_PERF_EVENTS=y
 CONFIG_SLAB=y
 CONFIG_MODULES=y
 CONFIG_MODULE_FORCE_LOAD=y
index 4edcfb4..36d60dd 100644 (file)
@@ -23,12 +23,6 @@ CONFIG_BLK_DEV_INTEGRITY=y
 # CONFIG_IOSCHED_CFQ is not set
 CONFIG_ARCH_MXS=y
 CONFIG_MACH_MXS_DT=y
-CONFIG_MACH_MX23EVK=y
-CONFIG_MACH_MX28EVK=y
-CONFIG_MACH_STMP378X_DEVB=y
-CONFIG_MACH_TX28=y
-CONFIG_MACH_M28EVK=y
-CONFIG_MACH_APX4DEVKIT=y
 # CONFIG_ARM_THUMB is not set
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
index e58edc3..6230304 100644 (file)
@@ -123,6 +123,7 @@ CONFIG_HW_RANDOM=y
 CONFIG_I2C_CHARDEV=y
 CONFIG_SPI=y
 CONFIG_SPI_OMAP24XX=y
+CONFIG_PINCTRL_SINGLE=y
 CONFIG_DEBUG_GPIO=y
 CONFIG_GPIO_SYSFS=y
 CONFIG_GPIO_TWL4030=y
diff --git a/arch/arm/configs/pnx4008_defconfig b/arch/arm/configs/pnx4008_defconfig
deleted file mode 100644 (file)
index 35a31cc..0000000
+++ /dev/null
@@ -1,472 +0,0 @@
-CONFIG_EXPERIMENTAL=y
-CONFIG_SYSVIPC=y
-CONFIG_POSIX_MQUEUE=y
-CONFIG_BSD_PROCESS_ACCT=y
-CONFIG_AUDIT=y
-CONFIG_LOG_BUF_SHIFT=14
-CONFIG_BLK_DEV_INITRD=y
-CONFIG_EXPERT=y
-CONFIG_SLAB=y
-CONFIG_MODULES=y
-CONFIG_MODULE_UNLOAD=y
-CONFIG_MODULE_FORCE_UNLOAD=y
-CONFIG_MODVERSIONS=y
-CONFIG_MODULE_SRCVERSION_ALL=y
-CONFIG_ARCH_PNX4008=y
-CONFIG_PREEMPT=y
-CONFIG_ZBOOT_ROM_TEXT=0x0
-CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="mem=64M console=ttyS0,115200"
-CONFIG_FPE_NWFPE=y
-CONFIG_BINFMT_AOUT=m
-CONFIG_BINFMT_MISC=m
-CONFIG_PM=y
-CONFIG_PACKET=y
-CONFIG_UNIX=y
-CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
-CONFIG_IP_ADVANCED_ROUTER=y
-CONFIG_IP_MULTIPLE_TABLES=y
-CONFIG_IP_ROUTE_MULTIPATH=y
-CONFIG_IP_ROUTE_VERBOSE=y
-CONFIG_IP_PNP=y
-CONFIG_IP_PNP_DHCP=y
-CONFIG_IP_PNP_BOOTP=y
-CONFIG_IP_MROUTE=y
-CONFIG_IP_PIMSM_V1=y
-CONFIG_IP_PIMSM_V2=y
-CONFIG_SYN_COOKIES=y
-CONFIG_INET_AH=m
-CONFIG_INET_ESP=m
-CONFIG_INET_IPCOMP=m
-CONFIG_IPV6_PRIVACY=y
-CONFIG_INET6_AH=m
-CONFIG_INET6_ESP=m
-CONFIG_INET6_IPCOMP=m
-CONFIG_IPV6_TUNNEL=m
-CONFIG_NETFILTER=y
-CONFIG_IP_VS=m
-CONFIG_IP_VS_PROTO_TCP=y
-CONFIG_IP_VS_PROTO_UDP=y
-CONFIG_IP_VS_PROTO_ESP=y
-CONFIG_IP_VS_PROTO_AH=y
-CONFIG_IP_VS_RR=m
-CONFIG_IP_VS_WRR=m
-CONFIG_IP_VS_LC=m
-CONFIG_IP_VS_WLC=m
-CONFIG_IP_VS_LBLC=m
-CONFIG_IP_VS_LBLCR=m
-CONFIG_IP_VS_DH=m
-CONFIG_IP_VS_SH=m
-CONFIG_IP_VS_SED=m
-CONFIG_IP_VS_NQ=m
-CONFIG_IP_VS_FTP=m
-CONFIG_IP_NF_QUEUE=m
-CONFIG_IP6_NF_QUEUE=m
-CONFIG_DECNET_NF_GRABULATOR=m
-CONFIG_BRIDGE_NF_EBTABLES=m
-CONFIG_BRIDGE_EBT_BROUTE=m
-CONFIG_BRIDGE_EBT_T_FILTER=m
-CONFIG_BRIDGE_EBT_T_NAT=m
-CONFIG_BRIDGE_EBT_802_3=m
-CONFIG_BRIDGE_EBT_AMONG=m
-CONFIG_BRIDGE_EBT_ARP=m
-CONFIG_BRIDGE_EBT_IP=m
-CONFIG_BRIDGE_EBT_LIMIT=m
-CONFIG_BRIDGE_EBT_MARK=m
-CONFIG_BRIDGE_EBT_PKTTYPE=m
-CONFIG_BRIDGE_EBT_STP=m
-CONFIG_BRIDGE_EBT_VLAN=m
-CONFIG_BRIDGE_EBT_ARPREPLY=m
-CONFIG_BRIDGE_EBT_DNAT=m
-CONFIG_BRIDGE_EBT_MARK_T=m
-CONFIG_BRIDGE_EBT_REDIRECT=m
-CONFIG_BRIDGE_EBT_SNAT=m
-CONFIG_BRIDGE_EBT_LOG=m
-CONFIG_IP_SCTP=m
-CONFIG_ATM=y
-CONFIG_ATM_CLIP=y
-CONFIG_ATM_LANE=m
-CONFIG_ATM_MPOA=m
-CONFIG_ATM_BR2684=m
-CONFIG_BRIDGE=m
-CONFIG_VLAN_8021Q=m
-CONFIG_DECNET=m
-CONFIG_LLC2=m
-CONFIG_IPX=m
-CONFIG_ATALK=m
-CONFIG_DEV_APPLETALK=m
-CONFIG_IPDDP=m
-CONFIG_IPDDP_ENCAP=y
-CONFIG_IPDDP_DECAP=y
-CONFIG_X25=m
-CONFIG_LAPB=m
-CONFIG_ECONET=m
-CONFIG_ECONET_AUNUDP=y
-CONFIG_ECONET_NATIVE=y
-CONFIG_WAN_ROUTER=m
-CONFIG_NET_SCHED=y
-CONFIG_NET_SCH_CBQ=m
-CONFIG_NET_SCH_HTB=m
-CONFIG_NET_SCH_HFSC=m
-CONFIG_NET_SCH_ATM=m
-CONFIG_NET_SCH_PRIO=m
-CONFIG_NET_SCH_RED=m
-CONFIG_NET_SCH_SFQ=m
-CONFIG_NET_SCH_TEQL=m
-CONFIG_NET_SCH_TBF=m
-CONFIG_NET_SCH_GRED=m
-CONFIG_NET_SCH_DSMARK=m
-CONFIG_NET_SCH_NETEM=m
-CONFIG_NET_CLS_TCINDEX=m
-CONFIG_NET_CLS_ROUTE4=m
-CONFIG_NET_CLS_FW=m
-CONFIG_NET_CLS_U32=m
-CONFIG_NET_CLS_RSVP=m
-CONFIG_NET_CLS_RSVP6=m
-CONFIG_NET_PKTGEN=m
-CONFIG_MTD=y
-CONFIG_MTD_CONCAT=y
-CONFIG_MTD_PARTITIONS=y
-CONFIG_MTD_REDBOOT_PARTS=y
-CONFIG_MTD_CHAR=y
-CONFIG_MTD_BLOCK=y
-CONFIG_MTD_SLRAM=m
-CONFIG_MTD_PHRAM=m
-CONFIG_MTD_MTDRAM=m
-CONFIG_MTD_DOC2000=m
-CONFIG_MTD_DOC2001=m
-CONFIG_MTD_DOC2001PLUS=m
-CONFIG_MTD_NAND=y
-CONFIG_MTD_NAND_NANDSIM=m
-CONFIG_BLK_DEV_LOOP=y
-CONFIG_BLK_DEV_CRYPTOLOOP=y
-CONFIG_BLK_DEV_NBD=y
-CONFIG_BLK_DEV_RAM=y
-CONFIG_BLK_DEV_RAM_SIZE=8192
-CONFIG_CDROM_PKTCDVD=m
-CONFIG_EEPROM_LEGACY=m
-CONFIG_SCSI=m
-CONFIG_BLK_DEV_SD=m
-CONFIG_CHR_DEV_ST=m
-CONFIG_CHR_DEV_OSST=m
-CONFIG_BLK_DEV_SR=m
-CONFIG_CHR_DEV_SG=m
-CONFIG_CHR_DEV_SCH=m
-CONFIG_SCSI_MULTI_LUN=y
-CONFIG_SCSI_CONSTANTS=y
-CONFIG_SCSI_LOGGING=y
-CONFIG_SCSI_SPI_ATTRS=m
-CONFIG_SCSI_FC_ATTRS=m
-CONFIG_SCSI_DEBUG=m
-CONFIG_NETDEVICES=y
-CONFIG_DUMMY=m
-CONFIG_BONDING=m
-CONFIG_EQUALIZER=m
-CONFIG_TUN=m
-CONFIG_NET_ETHERNET=y
-CONFIG_USB_CATC=m
-CONFIG_USB_KAWETH=m
-CONFIG_USB_PEGASUS=m
-CONFIG_USB_RTL8150=m
-CONFIG_USB_USBNET=m
-# CONFIG_USB_NET_CDC_SUBSET is not set
-CONFIG_WAN=y
-CONFIG_HDLC=m
-CONFIG_HDLC_RAW=m
-CONFIG_HDLC_RAW_ETH=m
-CONFIG_HDLC_CISCO=m
-CONFIG_HDLC_FR=m
-CONFIG_HDLC_PPP=m
-CONFIG_HDLC_X25=m
-CONFIG_DLCI=m
-CONFIG_WAN_ROUTER_DRIVERS=m
-CONFIG_LAPBETHER=m
-CONFIG_X25_ASY=m
-CONFIG_ATM_TCP=m
-CONFIG_PPP=m
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_ASYNC=m
-CONFIG_PPP_SYNC_TTY=m
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-CONFIG_PPP_MPPE=m
-CONFIG_PPPOE=m
-CONFIG_PPPOATM=m
-CONFIG_SLIP=m
-CONFIG_SLIP_COMPRESSED=y
-CONFIG_SLIP_SMART=y
-CONFIG_SLIP_MODE_SLIP6=y
-CONFIG_NETCONSOLE=m
-# CONFIG_INPUT_MOUSEDEV is not set
-CONFIG_INPUT_JOYDEV=m
-CONFIG_INPUT_EVDEV=m
-CONFIG_INPUT_EVBUG=m
-CONFIG_KEYBOARD_LKKBD=m
-CONFIG_KEYBOARD_NEWTON=m
-CONFIG_KEYBOARD_SUNKBD=m
-CONFIG_KEYBOARD_XTKBD=m
-CONFIG_MOUSE_PS2=m
-CONFIG_MOUSE_SERIAL=m
-CONFIG_MOUSE_VSXXXAA=m
-CONFIG_INPUT_JOYSTICK=y
-CONFIG_JOYSTICK_ANALOG=m
-CONFIG_JOYSTICK_A3D=m
-CONFIG_JOYSTICK_ADI=m
-CONFIG_JOYSTICK_COBRA=m
-CONFIG_JOYSTICK_GF2K=m
-CONFIG_JOYSTICK_GRIP=m
-CONFIG_JOYSTICK_GRIP_MP=m
-CONFIG_JOYSTICK_GUILLEMOT=m
-CONFIG_JOYSTICK_INTERACT=m
-CONFIG_JOYSTICK_SIDEWINDER=m
-CONFIG_JOYSTICK_TMDC=m
-CONFIG_JOYSTICK_IFORCE=m
-CONFIG_JOYSTICK_IFORCE_USB=y
-CONFIG_JOYSTICK_IFORCE_232=y
-CONFIG_JOYSTICK_WARRIOR=m
-CONFIG_JOYSTICK_MAGELLAN=m
-CONFIG_JOYSTICK_SPACEORB=m
-CONFIG_JOYSTICK_SPACEBALL=m
-CONFIG_JOYSTICK_STINGER=m
-CONFIG_JOYSTICK_JOYDUMP=m
-CONFIG_INPUT_TOUCHSCREEN=y
-CONFIG_TOUCHSCREEN_GUNZE=m
-CONFIG_INPUT_MISC=y
-CONFIG_INPUT_UINPUT=m
-CONFIG_SERIO_SERPORT=m
-CONFIG_SERIO_RAW=m
-CONFIG_GAMEPORT_NS558=m
-CONFIG_GAMEPORT_L4=m
-CONFIG_SERIAL_8250=y
-CONFIG_SERIAL_8250_CONSOLE=y
-CONFIG_SERIAL_8250_EXTENDED=y
-CONFIG_SERIAL_8250_MANY_PORTS=y
-CONFIG_SERIAL_8250_SHARE_IRQ=y
-CONFIG_SERIAL_8250_RSA=y
-CONFIG_HW_RANDOM=y
-CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=y
-CONFIG_SPI=y
-CONFIG_SPI_BITBANG=y
-# CONFIG_HWMON is not set
-CONFIG_WATCHDOG=y
-CONFIG_SOFT_WATCHDOG=m
-CONFIG_USBPCWATCHDOG=m
-# CONFIG_VGA_CONSOLE is not set
-CONFIG_SOUND=m
-CONFIG_SND=m
-CONFIG_SND_SEQUENCER=m
-CONFIG_SND_SEQ_DUMMY=m
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-CONFIG_SND_SEQUENCER_OSS=y
-CONFIG_SND_DUMMY=m
-CONFIG_SND_VIRMIDI=m
-CONFIG_SND_MTPAV=m
-CONFIG_SND_SERIAL_U16550=m
-CONFIG_SND_MPU401=m
-CONFIG_SND_USB_AUDIO=m
-CONFIG_SOUND_PRIME=m
-CONFIG_USB_HID=m
-CONFIG_USB_HIDDEV=y
-CONFIG_USB_KBD=m
-CONFIG_USB_MOUSE=m
-CONFIG_USB=y
-CONFIG_USB_DEVICEFS=y
-CONFIG_USB_MON=y
-CONFIG_USB_SL811_HCD=m
-CONFIG_USB_ACM=m
-CONFIG_USB_PRINTER=m
-CONFIG_USB_STORAGE=m
-CONFIG_USB_STORAGE_DATAFAB=m
-CONFIG_USB_STORAGE_FREECOM=m
-CONFIG_USB_STORAGE_USBAT=m
-CONFIG_USB_STORAGE_SDDR09=m
-CONFIG_USB_STORAGE_SDDR55=m
-CONFIG_USB_STORAGE_JUMPSHOT=m
-CONFIG_USB_MDC800=m
-CONFIG_USB_MICROTEK=m
-CONFIG_USB_SERIAL=m
-CONFIG_USB_SERIAL_GENERIC=y
-CONFIG_USB_SERIAL_BELKIN=m
-CONFIG_USB_SERIAL_WHITEHEAT=m
-CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m
-CONFIG_USB_SERIAL_CYPRESS_M8=m
-CONFIG_USB_SERIAL_EMPEG=m
-CONFIG_USB_SERIAL_FTDI_SIO=m
-CONFIG_USB_SERIAL_VISOR=m
-CONFIG_USB_SERIAL_IPAQ=m
-CONFIG_USB_SERIAL_IR=m
-CONFIG_USB_SERIAL_EDGEPORT=m
-CONFIG_USB_SERIAL_EDGEPORT_TI=m
-CONFIG_USB_SERIAL_IPW=m
-CONFIG_USB_SERIAL_KEYSPAN_PDA=m
-CONFIG_USB_SERIAL_KEYSPAN=m
-CONFIG_USB_SERIAL_KLSI=m
-CONFIG_USB_SERIAL_KOBIL_SCT=m
-CONFIG_USB_SERIAL_MCT_U232=m
-CONFIG_USB_SERIAL_PL2303=m
-CONFIG_USB_SERIAL_SAFE=m
-CONFIG_USB_SERIAL_CYBERJACK=m
-CONFIG_USB_SERIAL_XIRCOM=m
-CONFIG_USB_SERIAL_OMNINET=m
-CONFIG_USB_RIO500=m
-CONFIG_USB_LEGOTOWER=m
-CONFIG_USB_LCD=m
-CONFIG_USB_LED=m
-CONFIG_USB_CYTHERM=m
-CONFIG_USB_TEST=m
-CONFIG_USB_ATM=m
-CONFIG_USB_SPEEDTOUCH=m
-CONFIG_USB_GADGET=m
-CONFIG_USB_GADGET_DUMMY_HCD=y
-CONFIG_USB_ZERO=m
-CONFIG_USB_ETH=m
-CONFIG_USB_GADGETFS=m
-CONFIG_USB_FILE_STORAGE=m
-CONFIG_USB_G_SERIAL=m
-CONFIG_MMC=m
-CONFIG_EXT2_FS=y
-CONFIG_EXT2_FS_XATTR=y
-CONFIG_EXT2_FS_POSIX_ACL=y
-CONFIG_EXT2_FS_SECURITY=y
-CONFIG_EXT3_FS=m
-CONFIG_EXT3_FS_POSIX_ACL=y
-CONFIG_EXT3_FS_SECURITY=y
-CONFIG_REISERFS_FS=m
-CONFIG_REISERFS_FS_XATTR=y
-CONFIG_REISERFS_FS_POSIX_ACL=y
-CONFIG_REISERFS_FS_SECURITY=y
-CONFIG_JFS_FS=m
-CONFIG_JFS_POSIX_ACL=y
-CONFIG_JFS_STATISTICS=y
-CONFIG_XFS_FS=m
-CONFIG_XFS_QUOTA=y
-CONFIG_XFS_POSIX_ACL=y
-CONFIG_XFS_RT=y
-CONFIG_INOTIFY=y
-CONFIG_QUOTA=y
-CONFIG_QFMT_V1=m
-CONFIG_QFMT_V2=m
-CONFIG_AUTOFS_FS=m
-CONFIG_AUTOFS4_FS=m
-CONFIG_ISO9660_FS=m
-CONFIG_JOLIET=y
-CONFIG_ZISOFS=y
-CONFIG_UDF_FS=m
-CONFIG_MSDOS_FS=m
-CONFIG_VFAT_FS=m
-CONFIG_NTFS_FS=m
-CONFIG_TMPFS=y
-CONFIG_ADFS_FS=m
-CONFIG_AFFS_FS=m
-CONFIG_HFS_FS=m
-CONFIG_HFSPLUS_FS=m
-CONFIG_BEFS_FS=m
-CONFIG_BFS_FS=m
-CONFIG_EFS_FS=m
-CONFIG_JFFS2_FS=m
-CONFIG_CRAMFS=y
-CONFIG_VXFS_FS=m
-CONFIG_MINIX_FS=m
-CONFIG_HPFS_FS=m
-CONFIG_QNX4FS_FS=m
-CONFIG_ROMFS_FS=m
-CONFIG_SYSV_FS=m
-CONFIG_UFS_FS=m
-CONFIG_NFS_FS=y
-CONFIG_NFS_V3=y
-CONFIG_NFS_V4=y
-CONFIG_ROOT_NFS=y
-CONFIG_NFSD=m
-CONFIG_NFSD_V4=y
-CONFIG_RPCSEC_GSS_SPKM3=m
-CONFIG_SMB_FS=m
-CONFIG_CIFS=m
-CONFIG_NCP_FS=m
-CONFIG_NCPFS_PACKET_SIGNING=y
-CONFIG_NCPFS_IOCTL_LOCKING=y
-CONFIG_NCPFS_STRONG=y
-CONFIG_NCPFS_NFS_NS=y
-CONFIG_NCPFS_OS2_NS=y
-CONFIG_NCPFS_NLS=y
-CONFIG_NCPFS_EXTRAS=y
-CONFIG_CODA_FS=m
-CONFIG_AFS_FS=m
-CONFIG_PARTITION_ADVANCED=y
-CONFIG_ACORN_PARTITION=y
-CONFIG_ACORN_PARTITION_ICS=y
-CONFIG_ACORN_PARTITION_RISCIX=y
-CONFIG_OSF_PARTITION=y
-CONFIG_AMIGA_PARTITION=y
-CONFIG_ATARI_PARTITION=y
-CONFIG_MAC_PARTITION=y
-CONFIG_BSD_DISKLABEL=y
-CONFIG_MINIX_SUBPARTITION=y
-CONFIG_SOLARIS_X86_PARTITION=y
-CONFIG_UNIXWARE_DISKLABEL=y
-CONFIG_LDM_PARTITION=y
-CONFIG_SGI_PARTITION=y
-CONFIG_ULTRIX_PARTITION=y
-CONFIG_SUN_PARTITION=y
-CONFIG_NLS_DEFAULT="cp437"
-CONFIG_NLS_CODEPAGE_437=m
-CONFIG_NLS_CODEPAGE_737=m
-CONFIG_NLS_CODEPAGE_775=m
-CONFIG_NLS_CODEPAGE_850=m
-CONFIG_NLS_CODEPAGE_852=m
-CONFIG_NLS_CODEPAGE_855=m
-CONFIG_NLS_CODEPAGE_857=m
-CONFIG_NLS_CODEPAGE_860=m
-CONFIG_NLS_CODEPAGE_861=m
-CONFIG_NLS_CODEPAGE_862=m
-CONFIG_NLS_CODEPAGE_863=m
-CONFIG_NLS_CODEPAGE_864=m
-CONFIG_NLS_CODEPAGE_865=m
-CONFIG_NLS_CODEPAGE_866=m
-CONFIG_NLS_CODEPAGE_869=m
-CONFIG_NLS_CODEPAGE_936=m
-CONFIG_NLS_CODEPAGE_950=m
-CONFIG_NLS_CODEPAGE_932=m
-CONFIG_NLS_CODEPAGE_949=m
-CONFIG_NLS_CODEPAGE_874=m
-CONFIG_NLS_ISO8859_8=m
-CONFIG_NLS_CODEPAGE_1250=m
-CONFIG_NLS_CODEPAGE_1251=m
-CONFIG_NLS_ASCII=m
-CONFIG_NLS_ISO8859_1=m
-CONFIG_NLS_ISO8859_2=m
-CONFIG_NLS_ISO8859_3=m
-CONFIG_NLS_ISO8859_4=m
-CONFIG_NLS_ISO8859_5=m
-CONFIG_NLS_ISO8859_6=m
-CONFIG_NLS_ISO8859_7=m
-CONFIG_NLS_ISO8859_9=m
-CONFIG_NLS_ISO8859_13=m
-CONFIG_NLS_ISO8859_14=m
-CONFIG_NLS_ISO8859_15=m
-CONFIG_NLS_KOI8_R=m
-CONFIG_NLS_KOI8_U=m
-CONFIG_MAGIC_SYSRQ=y
-CONFIG_DEBUG_KERNEL=y
-CONFIG_DEBUG_MUTEXES=y
-# CONFIG_DEBUG_BUGVERBOSE is not set
-CONFIG_SECURITY=y
-CONFIG_CRYPTO_NULL=m
-CONFIG_CRYPTO_TEST=m
-CONFIG_CRYPTO_HMAC=y
-CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MICHAEL_MIC=m
-CONFIG_CRYPTO_SHA256=m
-CONFIG_CRYPTO_SHA512=m
-CONFIG_CRYPTO_WP512=m
-CONFIG_CRYPTO_ANUBIS=m
-CONFIG_CRYPTO_BLOWFISH=m
-CONFIG_CRYPTO_CAST6=m
-CONFIG_CRYPTO_KHAZAD=m
-CONFIG_CRYPTO_SERPENT=m
-CONFIG_CRYPTO_TEA=m
-CONFIG_CRYPTO_TWOFISH=m
-CONFIG_CRC16=m
index c328ac6..807d4e2 100644 (file)
@@ -1,4 +1,6 @@
 CONFIG_EXPERIMENTAL=y
+CONFIG_NO_HZ=y
+CONFIG_HIGH_RES_TIMERS=y
 CONFIG_RELAY=y
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_KALLSYMS_ALL=y
@@ -8,9 +10,7 @@ CONFIG_MODULE_UNLOAD=y
 CONFIG_PARTITION_ADVANCED=y
 CONFIG_BSD_DISKLABEL=y
 CONFIG_SOLARIS_X86_PARTITION=y
-CONFIG_ARCH_PRIMA2=y
-CONFIG_NO_HZ=y
-CONFIG_HIGH_RES_TIMERS=y
+CONFIG_ARCH_SIRF=y
 CONFIG_PREEMPT=y
 CONFIG_AEABI=y
 CONFIG_KEXEC=y
@@ -36,7 +36,6 @@ CONFIG_SPI=y
 CONFIG_SPI_SIRF=y
 CONFIG_SPI_SPIDEV=y
 # CONFIG_HWMON is not set
-# CONFIG_HID_SUPPORT is not set
 CONFIG_USB_GADGET=y
 CONFIG_USB_FILE_STORAGE=m
 CONFIG_USB_MASS_STORAGE=m
index db22453..0d6bb73 100644 (file)
@@ -145,6 +145,8 @@ CONFIG_MMC_SDHCI_TEGRA=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_EM3027=y
 CONFIG_RTC_DRV_TEGRA=y
+CONFIG_DMADEVICES=y
+CONFIG_TEGRA20_APB_DMA=y
 CONFIG_STAGING=y
 CONFIG_SENSORS_ISL29018=y
 CONFIG_SENSORS_ISL29028=y
index 03fb936..5c8b3bf 100644 (file)
        .size \name , . - \name
        .endm
 
+       .macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req
+#ifndef CONFIG_CPU_USE_DOMAINS
+       adds    \tmp, \addr, #\size - 1
+       sbcccs  \tmp, \tmp, \limit
+       bcs     \bad
+#endif
+       .endm
+
 #endif /* __ASM_ASSEMBLER_H__ */
index 2ae842d..5c44dcb 100644 (file)
@@ -203,6 +203,13 @@ static inline void dma_free_writecombine(struct device *dev, size_t size,
 }
 
 /*
+ * This can be called during early boot to increase the size of the atomic
+ * coherent DMA pool above the default value of 256KiB. It must be called
+ * before postcore_initcall.
+ */
+extern void __init init_dma_coherent_pool_size(unsigned long size);
+
+/*
  * This can be called during boot to increase the size of the consistent
  * DMA region above it's default value of 2MB. It must be called before the
  * memory allocator is initialised, i.e. before any core_initcall.
index 538f17c..295e2e4 100644 (file)
@@ -8,4 +8,7 @@
  * warranty of any kind, whether express or implied.
  */
 
-extern void __init tauros2_init(void);
+#define CACHE_TAUROS2_PREFETCH_ON      (1 << 0)
+#define CACHE_TAUROS2_LINEFILL_BURST8  (1 << 1)
+
+extern void __init tauros2_init(unsigned int features);
index 2ff2c75..02fe2fb 100644 (file)
@@ -217,18 +217,8 @@ extern int iop3xx_get_init_atu(void);
 #define IOP3XX_PCI_LOWER_MEM_PA        0x80000000
 #define IOP3XX_PCI_MEM_WINDOW_SIZE     0x08000000
 
-#define IOP3XX_PCI_IO_WINDOW_SIZE      0x00010000
 #define IOP3XX_PCI_LOWER_IO_PA         0x90000000
-#define IOP3XX_PCI_LOWER_IO_VA         0xfe000000
-#define IOP3XX_PCI_LOWER_IO_BA         0x90000000
-#define IOP3XX_PCI_UPPER_IO_PA         (IOP3XX_PCI_LOWER_IO_PA +\
-                                       IOP3XX_PCI_IO_WINDOW_SIZE - 1)
-#define IOP3XX_PCI_UPPER_IO_VA         (IOP3XX_PCI_LOWER_IO_VA +\
-                                       IOP3XX_PCI_IO_WINDOW_SIZE - 1)
-#define IOP3XX_PCI_IO_PHYS_TO_VIRT(addr) (((u32) (addr) -\
-                                       IOP3XX_PCI_LOWER_IO_PA) +\
-                                       IOP3XX_PCI_LOWER_IO_VA)
-
+#define IOP3XX_PCI_LOWER_IO_BA         0x00000000
 
 #ifndef __ASSEMBLY__
 
index 815c669..8f4db67 100644 (file)
@@ -113,11 +113,19 @@ static inline void __iomem *__typesafe_io(unsigned long addr)
 #define __iowmb()              do { } while (0)
 #endif
 
+/* PCI fixed i/o mapping */
+#define PCI_IO_VIRT_BASE       0xfee00000
+
+extern int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr);
+
 /*
  * Now, pick up the machine-defined IO definitions
  */
 #ifdef CONFIG_NEED_MACH_IO_H
 #include <mach/io.h>
+#elif defined(CONFIG_PCI)
+#define IO_SPACE_LIMIT ((resource_size_t)0xfffff)
+#define __io(a)                __typesafe_io(PCI_IO_VIRT_BASE + ((a) & IO_SPACE_LIMIT))
 #else
 #define __io(a)                __typesafe_io((a) & IO_SPACE_LIMIT)
 #endif
index a6efcdd..195ac2f 100644 (file)
@@ -9,6 +9,9 @@
  *
  *  Page table mapping constructs and function prototypes
  */
+#ifndef __ASM_MACH_MAP_H
+#define __ASM_MACH_MAP_H
+
 #include <asm/io.h>
 
 struct map_desc {
@@ -34,6 +37,8 @@ struct map_desc {
 
 #ifdef CONFIG_MMU
 extern void iotable_init(struct map_desc *, int);
+extern void vm_reserve_area_early(unsigned long addr, unsigned long size,
+                                 void *caller);
 
 struct mem_type;
 extern const struct mem_type *get_mem_type(unsigned int type);
@@ -44,4 +49,7 @@ extern int ioremap_page(unsigned long virt, unsigned long phys,
                        const struct mem_type *mtype);
 #else
 #define iotable_init(map,num)  do { } while (0)
+#define vm_reserve_area_early(a,s,c)   do { } while (0)
+#endif
+
 #endif
index 26c511f..db9fedb 100644 (file)
@@ -11,6 +11,8 @@
 #ifndef __ASM_MACH_PCI_H
 #define __ASM_MACH_PCI_H
 
+#include <linux/ioport.h>
+
 struct pci_sys_data;
 struct pci_ops;
 struct pci_bus;
@@ -42,6 +44,8 @@ struct pci_sys_data {
        unsigned long   io_offset;      /* bus->cpu IO mapping offset           */
        struct pci_bus  *bus;           /* PCI bus                              */
        struct list_head resources;     /* root bus resources (apertures)       */
+       struct resource io_res;
+       char            io_res_name[12];
                                        /* Bridge swizzling                     */
        u8              (*swizzle)(struct pci_dev *, u8 *);
                                        /* IRQ mapping                          */
@@ -55,6 +59,15 @@ struct pci_sys_data {
 void pci_common_init(struct hw_pci *);
 
 /*
+ * Setup early fixed I/O mapping.
+ */
+#if defined(CONFIG_PCI)
+extern void pci_map_io_early(unsigned long pfn);
+#else
+static inline void pci_map_io_early(unsigned long pfn) {}
+#endif
+
+/*
  * PCI controllers
  */
 extern struct pci_ops iop3xx_ops;
index e965f1b..5f6ddcc 100644 (file)
@@ -187,6 +187,7 @@ static inline unsigned long __phys_to_virt(unsigned long x)
 #define __phys_to_virt(x)      ((x) - PHYS_OFFSET + PAGE_OFFSET)
 #endif
 #endif
+#endif /* __ASSEMBLY__ */
 
 #ifndef PHYS_OFFSET
 #ifdef PLAT_PHYS_OFFSET
@@ -196,6 +197,8 @@ static inline unsigned long __phys_to_virt(unsigned long x)
 #endif
 #endif
 
+#ifndef __ASSEMBLY__
+
 /*
  * PFNs are used to describe any physical page; this means
  * PFN 0 == physical address 0.
index e074948..625cd62 100644 (file)
 #ifndef __ARM_PERF_EVENT_H__
 #define __ARM_PERF_EVENT_H__
 
-/* Nothing to see here... */
+/*
+ * The ARMv7 CPU PMU supports up to 32 event counters.
+ */
+#define ARMPMU_MAX_HWEVENTS            32
+
+#define HW_OP_UNSUPPORTED              0xFFFF
+#define C(_x)                          PERF_COUNT_HW_CACHE_##_x
+#define CACHE_OP_UNSUPPORTED           0xFFFF
 
 #endif /* __ARM_PERF_EVENT_H__ */
index 4432305..a26170d 100644 (file)
 #include <linux/perf_event.h>
 
 /*
- * Types of PMUs that can be accessed directly and require mutual
- * exclusion between profiling tools.
- */
-enum arm_pmu_type {
-       ARM_PMU_DEVICE_CPU      = 0,
-       ARM_NUM_PMU_DEVICES,
-};
-
-/*
  * struct arm_pmu_platdata - ARM PMU platform data
  *
  * @handle_irq: an optional handler which will be called from the
  *     interrupt and passed the address of the low level handler,
  *     and can be used to implement any platform specific handling
  *     before or after calling it.
- * @enable_irq: an optional handler which will be called after
- *     request_irq and be used to handle some platform specific
- *     irq enablement
- * @disable_irq: an optional handler which will be called before
- *     free_irq and be used to handle some platform specific
- *     irq disablement
+ * @runtime_resume: an optional handler which will be called by the
+ *     runtime PM framework following a call to pm_runtime_get().
+ *     Note that if pm_runtime_get() is called more than once in
+ *     succession this handler will only be called once.
+ * @runtime_suspend: an optional handler which will be called by the
+ *     runtime PM framework following a call to pm_runtime_put().
+ *     Note that if pm_runtime_get() is called more than once in
+ *     succession this handler will only be called following the
+ *     final call to pm_runtime_put() that actually disables the
+ *     hardware.
  */
 struct arm_pmu_platdata {
        irqreturn_t (*handle_irq)(int irq, void *dev,
                                  irq_handler_t pmu_handler);
-       void (*enable_irq)(int irq);
-       void (*disable_irq)(int irq);
+       int (*runtime_resume)(struct device *dev);
+       int (*runtime_suspend)(struct device *dev);
 };
 
-#ifdef CONFIG_CPU_HAS_PMU
-
-/**
- * reserve_pmu() - reserve the hardware performance counters
- *
- * Reserve the hardware performance counters in the system for exclusive use.
- * Returns 0 on success or -EBUSY if the lock is already held.
- */
-extern int
-reserve_pmu(enum arm_pmu_type type);
-
-/**
- * release_pmu() - Relinquish control of the performance counters
- *
- * Release the performance counters and allow someone else to use them.
- */
-extern void
-release_pmu(enum arm_pmu_type type);
-
-#else /* CONFIG_CPU_HAS_PMU */
-
-#include <linux/err.h>
-
-static inline int
-reserve_pmu(enum arm_pmu_type type)
-{
-       return -ENODEV;
-}
-
-static inline void
-release_pmu(enum arm_pmu_type type)    { }
-
-#endif /* CONFIG_CPU_HAS_PMU */
-
 #ifdef CONFIG_HW_PERF_EVENTS
 
 /* The events for a given PMU register set. */
@@ -103,7 +64,6 @@ struct pmu_hw_events {
 
 struct arm_pmu {
        struct pmu      pmu;
-       enum arm_pmu_type type;
        cpumask_t       active_irqs;
        char            *name;
        irqreturn_t     (*handle_irq)(int irq_num, void *dev);
@@ -118,6 +78,8 @@ struct arm_pmu {
        void            (*start)(void);
        void            (*stop)(void);
        void            (*reset)(void *);
+       int             (*request_irq)(irq_handler_t handler);
+       void            (*free_irq)(void);
        int             (*map_event)(struct perf_event *event);
        int             num_events;
        atomic_t        active_events;
@@ -129,7 +91,9 @@ struct arm_pmu {
 
 #define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu))
 
-int __init armpmu_register(struct arm_pmu *armpmu, char *name, int type);
+extern const struct dev_pm_ops armpmu_dev_pm_ops;
+
+int armpmu_register(struct arm_pmu *armpmu, char *name, int type);
 
 u64 armpmu_event_update(struct perf_event *event,
                        struct hw_perf_event *hwc,
@@ -139,6 +103,13 @@ int armpmu_event_set_period(struct perf_event *event,
                            struct hw_perf_event *hwc,
                            int idx);
 
+int armpmu_map_event(struct perf_event *event,
+                    const unsigned (*event_map)[PERF_COUNT_HW_MAX],
+                    const unsigned (*cache_map)[PERF_COUNT_HW_CACHE_MAX]
+                                               [PERF_COUNT_HW_CACHE_OP_MAX]
+                                               [PERF_COUNT_HW_CACHE_RESULT_MAX],
+                    u32 raw_event_mask);
+
 #endif /* CONFIG_HW_PERF_EVENTS */
 
 #endif /* __ARM_PMU_H__ */
index 314d466..99a1951 100644 (file)
@@ -199,6 +199,9 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
 {
        pgtable_page_dtor(pte);
 
+#ifdef CONFIG_ARM_LPAE
+       tlb_add_flush(tlb, addr);
+#else
        /*
         * With the classic ARM MMU, a pte page has two corresponding pmd
         * entries, each covering 1MB.
@@ -206,6 +209,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
        addr &= PMD_MASK;
        tlb_add_flush(tlb, addr + SZ_1M - PAGE_SIZE);
        tlb_add_flush(tlb, addr + SZ_1M);
+#endif
 
        tlb_remove_page(tlb, pte);
 }
index 479a635..77bd79f 100644 (file)
@@ -101,28 +101,39 @@ extern int __get_user_1(void *);
 extern int __get_user_2(void *);
 extern int __get_user_4(void *);
 
-#define __get_user_x(__r2,__p,__e,__s,__i...)                          \
+#define __GUP_CLOBBER_1        "lr", "cc"
+#ifdef CONFIG_CPU_USE_DOMAINS
+#define __GUP_CLOBBER_2        "ip", "lr", "cc"
+#else
+#define __GUP_CLOBBER_2 "lr", "cc"
+#endif
+#define __GUP_CLOBBER_4        "lr", "cc"
+
+#define __get_user_x(__r2,__p,__e,__l,__s)                             \
           __asm__ __volatile__ (                                       \
                __asmeq("%0", "r0") __asmeq("%1", "r2")                 \
+               __asmeq("%3", "r1")                                     \
                "bl     __get_user_" #__s                               \
                : "=&r" (__e), "=r" (__r2)                              \
-               : "0" (__p)                                             \
-               : __i, "cc")
+               : "0" (__p), "r" (__l)                                  \
+               : __GUP_CLOBBER_##__s)
 
-#define get_user(x,p)                                                  \
+#define __get_user_check(x,p)                                                  \
        ({                                                              \
+               unsigned long __limit = current_thread_info()->addr_limit - 1; \
                register const typeof(*(p)) __user *__p asm("r0") = (p);\
                register unsigned long __r2 asm("r2");                  \
+               register unsigned long __l asm("r1") = __limit;         \
                register int __e asm("r0");                             \
                switch (sizeof(*(__p))) {                               \
                case 1:                                                 \
-                       __get_user_x(__r2, __p, __e, 1, "lr");          \
-                       break;                                          \
+                       __get_user_x(__r2, __p, __e, __l, 1);           \
+                       break;                                          \
                case 2:                                                 \
-                       __get_user_x(__r2, __p, __e, 2, "r3", "lr");    \
+                       __get_user_x(__r2, __p, __e, __l, 2);           \
                        break;                                          \
                case 4:                                                 \
-                       __get_user_x(__r2, __p, __e, 4, "lr");          \
+                       __get_user_x(__r2, __p, __e, __l, 4);           \
                        break;                                          \
                default: __e = __get_user_bad(); break;                 \
                }                                                       \
@@ -130,42 +141,57 @@ extern int __get_user_4(void *);
                __e;                                                    \
        })
 
+#define get_user(x,p)                                                  \
+       ({                                                              \
+               might_fault();                                          \
+               __get_user_check(x,p);                                  \
+        })
+
 extern int __put_user_1(void *, unsigned int);
 extern int __put_user_2(void *, unsigned int);
 extern int __put_user_4(void *, unsigned int);
 extern int __put_user_8(void *, unsigned long long);
 
-#define __put_user_x(__r2,__p,__e,__s)                                 \
+#define __put_user_x(__r2,__p,__e,__l,__s)                             \
           __asm__ __volatile__ (                                       \
                __asmeq("%0", "r0") __asmeq("%2", "r2")                 \
+               __asmeq("%3", "r1")                                     \
                "bl     __put_user_" #__s                               \
                : "=&r" (__e)                                           \
-               : "0" (__p), "r" (__r2)                                 \
+               : "0" (__p), "r" (__r2), "r" (__l)                      \
                : "ip", "lr", "cc")
 
-#define put_user(x,p)                                                  \
+#define __put_user_check(x,p)                                                  \
        ({                                                              \
+               unsigned long __limit = current_thread_info()->addr_limit - 1; \
                register const typeof(*(p)) __r2 asm("r2") = (x);       \
                register const typeof(*(p)) __user *__p asm("r0") = (p);\
+               register unsigned long __l asm("r1") = __limit;         \
                register int __e asm("r0");                             \
                switch (sizeof(*(__p))) {                               \
                case 1:                                                 \
-                       __put_user_x(__r2, __p, __e, 1);                \
+                       __put_user_x(__r2, __p, __e, __l, 1);           \
                        break;                                          \
                case 2:                                                 \
-                       __put_user_x(__r2, __p, __e, 2);                \
+                       __put_user_x(__r2, __p, __e, __l, 2);           \
                        break;                                          \
                case 4:                                                 \
-                       __put_user_x(__r2, __p, __e, 4);                \
+                       __put_user_x(__r2, __p, __e, __l, 4);           \
                        break;                                          \
                case 8:                                                 \
-                       __put_user_x(__r2, __p, __e, 8);                \
+                       __put_user_x(__r2, __p, __e, __l, 8);           \
                        break;                                          \
                default: __e = __put_user_bad(); break;                 \
                }                                                       \
                __e;                                                    \
        })
 
+#define put_user(x,p)                                                  \
+       ({                                                              \
+               might_fault();                                          \
+               __put_user_check(x,p);                                  \
+        })
+
 #else /* CONFIG_MMU */
 
 /*
@@ -219,6 +245,7 @@ do {                                                                        \
        unsigned long __gu_addr = (unsigned long)(ptr);                 \
        unsigned long __gu_val;                                         \
        __chk_user_ptr(ptr);                                            \
+       might_fault();                                                  \
        switch (sizeof(*(ptr))) {                                       \
        case 1: __get_user_asm_byte(__gu_val,__gu_addr,err);    break;  \
        case 2: __get_user_asm_half(__gu_val,__gu_addr,err);    break;  \
@@ -300,6 +327,7 @@ do {                                                                        \
        unsigned long __pu_addr = (unsigned long)(ptr);                 \
        __typeof__(*(ptr)) __pu_val = (x);                              \
        __chk_user_ptr(ptr);                                            \
+       might_fault();                                                  \
        switch (sizeof(*(ptr))) {                                       \
        case 1: __put_user_asm_byte(__pu_val,__pu_addr,err);    break;  \
        case 2: __put_user_asm_half(__pu_val,__pu_addr,err);    break;  \
index 7ad2d5c..1c43214 100644 (file)
@@ -69,8 +69,7 @@ obj-$(CONFIG_CPU_XSC3)                += xscale-cp0.o
 obj-$(CONFIG_CPU_MOHAWK)       += xscale-cp0.o
 obj-$(CONFIG_CPU_PJ4)          += pj4-cp0.o
 obj-$(CONFIG_IWMMXT)           += iwmmxt.o
-obj-$(CONFIG_CPU_HAS_PMU)      += pmu.o
-obj-$(CONFIG_HW_PERF_EVENTS)   += perf_event.o
+obj-$(CONFIG_HW_PERF_EVENTS)   += perf_event.o perf_event_cpu.o
 AFLAGS_iwmmxt.o                        := -Wa,-mcpu=iwmmxt
 obj-$(CONFIG_ARM_CPU_TOPOLOGY)  += topology.o
 
index 2b2f25e..b244696 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/io.h>
 
 #include <asm/mach-types.h>
+#include <asm/mach/map.h>
 #include <asm/mach/pci.h>
 
 static int debug_pci;
@@ -423,6 +424,38 @@ static int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
        return irq;
 }
 
+static int __init pcibios_init_resources(int busnr, struct pci_sys_data *sys)
+{
+       int ret;
+       struct pci_host_bridge_window *window;
+
+       if (list_empty(&sys->resources)) {
+               pci_add_resource_offset(&sys->resources,
+                        &iomem_resource, sys->mem_offset);
+       }
+
+       list_for_each_entry(window, &sys->resources, list) {
+               if (resource_type(window->res) == IORESOURCE_IO)
+                       return 0;
+       }
+
+       sys->io_res.start = (busnr * SZ_64K) ?  : pcibios_min_io;
+       sys->io_res.end = (busnr + 1) * SZ_64K - 1;
+       sys->io_res.flags = IORESOURCE_IO;
+       sys->io_res.name = sys->io_res_name;
+       sprintf(sys->io_res_name, "PCI%d I/O", busnr);
+
+       ret = request_resource(&ioport_resource, &sys->io_res);
+       if (ret) {
+               pr_err("PCI: unable to allocate I/O port region (%d)\n", ret);
+               return ret;
+       }
+       pci_add_resource_offset(&sys->resources, &sys->io_res,
+                               sys->io_offset);
+
+       return 0;
+}
+
 static void __init pcibios_init_hw(struct hw_pci *hw, struct list_head *head)
 {
        struct pci_sys_data *sys = NULL;
@@ -445,11 +478,10 @@ static void __init pcibios_init_hw(struct hw_pci *hw, struct list_head *head)
                ret = hw->setup(nr, sys);
 
                if (ret > 0) {
-                       if (list_empty(&sys->resources)) {
-                               pci_add_resource_offset(&sys->resources,
-                                        &ioport_resource, sys->io_offset);
-                               pci_add_resource_offset(&sys->resources,
-                                        &iomem_resource, sys->mem_offset);
+                       ret = pcibios_init_resources(nr, sys);
+                       if (ret)  {
+                               kfree(sys);
+                               break;
                        }
 
                        if (hw->scan)
@@ -627,3 +659,15 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
 
        return 0;
 }
+
+void __init pci_map_io_early(unsigned long pfn)
+{
+       struct map_desc pci_io_desc = {
+               .virtual        = PCI_IO_VIRT_BASE,
+               .type           = MT_DEVICE,
+               .length         = SZ_64K,
+       };
+
+       pci_io_desc.pfn = pfn;
+       iotable_init(&pci_io_desc, 1);
+}
index ba386bd..281bf33 100644 (file)
@@ -159,6 +159,12 @@ static int debug_arch_supported(void)
                arch >= ARM_DEBUG_ARCH_V7_1;
 }
 
+/* Can we determine the watchpoint access type from the fsr? */
+static int debug_exception_updates_fsr(void)
+{
+       return 0;
+}
+
 /* Determine number of WRP registers available. */
 static int get_num_wrp_resources(void)
 {
@@ -604,13 +610,14 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp)
                /* Aligned */
                break;
        case 1:
-               /* Allow single byte watchpoint. */
-               if (info->ctrl.len == ARM_BREAKPOINT_LEN_1)
-                       break;
        case 2:
                /* Allow halfword watchpoints and breakpoints. */
                if (info->ctrl.len == ARM_BREAKPOINT_LEN_2)
                        break;
+       case 3:
+               /* Allow single byte watchpoint. */
+               if (info->ctrl.len == ARM_BREAKPOINT_LEN_1)
+                       break;
        default:
                ret = -EINVAL;
                goto out;
@@ -619,18 +626,35 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp)
        info->address &= ~alignment_mask;
        info->ctrl.len <<= offset;
 
-       /*
-        * Currently we rely on an overflow handler to take
-        * care of single-stepping the breakpoint when it fires.
-        * In the case of userspace breakpoints on a core with V7 debug,
-        * we can use the mismatch feature as a poor-man's hardware
-        * single-step, but this only works for per-task breakpoints.
-        */
-       if (!bp->overflow_handler && (arch_check_bp_in_kernelspace(bp) ||
-           !core_has_mismatch_brps() || !bp->hw.bp_target)) {
-               pr_warning("overflow handler required but none found\n");
-               ret = -EINVAL;
+       if (!bp->overflow_handler) {
+               /*
+                * Mismatch breakpoints are required for single-stepping
+                * breakpoints.
+                */
+               if (!core_has_mismatch_brps())
+                       return -EINVAL;
+
+               /* We don't allow mismatch breakpoints in kernel space. */
+               if (arch_check_bp_in_kernelspace(bp))
+                       return -EPERM;
+
+               /*
+                * Per-cpu breakpoints are not supported by our stepping
+                * mechanism.
+                */
+               if (!bp->hw.bp_target)
+                       return -EINVAL;
+
+               /*
+                * We only support specific access types if the fsr
+                * reports them.
+                */
+               if (!debug_exception_updates_fsr() &&
+                   (info->ctrl.type == ARM_BREAKPOINT_LOAD ||
+                    info->ctrl.type == ARM_BREAKPOINT_STORE))
+                       return -EINVAL;
        }
+
 out:
        return ret;
 }
@@ -706,10 +730,12 @@ static void watchpoint_handler(unsigned long addr, unsigned int fsr,
                                goto unlock;
 
                        /* Check that the access type matches. */
-                       access = (fsr & ARM_FSR_ACCESS_MASK) ? HW_BREAKPOINT_W :
-                                HW_BREAKPOINT_R;
-                       if (!(access & hw_breakpoint_type(wp)))
-                               goto unlock;
+                       if (debug_exception_updates_fsr()) {
+                               access = (fsr & ARM_FSR_ACCESS_MASK) ?
+                                         HW_BREAKPOINT_W : HW_BREAKPOINT_R;
+                               if (!(access & hw_breakpoint_type(wp)))
+                                       goto unlock;
+                       }
 
                        /* We have a winner. */
                        info->trigger = addr;
index ab243b8..93971b1 100644 (file)
  */
 #define pr_fmt(fmt) "hw perfevents: " fmt
 
-#include <linux/bitmap.h>
-#include <linux/interrupt.h>
 #include <linux/kernel.h>
-#include <linux/export.h>
-#include <linux/perf_event.h>
 #include <linux/platform_device.h>
-#include <linux/spinlock.h>
+#include <linux/pm_runtime.h>
 #include <linux/uaccess.h>
 
-#include <asm/cputype.h>
-#include <asm/irq.h>
 #include <asm/irq_regs.h>
 #include <asm/pmu.h>
 #include <asm/stacktrace.h>
 
-/*
- * ARMv6 supports a maximum of 3 events, starting from index 0. If we add
- * another platform that supports more, we need to increase this to be the
- * largest of all platforms.
- *
- * ARMv7 supports up to 32 events:
- *  cycle counter CCNT + 31 events counters CNT0..30.
- *  Cortex-A8 has 1+4 counters, Cortex-A9 has 1+6 counters.
- */
-#define ARMPMU_MAX_HWEVENTS            32
-
-static DEFINE_PER_CPU(struct perf_event * [ARMPMU_MAX_HWEVENTS], hw_events);
-static DEFINE_PER_CPU(unsigned long [BITS_TO_LONGS(ARMPMU_MAX_HWEVENTS)], used_mask);
-static DEFINE_PER_CPU(struct pmu_hw_events, cpu_hw_events);
-
-#define to_arm_pmu(p) (container_of(p, struct arm_pmu, pmu))
-
-/* Set at runtime when we know what CPU type we are. */
-static struct arm_pmu *cpu_pmu;
-
-const char *perf_pmu_name(void)
-{
-       if (!cpu_pmu)
-               return NULL;
-
-       return cpu_pmu->pmu.name;
-}
-EXPORT_SYMBOL_GPL(perf_pmu_name);
-
-int perf_num_counters(void)
-{
-       int max_events = 0;
-
-       if (cpu_pmu != NULL)
-               max_events = cpu_pmu->num_events;
-
-       return max_events;
-}
-EXPORT_SYMBOL_GPL(perf_num_counters);
-
-#define HW_OP_UNSUPPORTED              0xFFFF
-
-#define C(_x) \
-       PERF_COUNT_HW_CACHE_##_x
-
-#define CACHE_OP_UNSUPPORTED           0xFFFF
-
 static int
 armpmu_map_cache_event(const unsigned (*cache_map)
                                      [PERF_COUNT_HW_CACHE_MAX]
@@ -104,7 +51,7 @@ armpmu_map_cache_event(const unsigned (*cache_map)
 }
 
 static int
-armpmu_map_event(const unsigned (*event_map)[PERF_COUNT_HW_MAX], u64 config)
+armpmu_map_hw_event(const unsigned (*event_map)[PERF_COUNT_HW_MAX], u64 config)
 {
        int mapping = (*event_map)[config];
        return mapping == HW_OP_UNSUPPORTED ? -ENOENT : mapping;
@@ -116,19 +63,20 @@ armpmu_map_raw_event(u32 raw_event_mask, u64 config)
        return (int)(config & raw_event_mask);
 }
 
-static int map_cpu_event(struct perf_event *event,
-                        const unsigned (*event_map)[PERF_COUNT_HW_MAX],
-                        const unsigned (*cache_map)
-                                       [PERF_COUNT_HW_CACHE_MAX]
-                                       [PERF_COUNT_HW_CACHE_OP_MAX]
-                                       [PERF_COUNT_HW_CACHE_RESULT_MAX],
-                        u32 raw_event_mask)
+int
+armpmu_map_event(struct perf_event *event,
+                const unsigned (*event_map)[PERF_COUNT_HW_MAX],
+                const unsigned (*cache_map)
+                               [PERF_COUNT_HW_CACHE_MAX]
+                               [PERF_COUNT_HW_CACHE_OP_MAX]
+                               [PERF_COUNT_HW_CACHE_RESULT_MAX],
+                u32 raw_event_mask)
 {
        u64 config = event->attr.config;
 
        switch (event->attr.type) {
        case PERF_TYPE_HARDWARE:
-               return armpmu_map_event(event_map, config);
+               return armpmu_map_hw_event(event_map, config);
        case PERF_TYPE_HW_CACHE:
                return armpmu_map_cache_event(cache_map, config);
        case PERF_TYPE_RAW:
@@ -222,7 +170,6 @@ armpmu_stop(struct perf_event *event, int flags)
         */
        if (!(hwc->state & PERF_HES_STOPPED)) {
                armpmu->disable(hwc, hwc->idx);
-               barrier(); /* why? */
                armpmu_event_update(event, hwc, hwc->idx);
                hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
        }
@@ -350,99 +297,41 @@ validate_group(struct perf_event *event)
        return 0;
 }
 
-static irqreturn_t armpmu_platform_irq(int irq, void *dev)
+static irqreturn_t armpmu_dispatch_irq(int irq, void *dev)
 {
        struct arm_pmu *armpmu = (struct arm_pmu *) dev;
        struct platform_device *plat_device = armpmu->plat_device;
        struct arm_pmu_platdata *plat = dev_get_platdata(&plat_device->dev);
 
-       return plat->handle_irq(irq, dev, armpmu->handle_irq);
+       if (plat && plat->handle_irq)
+               return plat->handle_irq(irq, dev, armpmu->handle_irq);
+       else
+               return armpmu->handle_irq(irq, dev);
 }
 
 static void
 armpmu_release_hardware(struct arm_pmu *armpmu)
 {
-       int i, irq, irqs;
-       struct platform_device *pmu_device = armpmu->plat_device;
-       struct arm_pmu_platdata *plat =
-               dev_get_platdata(&pmu_device->dev);
-
-       irqs = min(pmu_device->num_resources, num_possible_cpus());
-
-       for (i = 0; i < irqs; ++i) {
-               if (!cpumask_test_and_clear_cpu(i, &armpmu->active_irqs))
-                       continue;
-               irq = platform_get_irq(pmu_device, i);
-               if (irq >= 0) {
-                       if (plat && plat->disable_irq)
-                               plat->disable_irq(irq);
-                       free_irq(irq, armpmu);
-               }
-       }
-
-       release_pmu(armpmu->type);
+       armpmu->free_irq();
+       pm_runtime_put_sync(&armpmu->plat_device->dev);
 }
 
 static int
 armpmu_reserve_hardware(struct arm_pmu *armpmu)
 {
-       struct arm_pmu_platdata *plat;
-       irq_handler_t handle_irq;
-       int i, err, irq, irqs;
+       int err;
        struct platform_device *pmu_device = armpmu->plat_device;
 
        if (!pmu_device)
                return -ENODEV;
 
-       err = reserve_pmu(armpmu->type);
+       pm_runtime_get_sync(&pmu_device->dev);
+       err = armpmu->request_irq(armpmu_dispatch_irq);
        if (err) {
-               pr_warning("unable to reserve pmu\n");
+               armpmu_release_hardware(armpmu);
                return err;
        }
 
-       plat = dev_get_platdata(&pmu_device->dev);
-       if (plat && plat->handle_irq)
-               handle_irq = armpmu_platform_irq;
-       else
-               handle_irq = armpmu->handle_irq;
-
-       irqs = min(pmu_device->num_resources, num_possible_cpus());
-       if (irqs < 1) {
-               pr_err("no irqs for PMUs defined\n");
-               return -ENODEV;
-       }
-
-       for (i = 0; i < irqs; ++i) {
-               err = 0;
-               irq = platform_get_irq(pmu_device, i);
-               if (irq < 0)
-                       continue;
-
-               /*
-                * If we have a single PMU interrupt that we can't shift,
-                * assume that we're running on a uniprocessor machine and
-                * continue. Otherwise, continue without this interrupt.
-                */
-               if (irq_set_affinity(irq, cpumask_of(i)) && irqs > 1) {
-                       pr_warning("unable to set irq affinity (irq=%d, cpu=%u)\n",
-                                   irq, i);
-                       continue;
-               }
-
-               err = request_irq(irq, handle_irq,
-                                 IRQF_DISABLED | IRQF_NOBALANCING,
-                                 "arm-pmu", armpmu);
-               if (err) {
-                       pr_err("unable to request IRQ%d for ARM PMU counters\n",
-                               irq);
-                       armpmu_release_hardware(armpmu);
-                       return err;
-               } else if (plat && plat->enable_irq)
-                       plat->enable_irq(irq);
-
-               cpumask_set_cpu(i, &armpmu->active_irqs);
-       }
-
        return 0;
 }
 
@@ -581,6 +470,32 @@ static void armpmu_disable(struct pmu *pmu)
        armpmu->stop();
 }
 
+#ifdef CONFIG_PM_RUNTIME
+static int armpmu_runtime_resume(struct device *dev)
+{
+       struct arm_pmu_platdata *plat = dev_get_platdata(dev);
+
+       if (plat && plat->runtime_resume)
+               return plat->runtime_resume(dev);
+
+       return 0;
+}
+
+static int armpmu_runtime_suspend(struct device *dev)
+{
+       struct arm_pmu_platdata *plat = dev_get_platdata(dev);
+
+       if (plat && plat->runtime_suspend)
+               return plat->runtime_suspend(dev);
+
+       return 0;
+}
+#endif
+
+const struct dev_pm_ops armpmu_dev_pm_ops = {
+       SET_RUNTIME_PM_OPS(armpmu_runtime_suspend, armpmu_runtime_resume, NULL)
+};
+
 static void __init armpmu_init(struct arm_pmu *armpmu)
 {
        atomic_set(&armpmu->active_events, 0);
@@ -598,174 +513,14 @@ static void __init armpmu_init(struct arm_pmu *armpmu)
        };
 }
 
-int __init armpmu_register(struct arm_pmu *armpmu, char *name, int type)
+int armpmu_register(struct arm_pmu *armpmu, char *name, int type)
 {
        armpmu_init(armpmu);
+       pr_info("enabled with %s PMU driver, %d counters available\n",
+                       armpmu->name, armpmu->num_events);
        return perf_pmu_register(&armpmu->pmu, name, type);
 }
 
-/* Include the PMU-specific implementations. */
-#include "perf_event_xscale.c"
-#include "perf_event_v6.c"
-#include "perf_event_v7.c"
-
-/*
- * Ensure the PMU has sane values out of reset.
- * This requires SMP to be available, so exists as a separate initcall.
- */
-static int __init
-cpu_pmu_reset(void)
-{
-       if (cpu_pmu && cpu_pmu->reset)
-               return on_each_cpu(cpu_pmu->reset, NULL, 1);
-       return 0;
-}
-arch_initcall(cpu_pmu_reset);
-
-/*
- * PMU platform driver and devicetree bindings.
- */
-static struct of_device_id armpmu_of_device_ids[] = {
-       {.compatible = "arm,cortex-a9-pmu"},
-       {.compatible = "arm,cortex-a8-pmu"},
-       {.compatible = "arm,arm1136-pmu"},
-       {.compatible = "arm,arm1176-pmu"},
-       {},
-};
-
-static struct platform_device_id armpmu_plat_device_ids[] = {
-       {.name = "arm-pmu"},
-       {},
-};
-
-static int __devinit armpmu_device_probe(struct platform_device *pdev)
-{
-       if (!cpu_pmu)
-               return -ENODEV;
-
-       cpu_pmu->plat_device = pdev;
-       return 0;
-}
-
-static struct platform_driver armpmu_driver = {
-       .driver         = {
-               .name   = "arm-pmu",
-               .of_match_table = armpmu_of_device_ids,
-       },
-       .probe          = armpmu_device_probe,
-       .id_table       = armpmu_plat_device_ids,
-};
-
-static int __init register_pmu_driver(void)
-{
-       return platform_driver_register(&armpmu_driver);
-}
-device_initcall(register_pmu_driver);
-
-static struct pmu_hw_events *armpmu_get_cpu_events(void)
-{
-       return &__get_cpu_var(cpu_hw_events);
-}
-
-static void __init cpu_pmu_init(struct arm_pmu *armpmu)
-{
-       int cpu;
-       for_each_possible_cpu(cpu) {
-               struct pmu_hw_events *events = &per_cpu(cpu_hw_events, cpu);
-               events->events = per_cpu(hw_events, cpu);
-               events->used_mask = per_cpu(used_mask, cpu);
-               raw_spin_lock_init(&events->pmu_lock);
-       }
-       armpmu->get_hw_events = armpmu_get_cpu_events;
-       armpmu->type = ARM_PMU_DEVICE_CPU;
-}
-
-/*
- * PMU hardware loses all context when a CPU goes offline.
- * When a CPU is hotplugged back in, since some hardware registers are
- * UNKNOWN at reset, the PMU must be explicitly reset to avoid reading
- * junk values out of them.
- */
-static int __cpuinit pmu_cpu_notify(struct notifier_block *b,
-                                       unsigned long action, void *hcpu)
-{
-       if ((action & ~CPU_TASKS_FROZEN) != CPU_STARTING)
-               return NOTIFY_DONE;
-
-       if (cpu_pmu && cpu_pmu->reset)
-               cpu_pmu->reset(NULL);
-
-       return NOTIFY_OK;
-}
-
-static struct notifier_block __cpuinitdata pmu_cpu_notifier = {
-       .notifier_call = pmu_cpu_notify,
-};
-
-/*
- * CPU PMU identification and registration.
- */
-static int __init
-init_hw_perf_events(void)
-{
-       unsigned long cpuid = read_cpuid_id();
-       unsigned long implementor = (cpuid & 0xFF000000) >> 24;
-       unsigned long part_number = (cpuid & 0xFFF0);
-
-       /* ARM Ltd CPUs. */
-       if (0x41 == implementor) {
-               switch (part_number) {
-               case 0xB360:    /* ARM1136 */
-               case 0xB560:    /* ARM1156 */
-               case 0xB760:    /* ARM1176 */
-                       cpu_pmu = armv6pmu_init();
-                       break;
-               case 0xB020:    /* ARM11mpcore */
-                       cpu_pmu = armv6mpcore_pmu_init();
-                       break;
-               case 0xC080:    /* Cortex-A8 */
-                       cpu_pmu = armv7_a8_pmu_init();
-                       break;
-               case 0xC090:    /* Cortex-A9 */
-                       cpu_pmu = armv7_a9_pmu_init();
-                       break;
-               case 0xC050:    /* Cortex-A5 */
-                       cpu_pmu = armv7_a5_pmu_init();
-                       break;
-               case 0xC0F0:    /* Cortex-A15 */
-                       cpu_pmu = armv7_a15_pmu_init();
-                       break;
-               case 0xC070:    /* Cortex-A7 */
-                       cpu_pmu = armv7_a7_pmu_init();
-                       break;
-               }
-       /* Intel CPUs [xscale]. */
-       } else if (0x69 == implementor) {
-               part_number = (cpuid >> 13) & 0x7;
-               switch (part_number) {
-               case 1:
-                       cpu_pmu = xscale1pmu_init();
-                       break;
-               case 2:
-                       cpu_pmu = xscale2pmu_init();
-                       break;
-               }
-       }
-
-       if (cpu_pmu) {
-               pr_info("enabled with %s PMU driver, %d counters available\n",
-                       cpu_pmu->name, cpu_pmu->num_events);
-               cpu_pmu_init(cpu_pmu);
-               register_cpu_notifier(&pmu_cpu_notifier);
-               armpmu_register(cpu_pmu, cpu_pmu->name, PERF_TYPE_RAW);
-       } else {
-               pr_info("no hardware support available\n");
-       }
-
-       return 0;
-}
-early_initcall(init_hw_perf_events);
-
 /*
  * Callchain handling code.
  */
diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c
new file mode 100644 (file)
index 0000000..8d7d8d4
--- /dev/null
@@ -0,0 +1,295 @@
+/*
+ * 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, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Copyright (C) 2012 ARM Limited
+ *
+ * Author: Will Deacon <will.deacon@arm.com>
+ */
+#define pr_fmt(fmt) "CPU PMU: " fmt
+
+#include <linux/bitmap.h>
+#include <linux/export.h>
+#include <linux/kernel.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/spinlock.h>
+
+#include <asm/cputype.h>
+#include <asm/irq_regs.h>
+#include <asm/pmu.h>
+
+/* Set at runtime when we know what CPU type we are. */
+static struct arm_pmu *cpu_pmu;
+
+static DEFINE_PER_CPU(struct perf_event * [ARMPMU_MAX_HWEVENTS], hw_events);
+static DEFINE_PER_CPU(unsigned long [BITS_TO_LONGS(ARMPMU_MAX_HWEVENTS)], used_mask);
+static DEFINE_PER_CPU(struct pmu_hw_events, cpu_hw_events);
+
+/*
+ * Despite the names, these two functions are CPU-specific and are used
+ * by the OProfile/perf code.
+ */
+const char *perf_pmu_name(void)
+{
+       if (!cpu_pmu)
+               return NULL;
+
+       return cpu_pmu->pmu.name;
+}
+EXPORT_SYMBOL_GPL(perf_pmu_name);
+
+int perf_num_counters(void)
+{
+       int max_events = 0;
+
+       if (cpu_pmu != NULL)
+               max_events = cpu_pmu->num_events;
+
+       return max_events;
+}
+EXPORT_SYMBOL_GPL(perf_num_counters);
+
+/* Include the PMU-specific implementations. */
+#include "perf_event_xscale.c"
+#include "perf_event_v6.c"
+#include "perf_event_v7.c"
+
+static struct pmu_hw_events *cpu_pmu_get_cpu_events(void)
+{
+       return &__get_cpu_var(cpu_hw_events);
+}
+
+static void cpu_pmu_free_irq(void)
+{
+       int i, irq, irqs;
+       struct platform_device *pmu_device = cpu_pmu->plat_device;
+
+       irqs = min(pmu_device->num_resources, num_possible_cpus());
+
+       for (i = 0; i < irqs; ++i) {
+               if (!cpumask_test_and_clear_cpu(i, &cpu_pmu->active_irqs))
+                       continue;
+               irq = platform_get_irq(pmu_device, i);
+               if (irq >= 0)
+                       free_irq(irq, cpu_pmu);
+       }
+}
+
+static int cpu_pmu_request_irq(irq_handler_t handler)
+{
+       int i, err, irq, irqs;
+       struct platform_device *pmu_device = cpu_pmu->plat_device;
+
+       if (!pmu_device)
+               return -ENODEV;
+
+       irqs = min(pmu_device->num_resources, num_possible_cpus());
+       if (irqs < 1) {
+               pr_err("no irqs for PMUs defined\n");
+               return -ENODEV;
+       }
+
+       for (i = 0; i < irqs; ++i) {
+               err = 0;
+               irq = platform_get_irq(pmu_device, i);
+               if (irq < 0)
+                       continue;
+
+               /*
+                * If we have a single PMU interrupt that we can't shift,
+                * assume that we're running on a uniprocessor machine and
+                * continue. Otherwise, continue without this interrupt.
+                */
+               if (irq_set_affinity(irq, cpumask_of(i)) && irqs > 1) {
+                       pr_warning("unable to set irq affinity (irq=%d, cpu=%u)\n",
+                                   irq, i);
+                       continue;
+               }
+
+               err = request_irq(irq, handler, IRQF_NOBALANCING, "arm-pmu",
+                                 cpu_pmu);
+               if (err) {
+                       pr_err("unable to request IRQ%d for ARM PMU counters\n",
+                               irq);
+                       return err;
+               }
+
+               cpumask_set_cpu(i, &cpu_pmu->active_irqs);
+       }
+
+       return 0;
+}
+
+static void __devinit cpu_pmu_init(struct arm_pmu *cpu_pmu)
+{
+       int cpu;
+       for_each_possible_cpu(cpu) {
+               struct pmu_hw_events *events = &per_cpu(cpu_hw_events, cpu);
+               events->events = per_cpu(hw_events, cpu);
+               events->used_mask = per_cpu(used_mask, cpu);
+               raw_spin_lock_init(&events->pmu_lock);
+       }
+
+       cpu_pmu->get_hw_events  = cpu_pmu_get_cpu_events;
+       cpu_pmu->request_irq    = cpu_pmu_request_irq;
+       cpu_pmu->free_irq       = cpu_pmu_free_irq;
+
+       /* Ensure the PMU has sane values out of reset. */
+       if (cpu_pmu && cpu_pmu->reset)
+               on_each_cpu(cpu_pmu->reset, NULL, 1);
+}
+
+/*
+ * PMU hardware loses all context when a CPU goes offline.
+ * When a CPU is hotplugged back in, since some hardware registers are
+ * UNKNOWN at reset, the PMU must be explicitly reset to avoid reading
+ * junk values out of them.
+ */
+static int __cpuinit cpu_pmu_notify(struct notifier_block *b,
+                                   unsigned long action, void *hcpu)
+{
+       if ((action & ~CPU_TASKS_FROZEN) != CPU_STARTING)
+               return NOTIFY_DONE;
+
+       if (cpu_pmu && cpu_pmu->reset)
+               cpu_pmu->reset(NULL);
+
+       return NOTIFY_OK;
+}
+
+static struct notifier_block __cpuinitdata cpu_pmu_hotplug_notifier = {
+       .notifier_call = cpu_pmu_notify,
+};
+
+/*
+ * PMU platform driver and devicetree bindings.
+ */
+static struct of_device_id __devinitdata cpu_pmu_of_device_ids[] = {
+       {.compatible = "arm,cortex-a15-pmu",    .data = armv7_a15_pmu_init},
+       {.compatible = "arm,cortex-a9-pmu",     .data = armv7_a9_pmu_init},
+       {.compatible = "arm,cortex-a8-pmu",     .data = armv7_a8_pmu_init},
+       {.compatible = "arm,cortex-a7-pmu",     .data = armv7_a7_pmu_init},
+       {.compatible = "arm,cortex-a5-pmu",     .data = armv7_a5_pmu_init},
+       {.compatible = "arm,arm11mpcore-pmu",   .data = armv6mpcore_pmu_init},
+       {.compatible = "arm,arm1176-pmu",       .data = armv6pmu_init},
+       {.compatible = "arm,arm1136-pmu",       .data = armv6pmu_init},
+       {},
+};
+
+static struct platform_device_id __devinitdata cpu_pmu_plat_device_ids[] = {
+       {.name = "arm-pmu"},
+       {},
+};
+
+/*
+ * CPU PMU identification and probing.
+ */
+static struct arm_pmu *__devinit probe_current_pmu(void)
+{
+       struct arm_pmu *pmu = NULL;
+       int cpu = get_cpu();
+       unsigned long cpuid = read_cpuid_id();
+       unsigned long implementor = (cpuid & 0xFF000000) >> 24;
+       unsigned long part_number = (cpuid & 0xFFF0);
+
+       pr_info("probing PMU on CPU %d\n", cpu);
+
+       /* ARM Ltd CPUs. */
+       if (0x41 == implementor) {
+               switch (part_number) {
+               case 0xB360:    /* ARM1136 */
+               case 0xB560:    /* ARM1156 */
+               case 0xB760:    /* ARM1176 */
+                       pmu = armv6pmu_init();
+                       break;
+               case 0xB020:    /* ARM11mpcore */
+                       pmu = armv6mpcore_pmu_init();
+                       break;
+               case 0xC080:    /* Cortex-A8 */
+                       pmu = armv7_a8_pmu_init();
+                       break;
+               case 0xC090:    /* Cortex-A9 */
+                       pmu = armv7_a9_pmu_init();
+                       break;
+               case 0xC050:    /* Cortex-A5 */
+                       pmu = armv7_a5_pmu_init();
+                       break;
+               case 0xC0F0:    /* Cortex-A15 */
+                       pmu = armv7_a15_pmu_init();
+                       break;
+               case 0xC070:    /* Cortex-A7 */
+                       pmu = armv7_a7_pmu_init();
+                       break;
+               }
+       /* Intel CPUs [xscale]. */
+       } else if (0x69 == implementor) {
+               part_number = (cpuid >> 13) & 0x7;
+               switch (part_number) {
+               case 1:
+                       pmu = xscale1pmu_init();
+                       break;
+               case 2:
+                       pmu = xscale2pmu_init();
+                       break;
+               }
+       }
+
+       put_cpu();
+       return pmu;
+}
+
+static int __devinit cpu_pmu_device_probe(struct platform_device *pdev)
+{
+       const struct of_device_id *of_id;
+       struct arm_pmu *(*init_fn)(void);
+       struct device_node *node = pdev->dev.of_node;
+
+       if (cpu_pmu) {
+               pr_info("attempt to register multiple PMU devices!");
+               return -ENOSPC;
+       }
+
+       if (node && (of_id = of_match_node(cpu_pmu_of_device_ids, pdev->dev.of_node))) {
+               init_fn = of_id->data;
+               cpu_pmu = init_fn();
+       } else {
+               cpu_pmu = probe_current_pmu();
+       }
+
+       if (!cpu_pmu)
+               return -ENODEV;
+
+       cpu_pmu->plat_device = pdev;
+       cpu_pmu_init(cpu_pmu);
+       register_cpu_notifier(&cpu_pmu_hotplug_notifier);
+       armpmu_register(cpu_pmu, cpu_pmu->name, PERF_TYPE_RAW);
+
+       return 0;
+}
+
+static struct platform_driver cpu_pmu_driver = {
+       .driver         = {
+               .name   = "arm-pmu",
+               .pm     = &armpmu_dev_pm_ops,
+               .of_match_table = cpu_pmu_of_device_ids,
+       },
+       .probe          = cpu_pmu_device_probe,
+       .id_table       = cpu_pmu_plat_device_ids,
+};
+
+static int __init register_pmu_driver(void)
+{
+       return platform_driver_register(&cpu_pmu_driver);
+}
+device_initcall(register_pmu_driver);
index c90fcb2..6ccc079 100644 (file)
@@ -645,7 +645,7 @@ armv6mpcore_pmu_disable_event(struct hw_perf_event *hwc,
 
 static int armv6_map_event(struct perf_event *event)
 {
-       return map_cpu_event(event, &armv6_perf_map,
+       return armpmu_map_event(event, &armv6_perf_map,
                                &armv6_perf_cache_map, 0xFF);
 }
 
@@ -664,7 +664,7 @@ static struct arm_pmu armv6pmu = {
        .max_period             = (1LLU << 32) - 1,
 };
 
-static struct arm_pmu *__init armv6pmu_init(void)
+static struct arm_pmu *__devinit armv6pmu_init(void)
 {
        return &armv6pmu;
 }
@@ -679,7 +679,7 @@ static struct arm_pmu *__init armv6pmu_init(void)
 
 static int armv6mpcore_map_event(struct perf_event *event)
 {
-       return map_cpu_event(event, &armv6mpcore_perf_map,
+       return armpmu_map_event(event, &armv6mpcore_perf_map,
                                &armv6mpcore_perf_cache_map, 0xFF);
 }
 
@@ -698,17 +698,17 @@ static struct arm_pmu armv6mpcore_pmu = {
        .max_period             = (1LLU << 32) - 1,
 };
 
-static struct arm_pmu *__init armv6mpcore_pmu_init(void)
+static struct arm_pmu *__devinit armv6mpcore_pmu_init(void)
 {
        return &armv6mpcore_pmu;
 }
 #else
-static struct arm_pmu *__init armv6pmu_init(void)
+static struct arm_pmu *__devinit armv6pmu_init(void)
 {
        return NULL;
 }
 
-static struct arm_pmu *__init armv6mpcore_pmu_init(void)
+static struct arm_pmu *__devinit armv6mpcore_pmu_init(void)
 {
        return NULL;
 }
index f04070b..bd4b090 100644 (file)
@@ -1204,31 +1204,31 @@ static void armv7pmu_reset(void *info)
 
 static int armv7_a8_map_event(struct perf_event *event)
 {
-       return map_cpu_event(event, &armv7_a8_perf_map,
+       return armpmu_map_event(event, &armv7_a8_perf_map,
                                &armv7_a8_perf_cache_map, 0xFF);
 }
 
 static int armv7_a9_map_event(struct perf_event *event)
 {
-       return map_cpu_event(event, &armv7_a9_perf_map,
+       return armpmu_map_event(event, &armv7_a9_perf_map,
                                &armv7_a9_perf_cache_map, 0xFF);
 }
 
 static int armv7_a5_map_event(struct perf_event *event)
 {
-       return map_cpu_event(event, &armv7_a5_perf_map,
+       return armpmu_map_event(event, &armv7_a5_perf_map,
                                &armv7_a5_perf_cache_map, 0xFF);
 }
 
 static int armv7_a15_map_event(struct perf_event *event)
 {
-       return map_cpu_event(event, &armv7_a15_perf_map,
+       return armpmu_map_event(event, &armv7_a15_perf_map,
                                &armv7_a15_perf_cache_map, 0xFF);
 }
 
 static int armv7_a7_map_event(struct perf_event *event)
 {
-       return map_cpu_event(event, &armv7_a7_perf_map,
+       return armpmu_map_event(event, &armv7_a7_perf_map,
                                &armv7_a7_perf_cache_map, 0xFF);
 }
 
@@ -1245,7 +1245,7 @@ static struct arm_pmu armv7pmu = {
        .max_period             = (1LLU << 32) - 1,
 };
 
-static u32 __init armv7_read_num_pmnc_events(void)
+static u32 __devinit armv7_read_num_pmnc_events(void)
 {
        u32 nb_cnt;
 
@@ -1256,7 +1256,7 @@ static u32 __init armv7_read_num_pmnc_events(void)
        return nb_cnt + 1;
 }
 
-static struct arm_pmu *__init armv7_a8_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a8_pmu_init(void)
 {
        armv7pmu.name           = "ARMv7 Cortex-A8";
        armv7pmu.map_event      = armv7_a8_map_event;
@@ -1264,7 +1264,7 @@ static struct arm_pmu *__init armv7_a8_pmu_init(void)
        return &armv7pmu;
 }
 
-static struct arm_pmu *__init armv7_a9_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a9_pmu_init(void)
 {
        armv7pmu.name           = "ARMv7 Cortex-A9";
        armv7pmu.map_event      = armv7_a9_map_event;
@@ -1272,7 +1272,7 @@ static struct arm_pmu *__init armv7_a9_pmu_init(void)
        return &armv7pmu;
 }
 
-static struct arm_pmu *__init armv7_a5_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a5_pmu_init(void)
 {
        armv7pmu.name           = "ARMv7 Cortex-A5";
        armv7pmu.map_event      = armv7_a5_map_event;
@@ -1280,7 +1280,7 @@ static struct arm_pmu *__init armv7_a5_pmu_init(void)
        return &armv7pmu;
 }
 
-static struct arm_pmu *__init armv7_a15_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a15_pmu_init(void)
 {
        armv7pmu.name           = "ARMv7 Cortex-A15";
        armv7pmu.map_event      = armv7_a15_map_event;
@@ -1289,7 +1289,7 @@ static struct arm_pmu *__init armv7_a15_pmu_init(void)
        return &armv7pmu;
 }
 
-static struct arm_pmu *__init armv7_a7_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a7_pmu_init(void)
 {
        armv7pmu.name           = "ARMv7 Cortex-A7";
        armv7pmu.map_event      = armv7_a7_map_event;
@@ -1298,27 +1298,27 @@ static struct arm_pmu *__init armv7_a7_pmu_init(void)
        return &armv7pmu;
 }
 #else
-static struct arm_pmu *__init armv7_a8_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a8_pmu_init(void)
 {
        return NULL;
 }
 
-static struct arm_pmu *__init armv7_a9_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a9_pmu_init(void)
 {
        return NULL;
 }
 
-static struct arm_pmu *__init armv7_a5_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a5_pmu_init(void)
 {
        return NULL;
 }
 
-static struct arm_pmu *__init armv7_a15_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a15_pmu_init(void)
 {
        return NULL;
 }
 
-static struct arm_pmu *__init armv7_a7_pmu_init(void)
+static struct arm_pmu *__devinit armv7_a7_pmu_init(void)
 {
        return NULL;
 }
index f759fe0..426e19f 100644 (file)
@@ -430,7 +430,7 @@ xscale1pmu_write_counter(int counter, u32 val)
 
 static int xscale_map_event(struct perf_event *event)
 {
-       return map_cpu_event(event, &xscale_perf_map,
+       return armpmu_map_event(event, &xscale_perf_map,
                                &xscale_perf_cache_map, 0xFF);
 }
 
@@ -449,7 +449,7 @@ static struct arm_pmu xscale1pmu = {
        .max_period     = (1LLU << 32) - 1,
 };
 
-static struct arm_pmu *__init xscale1pmu_init(void)
+static struct arm_pmu *__devinit xscale1pmu_init(void)
 {
        return &xscale1pmu;
 }
@@ -816,17 +816,17 @@ static struct arm_pmu xscale2pmu = {
        .max_period     = (1LLU << 32) - 1,
 };
 
-static struct arm_pmu *__init xscale2pmu_init(void)
+static struct arm_pmu *__devinit xscale2pmu_init(void)
 {
        return &xscale2pmu;
 }
 #else
-static struct arm_pmu *__init xscale1pmu_init(void)
+static struct arm_pmu *__devinit xscale1pmu_init(void)
 {
        return NULL;
 }
 
-static struct arm_pmu *__init xscale2pmu_init(void)
+static struct arm_pmu *__devinit xscale2pmu_init(void)
 {
        return NULL;
 }
diff --git a/arch/arm/kernel/pmu.c b/arch/arm/kernel/pmu.c
deleted file mode 100644 (file)
index 2334bf8..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  linux/arch/arm/kernel/pmu.c
- *
- *  Copyright (C) 2009 picoChip Designs Ltd, Jamie Iles
- *  Copyright (C) 2010 ARM Ltd, Will Deacon
- *
- * 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/err.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-
-#include <asm/pmu.h>
-
-/*
- * PMU locking to ensure mutual exclusion between different subsystems.
- */
-static unsigned long pmu_lock[BITS_TO_LONGS(ARM_NUM_PMU_DEVICES)];
-
-int
-reserve_pmu(enum arm_pmu_type type)
-{
-       return test_and_set_bit_lock(type, pmu_lock) ? -EBUSY : 0;
-}
-EXPORT_SYMBOL_GPL(reserve_pmu);
-
-void
-release_pmu(enum arm_pmu_type type)
-{
-       clear_bit_unlock(type, pmu_lock);
-}
-EXPORT_SYMBOL_GPL(release_pmu);
index f794521..b0179b8 100644 (file)
@@ -420,20 +420,23 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
 #endif
                        instr = *(u32 *) pc;
        } else if (thumb_mode(regs)) {
-               get_user(instr, (u16 __user *)pc);
+               if (get_user(instr, (u16 __user *)pc))
+                       goto die_sig;
                if (is_wide_instruction(instr)) {
                        unsigned int instr2;
-                       get_user(instr2, (u16 __user *)pc+1);
+                       if (get_user(instr2, (u16 __user *)pc+1))
+                               goto die_sig;
                        instr <<= 16;
                        instr |= instr2;
                }
-       } else {
-               get_user(instr, (u32 __user *)pc);
+       } else if (get_user(instr, (u32 __user *)pc)) {
+               goto die_sig;
        }
 
        if (call_undef_hook(regs, instr) == 0)
                return;
 
+die_sig:
 #ifdef CONFIG_DEBUG_USER
        if (user_debug & UDBG_UNDEFINED) {
                printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n",
index d6dacc6..395d5fb 100644 (file)
@@ -59,6 +59,7 @@ void __init init_current_timer_delay(unsigned long freq)
 {
        pr_info("Switching to timer-based delay loop\n");
        lpj_fine                        = freq / HZ;
+       loops_per_jiffy                 = lpj_fine;
        arm_delay_ops.delay             = __timer_delay;
        arm_delay_ops.const_udelay      = __timer_const_udelay;
        arm_delay_ops.udelay            = __timer_udelay;
index 11093a7..9b06bb4 100644 (file)
@@ -16,8 +16,9 @@
  * __get_user_X
  *
  * Inputs:     r0 contains the address
+ *             r1 contains the address limit, which must be preserved
  * Outputs:    r0 is the error code
- *             r2, r3 contains the zero-extended value
+ *             r2 contains the zero-extended value
  *             lr corrupted
  *
  * No other registers must be altered.  (see <asm/uaccess.h>
  * Note also that it is intended that __get_user_bad is not global.
  */
 #include <linux/linkage.h>
+#include <asm/assembler.h>
 #include <asm/errno.h>
 #include <asm/domain.h>
 
 ENTRY(__get_user_1)
+       check_uaccess r0, 1, r1, r2, __get_user_bad
 1: TUSER(ldrb) r2, [r0]
        mov     r0, #0
        mov     pc, lr
 ENDPROC(__get_user_1)
 
 ENTRY(__get_user_2)
-#ifdef CONFIG_THUMB2_KERNEL
-2: TUSER(ldrb) r2, [r0]
-3: TUSER(ldrb) r3, [r0, #1]
+       check_uaccess r0, 2, r1, r2, __get_user_bad
+#ifdef CONFIG_CPU_USE_DOMAINS
+rb     .req    ip
+2:     ldrbt   r2, [r0], #1
+3:     ldrbt   rb, [r0], #0
 #else
-2: TUSER(ldrb) r2, [r0], #1
-3: TUSER(ldrb) r3, [r0]
+rb     .req    r0
+2:     ldrb    r2, [r0]
+3:     ldrb    rb, [r0, #1]
 #endif
 #ifndef __ARMEB__
-       orr     r2, r2, r3, lsl #8
+       orr     r2, r2, rb, lsl #8
 #else
-       orr     r2, r3, r2, lsl #8
+       orr     r2, rb, r2, lsl #8
 #endif
        mov     r0, #0
        mov     pc, lr
 ENDPROC(__get_user_2)
 
 ENTRY(__get_user_4)
+       check_uaccess r0, 4, r1, r2, __get_user_bad
 4: TUSER(ldr)  r2, [r0]
        mov     r0, #0
        mov     pc, lr
index 7db2599..3d73dcb 100644 (file)
@@ -16,6 +16,7 @@
  * __put_user_X
  *
  * Inputs:     r0 contains the address
+ *             r1 contains the address limit, which must be preserved
  *             r2, r3 contains the value
  * Outputs:    r0 is the error code
  *             lr corrupted
  * Note also that it is intended that __put_user_bad is not global.
  */
 #include <linux/linkage.h>
+#include <asm/assembler.h>
 #include <asm/errno.h>
 #include <asm/domain.h>
 
 ENTRY(__put_user_1)
+       check_uaccess r0, 1, r1, ip, __put_user_bad
 1: TUSER(strb) r2, [r0]
        mov     r0, #0
        mov     pc, lr
 ENDPROC(__put_user_1)
 
 ENTRY(__put_user_2)
+       check_uaccess r0, 2, r1, ip, __put_user_bad
        mov     ip, r2, lsr #8
 #ifdef CONFIG_THUMB2_KERNEL
 #ifndef __ARMEB__
@@ -60,12 +64,14 @@ ENTRY(__put_user_2)
 ENDPROC(__put_user_2)
 
 ENTRY(__put_user_4)
+       check_uaccess r0, 4, r1, ip, __put_user_bad
 4: TUSER(str)  r2, [r0]
        mov     r0, #0
        mov     pc, lr
 ENDPROC(__put_user_4)
 
 ENTRY(__put_user_8)
+       check_uaccess r0, 8, r1, ip, __put_user_bad
 #ifdef CONFIG_THUMB2_KERNEL
 5: TUSER(str)  r2, [r0]
 6: TUSER(str)  r3, [r0, #4]
index 104ca40..aaa443b 100644 (file)
@@ -197,7 +197,7 @@ void __init at91rm9200_timer_init(void)
        at91_st_read(AT91_ST_SR);
 
        /* Make IRQs happen for the system timer */
-       setup_irq(AT91_ID_SYS, &at91rm9200_timer_irq);
+       setup_irq(NR_IRQS_LEGACY + AT91_ID_SYS, &at91rm9200_timer_irq);
 
        /* The 32KiHz "Slow Clock" (tick every 30517.58 nanoseconds) is used
         * directly for the clocksource and all clockevents, after adjusting
index 7b9c2ba..bce572a 100644 (file)
@@ -726,6 +726,8 @@ static struct resource rtt_resources[] = {
                .flags  = IORESOURCE_MEM,
        }, {
                .flags  = IORESOURCE_MEM,
+       }, {
+               .flags  = IORESOURCE_IRQ,
        },
 };
 
@@ -744,10 +746,12 @@ static void __init at91_add_device_rtt_rtc(void)
         * The second resource is needed:
         * GPBR will serve as the storage for RTC time offset
         */
-       at91sam9260_rtt_device.num_resources = 2;
+       at91sam9260_rtt_device.num_resources = 3;
        rtt_resources[1].start = AT91SAM9260_BASE_GPBR +
                                 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR;
        rtt_resources[1].end = rtt_resources[1].start + 3;
+       rtt_resources[2].start = NR_IRQS_LEGACY + AT91_ID_SYS;
+       rtt_resources[2].end = NR_IRQS_LEGACY + AT91_ID_SYS;
 }
 #else
 static void __init at91_add_device_rtt_rtc(void)
index 8df5c1b..bc2590d 100644 (file)
@@ -609,6 +609,8 @@ static struct resource rtt_resources[] = {
                .flags  = IORESOURCE_MEM,
        }, {
                .flags  = IORESOURCE_MEM,
+       }, {
+               .flags  = IORESOURCE_IRQ,
        }
 };
 
@@ -626,10 +628,12 @@ static void __init at91_add_device_rtt_rtc(void)
         * The second resource is needed:
         * GPBR will serve as the storage for RTC time offset
         */
-       at91sam9261_rtt_device.num_resources = 2;
+       at91sam9261_rtt_device.num_resources = 3;
        rtt_resources[1].start = AT91SAM9261_BASE_GPBR +
                                 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR;
        rtt_resources[1].end = rtt_resources[1].start + 3;
+       rtt_resources[2].start = NR_IRQS_LEGACY + AT91_ID_SYS;
+       rtt_resources[2].end = NR_IRQS_LEGACY + AT91_ID_SYS;
 }
 #else
 static void __init at91_add_device_rtt_rtc(void)
index eb6bbf8..9b6ca73 100644 (file)
@@ -990,6 +990,8 @@ static struct resource rtt0_resources[] = {
                .flags  = IORESOURCE_MEM,
        }, {
                .flags  = IORESOURCE_MEM,
+       }, {
+               .flags  = IORESOURCE_IRQ,
        }
 };
 
@@ -1006,6 +1008,8 @@ static struct resource rtt1_resources[] = {
                .flags  = IORESOURCE_MEM,
        }, {
                .flags  = IORESOURCE_MEM,
+       }, {
+               .flags  = IORESOURCE_IRQ,
        }
 };
 
@@ -1027,14 +1031,14 @@ static void __init at91_add_device_rtt_rtc(void)
                 * The second resource is needed only for the chosen RTT:
                 * GPBR will serve as the storage for RTC time offset
                 */
-               at91sam9263_rtt0_device.num_resources = 2;
+               at91sam9263_rtt0_device.num_resources = 3;
                at91sam9263_rtt1_device.num_resources = 1;
                pdev = &at91sam9263_rtt0_device;
                r = rtt0_resources;
                break;
        case 1:
                at91sam9263_rtt0_device.num_resources = 1;
-               at91sam9263_rtt1_device.num_resources = 2;
+               at91sam9263_rtt1_device.num_resources = 3;
                pdev = &at91sam9263_rtt1_device;
                r = rtt1_resources;
                break;
@@ -1047,6 +1051,8 @@ static void __init at91_add_device_rtt_rtc(void)
        pdev->name = "rtc-at91sam9";
        r[1].start = AT91SAM9263_BASE_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR;
        r[1].end = r[1].start + 3;
+       r[2].start = NR_IRQS_LEGACY + AT91_ID_SYS;
+       r[2].end = NR_IRQS_LEGACY + AT91_ID_SYS;
 }
 #else
 static void __init at91_add_device_rtt_rtc(void)
index 0607399..1b47319 100644 (file)
@@ -1293,6 +1293,8 @@ static struct resource rtt_resources[] = {
                .flags  = IORESOURCE_MEM,
        }, {
                .flags  = IORESOURCE_MEM,
+       }, {
+               .flags  = IORESOURCE_IRQ,
        }
 };
 
@@ -1310,10 +1312,12 @@ static void __init at91_add_device_rtt_rtc(void)
         * The second resource is needed:
         * GPBR will serve as the storage for RTC time offset
         */
-       at91sam9g45_rtt_device.num_resources = 2;
+       at91sam9g45_rtt_device.num_resources = 3;
        rtt_resources[1].start = AT91SAM9G45_BASE_GPBR +
                                 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR;
        rtt_resources[1].end = rtt_resources[1].start + 3;
+       rtt_resources[2].start = NR_IRQS_LEGACY + AT91_ID_SYS;
+       rtt_resources[2].end = NR_IRQS_LEGACY + AT91_ID_SYS;
 }
 #else
 static void __init at91_add_device_rtt_rtc(void)
index f09fff9..b3d365d 100644 (file)
@@ -688,6 +688,8 @@ static struct resource rtt_resources[] = {
                .flags  = IORESOURCE_MEM,
        }, {
                .flags  = IORESOURCE_MEM,
+       }, {
+               .flags  = IORESOURCE_IRQ,
        }
 };
 
@@ -705,10 +707,12 @@ static void __init at91_add_device_rtt_rtc(void)
         * The second resource is needed:
         * GPBR will serve as the storage for RTC time offset
         */
-       at91sam9rl_rtt_device.num_resources = 2;
+       at91sam9rl_rtt_device.num_resources = 3;
        rtt_resources[1].start = AT91SAM9RL_BASE_GPBR +
                                 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR;
        rtt_resources[1].end = rtt_resources[1].start + 3;
+       rtt_resources[2].start = NR_IRQS_LEGACY + AT91_ID_SYS;
+       rtt_resources[2].end = NR_IRQS_LEGACY + AT91_ID_SYS;
 }
 #else
 static void __init at91_add_device_rtt_rtc(void)
index de2ec6b..188c829 100644 (file)
@@ -63,6 +63,12 @@ EXPORT_SYMBOL_GPL(at91_pmc_base);
 
 #define cpu_has_300M_plla()    (cpu_is_at91sam9g10())
 
+#define cpu_has_240M_plla()    (cpu_is_at91sam9261() \
+                               || cpu_is_at91sam9263() \
+                               || cpu_is_at91sam9rl())
+
+#define cpu_has_210M_plla()    (cpu_is_at91sam9260())
+
 #define cpu_has_pllb()         (!(cpu_is_at91sam9rl() \
                                || cpu_is_at91sam9g45() \
                                || cpu_is_at91sam9x5() \
@@ -706,6 +712,12 @@ static int __init at91_pmc_init(unsigned long main_clock)
        } else if (cpu_has_800M_plla()) {
                if (plla.rate_hz > 800000000)
                        pll_overclock = true;
+       } else if (cpu_has_240M_plla()) {
+               if (plla.rate_hz > 240000000)
+                       pll_overclock = true;
+       } else if (cpu_has_210M_plla()) {
+               if (plla.rate_hz > 210000000)
+                       pll_overclock = true;
        } else {
                if (plla.rate_hz > 209000000)
                        pll_overclock = true;
diff --git a/arch/arm/mach-bcm2835/Makefile b/arch/arm/mach-bcm2835/Makefile
new file mode 100644 (file)
index 0000000..4c3892f
--- /dev/null
@@ -0,0 +1 @@
+obj-y += bcm2835.o
diff --git a/arch/arm/mach-bcm2835/Makefile.boot b/arch/arm/mach-bcm2835/Makefile.boot
new file mode 100644 (file)
index 0000000..0831fd1
--- /dev/null
@@ -0,0 +1,5 @@
+   zreladdr-y := 0x00008000
+params_phys-y := 0x00000100
+initrd_phys-y := 0x00800000
+
+dtb-y += bcm2835-rpi-b.dtb
diff --git a/arch/arm/mach-bcm2835/bcm2835.c b/arch/arm/mach-bcm2835/bcm2835.c
new file mode 100644 (file)
index 0000000..f6fea49
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2010 Broadcom
+ *
+ * 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 <linux/irqchip/bcm2835.h>
+#include <linux/of_platform.h>
+#include <linux/bcm2835_timer.h>
+#include <linux/clk/bcm2835.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+
+#include <mach/bcm2835_soc.h>
+
+static struct map_desc io_map __initdata = {
+       .virtual = BCM2835_PERIPH_VIRT,
+       .pfn = __phys_to_pfn(BCM2835_PERIPH_PHYS),
+       .length = BCM2835_PERIPH_SIZE,
+       .type = MT_DEVICE
+};
+
+void __init bcm2835_map_io(void)
+{
+       iotable_init(&io_map, 1);
+}
+
+void __init bcm2835_init(void)
+{
+       int ret;
+
+       bcm2835_init_clocks();
+
+       ret = of_platform_populate(NULL, of_default_bus_match_table, NULL,
+                                  NULL);
+       if (ret) {
+               pr_err("of_platform_populate failed: %d\n", ret);
+               BUG();
+       }
+}
+
+static const char * const bcm2835_compat[] = {
+       "brcm,bcm2835",
+       NULL
+};
+
+DT_MACHINE_START(BCM2835, "BCM2835")
+       .map_io = bcm2835_map_io,
+       .init_irq = bcm2835_init_irq,
+       .handle_irq = bcm2835_handle_irq,
+       .init_machine = bcm2835_init,
+       .timer = &bcm2835_timer,
+       .dt_compat = bcm2835_compat
+MACHINE_END
diff --git a/arch/arm/mach-bcm2835/include/mach/bcm2835_soc.h b/arch/arm/mach-bcm2835/include/mach/bcm2835_soc.h
new file mode 100644 (file)
index 0000000..d4dfcf7
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2012 Stephen Warren
+ *
+ * Derived from code:
+ * Copyright (C) 2010 Broadcom
+ *
+ * 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 __MACH_BCM2835_BCM2835_SOC_H__
+#define __MACH_BCM2835_BCM2835_SOC_H__
+
+#include <asm/sizes.h>
+
+#define BCM2835_PERIPH_PHYS    0x20000000
+#define BCM2835_PERIPH_VIRT    0xf0000000
+#define BCM2835_PERIPH_SIZE    SZ_16M
+#define BCM2835_DEBUG_PHYS     0x20201000
+#define BCM2835_DEBUG_VIRT     0xf0201000
+
+#endif
diff --git a/arch/arm/mach-bcm2835/include/mach/debug-macro.S b/arch/arm/mach-bcm2835/include/mach/debug-macro.S
new file mode 100644 (file)
index 0000000..8a161e4
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Debugging macro include header
+ *
+ * Copyright (C) 2010 Broadcom
+ * 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/bcm2835_soc.h>
+
+       .macro  addruart, rp, rv, tmp
+       ldr     \rp, =BCM2835_DEBUG_PHYS
+       ldr     \rv, =BCM2835_DEBUG_VIRT
+       .endm
+
+#include <asm/hardware/debug-pl01x.S>
similarity index 78%
rename from arch/arm/mach-versatile/include/mach/io.h
rename to arch/arm/mach-bcm2835/include/mach/timex.h
index 0406513..6d021e1 100644 (file)
@@ -1,7 +1,7 @@
 /*
- *  arch/arm/mach-versatile/include/mach/io.h
+ *  BCM2835 system clock frequency
  *
- *  Copyright (C) 2003 ARM Limited
+ *  Copyright (C) 2010 Broadcom
  *
  * 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
  * 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_ARM_ARCH_IO_H
-#define __ASM_ARM_ARCH_IO_H
 
-#define PCIO_BASE      0xeb000000ul
+#ifndef __ASM_ARCH_TIMEX_H
+#define __ASM_ARCH_TIMEX_H
 
-#define __io(a)                ((a) + PCIO_BASE)
+#define CLOCK_TICK_RATE                (1000000)
 
 #endif
diff --git a/arch/arm/mach-bcm2835/include/mach/uncompress.h b/arch/arm/mach-bcm2835/include/mach/uncompress.h
new file mode 100644 (file)
index 0000000..cc46dcc
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2010 Broadcom
+ * Copyright (C) 2003 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.
+ */
+
+#include <linux/io.h>
+#include <linux/amba/serial.h>
+#include <mach/bcm2835_soc.h>
+
+#define UART0_BASE BCM2835_DEBUG_PHYS
+
+#define BCM2835_UART_DR IOMEM(UART0_BASE + UART01x_DR)
+#define BCM2835_UART_FR IOMEM(UART0_BASE + UART01x_FR)
+#define BCM2835_UART_CR IOMEM(UART0_BASE + UART011_CR)
+
+static inline void putc(int c)
+{
+       while (__raw_readl(BCM2835_UART_FR) & UART01x_FR_TXFF)
+               barrier();
+
+       __raw_writel(c, BCM2835_UART_DR);
+}
+
+static inline void flush(void)
+{
+       int fr;
+
+       do {
+               fr = __raw_readl(BCM2835_UART_FR);
+               barrier();
+       } while ((fr & (UART011_FR_TXFE | UART01x_FR_BUSY)) != UART011_FR_TXFE);
+}
+
+#define arch_decomp_setup()
+#define arch_decomp_wdog()
index 45c97b1..c18a504 100644 (file)
@@ -29,7 +29,6 @@
 #include <asm/setup.h>
 #include <asm/mach-types.h>
 #include <asm/mach/time.h>
-#include <asm/pmu.h>
 
 #include <asm/mach/arch.h>
 #include <mach/dma.h>
@@ -38,7 +37,7 @@
 #include <mach/csp/chipcHw_def.h>
 #include <mach/csp/chipcHw_inline.h>
 
-#include <cfg_global.h>
+#include <mach/cfg_global.h>
 
 #include "core.h"
 
@@ -116,7 +115,7 @@ static struct resource pmu_resource = {
 
 static struct platform_device pmu_device = {
        .name           = "arm-pmu",
-       .id             = ARM_PMU_DEVICE_CPU,
+       .id             = -1,
        .resource       = &pmu_resource,
        .num_resources  = 1,
 };
index adbfb19..4b50228 100644 (file)
 #include <asm/mach/time.h>
 #include <asm/mach/map.h>
 
-#include <cfg_global.h>
+#include <mach/cfg_global.h>
 
 #include "clock.h"
 
-#include <csp/secHw.h>
 #include <mach/csp/secHw_def.h>
 #include <mach/csp/chipcHw_inline.h>
 #include <mach/csp/tmrHw_reg.h>
index 96273ff..5050833 100644 (file)
 
 /* ---- Include Files ---------------------------------------------------- */
 
-#include <csp/errno.h>
-#include <csp/stdint.h>
-#include <csp/module.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/export.h>
 
 #include <mach/csp/chipcHw_def.h>
 #include <mach/csp/chipcHw_inline.h>
 
-#include <csp/reg.h>
-#include <csp/delay.h>
+#include <mach/csp/reg.h>
+#include <linux/delay.h>
 
 /* ---- Private Constants and Types --------------------------------------- */
 
@@ -61,21 +61,21 @@ static int chipcHw_divide(int num, int denom)
 /****************************************************************************/
 chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock   /*  [ IN ] Configurable clock */
     ) {
-       volatile uint32_t *pPLLReg = (uint32_t *) 0x0;
-       volatile uint32_t *pClockCtrl = (uint32_t *) 0x0;
-       volatile uint32_t *pDependentClock = (uint32_t *) 0x0;
+       uint32_t __iomem *pPLLReg = NULL;
+       uint32_t __iomem *pClockCtrl = NULL;
+       uint32_t __iomem *pDependentClock = NULL;
        uint32_t vcoFreqPll1Hz = 0;     /* Effective VCO frequency for PLL1 in Hz */
        uint32_t vcoFreqPll2Hz = 0;     /* Effective VCO frequency for PLL2 in Hz */
        uint32_t dependentClockType = 0;
        uint32_t vcoHz = 0;
 
        /* Get VCO frequencies */
-       if ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) {
+       if ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) {
                uint64_t adjustFreq = 0;
 
                vcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
                    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
-                   ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                   ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
                     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
 
                /* Adjusted frequency due to chipcHw_REG_PLL_DIVIDER_NDIV_f_SS */
@@ -86,13 +86,13 @@ chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock        /*  [ IN ] Configur
        } else {
                vcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
                    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
-                   ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                   ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
                     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
        }
        vcoFreqPll2Hz =
            chipcHw_XTAL_FREQ_Hz *
                 chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
-           ((pChipcHw->PLLPreDivider2 & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+           ((readl(&pChipcHw->PLLPreDivider2) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
             chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
 
        switch (clock) {
@@ -187,51 +187,51 @@ chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock      /*  [ IN ] Configur
 
        if (pPLLReg) {
                /* Obtain PLL clock frequency */
-               if (*pPLLReg & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) {
+               if (readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) {
                        /* Return crystal clock frequency when bypassed */
                        return chipcHw_XTAL_FREQ_Hz;
                } else if (clock == chipcHw_CLOCK_DDR) {
                        /* DDR frequency is configured in PLLDivider register */
-                       return chipcHw_divide (vcoHz, (((pChipcHw->PLLDivider & 0xFF000000) >> 24) ? ((pChipcHw->PLLDivider & 0xFF000000) >> 24) : 256));
+                       return chipcHw_divide (vcoHz, (((readl(&pChipcHw->PLLDivider) & 0xFF000000) >> 24) ? ((readl(&pChipcHw->PLLDivider) & 0xFF000000) >> 24) : 256));
                } else {
                        /* From chip revision number B0, LCD clock is internally divided by 2 */
                        if ((pPLLReg == &pChipcHw->LCDClock) && (chipcHw_getChipRevisionNumber() != chipcHw_REV_NUMBER_A0)) {
                                vcoHz >>= 1;
                        }
                        /* Obtain PLL clock frequency using VCO dividers */
-                       return chipcHw_divide(vcoHz, ((*pPLLReg & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ? (*pPLLReg & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256));
+                       return chipcHw_divide(vcoHz, ((readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ?  (readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256));
                }
        } else if (pClockCtrl) {
                /* Obtain divider clock frequency */
                uint32_t div;
                uint32_t freq = 0;
 
-               if (*pClockCtrl & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) {
+               if (readl(pClockCtrl) & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) {
                        /* Return crystal clock frequency when bypassed */
                        return chipcHw_XTAL_FREQ_Hz;
                } else if (pDependentClock) {
                        /* Identify the dependent clock frequency */
                        switch (dependentClockType) {
                        case PLL_CLOCK:
-                               if (*pDependentClock & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) {
+                               if (readl(pDependentClock) & chipcHw_REG_PLL_CLOCK_BYPASS_SELECT) {
                                        /* Use crystal clock frequency when dependent PLL clock is bypassed */
                                        freq = chipcHw_XTAL_FREQ_Hz;
                                } else {
                                        /* Obtain PLL clock frequency using VCO dividers */
-                                       div = *pDependentClock & chipcHw_REG_PLL_CLOCK_MDIV_MASK;
+                                       div = readl(pDependentClock) & chipcHw_REG_PLL_CLOCK_MDIV_MASK;
                                        freq = div ? chipcHw_divide(vcoHz, div) : 0;
                                }
                                break;
                        case NON_PLL_CLOCK:
-                               if (pDependentClock == (uint32_t *) &pChipcHw->ACLKClock) {
+                               if (pDependentClock == &pChipcHw->ACLKClock) {
                                        freq = chipcHw_getClockFrequency (chipcHw_CLOCK_BUS);
                                } else {
-                                       if (*pDependentClock & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) {
+                                       if (readl(pDependentClock) & chipcHw_REG_DIV_CLOCK_BYPASS_SELECT) {
                                                /* Use crystal clock frequency when dependent divider clock is bypassed */
                                                freq = chipcHw_XTAL_FREQ_Hz;
                                        } else {
                                                /* Obtain divider clock frequency using XTAL dividers */
-                                               div = *pDependentClock & chipcHw_REG_DIV_CLOCK_DIV_MASK;
+                                               div = readl(pDependentClock) & chipcHw_REG_DIV_CLOCK_DIV_MASK;
                                                freq = chipcHw_divide (chipcHw_XTAL_FREQ_Hz, (div ? div : 256));
                                        }
                                }
@@ -242,7 +242,7 @@ chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock        /*  [ IN ] Configur
                        freq = chipcHw_XTAL_FREQ_Hz;
                }
 
-               div = *pClockCtrl & chipcHw_REG_DIV_CLOCK_DIV_MASK;
+               div = readl(pClockCtrl) & chipcHw_REG_DIV_CLOCK_DIV_MASK;
                return chipcHw_divide(freq, (div ? div : 256));
        }
        return 0;
@@ -261,9 +261,9 @@ chipcHw_freq chipcHw_getClockFrequency(chipcHw_CLOCK_e clock        /*  [ IN ] Configur
 chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,  /*  [ IN ] Configurable clock */
                                       uint32_t freq    /*  [ IN ] Clock frequency in Hz */
     ) {
-       volatile uint32_t *pPLLReg = (uint32_t *) 0x0;
-       volatile uint32_t *pClockCtrl = (uint32_t *) 0x0;
-       volatile uint32_t *pDependentClock = (uint32_t *) 0x0;
+       uint32_t __iomem *pPLLReg = NULL;
+       uint32_t __iomem *pClockCtrl = NULL;
+       uint32_t __iomem *pDependentClock = NULL;
        uint32_t vcoFreqPll1Hz = 0;     /* Effective VCO frequency for PLL1 in Hz */
        uint32_t desVcoFreqPll1Hz = 0;  /* Desired VCO frequency for PLL1 in Hz */
        uint32_t vcoFreqPll2Hz = 0;     /* Effective VCO frequency for PLL2 in Hz */
@@ -272,12 +272,12 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,     /*  [ IN ] Configu
        uint32_t desVcoHz = 0;
 
        /* Get VCO frequencies */
-       if ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) {
+       if ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) != chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) {
                uint64_t adjustFreq = 0;
 
                vcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
                    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
-                   ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                   ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
                     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
 
                /* Adjusted frequency due to chipcHw_REG_PLL_DIVIDER_NDIV_f_SS */
@@ -289,16 +289,16 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,     /*  [ IN ] Configu
                /* Desired VCO frequency */
                desVcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
                    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
-                   (((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                   (((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
                      chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT) + 1);
        } else {
                vcoFreqPll1Hz = desVcoFreqPll1Hz = chipcHw_XTAL_FREQ_Hz *
                    chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
-                   ((pChipcHw->PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+                   ((readl(&pChipcHw->PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
                     chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
        }
        vcoFreqPll2Hz = chipcHw_XTAL_FREQ_Hz * chipcHw_divide(chipcHw_REG_PLL_PREDIVIDER_P1, chipcHw_REG_PLL_PREDIVIDER_P2) *
-           ((pChipcHw->PLLPreDivider2 & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
+           ((readl(&pChipcHw->PLLPreDivider2) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MASK) >>
             chipcHw_REG_PLL_PREDIVIDER_NDIV_SHIFT);
 
        switch (clock) {
@@ -307,8 +307,7 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,       /*  [ IN ] Configu
                {
                        REG_LOCAL_IRQ_SAVE;
                        /* Dvide DDR_phy by two to obtain DDR_ctrl clock */
-                       pChipcHw->DDRClock = (pChipcHw->DDRClock & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((((freq / 2) / chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1)
-                               << chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT);
+                       writel((readl(&pChipcHw->DDRClock) & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((((freq / 2) / chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1) << chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT), &pChipcHw->DDRClock);
                        REG_LOCAL_IRQ_RESTORE;
                }
                pPLLReg = &pChipcHw->DDRClock;
@@ -329,8 +328,7 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,       /*  [ IN ] Configu
                /* Configure the VPM:BUS ratio settings */
                {
                        REG_LOCAL_IRQ_SAVE;
-                       pChipcHw->VPMClock = (pChipcHw->VPMClock & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((chipcHw_divide (freq, chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1)
-                               << chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT);
+                       writel((readl(&pChipcHw->VPMClock) & ~chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_MASK) | ((chipcHw_divide (freq, chipcHw_getClockFrequency(chipcHw_CLOCK_BUS)) - 1) << chipcHw_REG_PLL_CLOCK_TO_BUS_RATIO_SHIFT), &pChipcHw->VPMClock);
                        REG_LOCAL_IRQ_RESTORE;
                }
                pPLLReg = &pChipcHw->VPMClock;
@@ -428,9 +426,9 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,       /*  [ IN ] Configu
                /* For DDR settings use only the PLL divider clock */
                if (pPLLReg == &pChipcHw->DDRClock) {
                        /* Set M1DIV for PLL1, which controls the DDR clock */
-                       reg32_write(&pChipcHw->PLLDivider, (pChipcHw->PLLDivider & 0x00FFFFFF) | ((chipcHw_REG_PLL_DIVIDER_MDIV (desVcoHz, freq)) << 24));
+                       reg32_write(&pChipcHw->PLLDivider, (readl(&pChipcHw->PLLDivider) & 0x00FFFFFF) | ((chipcHw_REG_PLL_DIVIDER_MDIV (desVcoHz, freq)) << 24));
                        /* Calculate expected frequency */
-                       freq = chipcHw_divide(vcoHz, (((pChipcHw->PLLDivider & 0xFF000000) >> 24) ? ((pChipcHw->PLLDivider & 0xFF000000) >> 24) : 256));
+                       freq = chipcHw_divide(vcoHz, (((readl(&pChipcHw->PLLDivider) & 0xFF000000) >> 24) ? ((readl(&pChipcHw->PLLDivider) & 0xFF000000) >> 24) : 256));
                } else {
                        /* From chip revision number B0, LCD clock is internally divided by 2 */
                        if ((pPLLReg == &pChipcHw->LCDClock) && (chipcHw_getChipRevisionNumber() != chipcHw_REV_NUMBER_A0)) {
@@ -441,7 +439,7 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,       /*  [ IN ] Configu
                        reg32_modify_and(pPLLReg, ~(chipcHw_REG_PLL_CLOCK_MDIV_MASK));
                        reg32_modify_or(pPLLReg, chipcHw_REG_PLL_DIVIDER_MDIV(desVcoHz, freq));
                        /* Calculate expected frequency */
-                       freq = chipcHw_divide(vcoHz, ((*(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ? (*(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256));
+                       freq = chipcHw_divide(vcoHz, ((readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) ? (readl(pPLLReg) & chipcHw_REG_PLL_CLOCK_MDIV_MASK) : 256));
                }
                /* Wait for for atleast 200ns as per the protocol to change frequency */
                udelay(1);
@@ -460,16 +458,16 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,     /*  [ IN ] Configu
                if (pDependentClock) {
                        switch (dependentClockType) {
                        case PLL_CLOCK:
-                               divider = chipcHw_divide(chipcHw_divide (desVcoHz, (*pDependentClock & chipcHw_REG_PLL_CLOCK_MDIV_MASK)), freq);
+                               divider = chipcHw_divide(chipcHw_divide (desVcoHz, (readl(pDependentClock) & chipcHw_REG_PLL_CLOCK_MDIV_MASK)), freq);
                                break;
                        case NON_PLL_CLOCK:
                                {
                                        uint32_t sourceClock = 0;
 
-                                       if (pDependentClock == (uint32_t *) &pChipcHw->ACLKClock) {
+                                       if (pDependentClock == &pChipcHw->ACLKClock) {
                                                sourceClock = chipcHw_getClockFrequency (chipcHw_CLOCK_BUS);
                                        } else {
-                                               uint32_t div = *pDependentClock & chipcHw_REG_DIV_CLOCK_DIV_MASK;
+                                               uint32_t div = readl(pDependentClock) & chipcHw_REG_DIV_CLOCK_DIV_MASK;
                                                sourceClock = chipcHw_divide (chipcHw_XTAL_FREQ_Hz, ((div) ? div : 256));
                                        }
                                        divider = chipcHw_divide(sourceClock, freq);
@@ -483,7 +481,7 @@ chipcHw_freq chipcHw_setClockFrequency(chipcHw_CLOCK_e clock,       /*  [ IN ] Configu
                if (divider) {
                        REG_LOCAL_IRQ_SAVE;
                        /* Set the divider to obtain the required frequency */
-                       *pClockCtrl = (*pClockCtrl & (~chipcHw_REG_DIV_CLOCK_DIV_MASK)) | (((divider > 256) ? chipcHw_REG_DIV_CLOCK_DIV_256 : divider) & chipcHw_REG_DIV_CLOCK_DIV_MASK);
+                       writel((readl(pClockCtrl) & (~chipcHw_REG_DIV_CLOCK_DIV_MASK)) | (((divider > 256) ? chipcHw_REG_DIV_CLOCK_DIV_256 : divider) & chipcHw_REG_DIV_CLOCK_DIV_MASK), pClockCtrl);
                        REG_LOCAL_IRQ_RESTORE;
                        return freq;
                }
@@ -515,25 +513,26 @@ static int vpmPhaseAlignA0(void)
        int count = 0;
 
        for (iter = 0; (iter < MAX_PHASE_ALIGN_ATTEMPTS) && (adjustCount < MAX_PHASE_ADJUST_COUNT); iter++) {
-               phaseControl = (pChipcHw->VPMClock & chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT;
+               phaseControl = (readl(&pChipcHw->VPMClock) & chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT;
                phaseValue = 0;
                prevPhaseComp = 0;
 
                /* Step 1: Look for falling PH_COMP transition */
 
                /* Read the contents of VPM Clock resgister */
-               phaseValue = pChipcHw->VPMClock;
+               phaseValue = readl(&pChipcHw->VPMClock);
                do {
                        /* Store previous value of phase comparator */
                        prevPhaseComp = phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP;
                        /* Change the value of PH_CTRL. */
-                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       reg32_write(&pChipcHw->VPMClock,
+                       (readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
                        /* Wait atleast 20 ns */
                        udelay(1);
                        /* Toggle the LOAD_CH after phase control is written. */
-                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+                       writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock);
                        /* Read the contents of  VPM Clock resgister. */
-                       phaseValue = pChipcHw->VPMClock;
+                       phaseValue = readl(&pChipcHw->VPMClock);
 
                        if ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0x0) {
                                phaseControl = (0x3F & (phaseControl - 1));
@@ -557,12 +556,13 @@ static int vpmPhaseAlignA0(void)
 
                for (count = 0; (count < 5) && ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0); count++) {
                        phaseControl = (0x3F & (phaseControl + 1));
-                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       reg32_write(&pChipcHw->VPMClock,
+                       (readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
                        /* Wait atleast 20 ns */
                        udelay(1);
                        /* Toggle the LOAD_CH after phase control is written. */
-                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
-                       phaseValue = pChipcHw->VPMClock;
+                       writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock);
+                       phaseValue = readl(&pChipcHw->VPMClock);
                        /* Count number of adjustment made */
                        adjustCount++;
                }
@@ -581,12 +581,13 @@ static int vpmPhaseAlignA0(void)
 
                for (count = 0; (count < 3) && ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0); count++) {
                        phaseControl = (0x3F & (phaseControl - 1));
-                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       reg32_write(&pChipcHw->VPMClock,
+                       (readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
                        /* Wait atleast 20 ns */
                        udelay(1);
                        /* Toggle the LOAD_CH after phase control is written. */
-                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
-                       phaseValue = pChipcHw->VPMClock;
+                       writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock);
+                       phaseValue = readl(&pChipcHw->VPMClock);
                        /* Count number of adjustment made */
                        adjustCount++;
                }
@@ -605,12 +606,13 @@ static int vpmPhaseAlignA0(void)
 
                for (count = 0; (count < 5); count++) {
                        phaseControl = (0x3F & (phaseControl - 1));
-                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       reg32_write(&pChipcHw->VPMClock,
+                       (readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
                        /* Wait atleast 20 ns */
                        udelay(1);
                        /* Toggle the LOAD_CH after phase control is written. */
-                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
-                       phaseValue = pChipcHw->VPMClock;
+                       writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock);
+                       phaseValue = readl(&pChipcHw->VPMClock);
                        /* Count number of adjustment made */
                        adjustCount++;
                }
@@ -631,14 +633,14 @@ static int vpmPhaseAlignA0(void)
                        /* Store previous value of phase comparator */
                        prevPhaseComp = phaseValue;
                        /* Change the value of PH_CTRL. */
-                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       reg32_write(&pChipcHw->VPMClock,
+                       (readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
                        /* Wait atleast 20 ns */
                        udelay(1);
                        /* Toggle the LOAD_CH after phase control is written. */
-                       pChipcHw->VPMClock ^=
-                           chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+                       writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock);
                        /* Read the contents of  VPM Clock resgister. */
-                       phaseValue = pChipcHw->VPMClock;
+                       phaseValue = readl(&pChipcHw->VPMClock);
 
                        if ((phaseValue & chipcHw_REG_PLL_CLOCK_PHASE_COMP) == 0x0) {
                                phaseControl = (0x3F & (phaseControl - 1));
@@ -661,13 +663,13 @@ static int vpmPhaseAlignA0(void)
        }
 
        /* For VPM Phase should be perfectly aligned. */
-       phaseControl = (((pChipcHw->VPMClock >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT) - 1) & 0x3F);
+       phaseControl = (((readl(&pChipcHw->VPMClock) >> chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT) - 1) & 0x3F);
        {
                REG_LOCAL_IRQ_SAVE;
 
-               pChipcHw->VPMClock = (pChipcHw->VPMClock & ~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT);
+               writel((readl(&pChipcHw->VPMClock) & ~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT), &pChipcHw->VPMClock);
                /* Load new phase value */
-               pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+               writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock);
 
                REG_LOCAL_IRQ_RESTORE;
        }
@@ -697,7 +699,7 @@ int chipcHw_vpmPhaseAlign(void)
                int adjustCount = 0;
 
                /* Disable VPM access */
-               pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE;
+               writel(readl(&pChipcHw->Spare1) & ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE, &pChipcHw->Spare1);
                /* Disable HW VPM phase alignment  */
                chipcHw_vpmHwPhaseAlignDisable();
                /* Enable SW VPM phase alignment  */
@@ -715,23 +717,24 @@ int chipcHw_vpmPhaseAlign(void)
                                phaseControl--;
                        } else {
                                /* Enable VPM access */
-                               pChipcHw->Spare1 |= chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE;
+                               writel(readl(&pChipcHw->Spare1) | chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE, &pChipcHw->Spare1);
                                /* Return adjust count */
                                return adjustCount;
                        }
                        /* Change the value of PH_CTRL. */
-                       reg32_write(&pChipcHw->VPMClock, (pChipcHw->VPMClock & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
+                       reg32_write(&pChipcHw->VPMClock,
+                       (readl(&pChipcHw->VPMClock) & (~chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_MASK)) | (phaseControl << chipcHw_REG_PLL_CLOCK_PHASE_CONTROL_SHIFT));
                        /* Wait atleast 20 ns */
                        udelay(1);
                        /* Toggle the LOAD_CH after phase control is written. */
-                       pChipcHw->VPMClock ^= chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE;
+                       writel(readl(&pChipcHw->VPMClock) ^ chipcHw_REG_PLL_CLOCK_PHASE_UPDATE_ENABLE, &pChipcHw->VPMClock);
                        /* Count adjustment */
                        adjustCount++;
                }
        }
 
        /* Disable VPM access */
-       pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE;
+       writel(readl(&pChipcHw->Spare1) & ~chipcHw_REG_SPARE1_VPM_BUS_ACCESS_ENABLE, &pChipcHw->Spare1);
        return -1;
 }
 
index 367df75..8377d80 100644 (file)
 
 /* ---- Include Files ---------------------------------------------------- */
 
-#include <csp/errno.h>
-#include <csp/stdint.h>
-#include <csp/module.h>
+#include <linux/errno.h>
+#include <linux/types.h>
+#include <linux/export.h>
 
 #include <mach/csp/chipcHw_def.h>
 #include <mach/csp/chipcHw_inline.h>
 
-#include <csp/reg.h>
-#include <csp/delay.h>
+#include <mach/csp/reg.h>
+#include <linux/delay.h>
 /* ---- Private Constants and Types --------------------------------------- */
 
 /*
@@ -73,9 +73,9 @@ void chipcHw_pll2Enable(uint32_t vcoFreqHz)
 
        {
                REG_LOCAL_IRQ_SAVE;
-               pChipcHw->PLLConfig2 =
-                   chipcHw_REG_PLL_CONFIG_D_RESET |
-                   chipcHw_REG_PLL_CONFIG_A_RESET;
+               writel(chipcHw_REG_PLL_CONFIG_D_RESET |
+                      chipcHw_REG_PLL_CONFIG_A_RESET,
+                       &pChipcHw->PLLConfig2);
 
                pllPreDivider2 = chipcHw_REG_PLL_PREDIVIDER_POWER_DOWN |
                    chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER |
@@ -87,28 +87,30 @@ void chipcHw_pll2Enable(uint32_t vcoFreqHz)
                     chipcHw_REG_PLL_PREDIVIDER_P2_SHIFT);
 
                /* Enable CHIPC registers to control the PLL */
-               pChipcHw->PLLStatus |= chipcHw_REG_PLL_STATUS_CONTROL_ENABLE;
+               writel(readl(&pChipcHw->PLLStatus) | chipcHw_REG_PLL_STATUS_CONTROL_ENABLE, &pChipcHw->PLLStatus);
 
                /* Set pre divider to get desired VCO frequency */
-               pChipcHw->PLLPreDivider2 = pllPreDivider2;
+               writel(pllPreDivider2, &pChipcHw->PLLPreDivider2);
                /* Set NDIV Frac */
-               pChipcHw->PLLDivider2 = chipcHw_REG_PLL_DIVIDER_NDIV_f;
+               writel(chipcHw_REG_PLL_DIVIDER_NDIV_f, &pChipcHw->PLLDivider2);
 
                /* This has to be removed once the default values are fixed for PLL2. */
-               pChipcHw->PLLControl12 = 0x38000700;
-               pChipcHw->PLLControl22 = 0x00000015;
+               writel(0x38000700, &pChipcHw->PLLControl12);
+               writel(0x00000015, &pChipcHw->PLLControl22);
 
                /* Reset PLL2 */
                if (vcoFreqHz > chipcHw_REG_PLL_CONFIG_VCO_SPLIT_FREQ) {
-                       pChipcHw->PLLConfig2 = chipcHw_REG_PLL_CONFIG_D_RESET |
+                       writel(chipcHw_REG_PLL_CONFIG_D_RESET |
                            chipcHw_REG_PLL_CONFIG_A_RESET |
                            chipcHw_REG_PLL_CONFIG_VCO_1601_3200 |
-                           chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+                           chipcHw_REG_PLL_CONFIG_POWER_DOWN,
+                           &pChipcHw->PLLConfig2);
                } else {
-                       pChipcHw->PLLConfig2 = chipcHw_REG_PLL_CONFIG_D_RESET |
+                       writel(chipcHw_REG_PLL_CONFIG_D_RESET |
                            chipcHw_REG_PLL_CONFIG_A_RESET |
                            chipcHw_REG_PLL_CONFIG_VCO_800_1600 |
-                           chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+                           chipcHw_REG_PLL_CONFIG_POWER_DOWN,
+                           &pChipcHw->PLLConfig2);
                }
                REG_LOCAL_IRQ_RESTORE;
        }
@@ -119,22 +121,25 @@ void chipcHw_pll2Enable(uint32_t vcoFreqHz)
        {
                REG_LOCAL_IRQ_SAVE;
                /* Remove analog reset and Power on the PLL */
-               pChipcHw->PLLConfig2 &=
+               writel(readl(&pChipcHw->PLLConfig2) &
                    ~(chipcHw_REG_PLL_CONFIG_A_RESET |
-                     chipcHw_REG_PLL_CONFIG_POWER_DOWN);
+                     chipcHw_REG_PLL_CONFIG_POWER_DOWN),
+                     &pChipcHw->PLLConfig2);
 
                REG_LOCAL_IRQ_RESTORE;
 
        }
 
        /* Wait until PLL is locked */
-       while (!(pChipcHw->PLLStatus2 & chipcHw_REG_PLL_STATUS_LOCKED))
+       while (!(readl(&pChipcHw->PLLStatus2) & chipcHw_REG_PLL_STATUS_LOCKED))
                ;
 
        {
                REG_LOCAL_IRQ_SAVE;
                /* Remove digital reset */
-               pChipcHw->PLLConfig2 &= ~chipcHw_REG_PLL_CONFIG_D_RESET;
+               writel(readl(&pChipcHw->PLLConfig2) &
+                       ~chipcHw_REG_PLL_CONFIG_D_RESET,
+                       &pChipcHw->PLLConfig2);
 
                REG_LOCAL_IRQ_RESTORE;
        }
@@ -157,9 +162,9 @@ void chipcHw_pll1Enable(uint32_t vcoFreqHz, chipcHw_SPREAD_SPECTRUM_e ssSupport)
        {
                REG_LOCAL_IRQ_SAVE;
 
-               pChipcHw->PLLConfig =
-                   chipcHw_REG_PLL_CONFIG_D_RESET |
-                   chipcHw_REG_PLL_CONFIG_A_RESET;
+               writel(chipcHw_REG_PLL_CONFIG_D_RESET |
+                   chipcHw_REG_PLL_CONFIG_A_RESET,
+                   &pChipcHw->PLLConfig);
                /* Setting VCO frequency */
                if (ssSupport == chipcHw_SPREAD_SPECTRUM_ALLOW) {
                        pllPreDivider =
@@ -182,30 +187,22 @@ void chipcHw_pll1Enable(uint32_t vcoFreqHz, chipcHw_SPREAD_SPECTRUM_e ssSupport)
                }
 
                /* Enable CHIPC registers to control the PLL */
-               pChipcHw->PLLStatus |= chipcHw_REG_PLL_STATUS_CONTROL_ENABLE;
+               writel(readl(&pChipcHw->PLLStatus) | chipcHw_REG_PLL_STATUS_CONTROL_ENABLE, &pChipcHw->PLLStatus);
 
                /* Set pre divider to get desired VCO frequency */
-               pChipcHw->PLLPreDivider = pllPreDivider;
+               writel(pllPreDivider, &pChipcHw->PLLPreDivider);
                /* Set NDIV Frac */
                if (ssSupport == chipcHw_SPREAD_SPECTRUM_ALLOW) {
-                       pChipcHw->PLLDivider = chipcHw_REG_PLL_DIVIDER_M1DIV |
-                           chipcHw_REG_PLL_DIVIDER_NDIV_f_SS;
+                       writel(chipcHw_REG_PLL_DIVIDER_M1DIV | chipcHw_REG_PLL_DIVIDER_NDIV_f_SS, &pChipcHw->PLLDivider);
                } else {
-                       pChipcHw->PLLDivider = chipcHw_REG_PLL_DIVIDER_M1DIV |
-                           chipcHw_REG_PLL_DIVIDER_NDIV_f;
+                       writel(chipcHw_REG_PLL_DIVIDER_M1DIV | chipcHw_REG_PLL_DIVIDER_NDIV_f, &pChipcHw->PLLDivider);
                }
 
                /* Reset PLL1 */
                if (vcoFreqHz > chipcHw_REG_PLL_CONFIG_VCO_SPLIT_FREQ) {
-                       pChipcHw->PLLConfig = chipcHw_REG_PLL_CONFIG_D_RESET |
-                           chipcHw_REG_PLL_CONFIG_A_RESET |
-                           chipcHw_REG_PLL_CONFIG_VCO_1601_3200 |
-                           chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+                       writel(chipcHw_REG_PLL_CONFIG_D_RESET | chipcHw_REG_PLL_CONFIG_A_RESET | chipcHw_REG_PLL_CONFIG_VCO_1601_3200 | chipcHw_REG_PLL_CONFIG_POWER_DOWN, &pChipcHw->PLLConfig);
                } else {
-                       pChipcHw->PLLConfig = chipcHw_REG_PLL_CONFIG_D_RESET |
-                           chipcHw_REG_PLL_CONFIG_A_RESET |
-                           chipcHw_REG_PLL_CONFIG_VCO_800_1600 |
-                           chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+                       writel(chipcHw_REG_PLL_CONFIG_D_RESET | chipcHw_REG_PLL_CONFIG_A_RESET | chipcHw_REG_PLL_CONFIG_VCO_800_1600 | chipcHw_REG_PLL_CONFIG_POWER_DOWN, &pChipcHw->PLLConfig);
                }
 
                REG_LOCAL_IRQ_RESTORE;
@@ -216,22 +213,19 @@ void chipcHw_pll1Enable(uint32_t vcoFreqHz, chipcHw_SPREAD_SPECTRUM_e ssSupport)
                {
                        REG_LOCAL_IRQ_SAVE;
                        /* Remove analog reset and Power on the PLL */
-                       pChipcHw->PLLConfig &=
-                           ~(chipcHw_REG_PLL_CONFIG_A_RESET |
-                             chipcHw_REG_PLL_CONFIG_POWER_DOWN);
+                       writel(readl(&pChipcHw->PLLConfig) & ~(chipcHw_REG_PLL_CONFIG_A_RESET | chipcHw_REG_PLL_CONFIG_POWER_DOWN), &pChipcHw->PLLConfig);
                        REG_LOCAL_IRQ_RESTORE;
                }
 
                /* Wait until PLL is locked */
-               while (!(pChipcHw->PLLStatus & chipcHw_REG_PLL_STATUS_LOCKED)
-                      || !(pChipcHw->
-                           PLLStatus2 & chipcHw_REG_PLL_STATUS_LOCKED))
+               while (!(readl(&pChipcHw->PLLStatus) & chipcHw_REG_PLL_STATUS_LOCKED)
+                      || !(readl(&pChipcHw->PLLStatus2) & chipcHw_REG_PLL_STATUS_LOCKED))
                        ;
 
                /* Remove digital reset */
                {
                        REG_LOCAL_IRQ_SAVE;
-                       pChipcHw->PLLConfig &= ~chipcHw_REG_PLL_CONFIG_D_RESET;
+                       writel(readl(&pChipcHw->PLLConfig) & ~chipcHw_REG_PLL_CONFIG_D_RESET, &pChipcHw->PLLConfig);
                        REG_LOCAL_IRQ_RESTORE;
                }
        }
@@ -267,11 +261,7 @@ void chipcHw_Init(chipcHw_INIT_PARAM_t *initParam  /*  [ IN ] Misc chip initializ
        chipcHw_clearStickyBits(chipcHw_REG_STICKY_CHIP_SOFT_RESET);
 
        /* Before configuring the ARM clock, atleast we need to make sure BUS clock maintains the proper ratio with ARM clock */
-       pChipcHw->ACLKClock =
-           (pChipcHw->
-            ACLKClock & ~chipcHw_REG_ACLKClock_CLK_DIV_MASK) | (initParam->
-                                                                armBusRatio &
-                                                                chipcHw_REG_ACLKClock_CLK_DIV_MASK);
+       writel((readl(&pChipcHw->ACLKClock) & ~chipcHw_REG_ACLKClock_CLK_DIV_MASK) | (initParam-> armBusRatio & chipcHw_REG_ACLKClock_CLK_DIV_MASK), &pChipcHw->ACLKClock);
 
        /* Set various core component frequencies. The order in which this is done is important for some. */
        /* The RTBUS (DDR PHY) is derived from the BUS, and the BUS from the ARM, and VPM needs to know BUS */
index 2671d88..f95ce91 100644 (file)
 *****************************************************************************/
 
 /* ---- Include Files ---------------------------------------------------- */
-#include <csp/stdint.h>
+#include <linux/types.h>
 #include <mach/csp/chipcHw_def.h>
 #include <mach/csp/chipcHw_inline.h>
-#include <csp/intcHw.h>
-#include <csp/cache.h>
+#include <mach/csp/intcHw_reg.h>
+#include <asm/cacheflush.h>
 
 /* ---- Private Constants and Types --------------------------------------- */
 /* ---- Private Variables ------------------------------------------------- */
@@ -50,17 +50,18 @@ void chipcHw_reset(uint32_t mask)
                        chipcHw_softReset(chipcHw_REG_SOFT_RESET_CHIP_SOFT);
                }
                /* Bypass the PLL clocks before reboot */
-               pChipcHw->UARTClock |= chipcHw_REG_PLL_CLOCK_BYPASS_SELECT;
-               pChipcHw->SPIClock |= chipcHw_REG_PLL_CLOCK_BYPASS_SELECT;
+               writel(readl(&pChipcHw->UARTClock) | chipcHw_REG_PLL_CLOCK_BYPASS_SELECT,
+                       &pChipcHw->UARTClock);
+               writel(readl(&pChipcHw->SPIClock) | chipcHw_REG_PLL_CLOCK_BYPASS_SELECT,
+                       &pChipcHw->SPIClock);
 
                /* Copy the chipcHw_warmReset_run_from_aram function into ARAM */
                do {
-                       ((uint32_t *) MM_IO_BASE_ARAM)[i] =
-                           ((uint32_t *) &chipcHw_reset_run_from_aram)[i];
+                       writel(((uint32_t *) &chipcHw_reset_run_from_aram)[i], ((uint32_t __iomem *) MM_IO_BASE_ARAM) + i);
                        i++;
-               } while (((uint32_t *) MM_IO_BASE_ARAM)[i - 1] != 0xe1a0f00f);  /* 0xe1a0f00f == asm ("mov r15, r15"); */
+               } while (readl(((uint32_t __iomem*) MM_IO_BASE_ARAM) + i - 1) != 0xe1a0f00f);   /* 0xe1a0f00f == asm ("mov r15, r15"); */
 
-               CSP_CACHE_FLUSH_ALL;
+               flush_cache_all();
 
                /* run the function from ARAM */
                runFunc();
index 6b9be2e..547f746 100644 (file)
 /****************************************************************************/
 
 /* ---- Include Files ---------------------------------------------------- */
-#include <csp/stdint.h>
-#include <csp/string.h>
-#include <stddef.h>
+#include <linux/types.h>
+#include <linux/string.h>
+#include <linux/stddef.h>
 
-#include <csp/dmacHw.h>
+#include <mach/csp/dmacHw.h>
 #include <mach/csp/dmacHw_reg.h>
 #include <mach/csp/dmacHw_priv.h>
 #include <mach/csp/chipcHw_inline.h>
@@ -55,33 +55,32 @@ static uint32_t GetFifoSize(dmacHw_HANDLE_t handle  /*   [ IN ] DMA Channel handl
     ) {
        uint32_t val = 0;
        dmacHw_CBLK_t *pCblk = dmacHw_HANDLE_TO_CBLK(handle);
-       dmacHw_MISC_t *pMiscReg =
-           (dmacHw_MISC_t *) dmacHw_REG_MISC_BASE(pCblk->module);
+       dmacHw_MISC_t __iomem *pMiscReg = (void __iomem *)dmacHw_REG_MISC_BASE(pCblk->module);
 
        switch (pCblk->channel) {
        case 0:
-               val = (pMiscReg->CompParm2.lo & 0x70000000) >> 28;
+               val = (readl(&pMiscReg->CompParm2.lo) & 0x70000000) >> 28;
                break;
        case 1:
-               val = (pMiscReg->CompParm3.hi & 0x70000000) >> 28;
+               val = (readl(&pMiscReg->CompParm3.hi) & 0x70000000) >> 28;
                break;
        case 2:
-               val = (pMiscReg->CompParm3.lo & 0x70000000) >> 28;
+               val = (readl(&pMiscReg->CompParm3.lo) & 0x70000000) >> 28;
                break;
        case 3:
-               val = (pMiscReg->CompParm4.hi & 0x70000000) >> 28;
+               val = (readl(&pMiscReg->CompParm4.hi) & 0x70000000) >> 28;
                break;
        case 4:
-               val = (pMiscReg->CompParm4.lo & 0x70000000) >> 28;
+               val = (readl(&pMiscReg->CompParm4.lo) & 0x70000000) >> 28;
                break;
        case 5:
-               val = (pMiscReg->CompParm5.hi & 0x70000000) >> 28;
+               val = (readl(&pMiscReg->CompParm5.hi) & 0x70000000) >> 28;
                break;
        case 6:
-               val = (pMiscReg->CompParm5.lo & 0x70000000) >> 28;
+               val = (readl(&pMiscReg->CompParm5.lo) & 0x70000000) >> 28;
                break;
        case 7:
-               val = (pMiscReg->CompParm6.hi & 0x70000000) >> 28;
+               val = (readl(&pMiscReg->CompParm6.hi) & 0x70000000) >> 28;
                break;
        }
 
index a1f3283..fe43869 100644 (file)
 
 /* ---- Include Files ---------------------------------------------------- */
 
-#include <csp/stdint.h>
-#include <stddef.h>
+#include <linux/types.h>
+#include <linux/stddef.h>
 
-#include <csp/dmacHw.h>
+#include <mach/csp/dmacHw.h>
 #include <mach/csp/dmacHw_reg.h>
 #include <mach/csp/dmacHw_priv.h>
 
index 16225e4..dc4137f 100644 (file)
 
 /* ---- Include Files ---------------------------------------------------- */
 
-#include <csp/errno.h>
-#include <csp/stdint.h>
+#include <linux/errno.h>
+#include <linux/types.h>
 
-#include <csp/tmrHw.h>
+#include <mach/csp/tmrHw.h>
 #include <mach/csp/tmrHw_reg.h>
 
 #define tmrHw_ASSERT(a)                     if (!(a)) *(char *)0 = 0
diff --git a/arch/arm/mach-bcmring/include/cfg_global.h b/arch/arm/mach-bcmring/include/cfg_global.h
deleted file mode 100644 (file)
index f01da87..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#ifndef _CFG_GLOBAL_H_
-#define _CFG_GLOBAL_H_
-
-#include <cfg_global_defines.h>
-
-#define CFG_GLOBAL_CHIP                         BCM11107
-#define CFG_GLOBAL_CHIP_FAMILY                  CFG_GLOBAL_CHIP_FAMILY_BCMRING
-#define CFG_GLOBAL_CHIP_REV                     0xB0
-#define CFG_GLOBAL_RAM_SIZE                     0x10000000
-#define CFG_GLOBAL_RAM_BASE                     0x00000000
-#define CFG_GLOBAL_RAM_RESERVED_SIZE            0x000000
-
-#endif /* _CFG_GLOBAL_H_ */
diff --git a/arch/arm/mach-bcmring/include/csp/cache.h b/arch/arm/mach-bcmring/include/csp/cache.h
deleted file mode 100644 (file)
index caa20e5..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*****************************************************************************
-* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
-*
-* Unless you and Broadcom execute a separate written software license
-* agreement governing use of this software, this software is licensed to you
-* under the terms of the GNU General Public License version 2, available at
-* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-*
-* Notwithstanding the above, under no circumstances may you combine this
-* software in any way with any other Broadcom software provided under a
-* license other than the GPL, without Broadcom's express prior written
-* consent.
-*****************************************************************************/
-
-#ifndef CSP_CACHE_H
-#define CSP_CACHE_H
-
-/* ---- Include Files ---------------------------------------------------- */
-
-#include <csp/stdint.h>
-
-/* ---- Public Constants and Types --------------------------------------- */
-
-#if defined(__KERNEL__) && !defined(STANDALONE)
-#include <asm/cacheflush.h>
-
-#define CSP_CACHE_FLUSH_ALL      flush_cache_all()
-
-#else
-
-#define CSP_CACHE_FLUSH_ALL
-
-#endif
-
-#endif /* CSP_CACHE_H */
diff --git a/arch/arm/mach-bcmring/include/csp/delay.h b/arch/arm/mach-bcmring/include/csp/delay.h
deleted file mode 100644 (file)
index 8b3d803..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*****************************************************************************
-* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
-*
-* Unless you and Broadcom execute a separate written software license
-* agreement governing use of this software, this software is licensed to you
-* under the terms of the GNU General Public License version 2, available at
-* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-*
-* Notwithstanding the above, under no circumstances may you combine this
-* software in any way with any other Broadcom software provided under a
-* license other than the GPL, without Broadcom's express prior written
-* consent.
-*****************************************************************************/
-
-
-#ifndef CSP_DELAY_H
-#define CSP_DELAY_H
-
-/* ---- Include Files ---------------------------------------------------- */
-
-/* Some CSP routines require use of the following delay routines. Use the OS */
-/* version if available, otherwise use a CSP specific definition. */
-/* void udelay(unsigned long usecs); */
-/* void mdelay(unsigned long msecs); */
-
-#if defined(__KERNEL__) && !defined(STANDALONE)
-   #include <linux/delay.h>
-#else
-   #include <mach/csp/delay.h>
-#endif
-
-/* ---- Public Constants and Types --------------------------------------- */
-/* ---- Public Variable Externs ------------------------------------------ */
-/* ---- Public Function Prototypes --------------------------------------- */
-
-#endif /*  CSP_DELAY_H */
diff --git a/arch/arm/mach-bcmring/include/csp/errno.h b/arch/arm/mach-bcmring/include/csp/errno.h
deleted file mode 100644 (file)
index 51357dd..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*****************************************************************************
-* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
-*
-* Unless you and Broadcom execute a separate written software license
-* agreement governing use of this software, this software is licensed to you
-* under the terms of the GNU General Public License version 2, available at
-* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-*
-* Notwithstanding the above, under no circumstances may you combine this
-* software in any way with any other Broadcom software provided under a
-* license other than the GPL, without Broadcom's express prior written
-* consent.
-*****************************************************************************/
-
-#ifndef CSP_ERRNO_H
-#define CSP_ERRNO_H
-
-/* ---- Include Files ---------------------------------------------------- */
-
-#if   defined(__KERNEL__)
-#include <linux/errno.h>
-#elif defined(CSP_SIMULATION)
-#include <asm-generic/errno.h>
-#else
-#include <errno.h>
-#endif
-
-/* ---- Public Constants and Types --------------------------------------- */
-/* ---- Public Variable Externs ------------------------------------------ */
-/* ---- Public Function Prototypes --------------------------------------- */
-
-#endif /* CSP_ERRNO_H */
diff --git a/arch/arm/mach-bcmring/include/csp/intcHw.h b/arch/arm/mach-bcmring/include/csp/intcHw.h
deleted file mode 100644 (file)
index 1c639c8..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*****************************************************************************
-* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
-*
-* Unless you and Broadcom execute a separate written software license
-* agreement governing use of this software, this software is licensed to you
-* under the terms of the GNU General Public License version 2, available at
-* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-*
-* Notwithstanding the above, under no circumstances may you combine this
-* software in any way with any other Broadcom software provided under a
-* license other than the GPL, without Broadcom's express prior written
-* consent.
-*****************************************************************************/
-
-
-/****************************************************************************/
-/**
-*  @file    intcHw.h
-*
-*  @brief   generic interrupt controller API
-*
-*  @note
-*     None
-*/
-/****************************************************************************/
-
-#ifndef _INTCHW_H
-#define _INTCHW_H
-
-/* ---- Include Files ---------------------------------------------------- */
-#include <mach/csp/intcHw_reg.h>
-
-/* ---- Public Constants and Types --------------------------------------- */
-/* ---- Public Variable Externs ------------------------------------------ */
-/* ---- Public Function Prototypes --------------------------------------- */
-static inline void intcHw_irq_disable(void *basep, uint32_t mask);
-static inline void intcHw_irq_enable(void *basep, uint32_t mask);
-
-#endif /* _INTCHW_H */
-
diff --git a/arch/arm/mach-bcmring/include/csp/module.h b/arch/arm/mach-bcmring/include/csp/module.h
deleted file mode 100644 (file)
index c30d2a5..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*****************************************************************************
-* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
-*
-* Unless you and Broadcom execute a separate written software license
-* agreement governing use of this software, this software is licensed to you
-* under the terms of the GNU General Public License version 2, available at
-* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-*
-* Notwithstanding the above, under no circumstances may you combine this
-* software in any way with any other Broadcom software provided under a
-* license other than the GPL, without Broadcom's express prior written
-* consent.
-*****************************************************************************/
-
-
-#ifndef CSP_MODULE_H
-#define CSP_MODULE_H
-
-/* ---- Include Files ---------------------------------------------------- */
-
-#ifdef __KERNEL__
-    #include <linux/module.h>
-#else
-    #define EXPORT_SYMBOL(symbol)
-#endif
-
-/* ---- Public Constants and Types --------------------------------------- */
-/* ---- Public Variable Externs ------------------------------------------ */
-/* ---- Public Function Prototypes --------------------------------------- */
-
-
-#endif /* CSP_MODULE_H */
diff --git a/arch/arm/mach-bcmring/include/csp/secHw.h b/arch/arm/mach-bcmring/include/csp/secHw.h
deleted file mode 100644 (file)
index b9d7e07..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*****************************************************************************
-* Copyright 2004 - 2008 Broadcom Corporation.  All rights reserved.
-*
-* Unless you and Broadcom execute a separate written software license
-* agreement governing use of this software, this software is licensed to you
-* under the terms of the GNU General Public License version 2, available at
-* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-*
-* Notwithstanding the above, under no circumstances may you combine this
-* software in any way with any other Broadcom software provided under a
-* license other than the GPL, without Broadcom's express prior written
-* consent.
-*****************************************************************************/
-
-/****************************************************************************/
-/**
-*  @file    secHw.h
-*
-*  @brief   Definitions for accessing low level security features
-*
-*/
-/****************************************************************************/
-#ifndef SECHW_H
-#define SECHW_H
-
-typedef void (*secHw_FUNC_t) (void);
-
-typedef enum {
-       secHw_MODE_SECURE = 0x0,        /* Switches processor into secure mode */
-       secHw_MODE_NONSECURE = 0x1      /* Switches processor into non-secure mode */
-} secHw_MODE;
-
-/****************************************************************************/
-/**
-*  @brief   Requesting to execute the function in secure mode
-*
-*  This function requests the given function to run in secure mode
-*
-*/
-/****************************************************************************/
-void secHw_RunSecure(secHw_FUNC_t      /* Function to run in secure mode */
-    );
-
-/****************************************************************************/
-/**
-*  @brief   Sets the  mode
-*
-*  his function sets the processor mode (secure/non-secure)
-*
-*/
-/****************************************************************************/
-void secHw_SetMode(secHw_MODE  /* Processor mode */
-    );
-
-/****************************************************************************/
-/**
-*  @brief   Get the current mode
-*
-*  This function retieves the processor mode (secure/non-secure)
-*
-*/
-/****************************************************************************/
-void secHw_GetMode(secHw_MODE *);
-
-#endif /* SECHW_H */
diff --git a/arch/arm/mach-bcmring/include/csp/stdint.h b/arch/arm/mach-bcmring/include/csp/stdint.h
deleted file mode 100644 (file)
index 3a8718b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*****************************************************************************
-* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
-*
-* Unless you and Broadcom execute a separate written software license
-* agreement governing use of this software, this software is licensed to you
-* under the terms of the GNU General Public License version 2, available at
-* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-*
-* Notwithstanding the above, under no circumstances may you combine this
-* software in any way with any other Broadcom software provided under a
-* license other than the GPL, without Broadcom's express prior written
-* consent.
-*****************************************************************************/
-
-#ifndef CSP_STDINT_H
-#define CSP_STDINT_H
-
-/* ---- Include Files ---------------------------------------------------- */
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
-
-/* ---- Public Constants and Types --------------------------------------- */
-/* ---- Public Variable Externs ------------------------------------------ */
-/* ---- Public Function Prototypes --------------------------------------- */
-
-#endif /* CSP_STDINT_H */
diff --git a/arch/arm/mach-bcmring/include/csp/string.h b/arch/arm/mach-bcmring/include/csp/string.h
deleted file mode 100644 (file)
index ad9e400..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-/*****************************************************************************
-* Copyright 2003 - 2008 Broadcom Corporation.  All rights reserved.
-*
-* Unless you and Broadcom execute a separate written software license
-* agreement governing use of this software, this software is licensed to you
-* under the terms of the GNU General Public License version 2, available at
-* http://www.broadcom.com/licenses/GPLv2.php (the "GPL").
-*
-* Notwithstanding the above, under no circumstances may you combine this
-* software in any way with any other Broadcom software provided under a
-* license other than the GPL, without Broadcom's express prior written
-* consent.
-*****************************************************************************/
-
-
-
-#ifndef CSP_STRING_H
-#define CSP_STRING_H
-
-/* ---- Include Files ---------------------------------------------------- */
-
-#ifdef __KERNEL__
-   #include <linux/string.h>
-#else
-   #include <string.h>
-#endif
-
-/* ---- Public Constants and Types --------------------------------------- */
-/* ---- Public Variable Externs ------------------------------------------ */
-/* ---- Public Function Prototypes --------------------------------------- */
-
-
-#endif /* CSP_STRING_H */
-
 
 #define IMAGE_HEADER_SIZE_CHECKSUM    4
 #endif
+#ifndef _CFG_GLOBAL_H_
+#define _CFG_GLOBAL_H_
+
+#define CFG_GLOBAL_CHIP                         BCM11107
+#define CFG_GLOBAL_CHIP_FAMILY                  CFG_GLOBAL_CHIP_FAMILY_BCMRING
+#define CFG_GLOBAL_CHIP_REV                     0xB0
+#define CFG_GLOBAL_RAM_SIZE                     0x10000000
+#define CFG_GLOBAL_RAM_BASE                     0x00000000
+#define CFG_GLOBAL_RAM_RESERVED_SIZE            0x000000
+
+#endif /* _CFG_GLOBAL_H_ */
index 933ce68..0a89e0c 100644 (file)
@@ -17,7 +17,7 @@
 
 /* ---- Include Files ---------------------------------------------------- */
 #include <mach/csp/cap.h>
-#include <cfg_global.h>
+#include <mach/cfg_global.h>
 
 /* ---- Public Constants and Types --------------------------------------- */
 #define CAP_CONFIG0_VPM_DIS          0x00000001
index 1619733..39f09cb 100644 (file)
@@ -17,9 +17,9 @@
 
 /* ---- Include Files ----------------------------------------------------- */
 
-#include <csp/stdint.h>
-#include <csp/errno.h>
-#include <csp/reg.h>
+#include <linux/types.h>
+#include <linux/errno.h>
+#include <mach/csp/reg.h>
 #include <mach/csp/chipcHw_reg.h>
 
 /* ---- Public Constants and Types ---------------------------------------- */
index 03238c2..a66f3f7 100644 (file)
@@ -17,8 +17,8 @@
 
 /* ---- Include Files ----------------------------------------------------- */
 
-#include <csp/errno.h>
-#include <csp/reg.h>
+#include <linux/errno.h>
+#include <mach/csp/reg.h>
 #include <mach/csp/chipcHw_reg.h>
 #include <mach/csp/chipcHw_def.h>
 
@@ -47,7 +47,7 @@ static inline void chipcHw_setClock(chipcHw_CLOCK_e clock,
 /****************************************************************************/
 static inline uint32_t chipcHw_getChipId(void)
 {
-       return pChipcHw->ChipId;
+       return readl(&pChipcHw->ChipId);
 }
 
 /****************************************************************************/
@@ -59,15 +59,16 @@ static inline uint32_t chipcHw_getChipId(void)
 /****************************************************************************/
 static inline void chipcHw_enableSpreadSpectrum(void)
 {
-       if ((pChipcHw->
-            PLLPreDivider & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) !=
+       if ((readl(&pChipcHw->
+            PLLPreDivider) & chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_MASK) !=
            chipcHw_REG_PLL_PREDIVIDER_NDIV_MODE_INTEGER) {
-               ddrcReg_PHY_ADDR_CTL_REGP->ssCfg =
-                   (0xFFFF << ddrcReg_PHY_ADDR_SS_CFG_NDIV_AMPLITUDE_SHIFT) |
+               writel((0xFFFF << ddrcReg_PHY_ADDR_SS_CFG_NDIV_AMPLITUDE_SHIFT) |
                    (ddrcReg_PHY_ADDR_SS_CFG_MIN_CYCLE_PER_TICK <<
-                    ddrcReg_PHY_ADDR_SS_CFG_CYCLE_PER_TICK_SHIFT);
-               ddrcReg_PHY_ADDR_CTL_REGP->ssCtl |=
-                   ddrcReg_PHY_ADDR_SS_CTRL_ENABLE;
+                    ddrcReg_PHY_ADDR_SS_CFG_CYCLE_PER_TICK_SHIFT),
+                    &ddrcReg_PHY_ADDR_CTL_REGP->ssCfg);
+               writel(readl(&ddrcReg_PHY_ADDR_CTL_REGP->ssCtl) |
+                   ddrcReg_PHY_ADDR_SS_CTRL_ENABLE,
+                   &ddrcReg_PHY_ADDR_CTL_REGP->ssCtl);
        }
 }
 
@@ -93,8 +94,8 @@ static inline void chipcHw_disableSpreadSpectrum(void)
 /****************************************************************************/
 static inline uint32_t chipcHw_getChipProductId(void)
 {
-       return (pChipcHw->
-                ChipId & chipcHw_REG_CHIPID_BASE_MASK) >>
+       return (readl(&pChipcHw->
+                ChipId) & chipcHw_REG_CHIPID_BASE_MASK) >>
                chipcHw_REG_CHIPID_BASE_SHIFT;
 }
 
@@ -109,7 +110,7 @@ static inline uint32_t chipcHw_getChipProductId(void)
 /****************************************************************************/
 static inline chipcHw_REV_NUMBER_e chipcHw_getChipRevisionNumber(void)
 {
-       return pChipcHw->ChipId & chipcHw_REG_CHIPID_REV_MASK;
+       return readl(&pChipcHw->ChipId) & chipcHw_REG_CHIPID_REV_MASK;
 }
 
 /****************************************************************************/
@@ -156,7 +157,7 @@ static inline void chipcHw_busInterfaceClockDisable(uint32_t mask)
 /****************************************************************************/
 static inline uint32_t chipcHw_getBusInterfaceClockStatus(void)
 {
-       return pChipcHw->BusIntfClock;
+       return readl(&pChipcHw->BusIntfClock);
 }
 
 /****************************************************************************/
@@ -215,8 +216,9 @@ static inline void chipcHw_softResetDisable(uint64_t mask)
 
        /* Deassert module soft reset */
        REG_LOCAL_IRQ_SAVE;
-       pChipcHw->SoftReset1 ^= ctrl1;
-       pChipcHw->SoftReset2 ^= (ctrl2 & (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK));
+       writel(readl(&pChipcHw->SoftReset1) ^ ctrl1, &pChipcHw->SoftReset1);
+       writel(readl(&pChipcHw->SoftReset2) ^ (ctrl2 &
+               (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK)), &pChipcHw->SoftReset2);
        REG_LOCAL_IRQ_RESTORE;
 }
 
@@ -227,9 +229,10 @@ static inline void chipcHw_softResetEnable(uint64_t mask)
        uint32_t unhold = 0;
 
        REG_LOCAL_IRQ_SAVE;
-       pChipcHw->SoftReset1 |= ctrl1;
+       writel(readl(&pChipcHw->SoftReset1) | ctrl1, &pChipcHw->SoftReset1);
        /* Mask out unhold request bits */
-       pChipcHw->SoftReset2 |= (ctrl2 & (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK));
+       writel(readl(&pChipcHw->SoftReset2) | (ctrl2 &
+               (~chipcHw_REG_SOFT_RESET_UNHOLD_MASK)), &pChipcHw->SoftReset2);
 
        /* Process unhold requests */
        if (ctrl2 & chipcHw_REG_SOFT_RESET_VPM_GLOBAL_UNHOLD) {
@@ -246,7 +249,7 @@ static inline void chipcHw_softResetEnable(uint64_t mask)
 
        if (unhold) {
                /* Make sure unhold request is effective */
-               pChipcHw->SoftReset1 &= ~unhold;
+               writel(readl(&pChipcHw->SoftReset1) & ~unhold, &pChipcHw->SoftReset1);
        }
        REG_LOCAL_IRQ_RESTORE;
 }
@@ -307,7 +310,7 @@ static inline void chipcHw_setOTPOption(uint64_t mask)
 /****************************************************************************/
 static inline uint32_t chipcHw_getStickyBits(void)
 {
-       return pChipcHw->Sticky;
+       return readl(&pChipcHw->Sticky);
 }
 
 /****************************************************************************/
@@ -328,7 +331,7 @@ static inline void chipcHw_setStickyBits(uint32_t mask)
                bits |= chipcHw_REG_STICKY_POR_BROM;
        } else {
                uint32_t sticky;
-               sticky = pChipcHw->Sticky;
+               sticky = readl(pChipcHw->Sticky);
 
                if ((mask & chipcHw_REG_STICKY_BOOT_DONE)
                    && (sticky & chipcHw_REG_STICKY_BOOT_DONE) == 0) {
@@ -355,7 +358,7 @@ static inline void chipcHw_setStickyBits(uint32_t mask)
                        bits |= chipcHw_REG_STICKY_GENERAL_5;
                }
        }
-       pChipcHw->Sticky = bits;
+       writel(bits, pChipcHw->Sticky);
        REG_LOCAL_IRQ_RESTORE;
 }
 
@@ -377,7 +380,7 @@ static inline void chipcHw_clearStickyBits(uint32_t mask)
            (chipcHw_REG_STICKY_BOOT_DONE | chipcHw_REG_STICKY_GENERAL_1 |
             chipcHw_REG_STICKY_GENERAL_2 | chipcHw_REG_STICKY_GENERAL_3 |
             chipcHw_REG_STICKY_GENERAL_4 | chipcHw_REG_STICKY_GENERAL_5)) {
-               uint32_t sticky = pChipcHw->Sticky;
+               uint32_t sticky = readl(&pChipcHw->Sticky);
 
                if ((mask & chipcHw_REG_STICKY_BOOT_DONE)
                    && (sticky & chipcHw_REG_STICKY_BOOT_DONE)) {
@@ -410,7 +413,7 @@ static inline void chipcHw_clearStickyBits(uint32_t mask)
                        mask &= ~chipcHw_REG_STICKY_GENERAL_5;
                }
        }
-       pChipcHw->Sticky = bits | mask;
+       writel(bits | mask, &pChipcHw->Sticky);
        REG_LOCAL_IRQ_RESTORE;
 }
 
@@ -426,7 +429,7 @@ static inline void chipcHw_clearStickyBits(uint32_t mask)
 /****************************************************************************/
 static inline uint32_t chipcHw_getSoftStraps(void)
 {
-       return pChipcHw->SoftStraps;
+       return readl(&pChipcHw->SoftStraps);
 }
 
 /****************************************************************************/
@@ -456,7 +459,7 @@ static inline void chipcHw_setSoftStraps(uint32_t strapOptions)
 /****************************************************************************/
 static inline uint32_t chipcHw_getPinStraps(void)
 {
-       return pChipcHw->PinStraps;
+       return readl(&pChipcHw->PinStraps);
 }
 
 /****************************************************************************/
@@ -671,9 +674,9 @@ static inline void chipcHw_selectGE3(void)
 /****************************************************************************/
 static inline chipcHw_GPIO_FUNCTION_e chipcHw_getGpioPinFunction(int pin)
 {
-       return (*((uint32_t *) chipcHw_REG_GPIO_MUX(pin)) &
+       return (readl(chipcHw_REG_GPIO_MUX(pin))) &
                (chipcHw_REG_GPIO_MUX_MASK <<
-                chipcHw_REG_GPIO_MUX_POSITION(pin))) >>
+                chipcHw_REG_GPIO_MUX_POSITION(pin)) >>
            chipcHw_REG_GPIO_MUX_POSITION(pin);
 }
 
@@ -841,8 +844,8 @@ static inline void chipcHw_setUsbDevice(void)
 static inline void chipcHw_setClock(chipcHw_CLOCK_e clock,
                                    chipcHw_OPTYPE_e type, int mode)
 {
-       volatile uint32_t *pPLLReg = (uint32_t *) 0x0;
-       volatile uint32_t *pClockCtrl = (uint32_t *) 0x0;
+       uint32_t __iomem *pPLLReg = NULL;
+       uint32_t __iomem *pClockCtrl = NULL;
 
        switch (clock) {
        case chipcHw_CLOCK_DDR:
@@ -1071,7 +1074,7 @@ static inline void chipcHw_bypassClockDisable(chipcHw_CLOCK_e clock)
 /****************************************************************************/
 static inline int chipcHw_isSoftwareStrapsEnable(void)
 {
-       return pChipcHw->SoftStraps & 0x00000001;
+       return readl(&pChipcHw->SoftStraps) & 0x00000001;
 }
 
 /****************************************************************************/
@@ -1138,7 +1141,7 @@ static inline void chipcHw_pll2TestDisable(void)
 /****************************************************************************/
 static inline int chipcHw_isPllTestEnable(void)
 {
-       return pChipcHw->PLLConfig & chipcHw_REG_PLL_CONFIG_TEST_ENABLE;
+       return readl(&pChipcHw->PLLConfig) & chipcHw_REG_PLL_CONFIG_TEST_ENABLE;
 }
 
 /****************************************************************************/
@@ -1147,7 +1150,7 @@ static inline int chipcHw_isPllTestEnable(void)
 /****************************************************************************/
 static inline int chipcHw_isPll2TestEnable(void)
 {
-       return pChipcHw->PLLConfig2 & chipcHw_REG_PLL_CONFIG_TEST_ENABLE;
+       return readl(&pChipcHw->PLLConfig2) & chipcHw_REG_PLL_CONFIG_TEST_ENABLE;
 }
 
 /****************************************************************************/
@@ -1183,8 +1186,8 @@ static inline void chipcHw_pll2TestSelect(uint32_t val)
 /****************************************************************************/
 static inline uint8_t chipcHw_getPllTestSelected(void)
 {
-       return (uint8_t) ((pChipcHw->
-                          PLLConfig & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK)
+       return (uint8_t) ((readl(&pChipcHw->
+                          PLLConfig) & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK)
                          >> chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT);
 }
 
@@ -1194,8 +1197,8 @@ static inline uint8_t chipcHw_getPllTestSelected(void)
 /****************************************************************************/
 static inline uint8_t chipcHw_getPll2TestSelected(void)
 {
-       return (uint8_t) ((pChipcHw->
-                          PLLConfig2 & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK)
+       return (uint8_t) ((readl(&pChipcHw->
+                          PLLConfig2) & chipcHw_REG_PLL_CONFIG_TEST_SELECT_MASK)
                          >> chipcHw_REG_PLL_CONFIG_TEST_SELECT_SHIFT);
 }
 
@@ -1208,7 +1211,8 @@ static inline uint8_t chipcHw_getPll2TestSelected(void)
 static inline void chipcHw_pll1Disable(void)
 {
        REG_LOCAL_IRQ_SAVE;
-       pChipcHw->PLLConfig |= chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+       writel(readl(&pChipcHw->PLLConfig) | chipcHw_REG_PLL_CONFIG_POWER_DOWN,
+               &pChipcHw->PLLConfig);
        REG_LOCAL_IRQ_RESTORE;
 }
 
@@ -1221,7 +1225,8 @@ static inline void chipcHw_pll1Disable(void)
 static inline void chipcHw_pll2Disable(void)
 {
        REG_LOCAL_IRQ_SAVE;
-       pChipcHw->PLLConfig2 |= chipcHw_REG_PLL_CONFIG_POWER_DOWN;
+       writel(readl(&pChipcHw->PLLConfig2) | chipcHw_REG_PLL_CONFIG_POWER_DOWN,
+               &pChipcHw->PLLConfig2);
        REG_LOCAL_IRQ_RESTORE;
 }
 
@@ -1233,7 +1238,8 @@ static inline void chipcHw_pll2Disable(void)
 static inline void chipcHw_ddrPhaseAlignInterruptEnable(void)
 {
        REG_LOCAL_IRQ_SAVE;
-       pChipcHw->Spare1 |= chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE;
+       writel(readl(&pChipcHw->Spare1) | chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE,
+               &pChipcHw->Spare1);
        REG_LOCAL_IRQ_RESTORE;
 }
 
@@ -1245,7 +1251,8 @@ static inline void chipcHw_ddrPhaseAlignInterruptEnable(void)
 static inline void chipcHw_ddrPhaseAlignInterruptDisable(void)
 {
        REG_LOCAL_IRQ_SAVE;
-       pChipcHw->Spare1 &= ~chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE;
+       writel(readl(&pChipcHw->Spare1) & ~chipcHw_REG_SPARE1_DDR_PHASE_INTR_ENABLE,
+               &pChipcHw->Spare1);
        REG_LOCAL_IRQ_RESTORE;
 }
 
@@ -1333,7 +1340,8 @@ static inline void chipcHw_ddrHwPhaseAlignDisable(void)
 static inline void chipcHw_vpmSwPhaseAlignEnable(void)
 {
        REG_LOCAL_IRQ_SAVE;
-       pChipcHw->VPMPhaseCtrl1 |= chipcHw_REG_VPM_SW_PHASE_CTRL_ENABLE;
+       writel(readl(&pChipcHw->VPMPhaseCtrl1) | chipcHw_REG_VPM_SW_PHASE_CTRL_ENABLE,
+                       &pChipcHw->VPMPhaseCtrl1);
        REG_LOCAL_IRQ_RESTORE;
 }
 
@@ -1372,7 +1380,8 @@ static inline void chipcHw_vpmHwPhaseAlignEnable(void)
 static inline void chipcHw_vpmHwPhaseAlignDisable(void)
 {
        REG_LOCAL_IRQ_SAVE;
-       pChipcHw->VPMPhaseCtrl1 &= ~chipcHw_REG_VPM_HW_PHASE_CTRL_ENABLE;
+       writel(readl(&pChipcHw->VPMPhaseCtrl1) & ~chipcHw_REG_VPM_HW_PHASE_CTRL_ENABLE,
+               &pChipcHw->VPMPhaseCtrl1);
        REG_LOCAL_IRQ_RESTORE;
 }
 
@@ -1474,8 +1483,8 @@ chipcHw_setVpmHwPhaseAlignMargin(chipcHw_VPM_HW_PHASE_MARGIN_e margin)
 /****************************************************************************/
 static inline uint32_t chipcHw_isDdrHwPhaseAligned(void)
 {
-       return (pChipcHw->
-               PhaseAlignStatus & chipcHw_REG_DDR_PHASE_ALIGNED) ? 1 : 0;
+       return (readl(&pChipcHw->
+               PhaseAlignStatus) & chipcHw_REG_DDR_PHASE_ALIGNED) ? 1 : 0;
 }
 
 /****************************************************************************/
@@ -1488,8 +1497,8 @@ static inline uint32_t chipcHw_isDdrHwPhaseAligned(void)
 /****************************************************************************/
 static inline uint32_t chipcHw_isVpmHwPhaseAligned(void)
 {
-       return (pChipcHw->
-               PhaseAlignStatus & chipcHw_REG_VPM_PHASE_ALIGNED) ? 1 : 0;
+       return (readl(&pChipcHw->
+               PhaseAlignStatus) & chipcHw_REG_VPM_PHASE_ALIGNED) ? 1 : 0;
 }
 
 /****************************************************************************/
@@ -1500,8 +1509,8 @@ static inline uint32_t chipcHw_isVpmHwPhaseAligned(void)
 /****************************************************************************/
 static inline uint32_t chipcHw_getDdrHwPhaseAlignStatus(void)
 {
-       return (pChipcHw->
-               PhaseAlignStatus & chipcHw_REG_DDR_PHASE_STATUS_MASK) >>
+       return (readl(&pChipcHw->
+               PhaseAlignStatus) & chipcHw_REG_DDR_PHASE_STATUS_MASK) >>
            chipcHw_REG_DDR_PHASE_STATUS_SHIFT;
 }
 
@@ -1513,8 +1522,8 @@ static inline uint32_t chipcHw_getDdrHwPhaseAlignStatus(void)
 /****************************************************************************/
 static inline uint32_t chipcHw_getVpmHwPhaseAlignStatus(void)
 {
-       return (pChipcHw->
-               PhaseAlignStatus & chipcHw_REG_VPM_PHASE_STATUS_MASK) >>
+       return (readl(&pChipcHw->
+               PhaseAlignStatus) & chipcHw_REG_VPM_PHASE_STATUS_MASK) >>
            chipcHw_REG_VPM_PHASE_STATUS_SHIFT;
 }
 
@@ -1526,8 +1535,8 @@ static inline uint32_t chipcHw_getVpmHwPhaseAlignStatus(void)
 /****************************************************************************/
 static inline uint32_t chipcHw_getDdrPhaseControl(void)
 {
-       return (pChipcHw->
-               PhaseAlignStatus & chipcHw_REG_DDR_PHASE_CTRL_MASK) >>
+       return (readl(&pChipcHw->
+               PhaseAlignStatus) & chipcHw_REG_DDR_PHASE_CTRL_MASK) >>
            chipcHw_REG_DDR_PHASE_CTRL_SHIFT;
 }
 
@@ -1539,8 +1548,8 @@ static inline uint32_t chipcHw_getDdrPhaseControl(void)
 /****************************************************************************/
 static inline uint32_t chipcHw_getVpmPhaseControl(void)
 {
-       return (pChipcHw->
-               PhaseAlignStatus & chipcHw_REG_VPM_PHASE_CTRL_MASK) >>
+       return (readl(&pChipcHw->
+               PhaseAlignStatus) & chipcHw_REG_VPM_PHASE_CTRL_MASK) >>
            chipcHw_REG_VPM_PHASE_CTRL_SHIFT;
 }
 
index b162448..26f5d0e 100644 (file)
@@ -24,7 +24,7 @@
 #define CHIPCHW_REG_H
 
 #include <mach/csp/mm_io.h>
-#include <csp/reg.h>
+#include <mach/csp/reg.h>
 #include <mach/csp/ddrcReg.h>
 
 #define chipcHw_BASE_ADDRESS    MM_IO_BASE_CHIPC
@@ -131,8 +131,8 @@ typedef struct {
        uint32_t MiscInput_0_15;        /* Input type for MISC 0 - 16 */
 } chipcHw_REG_t;
 
-#define pChipcHw  ((volatile chipcHw_REG_t *) chipcHw_BASE_ADDRESS)
-#define pChipcPhysical  ((volatile chipcHw_REG_t *) MM_ADDR_IO_CHIPC)
+#define pChipcHw  ((chipcHw_REG_t __iomem *) chipcHw_BASE_ADDRESS)
+#define pChipcPhysical  (MM_ADDR_IO_CHIPC)
 
 #define chipcHw_REG_CHIPID_BASE_MASK                    0xFFFFF000
 #define chipcHw_REG_CHIPID_BASE_SHIFT                   12
index f1b68e2..39da2c1 100644 (file)
@@ -30,8 +30,8 @@ extern "C" {
 
 /* ---- Include Files ---------------------------------------------------- */
 
-#include <csp/reg.h>
-#include <csp/stdint.h>
+#include <mach/csp/reg.h>
+#include <linux/types.h>
 
 #include <mach/csp/mm_io.h>
 
@@ -416,7 +416,7 @@ extern "C" {
        } ddrcReg_PHY_ADDR_CTL_REG_t;
 
 #define ddrcReg_PHY_ADDR_CTL_REG_OFFSET                 0x0400
-#define ddrcReg_PHY_ADDR_CTL_REGP                       ((volatile ddrcReg_PHY_ADDR_CTL_REG_t *) (MM_IO_BASE_DDRC + ddrcReg_PHY_ADDR_CTL_REG_OFFSET))
+#define ddrcReg_PHY_ADDR_CTL_REGP                       ((volatile ddrcReg_PHY_ADDR_CTL_REG_t __iomem*) (MM_IO_BASE_DDRC + ddrcReg_PHY_ADDR_CTL_REG_OFFSET))
 
 /* @todo These SS definitions are duplicates of ones below */
 
similarity index 99%
rename from arch/arm/mach-bcmring/include/csp/dmacHw.h
rename to arch/arm/mach-bcmring/include/mach/csp/dmacHw.h
index e6a1dc4..9dc90f4 100644 (file)
@@ -23,9 +23,9 @@
 #ifndef _DMACHW_H
 #define _DMACHW_H
 
-#include <stddef.h>
+#include <linux/stddef.h>
 
-#include <csp/stdint.h>
+#include <linux/types.h>
 #include <mach/csp/dmacHw_reg.h>
 
 /* Define DMA Channel ID using DMA controller number (m) and channel number (c).
index d67e2f8..9d9455e 100644 (file)
@@ -24,7 +24,7 @@
 #ifndef _DMACHW_PRIV_H
 #define _DMACHW_PRIV_H
 
-#include <csp/stdint.h>
+#include <linux/types.h>
 
 /* Data type for DMA Link List Item */
 typedef struct {
index f1ecf96..7cd0aaf 100644 (file)
@@ -24,7 +24,7 @@
 #ifndef _DMACHW_REG_H
 #define _DMACHW_REG_H
 
-#include <csp/stdint.h>
+#include <linux/types.h>
 #include <mach/csp/mm_io.h>
 
 /* Data type for 64 bit little endian register */
@@ -121,75 +121,75 @@ typedef struct {
 } dmacHw_MISC_t;
 
 /* Base registers */
-#define dmacHw_0_MODULE_BASE_ADDR        (char *) MM_IO_BASE_DMA0      /* DMAC 0 module's base address */
-#define dmacHw_1_MODULE_BASE_ADDR        (char *) MM_IO_BASE_DMA1      /* DMAC 1 module's base address */
+#define dmacHw_0_MODULE_BASE_ADDR        (char __iomem*) MM_IO_BASE_DMA0       /* DMAC 0 module's base address */
+#define dmacHw_1_MODULE_BASE_ADDR        (char __iomem*) MM_IO_BASE_DMA1       /* DMAC 1 module's base address */
 
 extern uint32_t dmaChannelCount_0;
 extern uint32_t dmaChannelCount_1;
 
 /* Define channel specific registers */
-#define dmacHw_CHAN_BASE(module, chan)          ((dmacHw_CH_REG_t *) ((char *)((module) ? dmacHw_1_MODULE_BASE_ADDR : dmacHw_0_MODULE_BASE_ADDR) + ((chan) * sizeof(dmacHw_CH_REG_t))))
+#define dmacHw_CHAN_BASE(module, chan)          ((dmacHw_CH_REG_t __iomem*) ((char __iomem*)((module) ? dmacHw_1_MODULE_BASE_ADDR : dmacHw_0_MODULE_BASE_ADDR) + ((chan) * sizeof(dmacHw_CH_REG_t))))
 
 /* Raw interrupt status registers */
-#define dmacHw_REG_INT_RAW_BASE(module)         ((char *)dmacHw_CHAN_BASE((module), ((module) ? dmaChannelCount_1 : dmaChannelCount_0)))
-#define dmacHw_REG_INT_RAW_TRAN(module)         (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawTfr.lo)
-#define dmacHw_REG_INT_RAW_BLOCK(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawBlock.lo)
-#define dmacHw_REG_INT_RAW_STRAN(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawSrcTran.lo)
-#define dmacHw_REG_INT_RAW_DTRAN(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawDstTran.lo)
-#define dmacHw_REG_INT_RAW_ERROR(module)        (((dmacHw_INT_RAW_t *) dmacHw_REG_INT_RAW_BASE((module)))->RawErr.lo)
+#define dmacHw_REG_INT_RAW_BASE(module)         ((char __iomem *)dmacHw_CHAN_BASE((module), ((module) ? dmaChannelCount_1 : dmaChannelCount_0)))
+#define dmacHw_REG_INT_RAW_TRAN(module)         (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawTfr.lo)
+#define dmacHw_REG_INT_RAW_BLOCK(module)        (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawBlock.lo)
+#define dmacHw_REG_INT_RAW_STRAN(module)        (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawSrcTran.lo)
+#define dmacHw_REG_INT_RAW_DTRAN(module)        (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawDstTran.lo)
+#define dmacHw_REG_INT_RAW_ERROR(module)        (((dmacHw_INT_RAW_t __iomem *) dmacHw_REG_INT_RAW_BASE((module)))->RawErr.lo)
 
 /* Interrupt status registers */
-#define dmacHw_REG_INT_STAT_BASE(module)        ((char *)(dmacHw_REG_INT_RAW_BASE((module)) + sizeof(dmacHw_INT_RAW_t)))
-#define dmacHw_REG_INT_STAT_TRAN(module)        (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusTfr.lo)
-#define dmacHw_REG_INT_STAT_BLOCK(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusBlock.lo)
-#define dmacHw_REG_INT_STAT_STRAN(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusSrcTran.lo)
-#define dmacHw_REG_INT_STAT_DTRAN(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusDstTran.lo)
-#define dmacHw_REG_INT_STAT_ERROR(module)       (((dmacHw_INT_STATUS_t *) dmacHw_REG_INT_STAT_BASE((module)))->StatusErr.lo)
+#define dmacHw_REG_INT_STAT_BASE(module)        ((char __iomem*)(dmacHw_REG_INT_RAW_BASE((module)) + sizeof(dmacHw_INT_RAW_t)))
+#define dmacHw_REG_INT_STAT_TRAN(module)        (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusTfr.lo)
+#define dmacHw_REG_INT_STAT_BLOCK(module)       (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusBlock.lo)
+#define dmacHw_REG_INT_STAT_STRAN(module)       (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusSrcTran.lo)
+#define dmacHw_REG_INT_STAT_DTRAN(module)       (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusDstTran.lo)
+#define dmacHw_REG_INT_STAT_ERROR(module)       (((dmacHw_INT_STATUS_t __iomem *) dmacHw_REG_INT_STAT_BASE((module)))->StatusErr.lo)
 
 /* Interrupt status registers */
-#define dmacHw_REG_INT_MASK_BASE(module)        ((char *)(dmacHw_REG_INT_STAT_BASE((module)) + sizeof(dmacHw_INT_STATUS_t)))
-#define dmacHw_REG_INT_MASK_TRAN(module)        (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskTfr.lo)
-#define dmacHw_REG_INT_MASK_BLOCK(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskBlock.lo)
-#define dmacHw_REG_INT_MASK_STRAN(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskSrcTran.lo)
-#define dmacHw_REG_INT_MASK_DTRAN(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskDstTran.lo)
-#define dmacHw_REG_INT_MASK_ERROR(module)       (((dmacHw_INT_MASK_t *) dmacHw_REG_INT_MASK_BASE((module)))->MaskErr.lo)
+#define dmacHw_REG_INT_MASK_BASE(module)        ((char __iomem*)(dmacHw_REG_INT_STAT_BASE((module)) + sizeof(dmacHw_INT_STATUS_t)))
+#define dmacHw_REG_INT_MASK_TRAN(module)        (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskTfr.lo)
+#define dmacHw_REG_INT_MASK_BLOCK(module)       (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskBlock.lo)
+#define dmacHw_REG_INT_MASK_STRAN(module)       (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskSrcTran.lo)
+#define dmacHw_REG_INT_MASK_DTRAN(module)       (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskDstTran.lo)
+#define dmacHw_REG_INT_MASK_ERROR(module)       (((dmacHw_INT_MASK_t __iomem *) dmacHw_REG_INT_MASK_BASE((module)))->MaskErr.lo)
 
 /* Interrupt clear registers */
-#define dmacHw_REG_INT_CLEAR_BASE(module)       ((char *)(dmacHw_REG_INT_MASK_BASE((module)) + sizeof(dmacHw_INT_MASK_t)))
-#define dmacHw_REG_INT_CLEAR_TRAN(module)       (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearTfr.lo)
-#define dmacHw_REG_INT_CLEAR_BLOCK(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearBlock.lo)
-#define dmacHw_REG_INT_CLEAR_STRAN(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearSrcTran.lo)
-#define dmacHw_REG_INT_CLEAR_DTRAN(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearDstTran.lo)
-#define dmacHw_REG_INT_CLEAR_ERROR(module)      (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearErr.lo)
-#define dmacHw_REG_INT_STATUS(module)           (((dmacHw_INT_CLEAR_t *) dmacHw_REG_INT_CLEAR_BASE((module)))->StatusInt.lo)
+#define dmacHw_REG_INT_CLEAR_BASE(module)       ((char __iomem*)(dmacHw_REG_INT_MASK_BASE((module)) + sizeof(dmacHw_INT_MASK_t)))
+#define dmacHw_REG_INT_CLEAR_TRAN(module)       (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearTfr.lo)
+#define dmacHw_REG_INT_CLEAR_BLOCK(module)      (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearBlock.lo)
+#define dmacHw_REG_INT_CLEAR_STRAN(module)      (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearSrcTran.lo)
+#define dmacHw_REG_INT_CLEAR_DTRAN(module)      (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearDstTran.lo)
+#define dmacHw_REG_INT_CLEAR_ERROR(module)      (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->ClearErr.lo)
+#define dmacHw_REG_INT_STATUS(module)           (((dmacHw_INT_CLEAR_t __iomem *) dmacHw_REG_INT_CLEAR_BASE((module)))->StatusInt.lo)
 
 /* Software handshaking registers */
-#define dmacHw_REG_SW_HS_BASE(module)           ((char *)(dmacHw_REG_INT_CLEAR_BASE((module)) + sizeof(dmacHw_INT_CLEAR_t)))
-#define dmacHw_REG_SW_HS_SRC_REQ(module)        (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->ReqSrcReg.lo)
-#define dmacHw_REG_SW_HS_DST_REQ(module)        (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->ReqDstReg.lo)
-#define dmacHw_REG_SW_HS_SRC_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->SglReqSrcReg.lo)
-#define dmacHw_REG_SW_HS_DST_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->SglReqDstReg.lo)
-#define dmacHw_REG_SW_HS_SRC_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->LstSrcReg.lo)
-#define dmacHw_REG_SW_HS_DST_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t *) dmacHw_REG_SW_HS_BASE((module)))->LstDstReg.lo)
+#define dmacHw_REG_SW_HS_BASE(module)           ((char __iomem*)(dmacHw_REG_INT_CLEAR_BASE((module)) + sizeof(dmacHw_INT_CLEAR_t)))
+#define dmacHw_REG_SW_HS_SRC_REQ(module)        (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->ReqSrcReg.lo)
+#define dmacHw_REG_SW_HS_DST_REQ(module)        (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->ReqDstReg.lo)
+#define dmacHw_REG_SW_HS_SRC_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->SglReqSrcReg.lo)
+#define dmacHw_REG_SW_HS_DST_SGL_REQ(module)    (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->SglReqDstReg.lo)
+#define dmacHw_REG_SW_HS_SRC_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->LstSrcReg.lo)
+#define dmacHw_REG_SW_HS_DST_LST_REQ(module)    (((dmacHw_SW_HANDSHAKE_t __iomem *) dmacHw_REG_SW_HS_BASE((module)))->LstDstReg.lo)
 
 /* Miscellaneous registers */
-#define dmacHw_REG_MISC_BASE(module)            ((char *)(dmacHw_REG_SW_HS_BASE((module)) + sizeof(dmacHw_SW_HANDSHAKE_t)))
-#define dmacHw_REG_MISC_CFG(module)             (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->DmaCfgReg.lo)
-#define dmacHw_REG_MISC_CH_ENABLE(module)       (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->ChEnReg.lo)
-#define dmacHw_REG_MISC_ID(module)              (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->DmaIdReg.lo)
-#define dmacHw_REG_MISC_TEST(module)            (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->DmaTestReg.lo)
-#define dmacHw_REG_MISC_COMP_PARAM1_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm1.lo)
-#define dmacHw_REG_MISC_COMP_PARAM1_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm1.hi)
-#define dmacHw_REG_MISC_COMP_PARAM2_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm2.lo)
-#define dmacHw_REG_MISC_COMP_PARAM2_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm2.hi)
-#define dmacHw_REG_MISC_COMP_PARAM3_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm3.lo)
-#define dmacHw_REG_MISC_COMP_PARAM3_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm3.hi)
-#define dmacHw_REG_MISC_COMP_PARAM4_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm4.lo)
-#define dmacHw_REG_MISC_COMP_PARAM4_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm4.hi)
-#define dmacHw_REG_MISC_COMP_PARAM5_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm5.lo)
-#define dmacHw_REG_MISC_COMP_PARAM5_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm5.hi)
-#define dmacHw_REG_MISC_COMP_PARAM6_LO(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm6.lo)
-#define dmacHw_REG_MISC_COMP_PARAM6_HI(module)  (((dmacHw_MISC_t *) dmacHw_REG_MISC_BASE((module)))->CompParm6.hi)
+#define dmacHw_REG_MISC_BASE(module)            ((char __iomem*)(dmacHw_REG_SW_HS_BASE((module)) + sizeof(dmacHw_SW_HANDSHAKE_t)))
+#define dmacHw_REG_MISC_CFG(module)             (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->DmaCfgReg.lo)
+#define dmacHw_REG_MISC_CH_ENABLE(module)       (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->ChEnReg.lo)
+#define dmacHw_REG_MISC_ID(module)              (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->DmaIdReg.lo)
+#define dmacHw_REG_MISC_TEST(module)            (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->DmaTestReg.lo)
+#define dmacHw_REG_MISC_COMP_PARAM1_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm1.lo)
+#define dmacHw_REG_MISC_COMP_PARAM1_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm1.hi)
+#define dmacHw_REG_MISC_COMP_PARAM2_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm2.lo)
+#define dmacHw_REG_MISC_COMP_PARAM2_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm2.hi)
+#define dmacHw_REG_MISC_COMP_PARAM3_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm3.lo)
+#define dmacHw_REG_MISC_COMP_PARAM3_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm3.hi)
+#define dmacHw_REG_MISC_COMP_PARAM4_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm4.lo)
+#define dmacHw_REG_MISC_COMP_PARAM4_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm4.hi)
+#define dmacHw_REG_MISC_COMP_PARAM5_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm5.lo)
+#define dmacHw_REG_MISC_COMP_PARAM5_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm5.hi)
+#define dmacHw_REG_MISC_COMP_PARAM6_LO(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm6.lo)
+#define dmacHw_REG_MISC_COMP_PARAM6_HI(module)  (((dmacHw_MISC_t __iomem*) dmacHw_REG_MISC_BASE((module)))->CompParm6.hi)
 
 /* Channel control registers */
 #define dmacHw_REG_SAR(module, chan)            (dmacHw_CHAN_BASE((module), (chan))->ChannelSar.lo)
index cfa91be..27f59dd 100644 (file)
@@ -18,7 +18,7 @@
 
 /* ---- Include Files ---------------------------------------------------- */
 
-#include <cfg_global.h>
+#include <mach/cfg_global.h>
 #include <mach/csp/cap_inline.h>
 
 #if defined(__KERNEL__)
index 0aeb6a6..f59db25 100644 (file)
@@ -27,8 +27,8 @@
 #define _INTCHW_REG_H
 
 /* ---- Include Files ---------------------------------------------------- */
-#include <csp/stdint.h>
-#include <csp/reg.h>
+#include <linux/types.h>
+#include <mach/csp/reg.h>
 #include <mach/csp/mm_io.h>
 
 /* ---- Public Constants and Types --------------------------------------- */
@@ -37,9 +37,9 @@
 #define INTCHW_NUM_INTC           3
 
 /* Defines for interrupt controllers. This simplifies and cleans up the function calls. */
-#define INTCHW_INTC0    ((void *)MM_IO_BASE_INTC0)
-#define INTCHW_INTC1    ((void *)MM_IO_BASE_INTC1)
-#define INTCHW_SINTC    ((void *)MM_IO_BASE_SINTC)
+#define INTCHW_INTC0    (MM_IO_BASE_INTC0)
+#define INTCHW_INTC1    (MM_IO_BASE_INTC1)
+#define INTCHW_SINTC    (MM_IO_BASE_SINTC)
 
 /* INTC0 - interrupt controller 0 */
 #define INTCHW_INTC0_PIF_BITNUM           31   /* Peripheral interface interrupt */
 /* ---- Public Variable Externs ------------------------------------------ */
 /* ---- Public Function Prototypes --------------------------------------- */
 /* Clear one or more IRQ interrupts. */
-static inline void intcHw_irq_disable(void *basep, uint32_t mask)
+static inline void intcHw_irq_disable(void __iomem *basep, uint32_t mask)
 {
-       __REG32(basep + INTCHW_INTENCLEAR) = mask;
+       writel(mask, basep + INTCHW_INTENCLEAR);
 }
 
 /* Enables one or more IRQ interrupts. */
-static inline void intcHw_irq_enable(void *basep, uint32_t mask)
+static inline void intcHw_irq_enable(void __iomem *basep, uint32_t mask)
 {
-       __REG32(basep + INTCHW_INTENABLE) = mask;
+       writel(mask, basep + INTCHW_INTENABLE);
 }
 
 #endif /* _INTCHW_REG_H */
index ad58cf8..d571962 100644 (file)
@@ -29,7 +29,7 @@
 /* ---- Include Files ---------------------------------------------------- */
 
 #if !defined(CSP_SIMULATION)
-#include <cfg_global.h>
+#include <mach/cfg_global.h>
 #endif
 
 /* ---- Public Constants and Types --------------------------------------- */
index de92ec6..47450c2 100644 (file)
@@ -30,7 +30,7 @@
 #include <mach/csp/mm_addr.h>
 
 #if !defined(CSP_SIMULATION)
-#include <cfg_global.h>
+#include <mach/cfg_global.h>
 #endif
 
 /* ---- Public Constants and Types --------------------------------------- */
@@ -49,7 +49,7 @@
 #ifdef __ASSEMBLY__
 #define MM_IO_PHYS_TO_VIRT(phys)       (0xF0000000 | (((phys) >> 4) & 0x0F000000) | ((phys) & 0xFFFFFF))
 #else
-#define MM_IO_PHYS_TO_VIRT(phys)       (((phys) == MM_ADDR_IO_VPM_EXTMEM_RSVD) ? 0xF0000000 : \
+#define MM_IO_PHYS_TO_VIRT(phys)       (void __iomem *)(((phys) == MM_ADDR_IO_VPM_EXTMEM_RSVD) ? 0xF0000000 : \
                        (0xF0000000 | (((phys) >> 4) & 0x0F000000) | ((phys) & 0xFFFFFF)))
 #endif
 #endif
@@ -60,8 +60,8 @@
 #ifdef __ASSEMBLY__
 #define MM_IO_VIRT_TO_PHYS(virt)       ((((virt) & 0x0F000000) << 4) | ((virt) & 0xFFFFFF))
 #else
-#define MM_IO_VIRT_TO_PHYS(virt)       (((virt) == 0xF0000000) ? MM_ADDR_IO_VPM_EXTMEM_RSVD : \
-                       ((((virt) & 0x0F000000) << 4) | ((virt) & 0xFFFFFF)))
+#define MM_IO_VIRT_TO_PHYS(virt)       (((unsigned long)(virt) == 0xF0000000) ? MM_ADDR_IO_VPM_EXTMEM_RSVD : \
+                       ((((unsigned long)(virt) & 0x0F000000) << 4) | ((unsigned long)(virt) & 0xFFFFFF)))
 #endif
 #endif
 
similarity index 81%
rename from arch/arm/mach-bcmring/include/csp/reg.h
rename to arch/arm/mach-bcmring/include/mach/csp/reg.h
index 56654d2..d9cbdca 100644 (file)
 
 /* ---- Include Files ---------------------------------------------------- */
 
-#include <csp/stdint.h>
+#include <linux/types.h>
+#include <linux/io.h>
 
 /* ---- Public Constants and Types --------------------------------------- */
 
-#define __REG32(x)      (*((volatile uint32_t *)(x)))
-#define __REG16(x)      (*((volatile uint16_t *)(x)))
-#define __REG8(x)       (*((volatile uint8_t *) (x)))
+#define __REG32(x)      (*((volatile uint32_t __iomem *)(x)))
+#define __REG16(x)      (*((volatile uint16_t __iomem *)(x)))
+#define __REG8(x)       (*((volatile uint8_t __iomem *) (x)))
 
 /* Macros used to define a sequence of reserved registers. The start / end */
 /* are byte offsets in the particular register definition, with the "end" */
 
 #endif
 
-static inline void reg32_modify_and(volatile uint32_t *reg, uint32_t value)
+static inline void reg32_modify_and(volatile uint32_t __iomem *reg, uint32_t value)
 {
        REG_LOCAL_IRQ_SAVE;
-       *reg &= value;
+       __raw_writel(__raw_readl(reg) & value, reg);
        REG_LOCAL_IRQ_RESTORE;
 }
 
-static inline void reg32_modify_or(volatile uint32_t *reg, uint32_t value)
+static inline void reg32_modify_or(volatile uint32_t __iomem *reg, uint32_t value)
 {
        REG_LOCAL_IRQ_SAVE;
-       *reg |= value;
+       __raw_writel(__raw_readl(reg) | value, reg);
        REG_LOCAL_IRQ_RESTORE;
 }
 
-static inline void reg32_modify_mask(volatile uint32_t *reg, uint32_t mask,
+static inline void reg32_modify_mask(volatile uint32_t __iomem *reg, uint32_t mask,
                                     uint32_t value)
 {
        REG_LOCAL_IRQ_SAVE;
-       *reg = (*reg & mask) | value;
+       __raw_writel((__raw_readl(reg) & mask) | value, reg);
        REG_LOCAL_IRQ_RESTORE;
 }
 
-static inline void reg32_write(volatile uint32_t *reg, uint32_t value)
+static inline void reg32_write(volatile uint32_t __iomem *reg, uint32_t value)
 {
-       *reg = value;
+       __raw_writel(value, reg);
 }
 
 #endif /* CSP_REG_H */
index 9cd6a03..55d3cd4 100644 (file)
@@ -34,7 +34,7 @@
 /****************************************************************************/
 static inline void secHw_setSecure(uint32_t mask       /*  mask of type secHw_BLK_MASK_XXXXXX */
     ) {
-       secHw_REGS_t *regp = (secHw_REGS_t *) MM_IO_BASE_TZPC;
+       secHw_REGS_t __iomem *regp = MM_IO_BASE_TZPC;
 
        if (mask & 0x0000FFFF) {
                regp->reg[secHw_IDX_LS].setSecure = mask & 0x0000FFFF;
@@ -53,13 +53,13 @@ static inline void secHw_setSecure(uint32_t mask    /*  mask of type secHw_BLK_MASK
 /****************************************************************************/
 static inline void secHw_setUnsecure(uint32_t mask     /*  mask of type secHw_BLK_MASK_XXXXXX */
     ) {
-       secHw_REGS_t *regp = (secHw_REGS_t *) MM_IO_BASE_TZPC;
+       secHw_REGS_t __iomem *regp = MM_IO_BASE_TZPC;
 
        if (mask & 0x0000FFFF) {
-               regp->reg[secHw_IDX_LS].setUnsecure = mask & 0x0000FFFF;
+               writel(mask & 0x0000FFFF, &regp->reg[secHw_IDX_LS].setUnsecure);
        }
        if (mask & 0xFFFF0000) {
-               regp->reg[secHw_IDX_MS].setUnsecure = mask >> 16;
+               writel(mask >> 16, &regp->reg[secHw_IDX_MS].setUnsecure);
        }
 }
 
@@ -71,7 +71,7 @@ static inline void secHw_setUnsecure(uint32_t mask    /*  mask of type secHw_BLK_MA
 /****************************************************************************/
 static inline uint32_t secHw_getStatus(void)
 {
-       secHw_REGS_t *regp = (secHw_REGS_t *) MM_IO_BASE_TZPC;
+       secHw_REGS_t __iomem *regp = MM_IO_BASE_TZPC;
 
        return (regp->reg[1].status << 16) + regp->reg[0].status;
 }
similarity index 99%
rename from arch/arm/mach-bcmring/include/csp/tmrHw.h
rename to arch/arm/mach-bcmring/include/mach/csp/tmrHw.h
index 2cbb530..1cc882a 100644 (file)
@@ -23,7 +23,7 @@
 #ifndef _TMRHW_H
 #define _TMRHW_H
 
-#include <csp/stdint.h>
+#include <linux/types.h>
 
 typedef uint32_t tmrHw_ID_t;   /* Timer ID */
 typedef uint32_t tmrHw_COUNT_t;        /* Timer count */
index 7254378..13e0138 100644 (file)
@@ -27,7 +27,7 @@
 
 #include <linux/kernel.h>
 #include <linux/semaphore.h>
-#include <csp/dmacHw.h>
+#include <mach/csp/dmacHw.h>
 #include <mach/timer.h>
 
 /* ---- Constants and Types ---------------------------------------------- */
index 6ae20a6..a0c92b4 100644 (file)
@@ -22,7 +22,7 @@
 #define __ASM_ARCH_HARDWARE_H
 
 #include <asm/sizes.h>
-#include <cfg_global.h>
+#include <mach/cfg_global.h>
 #include <mach/csp/mm_io.h>
 
 /* Hardware addresses of major areas.
index 387376f..f8d51a8 100644 (file)
@@ -30,7 +30,7 @@
 #define __ASM_ARCH_REG_NAND_H
 
 /* ---- Include Files ---------------------------------------------------- */
-#include <csp/reg.h>
+#include <mach/csp/reg.h>
 #include <mach/reg_umi.h>
 
 /* ---- Constants and Types ---------------------------------------------- */
index 0992842..56dd9de 100644 (file)
@@ -30,7 +30,7 @@
 #define __ASM_ARCH_REG_UMI_H
 
 /* ---- Include Files ---------------------------------------------------- */
-#include <csp/reg.h>
+#include <mach/csp/reg.h>
 #include <mach/csp/mm_io.h>
 
 /* ---- Constants and Types ---------------------------------------------- */
 #define REG_UMI_BCH_ERR_LOC_WORD              0x00000018
 /* location within a page (512 byte) */
 #define REG_UMI_BCH_ERR_LOC_PAGE              0x00001FE0
-#define REG_UMI_BCH_ERR_LOC_ADDR(index)     (__REG32(HW_UMI_BASE + 0x64 + (index / 2)*4) >> ((index % 2) * 16))
+#define REG_UMI_BCH_ERR_LOC_ADDR(index)     (readl(HW_UMI_BASE + 0x64 + (index / 2)*4) >> ((index % 2) * 16))
 #endif
index 1adec78..33824a8 100644 (file)
 #include <mach/hardware.h>
 #include <mach/csp/mm_io.h>
 
-#define IO_DESC(va, sz) { .virtual = va, \
+#define IO_DESC(va, sz) { .virtual = (unsigned long)va, \
        .pfn = __phys_to_pfn(HW_IO_VIRT_TO_PHYS(va)), \
        .length = sz, \
        .type = MT_DEVICE }
 
-#define MEM_DESC(va, sz) { .virtual = va, \
+#define MEM_DESC(va, sz) { .virtual = (unsigned long)va, \
        .pfn = __phys_to_pfn(HW_IO_VIRT_TO_PHYS(va)), \
        .length = sz, \
        .type = MT_MEMORY }
index af9c3d7..5941290 100644 (file)
@@ -14,7 +14,7 @@
 
 #include <linux/types.h>
 #include <linux/module.h>
-#include <csp/tmrHw.h>
+#include <mach/csp/tmrHw.h>
 
 #include <mach/timer.h>
 /* The core.c file initializes timers 1 and 3 as a linux clocksource. */
index 6321567..bd54d7b 100644 (file)
@@ -49,16 +49,6 @@ static struct map_desc dove_io_desc[] __initdata = {
                .pfn            = __phys_to_pfn(DOVE_NB_REGS_PHYS_BASE),
                .length         = DOVE_NB_REGS_SIZE,
                .type           = MT_DEVICE,
-       }, {
-               .virtual        = DOVE_PCIE0_IO_VIRT_BASE,
-               .pfn            = __phys_to_pfn(DOVE_PCIE0_IO_PHYS_BASE),
-               .length         = DOVE_PCIE0_IO_SIZE,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = DOVE_PCIE1_IO_VIRT_BASE,
-               .pfn            = __phys_to_pfn(DOVE_PCIE1_IO_PHYS_BASE),
-               .length         = DOVE_PCIE1_IO_SIZE,
-               .type           = MT_DEVICE,
        },
 };
 
@@ -289,7 +279,7 @@ void __init dove_init(void)
        printk(KERN_INFO "TCLK = %dMHz\n", (get_tclk() + 499999) / 1000000);
 
 #ifdef CONFIG_CACHE_TAUROS2
-       tauros2_init();
+       tauros2_init(0);
 #endif
        dove_setup_cpu_mbus();
 
index d52b0ef..c91e300 100644 (file)
 #define DOVE_NB_REGS_SIZE              SZ_8M
 
 #define DOVE_PCIE0_IO_PHYS_BASE                0xf2000000
-#define DOVE_PCIE0_IO_VIRT_BASE                0xfee00000
 #define DOVE_PCIE0_IO_BUS_BASE         0x00000000
-#define DOVE_PCIE0_IO_SIZE             SZ_1M
+#define DOVE_PCIE0_IO_SIZE             SZ_64K
 
 #define DOVE_PCIE1_IO_PHYS_BASE                0xf2100000
-#define DOVE_PCIE1_IO_VIRT_BASE                0xfef00000
-#define DOVE_PCIE1_IO_BUS_BASE         0x00100000
-#define DOVE_PCIE1_IO_SIZE             SZ_1M
+#define DOVE_PCIE1_IO_BUS_BASE         0x00010000
+#define DOVE_PCIE1_IO_SIZE             SZ_64K
 
 /*
  * Dove Core Registers Map
diff --git a/arch/arm/mach-dove/include/mach/io.h b/arch/arm/mach-dove/include/mach/io.h
deleted file mode 100644 (file)
index 29c8b85..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * arch/arm/mach-dove/include/mach/io.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 __ASM_ARCH_IO_H
-#define __ASM_ARCH_IO_H
-
-#include "dove.h"
-
-#define IO_SPACE_LIMIT         0xffffffff
-
-#define __io(a)        ((void __iomem *)(((a) - DOVE_PCIE0_IO_BUS_BASE) + \
-                                                DOVE_PCIE0_IO_VIRT_BASE))
-
-#endif
index 47921b0..355332d 100644 (file)
@@ -26,9 +26,8 @@ struct pcie_port {
        u8                      root_bus_nr;
        void __iomem            *base;
        spinlock_t              conf_lock;
-       char                    io_space_name[16];
        char                    mem_space_name[16];
-       struct resource         res[2];
+       struct resource         res;
 };
 
 static struct pcie_port pcie_port[2];
@@ -53,24 +52,10 @@ static int __init dove_pcie_setup(int nr, struct pci_sys_data *sys)
 
        orion_pcie_setup(pp->base);
 
-       /*
-        * IORESOURCE_IO
-        */
-       snprintf(pp->io_space_name, sizeof(pp->io_space_name),
-                "PCIe %d I/O", pp->index);
-       pp->io_space_name[sizeof(pp->io_space_name) - 1] = 0;
-       pp->res[0].name = pp->io_space_name;
-       if (pp->index == 0) {
-               pp->res[0].start = DOVE_PCIE0_IO_PHYS_BASE;
-               pp->res[0].end = pp->res[0].start + DOVE_PCIE0_IO_SIZE - 1;
-       } else {
-               pp->res[0].start = DOVE_PCIE1_IO_PHYS_BASE;
-               pp->res[0].end = pp->res[0].start + DOVE_PCIE1_IO_SIZE - 1;
-       }
-       pp->res[0].flags = IORESOURCE_IO;
-       if (request_resource(&ioport_resource, &pp->res[0]))
-               panic("Request PCIe IO resource failed\n");
-       pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset);
+       if (pp->index == 0)
+               pci_ioremap_io(sys->busnr * SZ_64K, DOVE_PCIE0_IO_PHYS_BASE);
+       else
+               pci_ioremap_io(sys->busnr * SZ_64K, DOVE_PCIE1_IO_PHYS_BASE);
 
        /*
         * IORESOURCE_MEM
@@ -78,18 +63,18 @@ static int __init dove_pcie_setup(int nr, struct pci_sys_data *sys)
        snprintf(pp->mem_space_name, sizeof(pp->mem_space_name),
                 "PCIe %d MEM", pp->index);
        pp->mem_space_name[sizeof(pp->mem_space_name) - 1] = 0;
-       pp->res[1].name = pp->mem_space_name;
+       pp->res.name = pp->mem_space_name;
        if (pp->index == 0) {
-               pp->res[1].start = DOVE_PCIE0_MEM_PHYS_BASE;
-               pp->res[1].end = pp->res[1].start + DOVE_PCIE0_MEM_SIZE - 1;
+               pp->res.start = DOVE_PCIE0_MEM_PHYS_BASE;
+               pp->res.end = pp->res.start + DOVE_PCIE0_MEM_SIZE - 1;
        } else {
-               pp->res[1].start = DOVE_PCIE1_MEM_PHYS_BASE;
-               pp->res[1].end = pp->res[1].start + DOVE_PCIE1_MEM_SIZE - 1;
+               pp->res.start = DOVE_PCIE1_MEM_PHYS_BASE;
+               pp->res.end = pp->res.start + DOVE_PCIE1_MEM_SIZE - 1;
        }
-       pp->res[1].flags = IORESOURCE_MEM;
-       if (request_resource(&iomem_resource, &pp->res[1]))
+       pp->res.flags = IORESOURCE_MEM;
+       if (request_resource(&iomem_resource, &pp->res))
                panic("Request PCIe Memory resource failed\n");
-       pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset);
+       pci_add_resource_offset(&sys->resources, &pp->res, sys->mem_offset);
 
        return 1;
 }
@@ -210,7 +195,7 @@ static void __init add_pcie_port(int index, unsigned long base)
                pp->root_bus_nr = -1;
                pp->base = (void __iomem *)base;
                spin_lock_init(&pp->conf_lock);
-               memset(pp->res, 0, sizeof(pp->res));
+               memset(&pp->res, 0, sizeof(pp->res));
        } else {
                printk(KERN_INFO "link down, ignoring\n");
        }
index 774533c..3b00e29 100644 (file)
@@ -166,11 +166,6 @@ static int exynos5_clk_ip_gen_ctrl(struct clk *clk, int enable)
        return s5p_gatectrl(EXYNOS5_CLKGATE_IP_GEN, clk, enable);
 }
 
-static int exynos5_clk_ip_gps_ctrl(struct clk *clk, int enable)
-{
-       return s5p_gatectrl(EXYNOS5_CLKGATE_IP_GPS, clk, enable);
-}
-
 static int exynos5_clk_ip_mfc_ctrl(struct clk *clk, int enable)
 {
        return s5p_gatectrl(EXYNOS5_CLKGATE_IP_MFC, clk, enable);
@@ -672,10 +667,6 @@ static struct clk exynos5_init_clocks_off[] = {
                .enable         = exynos5_clk_ip_fsys_ctrl,
                .ctrlbit        = (1 << 7),
        }, {
-               .name           = "gps",
-               .enable         = exynos5_clk_ip_gps_ctrl,
-               .ctrlbit        = ((1 << 3) | (1 << 2) | (1 << 0)),
-       }, {
                .name           = "nfcon",
                .enable         = exynos5_clk_ip_fsys_ctrl,
                .ctrlbit        = (1 << 22),
index c72b675..9d1f3ac 100644 (file)
 #define EXYNOS5_PA_SYSMMU_JPEG         0x11F20000
 #define EXYNOS5_PA_SYSMMU_IOP          0x12360000
 #define EXYNOS5_PA_SYSMMU_RTIC         0x12370000
-#define EXYNOS5_PA_SYSMMU_GPS          0x12630000
 #define EXYNOS5_PA_SYSMMU_ISP          0x13260000
 #define EXYNOS5_PA_SYSMMU_DRC          0x12370000
 #define EXYNOS5_PA_SYSMMU_SCALERC      0x13280000
index 3e6aaa6..a42b369 100644 (file)
@@ -15,7 +15,7 @@
 #include <linux/init.h>
 #include <linux/io.h>
 #include <linux/spinlock.h>
+
 #include <asm/pgtable.h>
 #include <asm/page.h>
 #include <asm/irq.h>
@@ -26,6 +26,7 @@
 
 #include <asm/mach/irq.h>
 #include <asm/mach/map.h>
+#include <asm/mach/pci.h>
 
 #include "common.h"
 
@@ -175,11 +176,6 @@ static struct map_desc ebsa285_host_io_desc[] __initdata = {
                .pfn            = __phys_to_pfn(DC21285_PCI_IACK),
                .length         = PCIIACK_SIZE,
                .type           = MT_DEVICE,
-       }, {
-               .virtual        = PCIO_BASE,
-               .pfn            = __phys_to_pfn(DC21285_PCI_IO),
-               .length         = PCIO_SIZE,
-               .type           = MT_DEVICE,
        },
 #endif
 };
@@ -196,8 +192,10 @@ void __init footbridge_map_io(void)
         * Now, work out what we've got to map in addition on this
         * platform.
         */
-       if (footbridge_cfn_mode())
+       if (footbridge_cfn_mode()) {
                iotable_init(ebsa285_host_io_desc, ARRAY_SIZE(ebsa285_host_io_desc));
+               pci_map_io_early(__phys_to_pfn(DC21285_PCI_IO));
+       }
 }
 
 void footbridge_restart(char mode, const char *cmd)
index 9d62e33..a7cd2cf 100644 (file)
@@ -276,8 +276,8 @@ int __init dc21285_setup(int nr, struct pci_sys_data *sys)
 
        sys->mem_offset  = DC21285_PCI_MEM;
 
-       pci_add_resource_offset(&sys->resources,
-                               &ioport_resource, sys->io_offset);
+       pci_ioremap_io(0, DC21285_PCI_IO);
+
        pci_add_resource_offset(&sys->resources, &res[0], sys->mem_offset);
        pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset);
 
@@ -298,7 +298,7 @@ void __init dc21285_preinit(void)
        mem_size = (unsigned int)high_memory - PAGE_OFFSET;
        for (mem_mask = 0x00100000; mem_mask < 0x10000000; mem_mask <<= 1)
                if (mem_mask >= mem_size)
-                       break;          
+                       break;
 
        /*
         * These registers need to be set up whether we're the
@@ -350,14 +350,6 @@ void __init dc21285_preinit(void)
                            "PCI data parity", NULL);
 
        if (cfn_mode) {
-               static struct resource csrio;
-
-               csrio.flags  = IORESOURCE_IO;
-               csrio.name   = "Footbridge";
-
-               allocate_resource(&ioport_resource, &csrio, 128,
-                                 0xff00, 0xffff, 128, NULL, NULL);
-
                /*
                 * Map our SDRAM at a known address in PCI space, just in case
                 * the firmware had other ideas.  Using a nonzero base is
@@ -365,7 +357,7 @@ void __init dc21285_preinit(void)
                 * in the range 0x000a0000 to 0x000c0000. (eg, S3 cards).
                 */
                *CSR_PCICSRBASE       = 0xf4000000;
-               *CSR_PCICSRIOBASE     = csrio.start;
+               *CSR_PCICSRIOBASE     = 0;
                *CSR_PCISDRAMBASE     = __virt_to_bus(PAGE_OFFSET);
                *CSR_PCIROMBASE       = 0;
                *CSR_PCICMD = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
index e5acde2..c169f0c 100644 (file)
@@ -17,7 +17,8 @@
        /* For NetWinder debugging */
                .macro  addruart, rp, rv, tmp
                mov     \rp, #0x000003f8
-               orr     \rv, \rp, #0xff000000   @ virtual
+               orr     \rv, \rp, #0xfe000000   @ virtual
+               orr     \rv, \rv, #0x00e00000   @ virtual
                orr     \rp, \rp, #0x7c000000   @ physical
                .endm
 
index aba531e..aba4638 100644 (file)
 #ifndef __ASM_ARM_ARCH_IO_H
 #define __ASM_ARM_ARCH_IO_H
 
-#ifdef CONFIG_MMU
-#define MMU_IO(a, b)   (a)
-#else
-#define MMU_IO(a, b)   (b)
-#endif
-
-#define PCIO_SIZE       0x00100000
-#define PCIO_BASE       MMU_IO(0xff000000, 0x7c000000)
-
 /*
- * Translation of various region addresses to virtual addresses
+ * Translation of various i/o addresses to host addresses for !CONFIG_MMU
  */
+#define PCIO_BASE       0x7c000000
 #define __io(a)                        ((void __iomem *)(PCIO_BASE + (a)))
 
 #endif
index ca70e5f..020852d 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/sched.h>
 #include <asm/irq.h>
 #include <asm/mach/irq.h>
+#include <asm/system_misc.h>
 #include <mach/hardware.h>
 
 #define IRQ_SOURCE(base_addr)  (base_addr + 0x00)
index afd542a..7ca5fe4 100644 (file)
@@ -101,13 +101,8 @@ config     SOC_IMX51
        select SOC_IMX5
        select ARCH_MX5
        select ARCH_MX51
-
-config SOC_IMX53
-       bool
-       select SOC_IMX5
-       select ARCH_MX5
-       select ARCH_MX53
-       select HAVE_CAN_FLEXCAN if CAN
+       select PINCTRL
+       select PINCTRL_IMX51
 
 if ARCH_IMX_V4_V5
 
@@ -561,7 +556,6 @@ config MACH_BUG
 config MACH_IMX31_DT
        bool "Support i.MX31 platforms from device tree"
        select SOC_IMX31
-       select USE_OF
        help
          Include support for Freescale i.MX31 based platforms
          using the device tree for discovery.
@@ -737,95 +731,19 @@ config MACH_EUKREA_MBIMXSD51_BASEBOARD
 
 endchoice
 
-config MX51_EFIKA_COMMON
-       bool
-       select SOC_IMX51
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select IMX_HAVE_PLATFORM_MXC_EHCI
-       select IMX_HAVE_PLATFORM_PATA_IMX
-       select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select IMX_HAVE_PLATFORM_SPI_IMX
-       select MXC_ULPI if USB_ULPI
-
-config MACH_MX51_EFIKAMX
-       bool "Support MX51 Genesi Efika MX nettop"
-       select LEDS_GPIO_REGISTER
-       select MX51_EFIKA_COMMON
-       help
-         Include support for Genesi Efika MX nettop. This includes specific
-         configurations for the board and its peripherals.
-
-config MACH_MX51_EFIKASB
-       bool "Support MX51 Genesi Efika Smartbook"
-       select LEDS_GPIO_REGISTER
-       select MX51_EFIKA_COMMON
-       help
-         Include support for Genesi Efika Smartbook. This includes specific
-         configurations for the board and its peripherals.
-
-comment "i.MX53 machines:"
-
-config MACH_IMX53_DT
-       bool "Support i.MX53 platforms from device tree"
-       select SOC_IMX53
-       select MACH_MX53_ARD
-       select MACH_MX53_EVK
-       select MACH_MX53_LOCO
-       select MACH_MX53_SMD
-       help
-         Include support for Freescale i.MX53 based platforms
-         using the device tree for discovery
-
-config MACH_MX53_EVK
-       bool "Support MX53 EVK platforms"
-       select SOC_IMX53
-       select IMX_HAVE_PLATFORM_IMX2_WDT
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select IMX_HAVE_PLATFORM_IMX_I2C
-       select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select IMX_HAVE_PLATFORM_SPI_IMX
-       select LEDS_GPIO_REGISTER
-       help
-         Include support for MX53 EVK platform. This includes specific
-         configurations for the board and its peripherals.
-
-config MACH_MX53_SMD
-       bool "Support MX53 SMD platforms"
-       select SOC_IMX53
-       select IMX_HAVE_PLATFORM_IMX2_WDT
-       select IMX_HAVE_PLATFORM_IMX_I2C
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       help
-         Include support for MX53 SMD platform. This includes specific
-         configurations for the board and its peripherals.
+comment "Device tree only"
 
-config MACH_MX53_LOCO
-       bool "Support MX53 LOCO platforms"
-       select SOC_IMX53
-       select IMX_HAVE_PLATFORM_IMX2_WDT
-       select IMX_HAVE_PLATFORM_IMX_I2C
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select IMX_HAVE_PLATFORM_GPIO_KEYS
-       select LEDS_GPIO_REGISTER
-       help
-         Include support for MX53 LOCO platform. This includes specific
-         configurations for the board and its peripherals.
+config SOC_IMX53
+       bool "i.MX53 support"
+       select SOC_IMX5
+       select ARCH_MX5
+       select ARCH_MX53
+       select HAVE_CAN_FLEXCAN if CAN
+       select PINCTRL
+       select PINCTRL_IMX53
 
-config MACH_MX53_ARD
-       bool "Support MX53 ARD platforms"
-       select SOC_IMX53
-       select IMX_HAVE_PLATFORM_IMX2_WDT
-       select IMX_HAVE_PLATFORM_IMX_I2C
-       select IMX_HAVE_PLATFORM_IMX_UART
-       select IMX_HAVE_PLATFORM_SDHCI_ESDHC_IMX
-       select IMX_HAVE_PLATFORM_GPIO_KEYS
        help
-         Include support for MX53 ARD platform. This includes specific
-         configurations for the board and its peripherals.
-
-comment "i.MX6 family:"
+         This enables support for Freescale i.MX53 processor.
 
 config SOC_IMX6Q
        bool "i.MX6 Quad support"
index d004d37..895754a 100644 (file)
@@ -13,7 +13,7 @@ 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) cpu_op-mx51.o
 
 obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \
-                           clk-pfd.o clk-busy.o
+                           clk-pfd.o clk-busy.o clk.o
 
 # Support for CMOS sensor interface
 obj-$(CONFIG_MX1_VIDEO) += mx1-camera-fiq.o mx1-camera-fiq-ksym.o
@@ -83,16 +83,9 @@ endif
 # i.MX5 based machines
 obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o
 obj-$(CONFIG_MACH_MX51_3DS) += mach-mx51_3ds.o
-obj-$(CONFIG_MACH_MX53_EVK) += mach-mx53_evk.o
-obj-$(CONFIG_MACH_MX53_SMD) += mach-mx53_smd.o
-obj-$(CONFIG_MACH_MX53_LOCO) += mach-mx53_loco.o
-obj-$(CONFIG_MACH_MX53_ARD) += mach-mx53_ard.o
 obj-$(CONFIG_MACH_EUKREA_CPUIMX51SD) += mach-cpuimx51sd.o
 obj-$(CONFIG_MACH_EUKREA_MBIMXSD51_BASEBOARD) += eukrea_mbimxsd51-baseboard.o
-obj-$(CONFIG_MX51_EFIKA_COMMON) += mx51_efika.o
-obj-$(CONFIG_MACH_MX51_EFIKAMX) += mach-mx51_efikamx.o
-obj-$(CONFIG_MACH_MX51_EFIKASB) += mach-mx51_efikasb.o
 obj-$(CONFIG_MACH_MX50_RDP) += mach-mx50_rdp.o
 
 obj-$(CONFIG_MACH_IMX51_DT) += imx51-dt.o
-obj-$(CONFIG_MACH_IMX53_DT) += imx53-dt.o
+obj-$(CONFIG_SOC_IMX53) += mach-imx53.o
index ea13e61..cf65148 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/clk-provider.h>
 #include <linux/io.h>
 #include <linux/module.h>
-#include <linux/clkdev.h>
 #include <linux/err.h>
 
 #include <mach/hardware.h>
index fdd8cc8..4431a62 100644 (file)
@@ -222,10 +222,8 @@ int __init mx25_clocks_init(void)
        clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx-fb.0");
        clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx-fb.0");
        clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0");
-       clk_register_clkdev(clk[ssi1_ipg_per], "per", "imx-ssi.0");
-       clk_register_clkdev(clk[ssi1_ipg], "ipg", "imx-ssi.0");
-       clk_register_clkdev(clk[ssi2_ipg_per], "per", "imx-ssi.1");
-       clk_register_clkdev(clk[ssi2_ipg], "ipg", "imx-ssi.1");
+       clk_register_clkdev(clk[ssi1_ipg], NULL, "imx-ssi.0");
+       clk_register_clkdev(clk[ssi2_ipg], NULL, "imx-ssi.1");
        clk_register_clkdev(clk[esdhc1_ipg_per], "per", "sdhci-esdhc-imx25.0");
        clk_register_clkdev(clk[esdhc1_ipg], "ipg", "sdhci-esdhc-imx25.0");
        clk_register_clkdev(clk[esdhc1_ahb], "ahb", "sdhci-esdhc-imx25.0");
index c6422fb..177259b 100644 (file)
@@ -62,8 +62,8 @@ enum mx35_clks {
        kpp_gate, mlb_gate, mshc_gate, owire_gate, pwm_gate, rngc_gate,
        rtc_gate, rtic_gate, scc_gate, sdma_gate, spba_gate, spdif_gate,
        ssi1_gate, ssi2_gate, uart1_gate, uart2_gate, uart3_gate, usbotg_gate,
-       wdog_gate, max_gate, admux_gate, csi_gate, iim_gate, gpu2d_gate,
-       clk_max
+       wdog_gate, max_gate, admux_gate, csi_gate, csi_div, csi_sel, iim_gate,
+       gpu2d_gate, clk_max
 };
 
 static struct clk *clk[clk_max];
@@ -142,6 +142,9 @@ int __init mx35_clocks_init()
 
        clk[nfc_div] = imx_clk_divider("nfc_div", "ahb", base + MX35_CCM_PDR4, 28, 4);
 
+       clk[csi_sel] = imx_clk_mux("csi_sel", base + MX35_CCM_PDR2, 7, 1, std_sel, ARRAY_SIZE(std_sel));
+       clk[csi_div] = imx_clk_divider("csi_div", "csi_sel", base + MX35_CCM_PDR2, 16, 6);
+
        clk[asrc_gate] = imx_clk_gate2("asrc_gate", "ipg", base + MX35_CCM_CGR0,  0);
        clk[pata_gate] = imx_clk_gate2("pata_gate", "ipg", base + MX35_CCM_CGR0,  2);
        clk[audmux_gate] = imx_clk_gate2("audmux_gate", "ipg", base + MX35_CCM_CGR0,  4);
@@ -192,7 +195,7 @@ int __init mx35_clocks_init()
        clk[max_gate] = imx_clk_gate2("max_gate", "dummy", base + MX35_CCM_CGR2, 26);
        clk[admux_gate] = imx_clk_gate2("admux_gate", "ipg", base + MX35_CCM_CGR2, 30);
 
-       clk[csi_gate] = imx_clk_gate2("csi_gate", "ipg", base + MX35_CCM_CGR3,  0);
+       clk[csi_gate] = imx_clk_gate2("csi_gate", "csi_div", base + MX35_CCM_CGR3,  0);
        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);
 
@@ -228,12 +231,11 @@ int __init mx35_clocks_init()
        clk_register_clkdev(clk[i2c3_gate], NULL, "imx-i2c.2");
        clk_register_clkdev(clk[ipu_gate], NULL, "ipu-core");
        clk_register_clkdev(clk[ipu_gate], NULL, "mx3_sdc_fb");
+       clk_register_clkdev(clk[kpp_gate], NULL, "imx-keypad");
        clk_register_clkdev(clk[owire_gate], NULL, "mxc_w1");
        clk_register_clkdev(clk[sdma_gate], NULL, "imx35-sdma");
-       clk_register_clkdev(clk[ipg], "ipg", "imx-ssi.0");
-       clk_register_clkdev(clk[ssi1_div_post], "per", "imx-ssi.0");
-       clk_register_clkdev(clk[ipg], "ipg", "imx-ssi.1");
-       clk_register_clkdev(clk[ssi2_div_post], "per", "imx-ssi.1");
+       clk_register_clkdev(clk[ssi1_gate], NULL, "imx-ssi.0");
+       clk_register_clkdev(clk[ssi2_gate], NULL, "imx-ssi.1");
        /* i.mx35 has the i.mx21 type uart */
        clk_register_clkdev(clk[uart1_gate], "per", "imx21-uart.0");
        clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.0");
@@ -255,6 +257,7 @@ int __init mx35_clocks_init()
        clk_register_clkdev(clk[usbotg_gate], "ahb", "fsl-usb2-udc");
        clk_register_clkdev(clk[wdog_gate], NULL, "imx2-wdt.0");
        clk_register_clkdev(clk[nfc_div], NULL, "mxc_nand.0");
+       clk_register_clkdev(clk[csi_gate], NULL, "mx3-camera.0");
 
        clk_prepare_enable(clk[spba_gate]);
        clk_prepare_enable(clk[gpio1_gate]);
index 4bdcaa9..e5165a8 100644 (file)
@@ -39,16 +39,17 @@ static const char *ssi_ext2_com_sels[] = { "ssi_ext2_podf", "ssi2_root_gate", };
 static const char *emi_slow_sel[] = { "main_bus", "ahb", };
 static const char *usb_phy_sel_str[] = { "osc", "usb_phy_podf", };
 static const char *mx51_ipu_di0_sel[] = { "di_pred", "osc", "ckih1", "tve_di", };
-static const char *mx53_ipu_di0_sel[] = { "di_pred", "osc", "ckih1", "di_pll4_podf", "dummy", "ldb_di0", };
+static const char *mx53_ipu_di0_sel[] = { "di_pred", "osc", "ckih1", "di_pll4_podf", "dummy", "ldb_di0_gate", };
 static const char *mx53_ldb_di0_sel[] = { "pll3_sw", "pll4_sw", };
 static const char *mx51_ipu_di1_sel[] = { "di_pred", "osc", "ckih1", "tve_di", "ipp_di1", };
-static const char *mx53_ipu_di1_sel[] = { "di_pred", "osc", "ckih1", "tve_di", "ipp_di1", "ldb_di1", };
+static const char *mx53_ipu_di1_sel[] = { "di_pred", "osc", "ckih1", "tve_di", "ipp_di1", "ldb_di1_gate", };
 static const char *mx53_ldb_di1_sel[] = { "pll3_sw", "pll4_sw", };
 static const char *mx51_tve_ext_sel[] = { "osc", "ckih1", };
 static const char *mx53_tve_ext_sel[] = { "pll4_sw", "ckih1", };
 static const char *tve_sel[] = { "tve_pred", "tve_ext_sel", };
 static const char *ipu_sel[] = { "axi_a", "axi_b", "emi_slow_gate", "ahb", };
 static const char *vpu_sel[] = { "axi_a", "axi_b", "emi_slow_gate", "ahb", };
+static const char *mx53_can_sel[] = { "ipg", "ckih1", "ckih2", "lp_apm", };
 
 enum imx5_clks {
        dummy, ckil, osc, ckih1, ckih2, ahb, ipg, axi_a, axi_b, uart_pred,
@@ -82,6 +83,7 @@ enum imx5_clks {
        ssi_ext1_podf, ssi_ext2_pred, ssi_ext2_podf, ssi1_root_gate,
        ssi2_root_gate, ssi3_root_gate, ssi_ext1_gate, ssi_ext2_gate,
        epit1_ipg_gate, epit1_hf_gate, epit2_ipg_gate, epit2_hf_gate,
+       can_sel, can1_serial_gate, can1_ipg_gate,
        clk_max
 };
 
@@ -421,8 +423,12 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
        clk[esdhc4_per_gate] = imx_clk_gate2("esdhc4_per_gate", "esdhc_d_sel", MXC_CCM_CCGR3, 14);
        clk[usb_phy1_gate] = imx_clk_gate2("usb_phy1_gate", "usb_phy_sel", MXC_CCM_CCGR4, 10);
        clk[usb_phy2_gate] = imx_clk_gate2("usb_phy2_gate", "usb_phy_sel", MXC_CCM_CCGR4, 12);
-       clk[can2_serial_gate] = imx_clk_gate2("can2_serial_gate", "ipg", MXC_CCM_CCGR4, 6);
-       clk[can2_ipg_gate] = imx_clk_gate2("can2_ipg_gate", "ipg", MXC_CCM_CCGR4, 8);
+       clk[can_sel] = imx_clk_mux("can_sel", MXC_CCM_CSCMR2, 6, 2,
+                               mx53_can_sel, ARRAY_SIZE(mx53_can_sel));
+       clk[can1_serial_gate] = imx_clk_gate2("can1_serial_gate", "can_sel", MXC_CCM_CCGR6, 22);
+       clk[can1_ipg_gate] = imx_clk_gate2("can1_ipg_gate", "ipg", MXC_CCM_CCGR6, 20);
+       clk[can2_serial_gate] = imx_clk_gate2("can2_serial_gate", "can_sel", MXC_CCM_CCGR4, 8);
+       clk[can2_ipg_gate] = imx_clk_gate2("can2_ipg_gate", "ipg", MXC_CCM_CCGR4, 6);
        clk[i2c3_gate] = imx_clk_gate2("i2c3_gate", "per_root", MXC_CCM_CCGR1, 22);
 
        for (i = 0; i < ARRAY_SIZE(clk); i++)
@@ -455,6 +461,10 @@ int __init mx53_clocks_init(unsigned long rate_ckil, unsigned long rate_osc,
        clk_register_clkdev(clk[ssi1_ipg_gate], NULL, "63fcc000.ssi");
        clk_register_clkdev(clk[ssi2_ipg_gate], NULL, "50014000.ssi");
        clk_register_clkdev(clk[ssi3_ipg_gate], NULL, "63fd0000.ssi");
+       clk_register_clkdev(clk[can1_ipg_gate], "ipg", "53fc8000.can");
+       clk_register_clkdev(clk[can1_serial_gate], "per", "53fc8000.can");
+       clk_register_clkdev(clk[can2_ipg_gate], "ipg", "53fcc000.can");
+       clk_register_clkdev(clk[can2_serial_gate], "per", "53fcc000.can");
 
        /* set SDHC root clock to 200MHZ*/
        clk_set_rate(clk[esdhc_a_podf], 200000000);
index 4233d9e..3ec242f 100644 (file)
@@ -157,6 +157,7 @@ enum mx6q_clks {
 };
 
 static struct clk *clk[clk_max];
+static struct clk_onecell_data clk_data;
 
 static enum mx6q_clks const clks_init_on[] __initconst = {
        mmdc_ch0_axi, rom,
@@ -394,52 +395,24 @@ int __init mx6q_clocks_init(void)
                        pr_err("i.MX6q clk %d: register failed with %ld\n",
                                i, PTR_ERR(clk[i]));
 
+       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[twd], NULL, "smp_twd");
-       clk_register_clkdev(clk[apbh_dma], NULL, "110000.dma-apbh");
-       clk_register_clkdev(clk[per1_bch], "per1_bch", "112000.gpmi-nand");
-       clk_register_clkdev(clk[gpmi_bch_apb], "gpmi_bch_apb", "112000.gpmi-nand");
-       clk_register_clkdev(clk[gpmi_bch], "gpmi_bch", "112000.gpmi-nand");
-       clk_register_clkdev(clk[gpmi_apb], "gpmi_apb", "112000.gpmi-nand");
-       clk_register_clkdev(clk[gpmi_io], "gpmi_io", "112000.gpmi-nand");
-       clk_register_clkdev(clk[usboh3], NULL, "2184000.usb");
-       clk_register_clkdev(clk[usboh3], NULL, "2184200.usb");
-       clk_register_clkdev(clk[usboh3], NULL, "2184400.usb");
-       clk_register_clkdev(clk[usboh3], NULL, "2184600.usb");
-       clk_register_clkdev(clk[usbphy1], NULL, "20c9000.usbphy");
-       clk_register_clkdev(clk[usbphy2], NULL, "20ca000.usbphy");
-       clk_register_clkdev(clk[uart_serial], "per", "2020000.serial");
-       clk_register_clkdev(clk[uart_ipg], "ipg", "2020000.serial");
-       clk_register_clkdev(clk[uart_serial], "per", "21e8000.serial");
-       clk_register_clkdev(clk[uart_ipg], "ipg", "21e8000.serial");
-       clk_register_clkdev(clk[uart_serial], "per", "21ec000.serial");
-       clk_register_clkdev(clk[uart_ipg], "ipg", "21ec000.serial");
-       clk_register_clkdev(clk[uart_serial], "per", "21f0000.serial");
-       clk_register_clkdev(clk[uart_ipg], "ipg", "21f0000.serial");
-       clk_register_clkdev(clk[uart_serial], "per", "21f4000.serial");
-       clk_register_clkdev(clk[uart_ipg], "ipg", "21f4000.serial");
-       clk_register_clkdev(clk[enet], NULL, "2188000.ethernet");
-       clk_register_clkdev(clk[usdhc1], NULL, "2190000.usdhc");
-       clk_register_clkdev(clk[usdhc2], NULL, "2194000.usdhc");
-       clk_register_clkdev(clk[usdhc3], NULL, "2198000.usdhc");
-       clk_register_clkdev(clk[usdhc4], NULL, "219c000.usdhc");
-       clk_register_clkdev(clk[i2c1], NULL, "21a0000.i2c");
-       clk_register_clkdev(clk[i2c2], NULL, "21a4000.i2c");
-       clk_register_clkdev(clk[i2c3], NULL, "21a8000.i2c");
-       clk_register_clkdev(clk[ecspi1], NULL, "2008000.ecspi");
-       clk_register_clkdev(clk[ecspi2], NULL, "200c000.ecspi");
-       clk_register_clkdev(clk[ecspi3], NULL, "2010000.ecspi");
-       clk_register_clkdev(clk[ecspi4], NULL, "2014000.ecspi");
-       clk_register_clkdev(clk[ecspi5], NULL, "2018000.ecspi");
-       clk_register_clkdev(clk[sdma], NULL, "20ec000.sdma");
-       clk_register_clkdev(clk[dummy], NULL, "20bc000.wdog");
-       clk_register_clkdev(clk[dummy], NULL, "20c0000.wdog");
-       clk_register_clkdev(clk[ssi1_ipg], NULL, "2028000.ssi");
        clk_register_clkdev(clk[cko1_sel], "cko1_sel", NULL);
        clk_register_clkdev(clk[ahb], "ahb", NULL);
        clk_register_clkdev(clk[cko1], "cko1", NULL);
 
+       /*
+        * 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]);
+
        for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
                clk_prepare_enable(clk[clks_init_on[i]]);
 
index 2d856f9..02be731 100644 (file)
@@ -6,7 +6,7 @@
 #include <linux/err.h>
 #include <mach/common.h>
 #include <mach/hardware.h>
-#include <mach/clock.h>
+
 #include "clk.h"
 
 /**
@@ -29,8 +29,53 @@ static unsigned long clk_pllv1_recalc_rate(struct clk_hw *hw,
                unsigned long parent_rate)
 {
        struct clk_pllv1 *pll = to_clk_pllv1(hw);
+       long long ll;
+       int mfn_abs;
+       unsigned int mfi, mfn, mfd, pd;
+       u32 reg;
+       unsigned long rate;
+
+       reg = readl(pll->base);
+
+       /*
+        * Get the resulting clock rate from a PLL register value and the input
+        * frequency. PLLs with this register layout can be found on i.MX1,
+        * i.MX21, i.MX27 and i,MX31
+        *
+        *                  mfi + mfn / (mfd + 1)
+        *  f = 2 * f_ref * --------------------
+        *                        pd + 1
+        */
+
+       mfi = (reg >> 10) & 0xf;
+       mfn = reg & 0x3ff;
+       mfd = (reg >> 16) & 0x3ff;
+       pd =  (reg >> 26) & 0xf;
+
+       mfi = mfi <= 5 ? 5 : mfi;
+
+       mfn_abs = mfn;
+
+       /*
+        * On all i.MXs except i.MX1 and i.MX21 mfn is a 10bit
+        * 2's complements number
+        */
+       if (!cpu_is_mx1() && !cpu_is_mx21() && mfn >= 0x200)
+               mfn_abs = 0x400 - mfn;
+
+       rate = parent_rate * 2;
+       rate /= pd + 1;
+
+       ll = (unsigned long long)rate * mfn_abs;
+
+       do_div(ll, mfd + 1);
+
+       if (!cpu_is_mx1() && !cpu_is_mx21() && mfn >= 0x200)
+               ll = -ll;
+
+       ll = (rate * mfi) + ll;
 
-       return mxc_decode_pll(readl(pll->base), parent_rate);
+       return ll;
 }
 
 struct clk_ops clk_pllv1_ops = {
diff --git a/arch/arm/mach-imx/clk.c b/arch/arm/mach-imx/clk.c
new file mode 100644 (file)
index 0000000..f5e8be8
--- /dev/null
@@ -0,0 +1,3 @@
+#include <linux/spinlock.h>
+
+DEFINE_SPINLOCK(imx_ccm_lock);
index 1bf64fe..5f2d8ac 100644 (file)
@@ -3,7 +3,8 @@
 
 #include <linux/spinlock.h>
 #include <linux/clk-provider.h>
-#include <mach/clock.h>
+
+extern spinlock_t imx_ccm_lock;
 
 struct clk *imx_clk_pllv1(const char *name, const char *parent,
                void __iomem *base);
diff --git a/arch/arm/mach-imx/devices-imx53.h b/arch/arm/mach-imx/devices-imx53.h
deleted file mode 100644 (file)
index 77e0db9..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2010 Yong Shen. <Yong.Shen@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 <mach/mx53.h>
-#include <mach/devices-common.h>
-
-extern const struct imx_fec_data imx53_fec_data;
-#define imx53_add_fec(pdata)   \
-       imx_add_fec(&imx53_fec_data, pdata)
-
-extern const struct imx_imx_uart_1irq_data imx53_imx_uart_data[];
-#define imx53_add_imx_uart(id, pdata)  \
-       imx_add_imx_uart_1irq(&imx53_imx_uart_data[id], pdata)
-
-
-extern const struct imx_imx_i2c_data imx53_imx_i2c_data[];
-#define imx53_add_imx_i2c(id, pdata)   \
-       imx_add_imx_i2c(&imx53_imx_i2c_data[id], pdata)
-
-extern const struct imx_sdhci_esdhc_imx_data imx53_sdhci_esdhc_imx_data[];
-#define imx53_add_sdhci_esdhc_imx(id, pdata)   \
-       imx_add_sdhci_esdhc_imx(&imx53_sdhci_esdhc_imx_data[id], pdata)
-
-extern const struct imx_spi_imx_data imx53_ecspi_data[];
-#define imx53_add_ecspi(id, pdata)     \
-       imx_add_spi_imx(&imx53_ecspi_data[id], pdata)
-
-extern const struct imx_imx2_wdt_data imx53_imx2_wdt_data[];
-#define imx53_add_imx2_wdt(id) \
-       imx_add_imx2_wdt(&imx53_imx2_wdt_data[id])
-
-extern const struct imx_imx_ssi_data imx53_imx_ssi_data[];
-#define imx53_add_imx_ssi(id, pdata)   \
-       imx_add_imx_ssi(&imx53_imx_ssi_data[id], pdata)
-
-extern const struct imx_imx_keypad_data imx53_imx_keypad_data;
-#define imx53_add_imx_keypad(pdata)    \
-       imx_add_imx_keypad(&imx53_imx_keypad_data, pdata)
-
-extern const struct imx_pata_imx_data imx53_pata_imx_data;
-#define imx53_add_pata_imx() \
-       imx_add_pata_imx(&imx53_pata_imx_data)
-
-extern struct platform_device *__init imx53_add_ahci_imx(void);
diff --git a/arch/arm/mach-imx/efika.h b/arch/arm/mach-imx/efika.h
deleted file mode 100644 (file)
index 014aa98..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-#ifndef _EFIKA_H
-#define _EFIKA_H
-
-#define EFIKA_WLAN_EN          IMX_GPIO_NR(2, 16)
-#define EFIKA_WLAN_RESET       IMX_GPIO_NR(2, 10)
-#define EFIKA_USB_PHY_RESET    IMX_GPIO_NR(2, 9)
-
-void __init efika_board_common_init(void);
-
-#endif
index d4067fe..f233b4b 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/irq.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
-#include <linux/pinctrl/machine.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
 #include <mach/common.h>
@@ -44,27 +43,8 @@ static const struct of_dev_auxdata imx51_auxdata_lookup[] __initconst = {
        { /* sentinel */ }
 };
 
-static const struct of_device_id imx51_iomuxc_of_match[] __initconst = {
-       { .compatible = "fsl,imx51-iomuxc-babbage", .data = imx51_babbage_common_init, },
-       { /* sentinel */ }
-};
-
 static void __init imx51_dt_init(void)
 {
-       struct device_node *node;
-       const struct of_device_id *of_id;
-       void (*func)(void);
-
-       pinctrl_provide_dummies();
-
-       node = of_find_matching_node(NULL, imx51_iomuxc_of_match);
-       if (node) {
-               of_id = of_match_node(imx51_iomuxc_of_match, node);
-               func = of_id->data;
-               func();
-               of_node_put(node);
-       }
-
        of_platform_populate(NULL, of_default_bus_match_table,
                             imx51_auxdata_lookup, NULL);
 }
@@ -79,7 +59,6 @@ static struct sys_timer imx51_timer = {
 };
 
 static const char *imx51_dt_board_compat[] __initdata = {
-       "fsl,imx51-babbage",
        "fsl,imx51",
        NULL
 };
similarity index 81%
rename from arch/arm/mach-imx/imx53-dt.c
rename to arch/arm/mach-imx/mach-imx53.c
index 1b7a2fc..29711e9 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/irq.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
-#include <linux/pinctrl/machine.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
 #include <mach/common.h>
@@ -51,14 +50,6 @@ static const struct of_dev_auxdata imx53_auxdata_lookup[] __initconst = {
        { /* sentinel */ }
 };
 
-static const struct of_device_id imx53_iomuxc_of_match[] __initconst = {
-       { .compatible = "fsl,imx53-iomuxc-ard", .data = imx53_ard_common_init, },
-       { .compatible = "fsl,imx53-iomuxc-evk", .data = imx53_evk_common_init, },
-       { .compatible = "fsl,imx53-iomuxc-qsb", .data = imx53_qsb_common_init, },
-       { .compatible = "fsl,imx53-iomuxc-smd", .data = imx53_smd_common_init, },
-       { /* sentinel */ }
-};
-
 static void __init imx53_qsb_init(void)
 {
        struct clk *clk;
@@ -74,20 +65,6 @@ static void __init imx53_qsb_init(void)
 
 static void __init imx53_dt_init(void)
 {
-       struct device_node *node;
-       const struct of_device_id *of_id;
-       void (*func)(void);
-
-       pinctrl_provide_dummies();
-
-       node = of_find_matching_node(NULL, imx53_iomuxc_of_match);
-       if (node) {
-               of_id = of_match_node(imx53_iomuxc_of_match, node);
-               func = of_id->data;
-               func();
-               of_node_put(node);
-       }
-
        if (of_machine_is_compatible("fsl,imx53-qsb"))
                imx53_qsb_init();
 
@@ -105,10 +82,6 @@ static struct sys_timer imx53_timer = {
 };
 
 static const char *imx53_dt_board_compat[] __initdata = {
-       "fsl,imx53-ard",
-       "fsl,imx53-evk",
-       "fsl,imx53-qsb",
-       "fsl,imx53-smd",
        "fsl,imx53",
        NULL
 };
index 045b3f6..692b4b1 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
-#include <linux/pinctrl/machine.h>
 #include <linux/phy.h>
 #include <linux/micrel_phy.h>
 #include <linux/mfd/anatop.h>
@@ -100,7 +99,6 @@ static void __init imx6q_sabrelite_cko1_setup(void)
        clk_set_parent(cko1_sel, ahb);
        rate = clk_round_rate(cko1, 16000000);
        clk_set_rate(cko1, rate);
-       clk_register_clkdev(cko1, NULL, "0-000a");
 put_clk:
        if (!IS_ERR(cko1_sel))
                clk_put(cko1_sel);
@@ -159,12 +157,6 @@ static void __init imx6q_usb_init(void)
 
 static void __init imx6q_init_machine(void)
 {
-       /*
-        * This should be removed when all imx6q boards have pinctrl
-        * states for devices defined in device tree.
-        */
-       pinctrl_provide_dummies();
-
        if (of_machine_is_compatible("fsl,imx6q-sabrelite"))
                imx6q_sabrelite_init();
 
@@ -218,9 +210,6 @@ static struct sys_timer imx6q_timer = {
 };
 
 static const char *imx6q_dt_compat[] __initdata = {
-       "fsl,imx6q-arm2",
-       "fsl,imx6q-sabrelite",
-       "fsl,imx6q-sabresd",
        "fsl,imx6q",
        NULL,
 };
index 5d08533..8dc9d3e 100644 (file)
@@ -36,7 +36,6 @@
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 
-#include <mach/clock.h>
 #include <mach/common.h>
 #include <mach/hardware.h>
 #include <mach/iomux-mx3.h>
diff --git a/arch/arm/mach-imx/mach-mx51_efikamx.c b/arch/arm/mach-imx/mach-mx51_efikamx.c
deleted file mode 100644 (file)
index 8d09c01..0000000
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright (C) 2010 Linaro Limited
- *
- * based on code from the following
- * Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
- * Copyright 2009-2010 Genesi USA, 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
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/i2c.h>
-#include <linux/gpio.h>
-#include <linux/leds.h>
-#include <linux/input.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/spi/flash.h>
-#include <linux/spi/spi.h>
-#include <linux/mfd/mc13892.h>
-#include <linux/regulator/machine.h>
-#include <linux/regulator/consumer.h>
-
-#include <mach/common.h>
-#include <mach/hardware.h>
-#include <mach/iomux-mx51.h>
-
-#include <asm/setup.h>
-#include <asm/system_info.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "devices-imx51.h"
-#include "efika.h"
-
-#define EFIKAMX_PCBID0         IMX_GPIO_NR(3, 16)
-#define EFIKAMX_PCBID1         IMX_GPIO_NR(3, 17)
-#define EFIKAMX_PCBID2         IMX_GPIO_NR(3, 11)
-
-#define EFIKAMX_BLUE_LED       IMX_GPIO_NR(3, 13)
-#define EFIKAMX_GREEN_LED      IMX_GPIO_NR(3, 14)
-#define EFIKAMX_RED_LED                IMX_GPIO_NR(3, 15)
-
-#define EFIKAMX_POWER_KEY      IMX_GPIO_NR(2, 31)
-
-/* board 1.1 doesn't have same reset gpio */
-#define EFIKAMX_RESET1_1       IMX_GPIO_NR(3, 2)
-#define EFIKAMX_RESET          IMX_GPIO_NR(1, 4)
-
-#define EFIKAMX_POWEROFF       IMX_GPIO_NR(4, 13)
-
-#define EFIKAMX_PMIC           IMX_GPIO_NR(1, 6)
-
-/* the pci ids pin have pull up. they're driven low according to board id */
-#define MX51_PAD_PCBID0        IOMUX_PAD(0x518, 0x130, 3, 0x0,   0, PAD_CTL_PUS_100K_UP)
-#define MX51_PAD_PCBID1        IOMUX_PAD(0x51C, 0x134, 3, 0x0,   0, PAD_CTL_PUS_100K_UP)
-#define MX51_PAD_PCBID2        IOMUX_PAD(0x504, 0x128, 3, 0x0,   0, PAD_CTL_PUS_100K_UP)
-#define MX51_PAD_PWRKEY        IOMUX_PAD(0x48c, 0x0f8, 1, 0x0,   0, PAD_CTL_PUS_100K_UP | PAD_CTL_PKE)
-
-static iomux_v3_cfg_t mx51efikamx_pads[] = {
-       /* board id */
-       MX51_PAD_PCBID0,
-       MX51_PAD_PCBID1,
-       MX51_PAD_PCBID2,
-
-       /* leds */
-       MX51_PAD_CSI1_D9__GPIO3_13,
-       MX51_PAD_CSI1_VSYNC__GPIO3_14,
-       MX51_PAD_CSI1_HSYNC__GPIO3_15,
-
-       /* power key */
-       MX51_PAD_PWRKEY,
-
-       /* reset */
-       MX51_PAD_DI1_PIN13__GPIO3_2,
-       MX51_PAD_GPIO1_4__GPIO1_4,
-
-       /* power off */
-       MX51_PAD_CSI2_VSYNC__GPIO4_13,
-};
-
-/*   PCBID2  PCBID1 PCBID0  STATE
-       1       1      1    ER1:rev1.1
-       1       1      0    ER2:rev1.2
-       1       0      1    ER3:rev1.3
-       1       0      0    ER4:rev1.4
-*/
-static void __init mx51_efikamx_board_id(void)
-{
-       int id;
-
-       /* things are taking time to settle */
-       msleep(150);
-
-       gpio_request(EFIKAMX_PCBID0, "pcbid0");
-       gpio_direction_input(EFIKAMX_PCBID0);
-       gpio_request(EFIKAMX_PCBID1, "pcbid1");
-       gpio_direction_input(EFIKAMX_PCBID1);
-       gpio_request(EFIKAMX_PCBID2, "pcbid2");
-       gpio_direction_input(EFIKAMX_PCBID2);
-
-       id = gpio_get_value(EFIKAMX_PCBID0) ? 1 : 0;
-       id |= (gpio_get_value(EFIKAMX_PCBID1) ? 1 : 0) << 1;
-       id |= (gpio_get_value(EFIKAMX_PCBID2) ? 1 : 0) << 2;
-
-       switch (id) {
-       case 7:
-               system_rev = 0x11;
-               break;
-       case 6:
-               system_rev = 0x12;
-               break;
-       case 5:
-               system_rev = 0x13;
-               break;
-       case 4:
-               system_rev = 0x14;
-               break;
-       default:
-               system_rev = 0x10;
-               break;
-       }
-
-       if ((system_rev == 0x10)
-               || (system_rev == 0x12)
-               || (system_rev == 0x14)) {
-               printk(KERN_WARNING
-                       "EfikaMX: Unsupported board revision 1.%u!\n",
-                       system_rev & 0xf);
-       }
-}
-
-static struct gpio_led mx51_efikamx_leds[] __initdata = {
-       {
-               .name = "efikamx:green",
-               .default_trigger = "default-on",
-               .gpio = EFIKAMX_GREEN_LED,
-       },
-       {
-               .name = "efikamx:red",
-               .default_trigger = "ide-disk",
-               .gpio = EFIKAMX_RED_LED,
-       },
-       {
-               .name = "efikamx:blue",
-               .default_trigger = "mmc0",
-               .gpio = EFIKAMX_BLUE_LED,
-       },
-};
-
-static const struct gpio_led_platform_data
-               mx51_efikamx_leds_data __initconst = {
-       .leds = mx51_efikamx_leds,
-       .num_leds = ARRAY_SIZE(mx51_efikamx_leds),
-};
-
-static struct esdhc_platform_data sd_pdata = {
-       .cd_type = ESDHC_CD_CONTROLLER,
-       .wp_type = ESDHC_WP_CONTROLLER,
-};
-
-static struct gpio_keys_button mx51_efikamx_powerkey[] = {
-       {
-               .code = KEY_POWER,
-               .gpio = EFIKAMX_POWER_KEY,
-               .type = EV_PWR,
-               .desc = "Power Button (CM)",
-               .wakeup = 1,
-               .debounce_interval = 10, /* ms */
-       },
-};
-
-static const struct gpio_keys_platform_data mx51_efikamx_powerkey_data __initconst = {
-       .buttons = mx51_efikamx_powerkey,
-       .nbuttons = ARRAY_SIZE(mx51_efikamx_powerkey),
-};
-
-static void mx51_efikamx_restart(char mode, const char *cmd)
-{
-       if (system_rev == 0x11)
-               gpio_direction_output(EFIKAMX_RESET1_1, 0);
-       else
-               gpio_direction_output(EFIKAMX_RESET, 0);
-}
-
-static struct regulator *pwgt1, *pwgt2, *coincell;
-
-static void mx51_efikamx_power_off(void)
-{
-       if (!IS_ERR(coincell))
-               regulator_disable(coincell);
-
-       if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
-               regulator_disable(pwgt2);
-               regulator_disable(pwgt1);
-       }
-       gpio_direction_output(EFIKAMX_POWEROFF, 1);
-}
-
-static int __init mx51_efikamx_power_init(void)
-{
-       pwgt1 = regulator_get(NULL, "pwgt1");
-       pwgt2 = regulator_get(NULL, "pwgt2");
-       if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
-               regulator_enable(pwgt1);
-               regulator_enable(pwgt2);
-       }
-       gpio_request(EFIKAMX_POWEROFF, "poweroff");
-       pm_power_off = mx51_efikamx_power_off;
-
-       /* enable coincell charger. maybe need a small power driver ? */
-       coincell = regulator_get(NULL, "coincell");
-       if (!IS_ERR(coincell)) {
-               regulator_set_voltage(coincell, 3000000, 3000000);
-               regulator_enable(coincell);
-       }
-
-       regulator_has_full_constraints();
-
-       return 0;
-}
-
-static void __init mx51_efikamx_init_late(void)
-{
-       imx51_init_late();
-       mx51_efikamx_power_init();
-}
-
-static void __init mx51_efikamx_init(void)
-{
-       imx51_soc_init();
-
-       mxc_iomux_v3_setup_multiple_pads(mx51efikamx_pads,
-                                       ARRAY_SIZE(mx51efikamx_pads));
-       efika_board_common_init();
-
-       mx51_efikamx_board_id();
-
-       /* on < 1.2 boards both SD controllers are used */
-       if (system_rev < 0x12) {
-               imx51_add_sdhci_esdhc_imx(0, NULL);
-               imx51_add_sdhci_esdhc_imx(1, &sd_pdata);
-               mx51_efikamx_leds[2].default_trigger = "mmc1";
-       } else
-               imx51_add_sdhci_esdhc_imx(0, &sd_pdata);
-
-       gpio_led_register_device(-1, &mx51_efikamx_leds_data);
-       imx_add_gpio_keys(&mx51_efikamx_powerkey_data);
-
-       if (system_rev == 0x11) {
-               gpio_request(EFIKAMX_RESET1_1, "reset");
-               gpio_direction_output(EFIKAMX_RESET1_1, 1);
-       } else {
-               gpio_request(EFIKAMX_RESET, "reset");
-               gpio_direction_output(EFIKAMX_RESET, 1);
-       }
-
-       /*
-        * enable wifi by default only on mx
-        * sb and mx have same wlan pin but the value to enable it are
-        * different :/
-        */
-       gpio_request(EFIKA_WLAN_EN, "wlan_en");
-       gpio_direction_output(EFIKA_WLAN_EN, 0);
-       msleep(10);
-
-       gpio_request(EFIKA_WLAN_RESET, "wlan_rst");
-       gpio_direction_output(EFIKA_WLAN_RESET, 0);
-       msleep(10);
-       gpio_set_value(EFIKA_WLAN_RESET, 1);
-}
-
-static void __init mx51_efikamx_timer_init(void)
-{
-       mx51_clocks_init(32768, 24000000, 22579200, 24576000);
-}
-
-static struct sys_timer mx51_efikamx_timer = {
-       .init = mx51_efikamx_timer_init,
-};
-
-MACHINE_START(MX51_EFIKAMX, "Genesi Efika MX (Smarttop)")
-       .atag_offset = 0x100,
-       .map_io = mx51_map_io,
-       .init_early = imx51_init_early,
-       .init_irq = mx51_init_irq,
-       .handle_irq = imx51_handle_irq,
-       .timer = &mx51_efikamx_timer,
-       .init_machine = mx51_efikamx_init,
-       .init_late = mx51_efikamx_init_late,
-       .restart = mx51_efikamx_restart,
-MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx51_efikasb.c b/arch/arm/mach-imx/mach-mx51_efikasb.c
deleted file mode 100644 (file)
index fdbd181..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (C) Arnaud Patard <arnaud.patard@rtp-net.org>
- *
- * based on code from the following
- * Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
- * Copyright 2009-2010 Genesi USA, 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
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/i2c.h>
-#include <linux/gpio.h>
-#include <linux/leds.h>
-#include <linux/input.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/spi/flash.h>
-#include <linux/spi/spi.h>
-#include <linux/mfd/mc13892.h>
-#include <linux/regulator/machine.h>
-#include <linux/regulator/consumer.h>
-#include <linux/usb/otg.h>
-#include <linux/usb/ulpi.h>
-#include <mach/ulpi.h>
-
-#include <mach/common.h>
-#include <mach/hardware.h>
-#include <mach/iomux-mx51.h>
-
-#include <asm/setup.h>
-#include <asm/system_info.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "devices-imx51.h"
-#include "efika.h"
-
-#define EFIKASB_USBH2_STP      IMX_GPIO_NR(2, 20)
-#define EFIKASB_GREEN_LED      IMX_GPIO_NR(1, 3)
-#define EFIKASB_WHITE_LED      IMX_GPIO_NR(2, 25)
-#define EFIKASB_PCBID0         IMX_GPIO_NR(2, 28)
-#define EFIKASB_PCBID1         IMX_GPIO_NR(2, 29)
-#define EFIKASB_PWRKEY         IMX_GPIO_NR(2, 31)
-#define EFIKASB_LID            IMX_GPIO_NR(3, 14)
-#define EFIKASB_POWEROFF       IMX_GPIO_NR(4, 13)
-#define EFIKASB_RFKILL         IMX_GPIO_NR(3, 1)
-
-#define MX51_PAD_PWRKEY IOMUX_PAD(0x48c, 0x0f8, 1, 0x0,   0, PAD_CTL_PUS_100K_UP | PAD_CTL_PKE)
-#define MX51_PAD_SD1_CD        IOMUX_PAD(0x47c, 0x0e8, 1, __NA_, 0, MX51_ESDHC_PAD_CTRL)
-
-static iomux_v3_cfg_t mx51efikasb_pads[] = {
-       /* USB HOST2 */
-       MX51_PAD_EIM_D16__USBH2_DATA0,
-       MX51_PAD_EIM_D17__USBH2_DATA1,
-       MX51_PAD_EIM_D18__USBH2_DATA2,
-       MX51_PAD_EIM_D19__USBH2_DATA3,
-       MX51_PAD_EIM_D20__USBH2_DATA4,
-       MX51_PAD_EIM_D21__USBH2_DATA5,
-       MX51_PAD_EIM_D22__USBH2_DATA6,
-       MX51_PAD_EIM_D23__USBH2_DATA7,
-       MX51_PAD_EIM_A24__USBH2_CLK,
-       MX51_PAD_EIM_A25__USBH2_DIR,
-       MX51_PAD_EIM_A26__USBH2_STP,
-       MX51_PAD_EIM_A27__USBH2_NXT,
-
-       /* leds */
-       MX51_PAD_EIM_CS0__GPIO2_25,
-       MX51_PAD_GPIO1_3__GPIO1_3,
-
-       /* pcb id */
-       MX51_PAD_EIM_CS3__GPIO2_28,
-       MX51_PAD_EIM_CS4__GPIO2_29,
-
-       /* lid */
-       MX51_PAD_CSI1_VSYNC__GPIO3_14,
-
-       /* power key*/
-       MX51_PAD_PWRKEY,
-
-       /* wifi/bt button */
-       MX51_PAD_DI1_PIN12__GPIO3_1,
-
-       /* power off */
-       MX51_PAD_CSI2_VSYNC__GPIO4_13,
-
-       /* wdog reset */
-       MX51_PAD_GPIO1_4__WDOG1_WDOG_B,
-
-       /* BT */
-       MX51_PAD_EIM_A17__GPIO2_11,
-
-       MX51_PAD_SD1_CD,
-};
-
-static int initialize_usbh2_port(struct platform_device *pdev)
-{
-       iomux_v3_cfg_t usbh2stp = MX51_PAD_EIM_A26__USBH2_STP;
-       iomux_v3_cfg_t usbh2gpio = MX51_PAD_EIM_A26__GPIO2_20;
-
-       mxc_iomux_v3_setup_pad(usbh2gpio);
-       gpio_request(EFIKASB_USBH2_STP, "usbh2_stp");
-       gpio_direction_output(EFIKASB_USBH2_STP, 0);
-       msleep(1);
-       gpio_set_value(EFIKASB_USBH2_STP, 1);
-       msleep(1);
-
-       gpio_free(EFIKASB_USBH2_STP);
-       mxc_iomux_v3_setup_pad(usbh2stp);
-
-       mdelay(10);
-
-       return mx51_initialize_usb_hw(pdev->id, MXC_EHCI_ITC_NO_THRESHOLD);
-}
-
-static struct mxc_usbh_platform_data usbh2_config __initdata = {
-       .init   = initialize_usbh2_port,
-       .portsc = MXC_EHCI_MODE_ULPI,
-};
-
-static void __init mx51_efikasb_usb(void)
-{
-       usbh2_config.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
-                       ULPI_OTG_DRVVBUS_EXT | ULPI_OTG_EXTVBUSIND);
-       if (usbh2_config.otg)
-               imx51_add_mxc_ehci_hs(2, &usbh2_config);
-}
-
-static const struct gpio_led mx51_efikasb_leds[] __initconst = {
-       {
-               .name = "efikasb:green",
-               .default_trigger = "default-on",
-               .gpio = EFIKASB_GREEN_LED,
-               .active_low = 1,
-       },
-       {
-               .name = "efikasb:white",
-               .default_trigger = "caps",
-               .gpio = EFIKASB_WHITE_LED,
-       },
-};
-
-static const struct gpio_led_platform_data
-               mx51_efikasb_leds_data __initconst = {
-       .leds = mx51_efikasb_leds,
-       .num_leds = ARRAY_SIZE(mx51_efikasb_leds),
-};
-
-static struct gpio_keys_button mx51_efikasb_keys[] = {
-       {
-               .code = KEY_POWER,
-               .gpio = EFIKASB_PWRKEY,
-               .type = EV_KEY,
-               .desc = "Power Button",
-               .wakeup = 1,
-               .active_low = 1,
-       },
-       {
-               .code = SW_LID,
-               .gpio = EFIKASB_LID,
-               .type = EV_SW,
-               .desc = "Lid Switch",
-               .active_low = 1,
-       },
-       {
-               .code = KEY_RFKILL,
-               .gpio = EFIKASB_RFKILL,
-               .type = EV_KEY,
-               .desc = "rfkill",
-               .active_low = 1,
-       },
-};
-
-static const struct gpio_keys_platform_data mx51_efikasb_keys_data __initconst = {
-       .buttons = mx51_efikasb_keys,
-       .nbuttons = ARRAY_SIZE(mx51_efikasb_keys),
-};
-
-static struct esdhc_platform_data sd0_pdata = {
-#define EFIKASB_SD1_CD IMX_GPIO_NR(2, 27)
-       .cd_gpio = EFIKASB_SD1_CD,
-       .cd_type = ESDHC_CD_GPIO,
-       .wp_type = ESDHC_WP_CONTROLLER,
-};
-
-static struct esdhc_platform_data sd1_pdata = {
-       .cd_type = ESDHC_CD_CONTROLLER,
-       .wp_type = ESDHC_WP_CONTROLLER,
-};
-
-static struct regulator *pwgt1, *pwgt2;
-
-static void mx51_efikasb_power_off(void)
-{
-       gpio_set_value(EFIKA_USB_PHY_RESET, 0);
-
-       if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
-               regulator_disable(pwgt2);
-               regulator_disable(pwgt1);
-       }
-       gpio_direction_output(EFIKASB_POWEROFF, 1);
-}
-
-static int __init mx51_efikasb_power_init(void)
-{
-       pwgt1 = regulator_get(NULL, "pwgt1");
-       pwgt2 = regulator_get(NULL, "pwgt2");
-       if (!IS_ERR(pwgt1) && !IS_ERR(pwgt2)) {
-               regulator_enable(pwgt1);
-               regulator_enable(pwgt2);
-       }
-       gpio_request(EFIKASB_POWEROFF, "poweroff");
-       pm_power_off = mx51_efikasb_power_off;
-
-       regulator_has_full_constraints();
-
-       return 0;
-}
-
-static void __init mx51_efikasb_init_late(void)
-{
-       imx51_init_late();
-       mx51_efikasb_power_init();
-}
-
-/* 01     R1.3 board
-   10     R2.0 board */
-static void __init mx51_efikasb_board_id(void)
-{
-       int id;
-
-       gpio_request(EFIKASB_PCBID0, "pcb id0");
-       gpio_direction_input(EFIKASB_PCBID0);
-       gpio_request(EFIKASB_PCBID1, "pcb id1");
-       gpio_direction_input(EFIKASB_PCBID1);
-
-       id = gpio_get_value(EFIKASB_PCBID0) ? 1 : 0;
-       id |= (gpio_get_value(EFIKASB_PCBID1) ? 1 : 0) << 1;
-
-       switch (id) {
-       default:
-               break;
-       case 1:
-               system_rev = 0x13;
-               break;
-       case 2:
-               system_rev = 0x20;
-               break;
-       }
-}
-
-static void __init efikasb_board_init(void)
-{
-       imx51_soc_init();
-
-       mxc_iomux_v3_setup_multiple_pads(mx51efikasb_pads,
-                                       ARRAY_SIZE(mx51efikasb_pads));
-       efika_board_common_init();
-
-       mx51_efikasb_board_id();
-       mx51_efikasb_usb();
-       imx51_add_sdhci_esdhc_imx(0, &sd0_pdata);
-       imx51_add_sdhci_esdhc_imx(1, &sd1_pdata);
-
-       gpio_led_register_device(-1, &mx51_efikasb_leds_data);
-       imx_add_gpio_keys(&mx51_efikasb_keys_data);
-}
-
-static void __init mx51_efikasb_timer_init(void)
-{
-       mx51_clocks_init(32768, 24000000, 22579200, 24576000);
-}
-
-static struct sys_timer mx51_efikasb_timer = {
-       .init   = mx51_efikasb_timer_init,
-};
-
-MACHINE_START(MX51_EFIKASB, "Genesi Efika MX (Smartbook)")
-       .atag_offset = 0x100,
-       .map_io = mx51_map_io,
-       .init_early = imx51_init_early,
-       .init_irq = mx51_init_irq,
-       .handle_irq = imx51_handle_irq,
-       .init_machine =  efikasb_board_init,
-       .init_late = mx51_efikasb_init_late,
-       .timer = &mx51_efikasb_timer,
-       .restart        = mxc_restart,
-MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx53_ard.c b/arch/arm/mach-imx/mach-mx53_ard.c
deleted file mode 100644 (file)
index 6c28e65..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2011 Freescale Semiconductor, Inc. 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 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/init.h>
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/gpio.h>
-#include <linux/smsc911x.h>
-#include <linux/regulator/machine.h>
-#include <linux/regulator/fixed.h>
-
-#include <mach/common.h>
-#include <mach/hardware.h>
-#include <mach/iomux-mx53.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "devices-imx53.h"
-
-#define ARD_ETHERNET_INT_B     IMX_GPIO_NR(2, 31)
-#define ARD_SD1_CD             IMX_GPIO_NR(1, 1)
-#define ARD_SD1_WP             IMX_GPIO_NR(1, 9)
-#define ARD_I2CPORTEXP_B       IMX_GPIO_NR(2, 3)
-#define ARD_VOLUMEDOWN         IMX_GPIO_NR(4, 0)
-#define ARD_HOME                       IMX_GPIO_NR(5, 10)
-#define ARD_BACK                       IMX_GPIO_NR(5, 11)
-#define ARD_PROG                       IMX_GPIO_NR(5, 12)
-#define ARD_VOLUMEUP           IMX_GPIO_NR(5, 13)
-
-static iomux_v3_cfg_t mx53_ard_pads[] = {
-       /* UART1 */
-       MX53_PAD_PATA_DIOW__UART1_TXD_MUX,
-       MX53_PAD_PATA_DMACK__UART1_RXD_MUX,
-       /* WEIM for CS1 */
-       MX53_PAD_EIM_EB3__GPIO2_31, /* ETHERNET_INT_B */
-       MX53_PAD_EIM_D16__EMI_WEIM_D_16,
-       MX53_PAD_EIM_D17__EMI_WEIM_D_17,
-       MX53_PAD_EIM_D18__EMI_WEIM_D_18,
-       MX53_PAD_EIM_D19__EMI_WEIM_D_19,
-       MX53_PAD_EIM_D20__EMI_WEIM_D_20,
-       MX53_PAD_EIM_D21__EMI_WEIM_D_21,
-       MX53_PAD_EIM_D22__EMI_WEIM_D_22,
-       MX53_PAD_EIM_D23__EMI_WEIM_D_23,
-       MX53_PAD_EIM_D24__EMI_WEIM_D_24,
-       MX53_PAD_EIM_D25__EMI_WEIM_D_25,
-       MX53_PAD_EIM_D26__EMI_WEIM_D_26,
-       MX53_PAD_EIM_D27__EMI_WEIM_D_27,
-       MX53_PAD_EIM_D28__EMI_WEIM_D_28,
-       MX53_PAD_EIM_D29__EMI_WEIM_D_29,
-       MX53_PAD_EIM_D30__EMI_WEIM_D_30,
-       MX53_PAD_EIM_D31__EMI_WEIM_D_31,
-       MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0,
-       MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1,
-       MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2,
-       MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3,
-       MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4,
-       MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5,
-       MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6,
-       MX53_PAD_EIM_OE__EMI_WEIM_OE,
-       MX53_PAD_EIM_RW__EMI_WEIM_RW,
-       MX53_PAD_EIM_CS1__EMI_WEIM_CS_1,
-       /* SDHC1 */
-       MX53_PAD_SD1_CMD__ESDHC1_CMD,
-       MX53_PAD_SD1_CLK__ESDHC1_CLK,
-       MX53_PAD_SD1_DATA0__ESDHC1_DAT0,
-       MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
-       MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
-       MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
-       MX53_PAD_PATA_DATA8__ESDHC1_DAT4,
-       MX53_PAD_PATA_DATA9__ESDHC1_DAT5,
-       MX53_PAD_PATA_DATA10__ESDHC1_DAT6,
-       MX53_PAD_PATA_DATA11__ESDHC1_DAT7,
-       MX53_PAD_GPIO_1__GPIO1_1,
-       MX53_PAD_GPIO_9__GPIO1_9,
-       /* I2C2 */
-       MX53_PAD_EIM_EB2__I2C2_SCL,
-       MX53_PAD_KEY_ROW3__I2C2_SDA,
-       /* I2C3 */
-       MX53_PAD_GPIO_3__I2C3_SCL,
-       MX53_PAD_GPIO_16__I2C3_SDA,
-       /* GPIO */
-       MX53_PAD_DISP0_DAT16__GPIO5_10, /* home */
-       MX53_PAD_DISP0_DAT17__GPIO5_11, /* back */
-       MX53_PAD_DISP0_DAT18__GPIO5_12, /* prog */
-       MX53_PAD_DISP0_DAT19__GPIO5_13, /* vol up */
-       MX53_PAD_GPIO_10__GPIO4_0,              /* vol down */
-};
-
-#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake)   \
-{                                                      \
-       .gpio           = gpio_num,                             \
-       .type           = EV_KEY,                               \
-       .code           = ev_code,                              \
-       .active_low     = act_low,                              \
-       .desc           = "btn " descr,                 \
-       .wakeup         = wake,                                 \
-}
-
-static struct gpio_keys_button ard_buttons[] = {
-       GPIO_BUTTON(ARD_HOME, KEY_HOME, 1, "home", 0),
-       GPIO_BUTTON(ARD_BACK, KEY_BACK, 1, "back", 0),
-       GPIO_BUTTON(ARD_PROG, KEY_PROGRAM, 1, "program", 0),
-       GPIO_BUTTON(ARD_VOLUMEUP, KEY_VOLUMEUP, 1, "volume-up", 0),
-       GPIO_BUTTON(ARD_VOLUMEDOWN, KEY_VOLUMEDOWN, 1, "volume-down", 0),
-};
-
-static const struct gpio_keys_platform_data ard_button_data __initconst = {
-       .buttons        = ard_buttons,
-       .nbuttons       = ARRAY_SIZE(ard_buttons),
-};
-
-static struct resource ard_smsc911x_resources[] = {
-       {
-               .start = MX53_CS1_64MB_BASE_ADDR,
-               .end = MX53_CS1_64MB_BASE_ADDR + SZ_32M - 1,
-               .flags = IORESOURCE_MEM,
-       },
-       {
-               /* irq number is run-time assigned */
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-struct smsc911x_platform_config ard_smsc911x_config = {
-       .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
-       .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
-       .flags = SMSC911X_USE_32BIT,
-};
-
-static struct platform_device ard_smsc_lan9220_device = {
-       .name = "smsc911x",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(ard_smsc911x_resources),
-       .resource = ard_smsc911x_resources,
-       .dev = {
-               .platform_data = &ard_smsc911x_config,
-       },
-};
-
-static const struct esdhc_platform_data mx53_ard_sd1_data __initconst = {
-       .cd_gpio = ARD_SD1_CD,
-       .wp_gpio = ARD_SD1_WP,
-};
-
-static struct imxi2c_platform_data mx53_ard_i2c2_data = {
-       .bitrate = 50000,
-};
-
-static struct imxi2c_platform_data mx53_ard_i2c3_data = {
-       .bitrate = 400000,
-};
-
-static void __init mx53_ard_io_init(void)
-{
-       gpio_request(ARD_ETHERNET_INT_B, "eth-int-b");
-       gpio_direction_input(ARD_ETHERNET_INT_B);
-
-       gpio_request(ARD_I2CPORTEXP_B, "i2cptexp-rst");
-       gpio_direction_output(ARD_I2CPORTEXP_B, 1);
-}
-
-/* Config CS1 settings for ethernet controller */
-static int weim_cs_config(void)
-{
-       u32 reg;
-       void __iomem *weim_base, *iomuxc_base;
-
-       weim_base = ioremap(MX53_WEIM_BASE_ADDR, SZ_4K);
-       if (!weim_base)
-               return -ENOMEM;
-
-       iomuxc_base = ioremap(MX53_IOMUXC_BASE_ADDR, SZ_4K);
-       if (!iomuxc_base) {
-               iounmap(weim_base);
-               return -ENOMEM;
-       }
-
-       /* CS1 timings for LAN9220 */
-       writel(0x20001, (weim_base + 0x18));
-       writel(0x0, (weim_base + 0x1C));
-       writel(0x16000202, (weim_base + 0x20));
-       writel(0x00000002, (weim_base + 0x24));
-       writel(0x16002082, (weim_base + 0x28));
-       writel(0x00000000, (weim_base + 0x2C));
-       writel(0x00000000, (weim_base + 0x90));
-
-       /* specify 64 MB on CS1 and CS0 on GPR1 */
-       reg = readl(iomuxc_base + 0x4);
-       reg &= ~0x3F;
-       reg |= 0x1B;
-       writel(reg, (iomuxc_base + 0x4));
-
-       iounmap(iomuxc_base);
-       iounmap(weim_base);
-
-       return 0;
-}
-
-static struct regulator_consumer_supply dummy_supplies[] = {
-       REGULATOR_SUPPLY("vdd33a", "smsc911x"),
-       REGULATOR_SUPPLY("vddvario", "smsc911x"),
-};
-
-void __init imx53_ard_common_init(void)
-{
-       mxc_iomux_v3_setup_multiple_pads(mx53_ard_pads,
-                                        ARRAY_SIZE(mx53_ard_pads));
-       weim_cs_config();
-}
-
-static struct platform_device *devices[] __initdata = {
-       &ard_smsc_lan9220_device,
-};
-
-static void __init mx53_ard_board_init(void)
-{
-       imx53_soc_init();
-       imx53_add_imx_uart(0, NULL);
-
-       imx53_ard_common_init();
-       mx53_ard_io_init();
-       regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
-       ard_smsc911x_resources[1].start = gpio_to_irq(ARD_ETHERNET_INT_B);
-       ard_smsc911x_resources[1].end = gpio_to_irq(ARD_ETHERNET_INT_B);
-       platform_add_devices(devices, ARRAY_SIZE(devices));
-
-       imx53_add_sdhci_esdhc_imx(0, &mx53_ard_sd1_data);
-       imx53_add_imx2_wdt(0);
-       imx53_add_imx_i2c(1, &mx53_ard_i2c2_data);
-       imx53_add_imx_i2c(2, &mx53_ard_i2c3_data);
-       imx_add_gpio_keys(&ard_button_data);
-       imx53_add_ahci_imx();
-}
-
-static void __init mx53_ard_timer_init(void)
-{
-       mx53_clocks_init(32768, 24000000, 22579200, 0);
-}
-
-static struct sys_timer mx53_ard_timer = {
-       .init   = mx53_ard_timer_init,
-};
-
-MACHINE_START(MX53_ARD, "Freescale MX53 ARD Board")
-       .map_io = mx53_map_io,
-       .init_early = imx53_init_early,
-       .init_irq = mx53_init_irq,
-       .handle_irq = imx53_handle_irq,
-       .timer = &mx53_ard_timer,
-       .init_machine = mx53_ard_board_init,
-       .init_late      = imx53_init_late,
-       .restart        = mxc_restart,
-MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx53_evk.c b/arch/arm/mach-imx/mach-mx53_evk.c
deleted file mode 100644 (file)
index 09fe219..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright (C) 2010 Yong Shen. <Yong.Shen@linaro.org>
- */
-
-/*
- * 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.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <linux/init.h>
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/gpio.h>
-#include <linux/spi/flash.h>
-#include <linux/spi/spi.h>
-#include <mach/common.h>
-#include <mach/hardware.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-#include <mach/iomux-mx53.h>
-
-#define MX53_EVK_FEC_PHY_RST   IMX_GPIO_NR(7, 6)
-#define EVK_ECSPI1_CS0         IMX_GPIO_NR(2, 30)
-#define EVK_ECSPI1_CS1         IMX_GPIO_NR(3, 19)
-#define MX53EVK_LED            IMX_GPIO_NR(7, 7)
-
-#include "devices-imx53.h"
-
-static iomux_v3_cfg_t mx53_evk_pads[] = {
-       MX53_PAD_CSI0_DAT10__UART1_TXD_MUX,
-       MX53_PAD_CSI0_DAT11__UART1_RXD_MUX,
-
-       MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX,
-       MX53_PAD_PATA_DMARQ__UART2_TXD_MUX,
-       MX53_PAD_PATA_DIOR__UART2_RTS,
-       MX53_PAD_PATA_INTRQ__UART2_CTS,
-
-       MX53_PAD_PATA_CS_0__UART3_TXD_MUX,
-       MX53_PAD_PATA_CS_1__UART3_RXD_MUX,
-
-       MX53_PAD_EIM_D16__ECSPI1_SCLK,
-       MX53_PAD_EIM_D17__ECSPI1_MISO,
-       MX53_PAD_EIM_D18__ECSPI1_MOSI,
-
-       /* ecspi chip select lines */
-       MX53_PAD_EIM_EB2__GPIO2_30,
-       MX53_PAD_EIM_D19__GPIO3_19,
-       /* LED */
-       MX53_PAD_PATA_DA_1__GPIO7_7,
-};
-
-static const struct imxuart_platform_data mx53_evk_uart_pdata __initconst = {
-       .flags = IMXUART_HAVE_RTSCTS,
-};
-
-static const struct gpio_led mx53evk_leds[] __initconst = {
-       {
-               .name                   = "green",
-               .default_trigger        = "heartbeat",
-               .gpio                   = MX53EVK_LED,
-       },
-};
-
-static const struct gpio_led_platform_data mx53evk_leds_data __initconst = {
-       .leds           = mx53evk_leds,
-       .num_leds       = ARRAY_SIZE(mx53evk_leds),
-};
-
-static inline void mx53_evk_init_uart(void)
-{
-       imx53_add_imx_uart(0, NULL);
-       imx53_add_imx_uart(1, &mx53_evk_uart_pdata);
-       imx53_add_imx_uart(2, NULL);
-}
-
-static const struct imxi2c_platform_data mx53_evk_i2c_data __initconst = {
-       .bitrate = 100000,
-};
-
-static inline void mx53_evk_fec_reset(void)
-{
-       int ret;
-
-       /* reset FEC PHY */
-       ret = gpio_request_one(MX53_EVK_FEC_PHY_RST, GPIOF_OUT_INIT_LOW,
-                                                       "fec-phy-reset");
-       if (ret) {
-               printk(KERN_ERR"failed to get GPIO_FEC_PHY_RESET: %d\n", ret);
-               return;
-       }
-       msleep(1);
-       gpio_set_value(MX53_EVK_FEC_PHY_RST, 1);
-}
-
-static const struct fec_platform_data mx53_evk_fec_pdata __initconst = {
-       .phy = PHY_INTERFACE_MODE_RMII,
-};
-
-static struct spi_board_info mx53_evk_spi_board_info[] __initdata = {
-       {
-               .modalias = "mtd_dataflash",
-               .max_speed_hz = 25000000,
-               .bus_num = 0,
-               .chip_select = 1,
-               .mode = SPI_MODE_0,
-               .platform_data = NULL,
-       },
-};
-
-static int mx53_evk_spi_cs[] = {
-       EVK_ECSPI1_CS0,
-       EVK_ECSPI1_CS1,
-};
-
-static const struct spi_imx_master mx53_evk_spi_data __initconst = {
-       .chipselect     = mx53_evk_spi_cs,
-       .num_chipselect = ARRAY_SIZE(mx53_evk_spi_cs),
-};
-
-void __init imx53_evk_common_init(void)
-{
-       mxc_iomux_v3_setup_multiple_pads(mx53_evk_pads,
-                                        ARRAY_SIZE(mx53_evk_pads));
-}
-
-static void __init mx53_evk_board_init(void)
-{
-       imx53_soc_init();
-       imx53_evk_common_init();
-
-       mx53_evk_init_uart();
-       mx53_evk_fec_reset();
-       imx53_add_fec(&mx53_evk_fec_pdata);
-
-       imx53_add_imx_i2c(0, &mx53_evk_i2c_data);
-       imx53_add_imx_i2c(1, &mx53_evk_i2c_data);
-
-       imx53_add_sdhci_esdhc_imx(0, NULL);
-       imx53_add_sdhci_esdhc_imx(1, NULL);
-
-       spi_register_board_info(mx53_evk_spi_board_info,
-               ARRAY_SIZE(mx53_evk_spi_board_info));
-       imx53_add_ecspi(0, &mx53_evk_spi_data);
-       imx53_add_imx2_wdt(0);
-       gpio_led_register_device(-1, &mx53evk_leds_data);
-}
-
-static void __init mx53_evk_timer_init(void)
-{
-       mx53_clocks_init(32768, 24000000, 22579200, 0);
-}
-
-static struct sys_timer mx53_evk_timer = {
-       .init   = mx53_evk_timer_init,
-};
-
-MACHINE_START(MX53_EVK, "Freescale MX53 EVK Board")
-       .map_io = mx53_map_io,
-       .init_early = imx53_init_early,
-       .init_irq = mx53_init_irq,
-       .handle_irq = imx53_handle_irq,
-       .timer = &mx53_evk_timer,
-       .init_machine = mx53_evk_board_init,
-       .init_late      = imx53_init_late,
-       .restart        = mxc_restart,
-MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx53_loco.c b/arch/arm/mach-imx/mach-mx53_loco.c
deleted file mode 100644 (file)
index 8abe23c..0000000
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- * Copyright (C) 2011 Freescale Semiconductor, Inc. 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 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/init.h>
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/gpio.h>
-#include <linux/i2c.h>
-
-#include <mach/common.h>
-#include <mach/hardware.h>
-#include <mach/iomux-mx53.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "devices-imx53.h"
-
-#define MX53_LOCO_POWER                        IMX_GPIO_NR(1, 8)
-#define MX53_LOCO_UI1                  IMX_GPIO_NR(2, 14)
-#define MX53_LOCO_UI2                  IMX_GPIO_NR(2, 15)
-#define LOCO_FEC_PHY_RST               IMX_GPIO_NR(7, 6)
-#define LOCO_LED                       IMX_GPIO_NR(7, 7)
-#define LOCO_SD3_CD                    IMX_GPIO_NR(3, 11)
-#define LOCO_SD3_WP                    IMX_GPIO_NR(3, 12)
-#define LOCO_SD1_CD                    IMX_GPIO_NR(3, 13)
-#define LOCO_ACCEL_EN                  IMX_GPIO_NR(6, 14)
-
-static iomux_v3_cfg_t mx53_loco_pads[] = {
-       /* FEC */
-       MX53_PAD_FEC_MDC__FEC_MDC,
-       MX53_PAD_FEC_MDIO__FEC_MDIO,
-       MX53_PAD_FEC_REF_CLK__FEC_TX_CLK,
-       MX53_PAD_FEC_RX_ER__FEC_RX_ER,
-       MX53_PAD_FEC_CRS_DV__FEC_RX_DV,
-       MX53_PAD_FEC_RXD1__FEC_RDATA_1,
-       MX53_PAD_FEC_RXD0__FEC_RDATA_0,
-       MX53_PAD_FEC_TX_EN__FEC_TX_EN,
-       MX53_PAD_FEC_TXD1__FEC_TDATA_1,
-       MX53_PAD_FEC_TXD0__FEC_TDATA_0,
-       /* FEC_nRST */
-       MX53_PAD_PATA_DA_0__GPIO7_6,
-       /* FEC_nINT */
-       MX53_PAD_PATA_DATA4__GPIO2_4,
-       /* AUDMUX5 */
-       MX53_PAD_KEY_COL0__AUDMUX_AUD5_TXC,
-       MX53_PAD_KEY_ROW0__AUDMUX_AUD5_TXD,
-       MX53_PAD_KEY_COL1__AUDMUX_AUD5_TXFS,
-       MX53_PAD_KEY_ROW1__AUDMUX_AUD5_RXD,
-       /* I2C1 */
-       MX53_PAD_CSI0_DAT8__I2C1_SDA,
-       MX53_PAD_CSI0_DAT9__I2C1_SCL,
-       MX53_PAD_NANDF_CS1__GPIO6_14,   /* Accelerometer Enable */
-       /* I2C2 */
-       MX53_PAD_KEY_COL3__I2C2_SCL,
-       MX53_PAD_KEY_ROW3__I2C2_SDA,
-       /* SD1 */
-       MX53_PAD_SD1_CMD__ESDHC1_CMD,
-       MX53_PAD_SD1_CLK__ESDHC1_CLK,
-       MX53_PAD_SD1_DATA0__ESDHC1_DAT0,
-       MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
-       MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
-       MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
-       /* SD1_CD */
-       MX53_PAD_EIM_DA13__GPIO3_13,
-       /* SD3 */
-       MX53_PAD_PATA_DATA8__ESDHC3_DAT0,
-       MX53_PAD_PATA_DATA9__ESDHC3_DAT1,
-       MX53_PAD_PATA_DATA10__ESDHC3_DAT2,
-       MX53_PAD_PATA_DATA11__ESDHC3_DAT3,
-       MX53_PAD_PATA_DATA0__ESDHC3_DAT4,
-       MX53_PAD_PATA_DATA1__ESDHC3_DAT5,
-       MX53_PAD_PATA_DATA2__ESDHC3_DAT6,
-       MX53_PAD_PATA_DATA3__ESDHC3_DAT7,
-       MX53_PAD_PATA_IORDY__ESDHC3_CLK,
-       MX53_PAD_PATA_RESET_B__ESDHC3_CMD,
-       /* SD3_CD */
-       MX53_PAD_EIM_DA11__GPIO3_11,
-       /* SD3_WP */
-       MX53_PAD_EIM_DA12__GPIO3_12,
-       /* VGA */
-       MX53_PAD_EIM_OE__IPU_DI1_PIN7,
-       MX53_PAD_EIM_RW__IPU_DI1_PIN8,
-       /* DISPLB */
-       MX53_PAD_EIM_D20__IPU_SER_DISP0_CS,
-       MX53_PAD_EIM_D21__IPU_DISPB0_SER_CLK,
-       MX53_PAD_EIM_D22__IPU_DISPB0_SER_DIN,
-       MX53_PAD_EIM_D23__IPU_DI0_D0_CS,
-       /* DISP0_POWER_EN */
-       MX53_PAD_EIM_D24__GPIO3_24,
-       /* DISP0 DET INT */
-       MX53_PAD_EIM_D31__GPIO3_31,
-       /* LVDS */
-       MX53_PAD_LVDS0_TX3_P__LDB_LVDS0_TX3,
-       MX53_PAD_LVDS0_CLK_P__LDB_LVDS0_CLK,
-       MX53_PAD_LVDS0_TX2_P__LDB_LVDS0_TX2,
-       MX53_PAD_LVDS0_TX1_P__LDB_LVDS0_TX1,
-       MX53_PAD_LVDS0_TX0_P__LDB_LVDS0_TX0,
-       MX53_PAD_LVDS1_TX3_P__LDB_LVDS1_TX3,
-       MX53_PAD_LVDS1_TX2_P__LDB_LVDS1_TX2,
-       MX53_PAD_LVDS1_CLK_P__LDB_LVDS1_CLK,
-       MX53_PAD_LVDS1_TX1_P__LDB_LVDS1_TX1,
-       MX53_PAD_LVDS1_TX0_P__LDB_LVDS1_TX0,
-       /* I2C1 */
-       MX53_PAD_CSI0_DAT8__I2C1_SDA,
-       MX53_PAD_CSI0_DAT9__I2C1_SCL,
-       /* UART1 */
-       MX53_PAD_CSI0_DAT10__UART1_TXD_MUX,
-       MX53_PAD_CSI0_DAT11__UART1_RXD_MUX,
-       /* CSI0 */
-       MX53_PAD_CSI0_DAT12__IPU_CSI0_D_12,
-       MX53_PAD_CSI0_DAT13__IPU_CSI0_D_13,
-       MX53_PAD_CSI0_DAT14__IPU_CSI0_D_14,
-       MX53_PAD_CSI0_DAT15__IPU_CSI0_D_15,
-       MX53_PAD_CSI0_DAT16__IPU_CSI0_D_16,
-       MX53_PAD_CSI0_DAT17__IPU_CSI0_D_17,
-       MX53_PAD_CSI0_DAT18__IPU_CSI0_D_18,
-       MX53_PAD_CSI0_DAT19__IPU_CSI0_D_19,
-       MX53_PAD_CSI0_VSYNC__IPU_CSI0_VSYNC,
-       MX53_PAD_CSI0_MCLK__IPU_CSI0_HSYNC,
-       MX53_PAD_CSI0_PIXCLK__IPU_CSI0_PIXCLK,
-       /* DISPLAY */
-       MX53_PAD_DI0_DISP_CLK__IPU_DI0_DISP_CLK,
-       MX53_PAD_DI0_PIN15__IPU_DI0_PIN15,
-       MX53_PAD_DI0_PIN2__IPU_DI0_PIN2,
-       MX53_PAD_DI0_PIN3__IPU_DI0_PIN3,
-       MX53_PAD_DISP0_DAT0__IPU_DISP0_DAT_0,
-       MX53_PAD_DISP0_DAT1__IPU_DISP0_DAT_1,
-       MX53_PAD_DISP0_DAT2__IPU_DISP0_DAT_2,
-       MX53_PAD_DISP0_DAT3__IPU_DISP0_DAT_3,
-       MX53_PAD_DISP0_DAT4__IPU_DISP0_DAT_4,
-       MX53_PAD_DISP0_DAT5__IPU_DISP0_DAT_5,
-       MX53_PAD_DISP0_DAT6__IPU_DISP0_DAT_6,
-       MX53_PAD_DISP0_DAT7__IPU_DISP0_DAT_7,
-       MX53_PAD_DISP0_DAT8__IPU_DISP0_DAT_8,
-       MX53_PAD_DISP0_DAT9__IPU_DISP0_DAT_9,
-       MX53_PAD_DISP0_DAT10__IPU_DISP0_DAT_10,
-       MX53_PAD_DISP0_DAT11__IPU_DISP0_DAT_11,
-       MX53_PAD_DISP0_DAT12__IPU_DISP0_DAT_12,
-       MX53_PAD_DISP0_DAT13__IPU_DISP0_DAT_13,
-       MX53_PAD_DISP0_DAT14__IPU_DISP0_DAT_14,
-       MX53_PAD_DISP0_DAT15__IPU_DISP0_DAT_15,
-       MX53_PAD_DISP0_DAT16__IPU_DISP0_DAT_16,
-       MX53_PAD_DISP0_DAT17__IPU_DISP0_DAT_17,
-       MX53_PAD_DISP0_DAT18__IPU_DISP0_DAT_18,
-       MX53_PAD_DISP0_DAT19__IPU_DISP0_DAT_19,
-       MX53_PAD_DISP0_DAT20__IPU_DISP0_DAT_20,
-       MX53_PAD_DISP0_DAT21__IPU_DISP0_DAT_21,
-       MX53_PAD_DISP0_DAT22__IPU_DISP0_DAT_22,
-       MX53_PAD_DISP0_DAT23__IPU_DISP0_DAT_23,
-       /* Audio CLK*/
-       MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK,
-       /* PWM */
-       MX53_PAD_GPIO_1__PWM2_PWMO,
-       /* SPDIF */
-       MX53_PAD_GPIO_7__SPDIF_PLOCK,
-       MX53_PAD_GPIO_17__SPDIF_OUT1,
-       /* GPIO */
-       MX53_PAD_PATA_DA_1__GPIO7_7,            /* LED */
-       MX53_PAD_PATA_DA_2__GPIO7_8,
-       MX53_PAD_PATA_DATA5__GPIO2_5,
-       MX53_PAD_PATA_DATA6__GPIO2_6,
-       MX53_PAD_PATA_DATA14__GPIO2_14,
-       MX53_PAD_PATA_DATA15__GPIO2_15,
-       MX53_PAD_PATA_INTRQ__GPIO7_2,
-       MX53_PAD_EIM_WAIT__GPIO5_0,
-       MX53_PAD_NANDF_WP_B__GPIO6_9,
-       MX53_PAD_NANDF_RB0__GPIO6_10,
-       MX53_PAD_NANDF_CS1__GPIO6_14,
-       MX53_PAD_NANDF_CS2__GPIO6_15,
-       MX53_PAD_NANDF_CS3__GPIO6_16,
-       MX53_PAD_GPIO_5__GPIO1_5,
-       MX53_PAD_GPIO_16__GPIO7_11,
-       MX53_PAD_GPIO_8__GPIO1_8,
-};
-
-#define GPIO_BUTTON(gpio_num, ev_code, act_low, descr, wake)   \
-{                                                              \
-       .gpio           = gpio_num,                             \
-       .type           = EV_KEY,                               \
-       .code           = ev_code,                              \
-       .active_low     = act_low,                              \
-       .desc           = "btn " descr,                         \
-       .wakeup         = wake,                                 \
-}
-
-static struct gpio_keys_button loco_buttons[] = {
-       GPIO_BUTTON(MX53_LOCO_POWER, KEY_POWER, 1, "power", 0),
-       GPIO_BUTTON(MX53_LOCO_UI1, KEY_VOLUMEUP, 1, "volume-up", 0),
-       GPIO_BUTTON(MX53_LOCO_UI2, KEY_VOLUMEDOWN, 1, "volume-down", 0),
-};
-
-static const struct gpio_keys_platform_data loco_button_data __initconst = {
-       .buttons        = loco_buttons,
-       .nbuttons       = ARRAY_SIZE(loco_buttons),
-};
-
-static const struct esdhc_platform_data mx53_loco_sd1_data __initconst = {
-       .cd_gpio = LOCO_SD1_CD,
-       .cd_type = ESDHC_CD_GPIO,
-       .wp_type = ESDHC_WP_NONE,
-};
-
-static const struct esdhc_platform_data mx53_loco_sd3_data __initconst = {
-       .cd_gpio = LOCO_SD3_CD,
-       .wp_gpio = LOCO_SD3_WP,
-       .cd_type = ESDHC_CD_GPIO,
-       .wp_type = ESDHC_WP_GPIO,
-};
-
-static inline void mx53_loco_fec_reset(void)
-{
-       int ret;
-
-       /* reset FEC PHY */
-       ret = gpio_request(LOCO_FEC_PHY_RST, "fec-phy-reset");
-       if (ret) {
-               printk(KERN_ERR"failed to get GPIO_FEC_PHY_RESET: %d\n", ret);
-               return;
-       }
-       gpio_direction_output(LOCO_FEC_PHY_RST, 0);
-       msleep(1);
-       gpio_set_value(LOCO_FEC_PHY_RST, 1);
-}
-
-static const struct fec_platform_data mx53_loco_fec_data __initconst = {
-       .phy = PHY_INTERFACE_MODE_RMII,
-};
-
-static const struct imxi2c_platform_data mx53_loco_i2c_data __initconst = {
-       .bitrate = 100000,
-};
-
-static const struct gpio_led mx53loco_leds[] __initconst = {
-       {
-               .name                   = "green",
-               .default_trigger        = "heartbeat",
-               .gpio                   = LOCO_LED,
-       },
-};
-
-static const struct gpio_led_platform_data mx53loco_leds_data __initconst = {
-       .leds           = mx53loco_leds,
-       .num_leds       = ARRAY_SIZE(mx53loco_leds),
-};
-
-void __init imx53_qsb_common_init(void)
-{
-       mxc_iomux_v3_setup_multiple_pads(mx53_loco_pads,
-                                        ARRAY_SIZE(mx53_loco_pads));
-}
-
-static struct i2c_board_info mx53loco_i2c_devices[] = {
-       {
-               I2C_BOARD_INFO("mma8450", 0x1C),
-       },
-};
-
-static void __init mx53_loco_board_init(void)
-{
-       int ret;
-       imx53_soc_init();
-       imx53_qsb_common_init();
-
-       imx53_add_imx_uart(0, NULL);
-       mx53_loco_fec_reset();
-       imx53_add_fec(&mx53_loco_fec_data);
-       imx53_add_imx2_wdt(0);
-
-       ret = gpio_request_one(LOCO_ACCEL_EN, GPIOF_OUT_INIT_HIGH, "accel_en");
-       if (ret)
-               pr_err("Cannot request ACCEL_EN pin: %d\n", ret);
-
-       i2c_register_board_info(0, mx53loco_i2c_devices,
-                               ARRAY_SIZE(mx53loco_i2c_devices));
-       imx53_add_imx_i2c(0, &mx53_loco_i2c_data);
-       imx53_add_imx_i2c(1, &mx53_loco_i2c_data);
-       imx53_add_sdhci_esdhc_imx(0, &mx53_loco_sd1_data);
-       imx53_add_sdhci_esdhc_imx(2, &mx53_loco_sd3_data);
-       imx_add_gpio_keys(&loco_button_data);
-       gpio_led_register_device(-1, &mx53loco_leds_data);
-       imx53_add_ahci_imx();
-}
-
-static void __init mx53_loco_timer_init(void)
-{
-       mx53_clocks_init(32768, 24000000, 0, 0);
-}
-
-static struct sys_timer mx53_loco_timer = {
-       .init   = mx53_loco_timer_init,
-};
-
-MACHINE_START(MX53_LOCO, "Freescale MX53 LOCO Board")
-       .map_io = mx53_map_io,
-       .init_early = imx53_init_early,
-       .init_irq = mx53_init_irq,
-       .handle_irq = imx53_handle_irq,
-       .timer = &mx53_loco_timer,
-       .init_machine = mx53_loco_board_init,
-       .init_late      = imx53_init_late,
-       .restart        = mxc_restart,
-MACHINE_END
diff --git a/arch/arm/mach-imx/mach-mx53_smd.c b/arch/arm/mach-imx/mach-mx53_smd.c
deleted file mode 100644 (file)
index b15d6a6..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2011 Freescale Semiconductor, Inc. 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 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/init.h>
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/gpio.h>
-
-#include <mach/common.h>
-#include <mach/hardware.h>
-#include <mach/iomux-mx53.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "devices-imx53.h"
-
-#define SMD_FEC_PHY_RST                IMX_GPIO_NR(7, 6)
-#define MX53_SMD_SATA_PWR_EN    IMX_GPIO_NR(3, 3)
-
-static iomux_v3_cfg_t mx53_smd_pads[] = {
-       MX53_PAD_CSI0_DAT10__UART1_TXD_MUX,
-       MX53_PAD_CSI0_DAT11__UART1_RXD_MUX,
-
-       MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX,
-       MX53_PAD_PATA_DMARQ__UART2_TXD_MUX,
-
-       MX53_PAD_PATA_CS_0__UART3_TXD_MUX,
-       MX53_PAD_PATA_CS_1__UART3_RXD_MUX,
-       MX53_PAD_PATA_DA_1__UART3_CTS,
-       MX53_PAD_PATA_DA_2__UART3_RTS,
-       /* I2C1 */
-       MX53_PAD_CSI0_DAT8__I2C1_SDA,
-       MX53_PAD_CSI0_DAT9__I2C1_SCL,
-       /* SD1 */
-       MX53_PAD_SD1_CMD__ESDHC1_CMD,
-       MX53_PAD_SD1_CLK__ESDHC1_CLK,
-       MX53_PAD_SD1_DATA0__ESDHC1_DAT0,
-       MX53_PAD_SD1_DATA1__ESDHC1_DAT1,
-       MX53_PAD_SD1_DATA2__ESDHC1_DAT2,
-       MX53_PAD_SD1_DATA3__ESDHC1_DAT3,
-       /* SD2 */
-       MX53_PAD_SD2_CMD__ESDHC2_CMD,
-       MX53_PAD_SD2_CLK__ESDHC2_CLK,
-       MX53_PAD_SD2_DATA0__ESDHC2_DAT0,
-       MX53_PAD_SD2_DATA1__ESDHC2_DAT1,
-       MX53_PAD_SD2_DATA2__ESDHC2_DAT2,
-       MX53_PAD_SD2_DATA3__ESDHC2_DAT3,
-       /* SD3 */
-       MX53_PAD_PATA_DATA8__ESDHC3_DAT0,
-       MX53_PAD_PATA_DATA9__ESDHC3_DAT1,
-       MX53_PAD_PATA_DATA10__ESDHC3_DAT2,
-       MX53_PAD_PATA_DATA11__ESDHC3_DAT3,
-       MX53_PAD_PATA_DATA0__ESDHC3_DAT4,
-       MX53_PAD_PATA_DATA1__ESDHC3_DAT5,
-       MX53_PAD_PATA_DATA2__ESDHC3_DAT6,
-       MX53_PAD_PATA_DATA3__ESDHC3_DAT7,
-       MX53_PAD_PATA_IORDY__ESDHC3_CLK,
-       MX53_PAD_PATA_RESET_B__ESDHC3_CMD,
-};
-
-static const struct imxuart_platform_data mx53_smd_uart_data __initconst = {
-       .flags = IMXUART_HAVE_RTSCTS,
-};
-
-static inline void mx53_smd_init_uart(void)
-{
-       imx53_add_imx_uart(0, NULL);
-       imx53_add_imx_uart(1, NULL);
-       imx53_add_imx_uart(2, &mx53_smd_uart_data);
-}
-
-static inline void mx53_smd_fec_reset(void)
-{
-       int ret;
-
-       /* reset FEC PHY */
-       ret = gpio_request(SMD_FEC_PHY_RST, "fec-phy-reset");
-       if (ret) {
-               printk(KERN_ERR"failed to get GPIO_FEC_PHY_RESET: %d\n", ret);
-               return;
-       }
-       gpio_direction_output(SMD_FEC_PHY_RST, 0);
-       msleep(1);
-       gpio_set_value(SMD_FEC_PHY_RST, 1);
-}
-
-static const struct fec_platform_data mx53_smd_fec_data __initconst = {
-       .phy = PHY_INTERFACE_MODE_RMII,
-};
-
-static const struct imxi2c_platform_data mx53_smd_i2c_data __initconst = {
-       .bitrate = 100000,
-};
-
-static inline void mx53_smd_ahci_pwr_on(void)
-{
-       int ret;
-
-       /* Enable SATA PWR */
-       ret = gpio_request_one(MX53_SMD_SATA_PWR_EN,
-                       GPIOF_DIR_OUT | GPIOF_INIT_HIGH, "ahci-sata-pwr");
-       if (ret) {
-               pr_err("failed to enable SATA_PWR_EN: %d\n", ret);
-               return;
-       }
-}
-
-void __init imx53_smd_common_init(void)
-{
-       mxc_iomux_v3_setup_multiple_pads(mx53_smd_pads,
-                                        ARRAY_SIZE(mx53_smd_pads));
-}
-
-static void __init mx53_smd_board_init(void)
-{
-       imx53_soc_init();
-       imx53_smd_common_init();
-
-       mx53_smd_init_uart();
-       mx53_smd_fec_reset();
-       imx53_add_fec(&mx53_smd_fec_data);
-       imx53_add_imx2_wdt(0);
-       imx53_add_imx_i2c(0, &mx53_smd_i2c_data);
-       imx53_add_sdhci_esdhc_imx(0, NULL);
-       imx53_add_sdhci_esdhc_imx(1, NULL);
-       imx53_add_sdhci_esdhc_imx(2, NULL);
-       mx53_smd_ahci_pwr_on();
-       imx53_add_ahci_imx();
-}
-
-static void __init mx53_smd_timer_init(void)
-{
-       mx53_clocks_init(32768, 24000000, 22579200, 0);
-}
-
-static struct sys_timer mx53_smd_timer = {
-       .init   = mx53_smd_timer_init,
-};
-
-MACHINE_START(MX53_SMD, "Freescale MX53 SMD Board")
-       .map_io = mx53_map_io,
-       .init_early = imx53_init_early,
-       .init_irq = mx53_init_irq,
-       .handle_irq = imx53_handle_irq,
-       .timer = &mx53_smd_timer,
-       .init_machine = mx53_smd_board_init,
-       .init_late      = imx53_init_late,
-       .restart        = mxc_restart,
-MACHINE_END
index 52d8f53..acb0aad 100644 (file)
@@ -128,25 +128,6 @@ static struct sdma_platform_data imx51_sdma_pdata __initdata = {
        .script_addrs = &imx51_sdma_script,
 };
 
-static struct sdma_script_start_addrs imx53_sdma_script __initdata = {
-       .ap_2_ap_addr = 642,
-       .app_2_mcu_addr = 683,
-       .mcu_2_app_addr = 747,
-       .uart_2_mcu_addr = 817,
-       .shp_2_mcu_addr = 891,
-       .mcu_2_shp_addr = 960,
-       .uartsh_2_mcu_addr = 1032,
-       .spdif_2_mcu_addr = 1100,
-       .mcu_2_spdif_addr = 1134,
-       .firi_2_mcu_addr = 1193,
-       .mcu_2_firi_addr = 1290,
-};
-
-static struct sdma_platform_data imx53_sdma_pdata __initdata = {
-       .fw_name = "sdma-imx53.bin",
-       .script_addrs = &imx53_sdma_script,
-};
-
 static const struct resource imx50_audmux_res[] __initconst = {
        DEFINE_RES_MEM(MX50_AUDMUX_BASE_ADDR, SZ_16K),
 };
@@ -155,10 +136,6 @@ static const struct resource imx51_audmux_res[] __initconst = {
        DEFINE_RES_MEM(MX51_AUDMUX_BASE_ADDR, SZ_16K),
 };
 
-static const struct resource imx53_audmux_res[] __initconst = {
-       DEFINE_RES_MEM(MX53_AUDMUX_BASE_ADDR, SZ_16K),
-};
-
 void __init imx50_soc_init(void)
 {
        /* i.mx50 has the i.mx35 type gpio */
@@ -196,30 +173,6 @@ void __init imx51_soc_init(void)
                                        ARRAY_SIZE(imx51_audmux_res));
 }
 
-void __init imx53_soc_init(void)
-{
-       /* i.mx53 has the i.mx35 type gpio */
-       mxc_register_gpio("imx35-gpio", 0, MX53_GPIO1_BASE_ADDR, SZ_16K, MX53_INT_GPIO1_LOW, MX53_INT_GPIO1_HIGH);
-       mxc_register_gpio("imx35-gpio", 1, MX53_GPIO2_BASE_ADDR, SZ_16K, MX53_INT_GPIO2_LOW, MX53_INT_GPIO2_HIGH);
-       mxc_register_gpio("imx35-gpio", 2, MX53_GPIO3_BASE_ADDR, SZ_16K, MX53_INT_GPIO3_LOW, MX53_INT_GPIO3_HIGH);
-       mxc_register_gpio("imx35-gpio", 3, MX53_GPIO4_BASE_ADDR, SZ_16K, MX53_INT_GPIO4_LOW, MX53_INT_GPIO4_HIGH);
-       mxc_register_gpio("imx35-gpio", 4, MX53_GPIO5_BASE_ADDR, SZ_16K, MX53_INT_GPIO5_LOW, MX53_INT_GPIO5_HIGH);
-       mxc_register_gpio("imx35-gpio", 5, MX53_GPIO6_BASE_ADDR, SZ_16K, MX53_INT_GPIO6_LOW, MX53_INT_GPIO6_HIGH);
-       mxc_register_gpio("imx35-gpio", 6, MX53_GPIO7_BASE_ADDR, SZ_16K, MX53_INT_GPIO7_LOW, MX53_INT_GPIO7_HIGH);
-
-       pinctrl_provide_dummies();
-       /* i.mx53 has the i.mx35 type sdma */
-       imx_add_imx_sdma("imx35-sdma", MX53_SDMA_BASE_ADDR, MX53_INT_SDMA, &imx53_sdma_pdata);
-
-       /* Setup AIPS registers */
-       imx_set_aips(MX53_IO_ADDRESS(MX53_AIPS1_BASE_ADDR));
-       imx_set_aips(MX53_IO_ADDRESS(MX53_AIPS2_BASE_ADDR));
-
-       /* i.mx53 has the i.mx31 type audmux */
-       platform_device_register_simple("imx31-audmux", 0, imx53_audmux_res,
-                                       ARRAY_SIZE(imx53_audmux_res));
-}
-
 void __init imx51_init_late(void)
 {
        mx51_neon_fixup();
diff --git a/arch/arm/mach-imx/mx51_efika.c b/arch/arm/mach-imx/mx51_efika.c
deleted file mode 100644 (file)
index ee870c4..0000000
+++ /dev/null
@@ -1,633 +0,0 @@
-/*
- * based on code from the following
- * Copyright 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright 2009-2010 Pegatron Corporation. All Rights Reserved.
- * Copyright 2009-2010 Genesi USA, 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
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/i2c.h>
-#include <linux/gpio.h>
-#include <linux/leds.h>
-#include <linux/input.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/spi/flash.h>
-#include <linux/spi/spi.h>
-#include <linux/mfd/mc13892.h>
-#include <linux/regulator/machine.h>
-#include <linux/regulator/consumer.h>
-
-#include <mach/common.h>
-#include <mach/hardware.h>
-#include <mach/iomux-mx51.h>
-
-#include <linux/usb/otg.h>
-#include <linux/usb/ulpi.h>
-#include <mach/ulpi.h>
-
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include "devices-imx51.h"
-#include "efika.h"
-#include "cpu_op-mx51.h"
-
-#define MX51_USB_CTRL_1_OFFSET          0x10
-#define MX51_USB_CTRL_UH1_EXT_CLK_EN    (1 << 25)
-#define        MX51_USB_PLL_DIV_19_2_MHZ       0x01
-
-#define EFIKAMX_USB_HUB_RESET  IMX_GPIO_NR(1, 5)
-#define EFIKAMX_USBH1_STP      IMX_GPIO_NR(1, 27)
-
-#define EFIKAMX_SPI_CS0                IMX_GPIO_NR(4, 24)
-#define EFIKAMX_SPI_CS1                IMX_GPIO_NR(4, 25)
-
-#define EFIKAMX_PMIC           IMX_GPIO_NR(1, 6)
-
-static iomux_v3_cfg_t mx51efika_pads[] = {
-       /* UART1 */
-       MX51_PAD_UART1_RXD__UART1_RXD,
-       MX51_PAD_UART1_TXD__UART1_TXD,
-       MX51_PAD_UART1_RTS__UART1_RTS,
-       MX51_PAD_UART1_CTS__UART1_CTS,
-
-       /* SD 1 */
-       MX51_PAD_SD1_CMD__SD1_CMD,
-       MX51_PAD_SD1_CLK__SD1_CLK,
-       MX51_PAD_SD1_DATA0__SD1_DATA0,
-       MX51_PAD_SD1_DATA1__SD1_DATA1,
-       MX51_PAD_SD1_DATA2__SD1_DATA2,
-       MX51_PAD_SD1_DATA3__SD1_DATA3,
-
-       /* SD 2 */
-       MX51_PAD_SD2_CMD__SD2_CMD,
-       MX51_PAD_SD2_CLK__SD2_CLK,
-       MX51_PAD_SD2_DATA0__SD2_DATA0,
-       MX51_PAD_SD2_DATA1__SD2_DATA1,
-       MX51_PAD_SD2_DATA2__SD2_DATA2,
-       MX51_PAD_SD2_DATA3__SD2_DATA3,
-
-       /* SD/MMC WP/CD */
-       MX51_PAD_GPIO1_0__SD1_CD,
-       MX51_PAD_GPIO1_1__SD1_WP,
-       MX51_PAD_GPIO1_7__SD2_WP,
-       MX51_PAD_GPIO1_8__SD2_CD,
-
-       /* spi */
-       MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI,
-       MX51_PAD_CSPI1_MISO__ECSPI1_MISO,
-       MX51_PAD_CSPI1_SS0__GPIO4_24,
-       MX51_PAD_CSPI1_SS1__GPIO4_25,
-       MX51_PAD_CSPI1_RDY__ECSPI1_RDY,
-       MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK,
-       MX51_PAD_GPIO1_6__GPIO1_6,
-
-       /* USB HOST1 */
-       MX51_PAD_USBH1_CLK__USBH1_CLK,
-       MX51_PAD_USBH1_DIR__USBH1_DIR,
-       MX51_PAD_USBH1_NXT__USBH1_NXT,
-       MX51_PAD_USBH1_DATA0__USBH1_DATA0,
-       MX51_PAD_USBH1_DATA1__USBH1_DATA1,
-       MX51_PAD_USBH1_DATA2__USBH1_DATA2,
-       MX51_PAD_USBH1_DATA3__USBH1_DATA3,
-       MX51_PAD_USBH1_DATA4__USBH1_DATA4,
-       MX51_PAD_USBH1_DATA5__USBH1_DATA5,
-       MX51_PAD_USBH1_DATA6__USBH1_DATA6,
-       MX51_PAD_USBH1_DATA7__USBH1_DATA7,
-
-       /* USB HUB RESET */
-       MX51_PAD_GPIO1_5__GPIO1_5,
-
-       /* WLAN */
-       MX51_PAD_EIM_A22__GPIO2_16,
-       MX51_PAD_EIM_A16__GPIO2_10,
-
-       /* USB PHY RESET */
-       MX51_PAD_EIM_D27__GPIO2_9,
-};
-
-/* Serial ports */
-static const struct imxuart_platform_data uart_pdata = {
-       .flags = IMXUART_HAVE_RTSCTS,
-};
-
-/* This function is board specific as the bit mask for the plldiv will also
- * be different for other Freescale SoCs, thus a common bitmask is not
- * possible and cannot get place in /plat-mxc/ehci.c.
- */
-static int initialize_otg_port(struct platform_device *pdev)
-{
-       u32 v;
-       void __iomem *usb_base;
-       void __iomem *usbother_base;
-       usb_base = ioremap(MX51_USB_OTG_BASE_ADDR, SZ_4K);
-       if (!usb_base)
-               return -ENOMEM;
-       usbother_base = (void __iomem *)(usb_base + MX5_USBOTHER_REGS_OFFSET);
-
-       /* Set the PHY clock to 19.2MHz */
-       v = __raw_readl(usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
-       v &= ~MX5_USB_UTMI_PHYCTRL1_PLLDIV_MASK;
-       v |= MX51_USB_PLL_DIV_19_2_MHZ;
-       __raw_writel(v, usbother_base + MXC_USB_PHY_CTR_FUNC2_OFFSET);
-       iounmap(usb_base);
-
-       mdelay(10);
-
-       return mx51_initialize_usb_hw(pdev->id, MXC_EHCI_INTERNAL_PHY);
-}
-
-static const struct mxc_usbh_platform_data dr_utmi_config __initconst = {
-       .init   = initialize_otg_port,
-       .portsc = MXC_EHCI_UTMI_16BIT,
-};
-
-static int initialize_usbh1_port(struct platform_device *pdev)
-{
-       iomux_v3_cfg_t usbh1stp = MX51_PAD_USBH1_STP__USBH1_STP;
-       iomux_v3_cfg_t usbh1gpio = MX51_PAD_USBH1_STP__GPIO1_27;
-       u32 v;
-       void __iomem *usb_base;
-       void __iomem *socregs_base;
-
-       mxc_iomux_v3_setup_pad(usbh1gpio);
-       gpio_request(EFIKAMX_USBH1_STP, "usbh1_stp");
-       gpio_direction_output(EFIKAMX_USBH1_STP, 0);
-       msleep(1);
-       gpio_set_value(EFIKAMX_USBH1_STP, 1);
-       msleep(1);
-
-       usb_base = ioremap(MX51_USB_OTG_BASE_ADDR, SZ_4K);
-       socregs_base = (void __iomem *)(usb_base + MX5_USBOTHER_REGS_OFFSET);
-
-       /* The clock for the USBH1 ULPI port will come externally */
-       /* from the PHY. */
-       v = __raw_readl(socregs_base + MX51_USB_CTRL_1_OFFSET);
-       __raw_writel(v | MX51_USB_CTRL_UH1_EXT_CLK_EN,
-                       socregs_base + MX51_USB_CTRL_1_OFFSET);
-
-       iounmap(usb_base);
-
-       gpio_free(EFIKAMX_USBH1_STP);
-       mxc_iomux_v3_setup_pad(usbh1stp);
-
-       mdelay(10);
-
-       return mx51_initialize_usb_hw(pdev->id, MXC_EHCI_ITC_NO_THRESHOLD);
-}
-
-static struct mxc_usbh_platform_data usbh1_config __initdata = {
-       .init   = initialize_usbh1_port,
-       .portsc = MXC_EHCI_MODE_ULPI,
-};
-
-static void mx51_efika_hubreset(void)
-{
-       gpio_request(EFIKAMX_USB_HUB_RESET, "usb_hub_rst");
-       gpio_direction_output(EFIKAMX_USB_HUB_RESET, 1);
-       msleep(1);
-       gpio_set_value(EFIKAMX_USB_HUB_RESET, 0);
-       msleep(1);
-       gpio_set_value(EFIKAMX_USB_HUB_RESET, 1);
-}
-
-static void __init mx51_efika_usb(void)
-{
-       mx51_efika_hubreset();
-
-       /* pulling it low, means no USB at all... */
-       gpio_request(EFIKA_USB_PHY_RESET, "usb_phy_reset");
-       gpio_direction_output(EFIKA_USB_PHY_RESET, 0);
-       msleep(1);
-       gpio_set_value(EFIKA_USB_PHY_RESET, 1);
-
-       usbh1_config.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS |
-                       ULPI_OTG_DRVVBUS_EXT | ULPI_OTG_EXTVBUSIND);
-
-       imx51_add_mxc_ehci_otg(&dr_utmi_config);
-       if (usbh1_config.otg)
-               imx51_add_mxc_ehci_hs(1, &usbh1_config);
-}
-
-static struct mtd_partition mx51_efika_spi_nor_partitions[] = {
-       {
-        .name = "u-boot",
-        .offset = 0,
-        .size = SZ_256K,
-       },
-       {
-         .name = "config",
-         .offset = MTDPART_OFS_APPEND,
-         .size = SZ_64K,
-       },
-};
-
-static struct flash_platform_data mx51_efika_spi_flash_data = {
-       .name           = "spi_flash",
-       .parts          = mx51_efika_spi_nor_partitions,
-       .nr_parts       = ARRAY_SIZE(mx51_efika_spi_nor_partitions),
-       .type           = "sst25vf032b",
-};
-
-static struct regulator_consumer_supply sw1_consumers[] = {
-       {
-               .supply = "cpu_vcc",
-       }
-};
-
-static struct regulator_consumer_supply vdig_consumers[] = {
-       /* sgtl5000 */
-       REGULATOR_SUPPLY("VDDA", "1-000a"),
-       REGULATOR_SUPPLY("VDDD", "1-000a"),
-};
-
-static struct regulator_consumer_supply vvideo_consumers[] = {
-       /* sgtl5000 */
-       REGULATOR_SUPPLY("VDDIO", "1-000a"),
-};
-
-static struct regulator_consumer_supply vsd_consumers[] = {
-       REGULATOR_SUPPLY("vmmc", "sdhci-esdhc-imx51.0"),
-       REGULATOR_SUPPLY("vmmc", "sdhci-esdhc-imx51.1"),
-};
-
-static struct regulator_consumer_supply pwgt1_consumer[] = {
-       {
-               .supply = "pwgt1",
-       }
-};
-
-static struct regulator_consumer_supply pwgt2_consumer[] = {
-       {
-               .supply = "pwgt2",
-       }
-};
-
-static struct regulator_consumer_supply coincell_consumer[] = {
-       {
-               .supply = "coincell",
-       }
-};
-
-static struct regulator_init_data sw1_init = {
-       .constraints = {
-               .name = "SW1",
-               .min_uV = 600000,
-               .max_uV = 1375000,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
-               .valid_modes_mask = 0,
-               .always_on = 1,
-               .boot_on = 1,
-               .state_mem = {
-                       .uV = 850000,
-                       .mode = REGULATOR_MODE_NORMAL,
-                       .enabled = 1,
-               },
-       },
-       .num_consumer_supplies = ARRAY_SIZE(sw1_consumers),
-       .consumer_supplies = sw1_consumers,
-};
-
-static struct regulator_init_data sw2_init = {
-       .constraints = {
-               .name = "SW2",
-               .min_uV = 900000,
-               .max_uV = 1850000,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
-               .always_on = 1,
-               .boot_on = 1,
-               .state_mem = {
-                       .uV = 950000,
-                       .mode = REGULATOR_MODE_NORMAL,
-                       .enabled = 1,
-               },
-       }
-};
-
-static struct regulator_init_data sw3_init = {
-       .constraints = {
-               .name = "SW3",
-               .min_uV = 1100000,
-               .max_uV = 1850000,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
-               .always_on = 1,
-               .boot_on = 1,
-       }
-};
-
-static struct regulator_init_data sw4_init = {
-       .constraints = {
-               .name = "SW4",
-               .min_uV = 1100000,
-               .max_uV = 1850000,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
-               .always_on = 1,
-               .boot_on = 1,
-       }
-};
-
-static struct regulator_init_data viohi_init = {
-       .constraints = {
-               .name = "VIOHI",
-               .boot_on = 1,
-               .always_on = 1,
-       }
-};
-
-static struct regulator_init_data vusb_init = {
-       .constraints = {
-               .name = "VUSB",
-               .boot_on = 1,
-               .always_on = 1,
-       }
-};
-
-static struct regulator_init_data swbst_init = {
-       .constraints = {
-               .name = "SWBST",
-       }
-};
-
-static struct regulator_init_data vdig_init = {
-       .constraints = {
-               .name = "VDIG",
-               .min_uV = 1050000,
-               .max_uV = 1800000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
-               .boot_on = 1,
-               .always_on = 1,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(vdig_consumers),
-       .consumer_supplies = vdig_consumers,
-};
-
-static struct regulator_init_data vpll_init = {
-       .constraints = {
-               .name = "VPLL",
-               .min_uV = 1050000,
-               .max_uV = 1800000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
-               .boot_on = 1,
-               .always_on = 1,
-       }
-};
-
-static struct regulator_init_data vusb2_init = {
-       .constraints = {
-               .name = "VUSB2",
-               .min_uV = 2400000,
-               .max_uV = 2775000,
-               .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
-               .boot_on = 1,
-               .always_on = 1,
-       }
-};
-
-static struct regulator_init_data vvideo_init = {
-       .constraints = {
-               .name = "VVIDEO",
-               .min_uV = 2775000,
-               .max_uV = 2775000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
-               .boot_on = 1,
-               .apply_uV = 1,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(vvideo_consumers),
-       .consumer_supplies = vvideo_consumers,
-};
-
-static struct regulator_init_data vaudio_init = {
-       .constraints = {
-               .name = "VAUDIO",
-               .min_uV = 2300000,
-               .max_uV = 3000000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
-               .boot_on = 1,
-       }
-};
-
-static struct regulator_init_data vsd_init = {
-       .constraints = {
-               .name = "VSD",
-               .min_uV = 1800000,
-               .max_uV = 3150000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE,
-               .boot_on = 1,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(vsd_consumers),
-       .consumer_supplies = vsd_consumers,
-};
-
-static struct regulator_init_data vcam_init = {
-       .constraints = {
-               .name = "VCAM",
-               .min_uV = 2500000,
-               .max_uV = 3000000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE |
-                       REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
-               .valid_modes_mask = REGULATOR_MODE_FAST | REGULATOR_MODE_NORMAL,
-               .boot_on = 1,
-       }
-};
-
-static struct regulator_init_data vgen1_init = {
-       .constraints = {
-               .name = "VGEN1",
-               .min_uV = 1200000,
-               .max_uV = 3150000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
-               .boot_on = 1,
-               .always_on = 1,
-       }
-};
-
-static struct regulator_init_data vgen2_init = {
-       .constraints = {
-               .name = "VGEN2",
-               .min_uV = 1200000,
-               .max_uV = 3150000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
-               .boot_on = 1,
-               .always_on = 1,
-       }
-};
-
-static struct regulator_init_data vgen3_init = {
-       .constraints = {
-               .name = "VGEN3",
-               .min_uV = 1800000,
-               .max_uV = 2900000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
-               .boot_on = 1,
-               .always_on = 1,
-       }
-};
-
-static struct regulator_init_data gpo1_init = {
-       .constraints = {
-               .name = "GPO1",
-       }
-};
-
-static struct regulator_init_data gpo2_init = {
-       .constraints = {
-               .name = "GPO2",
-       }
-};
-
-static struct regulator_init_data gpo3_init = {
-       .constraints = {
-               .name = "GPO3",
-       }
-};
-
-static struct regulator_init_data gpo4_init = {
-       .constraints = {
-               .name = "GPO4",
-       }
-};
-
-static struct regulator_init_data pwgt1_init = {
-       .constraints = {
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-               .boot_on        = 1,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(pwgt1_consumer),
-       .consumer_supplies = pwgt1_consumer,
-};
-
-static struct regulator_init_data pwgt2_init = {
-       .constraints = {
-               .valid_ops_mask = REGULATOR_CHANGE_STATUS,
-               .boot_on        = 1,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(pwgt2_consumer),
-       .consumer_supplies = pwgt2_consumer,
-};
-
-static struct regulator_init_data vcoincell_init = {
-       .constraints = {
-               .name = "COINCELL",
-               .min_uV = 3000000,
-               .max_uV = 3000000,
-               .valid_ops_mask =
-                       REGULATOR_CHANGE_VOLTAGE | REGULATOR_CHANGE_STATUS,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(coincell_consumer),
-       .consumer_supplies = coincell_consumer,
-};
-
-static struct mc13xxx_regulator_init_data mx51_efika_regulators[] = {
-       { .id = MC13892_SW1,            .init_data =  &sw1_init },
-       { .id = MC13892_SW2,            .init_data =  &sw2_init },
-       { .id = MC13892_SW3,            .init_data =  &sw3_init },
-       { .id = MC13892_SW4,            .init_data =  &sw4_init },
-       { .id = MC13892_SWBST,          .init_data =  &swbst_init },
-       { .id = MC13892_VIOHI,          .init_data =  &viohi_init },
-       { .id = MC13892_VPLL,           .init_data =  &vpll_init },
-       { .id = MC13892_VDIG,           .init_data =  &vdig_init },
-       { .id = MC13892_VSD,            .init_data =  &vsd_init },
-       { .id = MC13892_VUSB2,          .init_data =  &vusb2_init },
-       { .id = MC13892_VVIDEO,         .init_data =  &vvideo_init },
-       { .id = MC13892_VAUDIO,         .init_data =  &vaudio_init },
-       { .id = MC13892_VCAM,           .init_data =  &vcam_init },
-       { .id = MC13892_VGEN1,          .init_data =  &vgen1_init },
-       { .id = MC13892_VGEN2,          .init_data =  &vgen2_init },
-       { .id = MC13892_VGEN3,          .init_data =  &vgen3_init },
-       { .id = MC13892_VUSB,           .init_data =  &vusb_init },
-       { .id = MC13892_GPO1,           .init_data =  &gpo1_init },
-       { .id = MC13892_GPO2,           .init_data =  &gpo2_init },
-       { .id = MC13892_GPO3,           .init_data =  &gpo3_init },
-       { .id = MC13892_GPO4,           .init_data =  &gpo4_init },
-       { .id = MC13892_PWGT1SPI,       .init_data = &pwgt1_init },
-       { .id = MC13892_PWGT2SPI,       .init_data = &pwgt2_init },
-       { .id = MC13892_VCOINCELL,      .init_data = &vcoincell_init },
-};
-
-static struct mc13xxx_platform_data mx51_efika_mc13892_data = {
-       .flags = MC13XXX_USE_RTC,
-       .regulators = {
-               .num_regulators = ARRAY_SIZE(mx51_efika_regulators),
-               .regulators = mx51_efika_regulators,
-       },
-};
-
-static struct spi_board_info mx51_efika_spi_board_info[] __initdata = {
-       {
-               .modalias = "m25p80",
-               .max_speed_hz = 25000000,
-               .bus_num = 0,
-               .chip_select = 1,
-               .platform_data = &mx51_efika_spi_flash_data,
-               .irq = -1,
-       },
-       {
-               .modalias = "mc13892",
-               .max_speed_hz = 1000000,
-               .bus_num = 0,
-               .chip_select = 0,
-               .platform_data = &mx51_efika_mc13892_data,
-               /* irq number is run-time assigned */
-       },
-};
-
-static int mx51_efika_spi_cs[] = {
-       EFIKAMX_SPI_CS0,
-       EFIKAMX_SPI_CS1,
-};
-
-static const struct spi_imx_master mx51_efika_spi_pdata __initconst = {
-       .chipselect     = mx51_efika_spi_cs,
-       .num_chipselect = ARRAY_SIZE(mx51_efika_spi_cs),
-};
-
-void __init efika_board_common_init(void)
-{
-       mxc_iomux_v3_setup_multiple_pads(mx51efika_pads,
-                                       ARRAY_SIZE(mx51efika_pads));
-       imx51_add_imx_uart(0, &uart_pdata);
-       mx51_efika_usb();
-
-       /* FIXME: comes from original code. check this. */
-       if (mx51_revision() < IMX_CHIP_REVISION_2_0)
-               sw2_init.constraints.state_mem.uV = 1100000;
-       else if (mx51_revision() == IMX_CHIP_REVISION_2_0) {
-               sw2_init.constraints.state_mem.uV = 1250000;
-               sw1_init.constraints.state_mem.uV = 1000000;
-       }
-       if (machine_is_mx51_efikasb())
-               vgen1_init.constraints.max_uV = 1200000;
-
-       gpio_request(EFIKAMX_PMIC, "pmic irq");
-       gpio_direction_input(EFIKAMX_PMIC);
-       mx51_efika_spi_board_info[1].irq = gpio_to_irq(EFIKAMX_PMIC);
-       spi_register_board_info(mx51_efika_spi_board_info,
-               ARRAY_SIZE(mx51_efika_spi_board_info));
-       imx51_add_ecspi(0, &mx51_efika_spi_pdata);
-
-       imx51_add_pata_imx();
-
-#if defined(CONFIG_CPU_FREQ_IMX)
-       get_cpu_op = mx51_get_cpu_op;
-#endif
-}
index ec467ba..4c03475 100644 (file)
  */
 #define PHYS_PCI_V3_BASE                0x62000000
 
+#define PCI_MEMORY_VADDR               0xe8000000
+#define PCI_CONFIG_VADDR               0xec000000
+#define PCI_V3_VADDR                   0xed000000
+
 /* ------------------------------------------------------------------------
  *  Integrator Interrupt Controllers
  * ------------------------------------------------------------------------
index 3b22675..fd3ef28 100644 (file)
@@ -50,6 +50,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/irq.h>
 #include <asm/mach/map.h>
+#include <asm/mach/pci.h>
 #include <asm/mach/time.h>
 
 #include <plat/fpga-irq.h>
@@ -73,7 +74,7 @@
  * e8000000    40000000        PCI memory              PHYS_PCI_MEM_BASE       (max 512M)
  * ec000000    61000000        PCI config space        PHYS_PCI_CONFIG_BASE    (max 16M)
  * ed000000    62000000        PCI V3 regs             PHYS_PCI_V3_BASE        (max 64k)
- * ee000000    60000000        PCI IO                  PHYS_PCI_IO_BASE        (max 16M)
+ * fee00000    60000000        PCI IO                  PHYS_PCI_IO_BASE        (max 16M)
  * ef000000                    Cache flush
  * f1000000    10000000        Core module registers
  * f1100000    11000000        System controller registers
@@ -147,11 +148,6 @@ static struct map_desc ap_io_desc[] __initdata = {
                .pfn            = __phys_to_pfn(PHYS_PCI_V3_BASE),
                .length         = SZ_64K,
                .type           = MT_DEVICE
-       }, {
-               .virtual        = PCI_IO_VADDR,
-               .pfn            = __phys_to_pfn(PHYS_PCI_IO_BASE),
-               .length         = SZ_64K,
-               .type           = MT_DEVICE
        }
 };
 
@@ -159,6 +155,7 @@ static void __init ap_map_io(void)
 {
        iotable_init(ap_io_desc, ARRAY_SIZE(ap_io_desc));
        vga_base = PCI_MEMORY_VADDR;
+       pci_map_io_early(__phys_to_pfn(PHYS_PCI_IO_BASE));
 }
 
 #define INTEGRATOR_SC_VALID_INT        0x003fffff
index b866880..495f181 100644 (file)
 /*
  * The V3 PCI interface chip in Integrator provides several windows from
  * local bus memory into the PCI memory areas.   Unfortunately, there
- * are not really enough windows for our usage, therefore we reuse 
+ * are not really enough windows for our usage, therefore we reuse
  * one of the windows for access to PCI configuration space.  The
  * memory map is as follows:
- * 
+ *
  * Local Bus Memory         Usage
- * 
+ *
  * 40000000 - 4FFFFFFF      PCI memory.  256M non-prefetchable
  * 50000000 - 5FFFFFFF      PCI memory.  256M prefetchable
  * 60000000 - 60FFFFFF      PCI IO.  16M
  * 61000000 - 61FFFFFF      PCI Configuration. 16M
- * 
+ *
  * There are three V3 windows, each described by a pair of V3 registers.
  * These are LB_BASE0/LB_MAP0, LB_BASE1/LB_MAP1 and LB_BASE2/LB_MAP2.
  * Base0 and Base1 can be used for any type of PCI memory access.   Base2
  * can be used either for PCI I/O or for I20 accesses.  By default, uHAL
  * uses this only for PCI IO space.
- * 
+ *
  * Normally these spaces are mapped using the following base registers:
- * 
+ *
  * Usage Local Bus Memory         Base/Map registers used
- * 
+ *
  * Mem   40000000 - 4FFFFFFF      LB_BASE0/LB_MAP0
  * Mem   50000000 - 5FFFFFFF      LB_BASE1/LB_MAP1
  * IO    60000000 - 60FFFFFF      LB_BASE2/LB_MAP2
  * Cfg   61000000 - 61FFFFFF
- * 
+ *
  * This means that I20 and PCI configuration space accesses will fail.
- * When PCI configuration accesses are needed (via the uHAL PCI 
+ * When PCI configuration accesses are needed (via the uHAL PCI
  * configuration space primitives) we must remap the spaces as follows:
- * 
+ *
  * Usage Local Bus Memory         Base/Map registers used
- * 
+ *
  * Mem   40000000 - 4FFFFFFF      LB_BASE0/LB_MAP0
  * Mem   50000000 - 5FFFFFFF      LB_BASE0/LB_MAP0
  * IO    60000000 - 60FFFFFF      LB_BASE2/LB_MAP2
  * Cfg   61000000 - 61FFFFFF      LB_BASE1/LB_MAP1
- * 
+ *
  * To make this work, the code depends on overlapping windows working.
- * The V3 chip translates an address by checking its range within 
+ * The V3 chip translates an address by checking its range within
  * each of the BASE/MAP pairs in turn (in ascending register number
  * order).  It will use the first matching pair.   So, for example,
  * if the same address is mapped by both LB_BASE0/LB_MAP0 and
- * LB_BASE1/LB_MAP1, the V3 will use the translation from 
+ * LB_BASE1/LB_MAP1, the V3 will use the translation from
  * LB_BASE0/LB_MAP0.
- * 
+ *
  * To allow PCI Configuration space access, the code enlarges the
  * window mapped by LB_BASE0/LB_MAP0 from 256M to 512M.  This occludes
  * the windows currently mapped by LB_BASE1/LB_MAP1 so that it can
  * be remapped for use by configuration cycles.
- * 
- * At the end of the PCI Configuration space accesses, 
+ *
+ * At the end of the PCI Configuration space accesses,
  * LB_BASE1/LB_MAP1 is reset to map PCI Memory.  Finally the window
  * mapped by LB_BASE0/LB_MAP0 is reduced in size from 512M to 256M to
  * reveal the now restored LB_BASE1/LB_MAP1 window.
- * 
+ *
  * NOTE: We do not set up I2O mapping.  I suspect that this is only
  * for an intelligent (target) device.  Using I2O disables most of
  * the mappings into PCI memory.
  *
  * returns:    configuration address to play on the PCI bus
  *
- * To generate the appropriate PCI configuration cycles in the PCI 
- * configuration address space, you present the V3 with the following pattern 
+ * To generate the appropriate PCI configuration cycles in the PCI
+ * configuration address space, you present the V3 with the following pattern
  * (which is very nearly a type 1 (except that the lower two bits are 00 and
  * not 01).   In order for this mapping to work you need to set up one of
  * the local to PCI aperatures to 16Mbytes in length translating to
  *
  * Type 0:
  *
- *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1 
+ *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1
  *  3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  * | | |D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|0|
  *
  * Type 1:
  *
- *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1 
+ *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1
  *  3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  * | | | | | | | | | | |B|B|B|B|B|B|B|B|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|1|
  *     15:11   Device number (5 bits)
  *     10:8    function number
  *      7:2    register number
- *  
+ *
  */
 static DEFINE_RAW_SPINLOCK(v3_lock);
 
@@ -374,12 +374,9 @@ static int __init pci_v3_setup_resources(struct pci_sys_data *sys)
        }
 
        /*
-        * the IO resource for this bus
         * the mem resource for this bus
         * the prefetch mem resource for this bus
         */
-       pci_add_resource_offset(&sys->resources,
-                               &ioport_resource, sys->io_offset);
        pci_add_resource_offset(&sys->resources, &non_mem, sys->mem_offset);
        pci_add_resource_offset(&sys->resources, &pre_mem, sys->mem_offset);
 
@@ -498,7 +495,6 @@ void __init pci_v3_preinit(void)
        unsigned int temp;
        int ret;
 
-       pcibios_min_io = 0x6000;
        pcibios_min_mem = 0x00100000;
 
        /*
diff --git a/arch/arm/mach-iop13xx/include/mach/io.h b/arch/arm/mach-iop13xx/include/mach/io.h
deleted file mode 100644 (file)
index f131885..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * iop13xx custom ioremap implementation
- * Copyright (c) 2005-2006, Intel Corporation.
- *
- * 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, write to the Free Software Foundation, Inc., 59 Temple
- * Place - Suite 330, Boston, MA 02111-1307 USA.
- *
- */
-#ifndef __ASM_ARM_ARCH_IO_H
-#define __ASM_ARM_ARCH_IO_H
-
-#define IO_SPACE_LIMIT 0xffffffff
-
-#define __io(a) __iop13xx_io(a)
-
-extern void __iomem * __iop13xx_io(unsigned long io_addr);
-
-#endif
index e190dcd..e10e101 100644 (file)
@@ -69,21 +69,11 @@ extern unsigned long get_iop_tick_rate(void);
  * 0x8000.0000 + 928M  0x2.8000.0000   (ioremap)       PCIE outbound memory window
  *
  * IO MAP
- * 0x1000 + 64K        0x0.fffb.1000   0xfec6.1000     PCIX outbound i/o window
- * 0x1000 + 64K        0x0.fffd.1000   0xfed7.1000     PCIE outbound i/o window
+ * 0x00000 + 64K       0x0.fffb.0000   0xfee0.0000     PCIX outbound i/o window
+ * 0x10000 + 64K       0x0.fffd.0000   0xfee1.0000     PCIE outbound i/o window
  */
-#define IOP13XX_PCIX_IO_WINDOW_SIZE   0x10000UL
 #define IOP13XX_PCIX_LOWER_IO_PA      0xfffb0000UL
-#define IOP13XX_PCIX_LOWER_IO_VA      0xfec60000UL
 #define IOP13XX_PCIX_LOWER_IO_BA      0x0UL /* OIOTVR */
-#define IOP13XX_PCIX_IO_BUS_OFFSET    0x1000UL
-#define IOP13XX_PCIX_UPPER_IO_PA      (IOP13XX_PCIX_LOWER_IO_PA +\
-                                      IOP13XX_PCIX_IO_WINDOW_SIZE - 1)
-#define IOP13XX_PCIX_UPPER_IO_VA      (IOP13XX_PCIX_LOWER_IO_VA +\
-                                      IOP13XX_PCIX_IO_WINDOW_SIZE - 1)
-#define IOP13XX_PCIX_IO_PHYS_TO_VIRT(addr) (u32) ((u32) addr -\
-                                          (IOP13XX_PCIX_LOWER_IO_PA\
-                                          - IOP13XX_PCIX_LOWER_IO_VA))
 
 #define IOP13XX_PCIX_MEM_PHYS_OFFSET  0x100000000ULL
 #define IOP13XX_PCIX_MEM_WINDOW_SIZE  0x3a000000UL
@@ -103,20 +93,8 @@ extern unsigned long get_iop_tick_rate(void);
                                        IOP13XX_PCIX_LOWER_MEM_BA)
 
 /* PCI-E ranges */
-#define IOP13XX_PCIE_IO_WINDOW_SIZE     0x10000UL
 #define IOP13XX_PCIE_LOWER_IO_PA        0xfffd0000UL
-#define IOP13XX_PCIE_LOWER_IO_VA        0xfed70000UL
-#define IOP13XX_PCIE_LOWER_IO_BA        0x0UL  /* OIOTVR */
-#define IOP13XX_PCIE_IO_BUS_OFFSET      0x1000UL
-#define IOP13XX_PCIE_UPPER_IO_PA        (IOP13XX_PCIE_LOWER_IO_PA +\
-                                        IOP13XX_PCIE_IO_WINDOW_SIZE - 1)
-#define IOP13XX_PCIE_UPPER_IO_VA        (IOP13XX_PCIE_LOWER_IO_VA +\
-                                        IOP13XX_PCIE_IO_WINDOW_SIZE - 1)
-#define IOP13XX_PCIE_UPPER_IO_BA        (IOP13XX_PCIE_LOWER_IO_BA +\
-                                        IOP13XX_PCIE_IO_WINDOW_SIZE - 1)
-#define IOP13XX_PCIE_IO_PHYS_TO_VIRT(addr) (u32) ((u32) addr -\
-                                          (IOP13XX_PCIE_LOWER_IO_PA\
-                                          - IOP13XX_PCIE_LOWER_IO_VA))
+#define IOP13XX_PCIE_LOWER_IO_BA        0x10000UL  /* OIOTVR */
 
 #define IOP13XX_PCIE_MEM_PHYS_OFFSET    0x200000000ULL
 #define IOP13XX_PCIE_MEM_WINDOW_SIZE    0x3a000000UL
index 3c36419..851dc8f 100644 (file)
 
 #include "pci.h"
 
-void * __iomem __iop13xx_io(unsigned long io_addr)
-{
-       void __iomem * io_virt;
-
-       switch (io_addr) {
-       case IOP13XX_PCIE_LOWER_IO_PA ... IOP13XX_PCIE_UPPER_IO_PA:
-               io_virt = (void *) IOP13XX_PCIE_IO_PHYS_TO_VIRT(io_addr);
-               break;
-       case IOP13XX_PCIX_LOWER_IO_PA ... IOP13XX_PCIX_UPPER_IO_PA:
-               io_virt = (void *) IOP13XX_PCIX_IO_PHYS_TO_VIRT(io_addr);
-               break;
-       default:
-               BUG();
-       }
-
-       return io_virt;
-}
-EXPORT_SYMBOL(__iop13xx_io);
-
 static void __iomem *__iop13xx_ioremap_caller(unsigned long cookie,
        size_t size, unsigned int mtype, void *caller)
 {
@@ -67,12 +48,6 @@ static void __iomem *__iop13xx_ioremap_caller(unsigned long cookie,
                                       (cookie - IOP13XX_PBI_LOWER_MEM_RA),
                                       size, mtype, __builtin_return_address(0));
                break;
-       case IOP13XX_PCIE_LOWER_IO_PA ... IOP13XX_PCIE_UPPER_IO_PA:
-               retval = (void *) IOP13XX_PCIE_IO_PHYS_TO_VIRT(cookie);
-               break;
-       case IOP13XX_PCIX_LOWER_IO_PA ... IOP13XX_PCIX_UPPER_IO_PA:
-               retval = (void *) IOP13XX_PCIX_IO_PHYS_TO_VIRT(cookie);
-               break;
        case IOP13XX_PMMR_PHYS_MEM_BASE ... IOP13XX_PMMR_UPPER_MEM_PA:
                retval = (void *) IOP13XX_PMMR_PHYS_TO_VIRT(cookie);
                break;
@@ -99,8 +74,6 @@ static void __iop13xx_iounmap(volatile void __iomem *addr)
                    goto skip;
 
        switch ((u32) addr) {
-       case IOP13XX_PCIE_LOWER_IO_VA ... IOP13XX_PCIE_UPPER_IO_VA:
-       case IOP13XX_PCIX_LOWER_IO_VA ... IOP13XX_PCIX_UPPER_IO_VA:
        case IOP13XX_PMMR_VIRT_MEM_BASE ... IOP13XX_PMMR_UPPER_MEM_VA:
                goto skip;
        }
index 861cb12..91f731a 100644 (file)
@@ -970,7 +970,6 @@ void __init iop13xx_pci_init(void)
        __raw_writel(__raw_readl(IOP13XX_XBG_BECSR) & 3, IOP13XX_XBG_BECSR);
 
        /* Setup the Min Address for PCI memory... */
-       pcibios_min_io = 0;
        pcibios_min_mem = IOP13XX_PCIX_LOWER_MEM_BA;
 
        /* if Linux is given control of an ATU
@@ -1003,7 +1002,7 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys)
        if (nr > 1)
                return 0;
 
-       res = kcalloc(2, sizeof(struct resource), GFP_KERNEL);
+       res = kzalloc(sizeof(struct resource), GFP_KERNEL);
        if (!res)
                panic("PCI: unable to alloc resources");
 
@@ -1042,17 +1041,13 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys)
                                  << IOP13XX_ATUX_PCIXSR_FUNC_NUM;
                __raw_writel(pcixsr, IOP13XX_ATUX_PCIXSR);
 
-               res[0].start = IOP13XX_PCIX_LOWER_IO_PA + IOP13XX_PCIX_IO_BUS_OFFSET;
-               res[0].end   = IOP13XX_PCIX_UPPER_IO_PA;
-               res[0].name  = "IQ81340 ATUX PCI I/O Space";
-               res[0].flags = IORESOURCE_IO;
+               pci_ioremap_io(0, IOP13XX_PCIX_LOWER_IO_PA);
 
-               res[1].start = IOP13XX_PCIX_LOWER_MEM_RA;
-               res[1].end   = IOP13XX_PCIX_UPPER_MEM_RA;
-               res[1].name  = "IQ81340 ATUX PCI Memory Space";
-               res[1].flags = IORESOURCE_MEM;
+               res->start = IOP13XX_PCIX_LOWER_MEM_RA;
+               res->end   = IOP13XX_PCIX_UPPER_MEM_RA;
+               res->name  = "IQ81340 ATUX PCI Memory Space";
+               res->flags = IORESOURCE_MEM;
                sys->mem_offset = IOP13XX_PCIX_MEM_OFFSET;
-               sys->io_offset = IOP13XX_PCIX_LOWER_IO_PA;
                break;
        case IOP13XX_INIT_ATU_ATUE:
                /* Note: the function number field in the PCSR is ro */
@@ -1063,17 +1058,13 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys)
 
                __raw_writel(pcsr, IOP13XX_ATUE_PCSR);
 
-               res[0].start = IOP13XX_PCIE_LOWER_IO_PA + IOP13XX_PCIE_IO_BUS_OFFSET;
-               res[0].end   = IOP13XX_PCIE_UPPER_IO_PA;
-               res[0].name  = "IQ81340 ATUE PCI I/O Space";
-               res[0].flags = IORESOURCE_IO;
+               pci_ioremap_io(SZ_64K, IOP13XX_PCIE_LOWER_IO_PA);
 
-               res[1].start = IOP13XX_PCIE_LOWER_MEM_RA;
-               res[1].end   = IOP13XX_PCIE_UPPER_MEM_RA;
-               res[1].name  = "IQ81340 ATUE PCI Memory Space";
-               res[1].flags = IORESOURCE_MEM;
+               res->start = IOP13XX_PCIE_LOWER_MEM_RA;
+               res->end   = IOP13XX_PCIE_UPPER_MEM_RA;
+               res->name  = "IQ81340 ATUE PCI Memory Space";
+               res->flags = IORESOURCE_MEM;
                sys->mem_offset = IOP13XX_PCIE_MEM_OFFSET;
-               sys->io_offset = IOP13XX_PCIE_LOWER_IO_PA;
                sys->map_irq = iop13xx_pcie_map_irq;
                break;
        default:
@@ -1081,11 +1072,9 @@ int iop13xx_pci_setup(int nr, struct pci_sys_data *sys)
                return 0;
        }
 
-       request_resource(&ioport_resource, &res[0]);
-       request_resource(&iomem_resource, &res[1]);
+       request_resource(&iomem_resource, res);
 
-       pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset);
-       pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset);
+       pci_add_resource_offset(&sys->resources, res, sys->mem_offset);
 
        return 1;
 }
index daabb1f..4a7f20d 100644 (file)
@@ -40,16 +40,6 @@ static struct map_desc iop13xx_std_desc[] __initdata = {
                .pfn     = __phys_to_pfn(IOP13XX_PMMR_PHYS_MEM_BASE),
                .length  = IOP13XX_PMMR_SIZE,
                .type    = MT_DEVICE,
-       }, { /* PCIE IO space */
-               .virtual = IOP13XX_PCIE_LOWER_IO_VA,
-               .pfn     = __phys_to_pfn(IOP13XX_PCIE_LOWER_IO_PA),
-               .length  = IOP13XX_PCIX_IO_WINDOW_SIZE,
-               .type    = MT_DEVICE,
-       }, { /* PCIX IO space */
-               .virtual = IOP13XX_PCIX_LOWER_IO_VA,
-               .pfn     = __phys_to_pfn(IOP13XX_PCIX_LOWER_IO_PA),
-               .length  = IOP13XX_PCIX_IO_WINDOW_SIZE,
-               .type    = MT_DEVICE,
        },
 };
 
diff --git a/arch/arm/mach-iop32x/include/mach/io.h b/arch/arm/mach-iop32x/include/mach/io.h
deleted file mode 100644 (file)
index e2ada26..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * arch/arm/mach-iop32x/include/mach/io.h
- *
- * Copyright (C) 2001 MontaVista Software, 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 __IO_H
-#define __IO_H
-
-#include <asm/hardware/iop3xx.h>
-
-#define IO_SPACE_LIMIT         0xffffffff
-#define __io(p)                ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p))
-
-#endif
diff --git a/arch/arm/mach-iop33x/include/mach/io.h b/arch/arm/mach-iop33x/include/mach/io.h
deleted file mode 100644 (file)
index f7c1b65..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * arch/arm/mach-iop33x/include/mach/io.h
- *
- * Copyright (C) 2001  MontaVista Software, 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 __IO_H
-#define __IO_H
-
-#include <asm/hardware/iop3xx.h>
-
-#define IO_SPACE_LIMIT         0xffffffff
-#define __io(p)                ((void __iomem *)IOP3XX_PCI_IO_PHYS_TO_VIRT(p))
-
-#endif
index 3226077..3f7b05f 100644 (file)
  ****************************************************************************/
 static struct map_desc kirkwood_io_desc[] __initdata = {
        {
-               .virtual        = KIRKWOOD_PCIE_IO_VIRT_BASE,
-               .pfn            = __phys_to_pfn(KIRKWOOD_PCIE_IO_PHYS_BASE),
-               .length         = KIRKWOOD_PCIE_IO_SIZE,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = KIRKWOOD_PCIE1_IO_VIRT_BASE,
-               .pfn            = __phys_to_pfn(KIRKWOOD_PCIE1_IO_PHYS_BASE),
-               .length         = KIRKWOOD_PCIE1_IO_SIZE,
-               .type           = MT_DEVICE,
-       }, {
                .virtual        = KIRKWOOD_REGS_VIRT_BASE,
                .pfn            = __phys_to_pfn(KIRKWOOD_REGS_PHYS_BASE),
                .length         = KIRKWOOD_REGS_SIZE,
@@ -517,6 +507,13 @@ void __init kirkwood_wdt_init(void)
 void __init kirkwood_init_early(void)
 {
        orion_time_set_base(TIMER_VIRT_BASE);
+
+       /*
+        * Some Kirkwood devices allocate their coherent buffers from atomic
+        * context. Increase size of atomic coherent pool to make sure such
+        * the allocations won't fail.
+        */
+       init_dma_coherent_pool_size(SZ_1M);
 }
 
 int kirkwood_tclk;
index d933593..be90b7d 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/sizes.h>
 #include <linux/platform_device.h>
 #include <linux/mtd/partitions.h>
 #include <linux/ata_platform.h>
diff --git a/arch/arm/mach-kirkwood/include/mach/io.h b/arch/arm/mach-kirkwood/include/mach/io.h
deleted file mode 100644 (file)
index 5d0ab61..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * arch/arm/mach-kirkwood/include/mach/io.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 __ASM_ARCH_IO_H
-#define __ASM_ARCH_IO_H
-
-#include "kirkwood.h"
-
-#define IO_SPACE_LIMIT         0xffffffff
-
-static inline void __iomem *__io(unsigned long addr)
-{
-       return (void __iomem *)((addr - KIRKWOOD_PCIE_IO_BUS_BASE)
-                                       + KIRKWOOD_PCIE_IO_VIRT_BASE);
-}
-
-#define __io(a)                        __io(a)
-
-#endif
index c5b6851..af4f000 100644 (file)
 #define KIRKWOOD_NAND_MEM_SIZE         SZ_1K
 
 #define KIRKWOOD_PCIE1_IO_PHYS_BASE    0xf3000000
-#define KIRKWOOD_PCIE1_IO_VIRT_BASE    0xfef00000
-#define KIRKWOOD_PCIE1_IO_BUS_BASE     0x00100000
-#define KIRKWOOD_PCIE1_IO_SIZE         SZ_1M
+#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_VIRT_BASE     0xfee00000
 #define KIRKWOOD_PCIE_IO_BUS_BASE      0x00000000
-#define KIRKWOOD_PCIE_IO_SIZE          SZ_1M
+#define KIRKWOOD_PCIE_IO_SIZE          SZ_64K
 
 #define KIRKWOOD_REGS_PHYS_BASE                0xf1000000
 #define KIRKWOOD_REGS_VIRT_BASE                0xfed00000
index 6e8b2ef..532d8ac 100644 (file)
@@ -56,7 +56,7 @@ struct pcie_port {
        void __iomem            *base;
        spinlock_t              conf_lock;
        int                     irq;
-       struct resource         res[2];
+       struct resource         res;
 };
 
 static int pcie_port_map[2];
@@ -137,20 +137,12 @@ static void __init pcie0_ioresources_init(struct pcie_port *pp)
        pp->irq = IRQ_KIRKWOOD_PCIE;
 
        /*
-        * IORESOURCE_IO
-        */
-       pp->res[0].name = "PCIe 0 I/O Space";
-       pp->res[0].start = KIRKWOOD_PCIE_IO_BUS_BASE;
-       pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE_IO_SIZE - 1;
-       pp->res[0].flags = IORESOURCE_IO;
-
-       /*
         * IORESOURCE_MEM
         */
-       pp->res[1].name = "PCIe 0 MEM";
-       pp->res[1].start = KIRKWOOD_PCIE_MEM_PHYS_BASE;
-       pp->res[1].end = pp->res[1].start + KIRKWOOD_PCIE_MEM_SIZE - 1;
-       pp->res[1].flags = 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)
@@ -159,20 +151,12 @@ static void __init pcie1_ioresources_init(struct pcie_port *pp)
        pp->irq = IRQ_KIRKWOOD_PCIE1;
 
        /*
-        * IORESOURCE_IO
-        */
-       pp->res[0].name = "PCIe 1 I/O Space";
-       pp->res[0].start = KIRKWOOD_PCIE1_IO_BUS_BASE;
-       pp->res[0].end = pp->res[0].start + KIRKWOOD_PCIE1_IO_SIZE - 1;
-       pp->res[0].flags = IORESOURCE_IO;
-
-       /*
         * IORESOURCE_MEM
         */
-       pp->res[1].name = "PCIe 1 MEM";
-       pp->res[1].start = KIRKWOOD_PCIE1_MEM_PHYS_BASE;
-       pp->res[1].end = pp->res[1].start + KIRKWOOD_PCIE1_MEM_SIZE - 1;
-       pp->res[1].flags = 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)
@@ -197,23 +181,21 @@ static int __init kirkwood_pcie_setup(int nr, struct pci_sys_data *sys)
        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(&ioport_resource, &pp->res[0]))
-               panic("Request PCIe%d IO resource failed\n", index);
-       if (request_resource(&iomem_resource, &pp->res[1]))
+       if (request_resource(&iomem_resource, &pp->res))
                panic("Request PCIe%d Memory resource failed\n", index);
 
-       sys->io_offset = 0;
-       pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset);
-       pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset);
+       pci_add_resource_offset(&sys->resources, &pp->res, sys->mem_offset);
 
        /*
         * Generic PCIe unit setup.
diff --git a/arch/arm/mach-ks8695/include/mach/regs-timer.h b/arch/arm/mach-ks8695/include/mach/regs-timer.h
deleted file mode 100644 (file)
index e620cda..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * arch/arm/mach-ks8695/include/mach/regs-timer.h
- *
- * Copyright (C) 2006 Ben Dooks <ben@simtec.co.uk>
- * Copyright (C) 2006 Simtec Electronics
- *
- * KS8695 - Timer registers and bit definitions.
- *
- * 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 KS8695_TIMER_H
-#define KS8695_TIMER_H
-
-#define KS8695_TMR_OFFSET      (0xF0000 + 0xE400)
-#define KS8695_TMR_VA          (KS8695_IO_VA + KS8695_TMR_OFFSET)
-#define KS8695_TMR_PA          (KS8695_IO_PA + KS8695_TMR_OFFSET)
-
-
-/*
- * Timer registers
- */
-#define KS8695_TMCON           (0x00)          /* Timer Control Register */
-#define KS8695_T1TC            (0x04)          /* Timer 1 Timeout Count Register */
-#define KS8695_T0TC            (0x08)          /* Timer 0 Timeout Count Register */
-#define KS8695_T1PD            (0x0C)          /* Timer 1 Pulse Count Register */
-#define KS8695_T0PD            (0x10)          /* Timer 0 Pulse Count Register */
-
-
-/* Timer Control Register */
-#define TMCON_T1EN             (1 << 1)        /* Timer 1 Enable */
-#define TMCON_T0EN             (1 << 0)        /* Timer 0 Enable */
-
-/* Timer0 Timeout Counter Register */
-#define T0TC_WATCHDOG          (0xff)          /* Enable watchdog mode */
-
-
-#endif
index ec783a3..46c84bc 100644 (file)
 #include <linux/kernel.h>
 #include <linux/sched.h>
 #include <linux/io.h>
+#include <linux/clockchips.h>
 
 #include <asm/mach/time.h>
 #include <asm/system_misc.h>
 
-#include <mach/regs-timer.h>
 #include <mach/regs-irq.h>
 
 #include "generic.h"
 
+#define KS8695_TMR_OFFSET      (0xF0000 + 0xE400)
+#define KS8695_TMR_VA          (KS8695_IO_VA + KS8695_TMR_OFFSET)
+#define KS8695_TMR_PA          (KS8695_IO_PA + KS8695_TMR_OFFSET)
+
 /*
- * Returns number of ms since last clock interrupt.  Note that interrupts
- * will have been disabled by do_gettimeoffset()
+ * Timer registers
  */
-static unsigned long ks8695_gettimeoffset (void)
+#define KS8695_TMCON           (0x00)          /* Timer Control Register */
+#define KS8695_T1TC            (0x04)          /* Timer 1 Timeout Count Register */
+#define KS8695_T0TC            (0x08)          /* Timer 0 Timeout Count Register */
+#define KS8695_T1PD            (0x0C)          /* Timer 1 Pulse Count Register */
+#define KS8695_T0PD            (0x10)          /* Timer 0 Pulse Count Register */
+
+/* Timer Control Register */
+#define TMCON_T1EN             (1 << 1)        /* Timer 1 Enable */
+#define TMCON_T0EN             (1 << 0)        /* Timer 0 Enable */
+
+/* Timer0 Timeout Counter Register */
+#define T0TC_WATCHDOG          (0xff)          /* Enable watchdog mode */
+
+static void ks8695_set_mode(enum clock_event_mode mode,
+                           struct clock_event_device *evt)
 {
-       unsigned long elapsed, tick2, intpending;
+       u32 tmcon;
 
-       /*
-        * Get the current number of ticks.  Note that there is a race
-        * condition between us reading the timer and checking for an
-        * interrupt.  We solve this by ensuring that the counter has not
-        * reloaded between our two reads.
-        */
-       elapsed = __raw_readl(KS8695_TMR_VA + KS8695_T1TC) + __raw_readl(KS8695_TMR_VA + KS8695_T1PD);
-       do {
-               tick2 = elapsed;
-               intpending = __raw_readl(KS8695_IRQ_VA + KS8695_INTST) & (1 << KS8695_IRQ_TIMER1);
-               elapsed = __raw_readl(KS8695_TMR_VA + KS8695_T1TC) + __raw_readl(KS8695_TMR_VA + KS8695_T1PD);
-       } while (elapsed > tick2);
-
-       /* Convert to number of ticks expired (not remaining) */
-       elapsed = (CLOCK_TICK_RATE / HZ) - elapsed;
-
-       /* Is interrupt pending?  If so, then timer has been reloaded already. */
-       if (intpending)
-               elapsed += (CLOCK_TICK_RATE / HZ);
-
-       /* Convert ticks to usecs */
-       return (unsigned long)(elapsed * (tick_nsec / 1000)) / LATCH;
+       if (mode == CLOCK_EVT_FEAT_PERIODIC) {
+               u32 rate = DIV_ROUND_CLOSEST(KS8695_CLOCK_RATE, HZ);
+               u32 half = DIV_ROUND_CLOSEST(rate, 2);
+
+               /* Disable timer 1 */
+               tmcon = readl_relaxed(KS8695_TMR_VA + KS8695_TMCON);
+               tmcon &= ~TMCON_T1EN;
+               writel_relaxed(tmcon, KS8695_TMR_VA + KS8695_TMCON);
+
+               /* Both registers need to count down */
+               writel_relaxed(half, KS8695_TMR_VA + KS8695_T1TC);
+               writel_relaxed(half, KS8695_TMR_VA + KS8695_T1PD);
+
+               /* Re-enable timer1 */
+               tmcon |= TMCON_T1EN;
+               writel_relaxed(tmcon, KS8695_TMR_VA + KS8695_TMCON);
+       }
 }
 
+static int ks8695_set_next_event(unsigned long cycles,
+                                struct clock_event_device *evt)
+
+{
+       u32 half = DIV_ROUND_CLOSEST(cycles, 2);
+       u32 tmcon;
+
+       /* Disable timer 1 */
+       tmcon = readl_relaxed(KS8695_TMR_VA + KS8695_TMCON);
+       tmcon &= ~TMCON_T1EN;
+       writel_relaxed(tmcon, KS8695_TMR_VA + KS8695_TMCON);
+
+       /* Both registers need to count down */
+       writel_relaxed(half, KS8695_TMR_VA + KS8695_T1TC);
+       writel_relaxed(half, KS8695_TMR_VA + KS8695_T1PD);
+
+       /* Re-enable timer1 */
+       tmcon |= TMCON_T1EN;
+       writel_relaxed(tmcon, KS8695_TMR_VA + KS8695_TMCON);
+
+       return 0;
+}
+
+static struct clock_event_device clockevent_ks8695 = {
+       .name           = "ks8695_t1tc",
+       .rating         = 300, /* Reasonably fast and accurate clock event */
+       .features       = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
+       .set_next_event = ks8695_set_next_event,
+       .set_mode       = ks8695_set_mode,
+};
+
 /*
  * IRQ handler for the timer.
  */
 static irqreturn_t ks8695_timer_interrupt(int irq, void *dev_id)
 {
-       timer_tick();
+       struct clock_event_device *evt = &clockevent_ks8695;
+
+       evt->event_handler(evt);
        return IRQ_HANDLED;
 }
 
@@ -83,18 +128,22 @@ static struct irqaction ks8695_timer_irq = {
 
 static void ks8695_timer_setup(void)
 {
-       unsigned long tmout = CLOCK_TICK_RATE / HZ;
        unsigned long tmcon;
 
-       /* disable timer1 */
-       tmcon = __raw_readl(KS8695_TMR_VA + KS8695_TMCON);
-       __raw_writel(tmcon & ~TMCON_T1EN, KS8695_TMR_VA + KS8695_TMCON);
-
-       __raw_writel(tmout / 2, KS8695_TMR_VA + KS8695_T1TC);
-       __raw_writel(tmout / 2, KS8695_TMR_VA + KS8695_T1PD);
+       /* Disable timer 0 and 1 */
+       tmcon = readl_relaxed(KS8695_TMR_VA + KS8695_TMCON);
+       tmcon &= ~TMCON_T0EN;
+       tmcon &= ~TMCON_T1EN;
+       writel_relaxed(tmcon, KS8695_TMR_VA + KS8695_TMCON);
 
-       /* re-enable timer1 */
-       __raw_writel(tmcon | TMCON_T1EN, KS8695_TMR_VA + KS8695_TMCON);
+       /*
+        * Use timer 1 to fire IRQs on the timeline, minimum 2 cycles
+        * (one on each counter) maximum 2*2^32, but the API will only
+        * accept up to a 32bit full word (0xFFFFFFFFU).
+        */
+       clockevents_config_and_register(&clockevent_ks8695,
+                                       KS8695_CLOCK_RATE, 2,
+                                       0xFFFFFFFFU);
 }
 
 static void __init ks8695_timer_init (void)
@@ -107,8 +156,6 @@ static void __init ks8695_timer_init (void)
 
 struct sys_timer ks8695_timer = {
        .init           = ks8695_timer_init,
-       .offset         = ks8695_gettimeoffset,
-       .resume         = ks8695_timer_setup,
 };
 
 void ks8695_restart(char mode, const char *cmd)
@@ -119,12 +166,12 @@ void ks8695_restart(char mode, const char *cmd)
                soft_restart(0);
 
        /* disable timer0 */
-       reg = __raw_readl(KS8695_TMR_VA + KS8695_TMCON);
-       __raw_writel(reg & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON);
+       reg = readl_relaxed(KS8695_TMR_VA + KS8695_TMCON);
+       writel_relaxed(reg & ~TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON);
 
        /* enable watchdog mode */
-       __raw_writel((10 << 8) | T0TC_WATCHDOG, KS8695_TMR_VA + KS8695_T0TC);
+       writel_relaxed((10 << 8) | T0TC_WATCHDOG, KS8695_TMR_VA + KS8695_T0TC);
 
        /* re-enable timer0 */
-       __raw_writel(reg | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON);
+       writel_relaxed(reg | TMCON_T0EN, KS8695_TMR_VA + KS8695_TMCON);
 }
index 5b1cc35..3c63327 100644 (file)
@@ -283,21 +283,25 @@ static int lpc32xx_set_irq_type(struct irq_data *d, unsigned int type)
        case IRQ_TYPE_EDGE_RISING:
                /* Rising edge sensitive */
                __lpc32xx_set_irq_type(d->hwirq, 1, 1);
+               __irq_set_handler_locked(d->hwirq, handle_edge_irq);
                break;
 
        case IRQ_TYPE_EDGE_FALLING:
                /* Falling edge sensitive */
                __lpc32xx_set_irq_type(d->hwirq, 0, 1);
+               __irq_set_handler_locked(d->hwirq, handle_edge_irq);
                break;
 
        case IRQ_TYPE_LEVEL_LOW:
                /* Low level sensitive */
                __lpc32xx_set_irq_type(d->hwirq, 0, 0);
+               __irq_set_handler_locked(d->hwirq, handle_level_irq);
                break;
 
        case IRQ_TYPE_LEVEL_HIGH:
                /* High level sensitive */
                __lpc32xx_set_irq_type(d->hwirq, 1, 0);
+               __irq_set_handler_locked(d->hwirq, handle_level_irq);
                break;
 
        /* Other modes are not supported */
@@ -305,9 +309,6 @@ static int lpc32xx_set_irq_type(struct irq_data *d, unsigned int type)
                return -EINVAL;
        }
 
-       /* Ok to use the level handler for all types */
-       irq_set_handler(d->hwirq, handle_level_irq);
-
        return 0;
 }
 
index b07dcc9..8f2a2f8 100644 (file)
@@ -37,6 +37,8 @@
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
 #include <linux/clk.h>
+#include <linux/mtd/lpc32xx_slc.h>
+#include <linux/mtd/lpc32xx_mlc.h>
 
 #include <asm/setup.h>
 #include <asm/mach-types.h>
@@ -223,6 +225,14 @@ static struct mmci_platform_data lpc32xx_mmci_data = {
         * gather, and the MMCI driver doesn't do it this way */
 };
 
+static struct lpc32xx_slc_platform_data lpc32xx_slc_data = {
+       .dma_filter = pl08x_filter_id,
+};
+
+static struct lpc32xx_mlc_platform_data lpc32xx_mlc_data = {
+       .dma_filter = pl08x_filter_id,
+};
+
 static const struct of_dev_auxdata lpc32xx_auxdata_lookup[] __initconst = {
        OF_DEV_AUXDATA("arm,pl022", 0x20084000, "dev:ssp0", &lpc32xx_ssp0_data),
        OF_DEV_AUXDATA("arm,pl022", 0x2008C000, "dev:ssp1", &lpc32xx_ssp1_data),
@@ -230,6 +240,10 @@ static const struct of_dev_auxdata lpc32xx_auxdata_lookup[] __initconst = {
        OF_DEV_AUXDATA("arm,pl080", 0x31000000, "pl08xdmac", &pl08x_pd),
        OF_DEV_AUXDATA("arm,pl18x", 0x20098000, "20098000.sd",
                       &lpc32xx_mmci_data),
+       OF_DEV_AUXDATA("nxp,lpc3220-slc", 0x20020000, "20020000.flash",
+                      &lpc32xx_slc_data),
+       OF_DEV_AUXDATA("nxp,lpc3220-mlc", 0x200a8000, "200a8000.flash",
+                      &lpc32xx_mlc_data),
        { }
 };
 
@@ -253,12 +267,6 @@ static void __init lpc3250_machine_init(void)
 
        of_platform_populate(NULL, of_default_bus_match_table,
                             lpc32xx_auxdata_lookup, NULL);
-
-       /* Register GPIOs used on this board */
-       if (gpio_request(MMC_PWR_ENABLE_GPIO, "mmc_power_en"))
-               pr_err("Error requesting gpio %u", MMC_PWR_ENABLE_GPIO);
-       else if (gpio_direction_output(MMC_PWR_ENABLE_GPIO, 1))
-               pr_err("Error setting gpio %u to output", MMC_PWR_ENABLE_GPIO);
 }
 
 static char const *lpc32xx_dt_compat[] __initdata = {
index 7fddd01..d697d07 100644 (file)
@@ -108,18 +108,21 @@ endmenu
 config CPU_PXA168
        bool
        select CPU_MOHAWK
+       select COMMON_CLK
        help
          Select code specific to PXA168
 
 config CPU_PXA910
        bool
        select CPU_MOHAWK
+       select COMMON_CLK
        help
          Select code specific to PXA910
 
 config CPU_MMP2
        bool
        select CPU_PJ4
+       select COMMON_CLK
        help
          Select code specific to MMP2. MMP2 is ARMv7 compatible.
 
index b786f7e..095c155 100644 (file)
@@ -2,13 +2,19 @@
 # Makefile for Marvell's PXA168 processors line
 #
 
-obj-y                          += common.o clock.o devices.o time.o irq.o
+obj-y                          += common.o devices.o time.o irq.o
 
 # SoC support
 obj-$(CONFIG_CPU_PXA168)       += pxa168.o
 obj-$(CONFIG_CPU_PXA910)       += pxa910.o
 obj-$(CONFIG_CPU_MMP2)         += mmp2.o sram.o
 
+ifeq ($(CONFIG_COMMON_CLK), )
+obj-y                          += clock.o
+obj-$(CONFIG_CPU_PXA168)       += clock-pxa168.o
+obj-$(CONFIG_CPU_PXA910)       += clock-pxa910.o
+obj-$(CONFIG_CPU_MMP2)         += clock-mmp2.o
+endif
 ifeq ($(CONFIG_PM),y)
 obj-$(CONFIG_CPU_PXA910)       += pm-pxa910.o
 obj-$(CONFIG_CPU_MMP2)         += pm-mmp2.o
diff --git a/arch/arm/mach-mmp/clock-mmp2.c b/arch/arm/mach-mmp/clock-mmp2.c
new file mode 100644 (file)
index 0000000..21d2200
--- /dev/null
@@ -0,0 +1,111 @@
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/list.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+
+#include <mach/addr-map.h>
+
+#include "common.h"
+#include "clock.h"
+
+/*
+ * APB Clock register offsets for MMP2
+ */
+#define APBC_RTC       APBC_REG(0x000)
+#define APBC_TWSI1     APBC_REG(0x004)
+#define APBC_TWSI2     APBC_REG(0x008)
+#define APBC_TWSI3     APBC_REG(0x00c)
+#define APBC_TWSI4     APBC_REG(0x010)
+#define APBC_KPC       APBC_REG(0x018)
+#define APBC_UART1     APBC_REG(0x02c)
+#define APBC_UART2     APBC_REG(0x030)
+#define APBC_UART3     APBC_REG(0x034)
+#define APBC_GPIO      APBC_REG(0x038)
+#define APBC_PWM0      APBC_REG(0x03c)
+#define APBC_PWM1      APBC_REG(0x040)
+#define APBC_PWM2      APBC_REG(0x044)
+#define APBC_PWM3      APBC_REG(0x048)
+#define APBC_SSP0      APBC_REG(0x04c)
+#define APBC_SSP1      APBC_REG(0x050)
+#define APBC_SSP2      APBC_REG(0x054)
+#define APBC_SSP3      APBC_REG(0x058)
+#define APBC_SSP4      APBC_REG(0x05c)
+#define APBC_SSP5      APBC_REG(0x060)
+#define APBC_TWSI5     APBC_REG(0x07c)
+#define APBC_TWSI6     APBC_REG(0x080)
+#define APBC_UART4     APBC_REG(0x088)
+
+#define APMU_USB       APMU_REG(0x05c)
+#define APMU_NAND      APMU_REG(0x060)
+#define APMU_SDH0      APMU_REG(0x054)
+#define APMU_SDH1      APMU_REG(0x058)
+#define APMU_SDH2      APMU_REG(0x0e8)
+#define APMU_SDH3      APMU_REG(0x0ec)
+
+static void sdhc_clk_enable(struct clk *clk)
+{
+       uint32_t clk_rst;
+
+       clk_rst  =  __raw_readl(clk->clk_rst);
+       clk_rst |= clk->enable_val;
+       __raw_writel(clk_rst, clk->clk_rst);
+}
+
+static void sdhc_clk_disable(struct clk *clk)
+{
+       uint32_t clk_rst;
+
+       clk_rst  =  __raw_readl(clk->clk_rst);
+       clk_rst &= ~clk->enable_val;
+       __raw_writel(clk_rst, clk->clk_rst);
+}
+
+struct clkops sdhc_clk_ops = {
+       .enable         = sdhc_clk_enable,
+       .disable        = sdhc_clk_disable,
+};
+
+/* APB peripheral clocks */
+static APBC_CLK(uart1, UART1, 1, 26000000);
+static APBC_CLK(uart2, UART2, 1, 26000000);
+static APBC_CLK(uart3, UART3, 1, 26000000);
+static APBC_CLK(uart4, UART4, 1, 26000000);
+static APBC_CLK(twsi1, TWSI1, 0, 26000000);
+static APBC_CLK(twsi2, TWSI2, 0, 26000000);
+static APBC_CLK(twsi3, TWSI3, 0, 26000000);
+static APBC_CLK(twsi4, TWSI4, 0, 26000000);
+static APBC_CLK(twsi5, TWSI5, 0, 26000000);
+static APBC_CLK(twsi6, TWSI6, 0, 26000000);
+static APBC_CLK(gpio, GPIO, 0, 26000000);
+
+static APMU_CLK(nand, NAND, 0xbf, 100000000);
+static APMU_CLK_OPS(sdh0, SDH0, 0x1b, 200000000, &sdhc_clk_ops);
+static APMU_CLK_OPS(sdh1, SDH1, 0x1b, 200000000, &sdhc_clk_ops);
+static APMU_CLK_OPS(sdh2, SDH2, 0x1b, 200000000, &sdhc_clk_ops);
+static APMU_CLK_OPS(sdh3, SDH3, 0x1b, 200000000, &sdhc_clk_ops);
+
+static struct clk_lookup mmp2_clkregs[] = {
+       INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
+       INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
+       INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL),
+       INIT_CLKREG(&clk_uart4, "pxa2xx-uart.3", NULL),
+       INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.0", NULL),
+       INIT_CLKREG(&clk_twsi2, "pxa2xx-i2c.1", NULL),
+       INIT_CLKREG(&clk_twsi3, "pxa2xx-i2c.2", NULL),
+       INIT_CLKREG(&clk_twsi4, "pxa2xx-i2c.3", NULL),
+       INIT_CLKREG(&clk_twsi5, "pxa2xx-i2c.4", NULL),
+       INIT_CLKREG(&clk_twsi6, "pxa2xx-i2c.5", NULL),
+       INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
+       INIT_CLKREG(&clk_gpio, "pxa-gpio", NULL),
+       INIT_CLKREG(&clk_sdh0, "sdhci-pxav3.0", "PXA-SDHCLK"),
+       INIT_CLKREG(&clk_sdh1, "sdhci-pxav3.1", "PXA-SDHCLK"),
+       INIT_CLKREG(&clk_sdh2, "sdhci-pxav3.2", "PXA-SDHCLK"),
+       INIT_CLKREG(&clk_sdh3, "sdhci-pxav3.3", "PXA-SDHCLK"),
+};
+
+void __init mmp2_clk_init(void)
+{
+       clkdev_add_table(ARRAY_AND_SIZE(mmp2_clkregs));
+}
diff --git a/arch/arm/mach-mmp/clock-pxa168.c b/arch/arm/mach-mmp/clock-pxa168.c
new file mode 100644 (file)
index 0000000..5e6c18c
--- /dev/null
@@ -0,0 +1,91 @@
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/list.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+
+#include <mach/addr-map.h>
+
+#include "common.h"
+#include "clock.h"
+
+/*
+ * APB clock register offsets for PXA168
+ */
+#define APBC_UART1     APBC_REG(0x000)
+#define APBC_UART2     APBC_REG(0x004)
+#define APBC_GPIO      APBC_REG(0x008)
+#define APBC_PWM1      APBC_REG(0x00c)
+#define APBC_PWM2      APBC_REG(0x010)
+#define APBC_PWM3      APBC_REG(0x014)
+#define APBC_PWM4      APBC_REG(0x018)
+#define APBC_RTC       APBC_REG(0x028)
+#define APBC_TWSI0     APBC_REG(0x02c)
+#define APBC_KPC       APBC_REG(0x030)
+#define APBC_TWSI1     APBC_REG(0x06c)
+#define APBC_UART3     APBC_REG(0x070)
+#define APBC_SSP1      APBC_REG(0x81c)
+#define APBC_SSP2      APBC_REG(0x820)
+#define APBC_SSP3      APBC_REG(0x84c)
+#define APBC_SSP4      APBC_REG(0x858)
+#define APBC_SSP5      APBC_REG(0x85c)
+
+#define APMU_NAND      APMU_REG(0x060)
+#define APMU_LCD       APMU_REG(0x04c)
+#define APMU_ETH       APMU_REG(0x0fc)
+#define APMU_USB       APMU_REG(0x05c)
+
+/* APB peripheral clocks */
+static APBC_CLK(uart1, UART1, 1, 14745600);
+static APBC_CLK(uart2, UART2, 1, 14745600);
+static APBC_CLK(uart3, UART3, 1, 14745600);
+static APBC_CLK(twsi0, TWSI0, 1, 33000000);
+static APBC_CLK(twsi1, TWSI1, 1, 33000000);
+static APBC_CLK(pwm1, PWM1, 1, 13000000);
+static APBC_CLK(pwm2, PWM2, 1, 13000000);
+static APBC_CLK(pwm3, PWM3, 1, 13000000);
+static APBC_CLK(pwm4, PWM4, 1, 13000000);
+static APBC_CLK(ssp1, SSP1, 4, 0);
+static APBC_CLK(ssp2, SSP2, 4, 0);
+static APBC_CLK(ssp3, SSP3, 4, 0);
+static APBC_CLK(ssp4, SSP4, 4, 0);
+static APBC_CLK(ssp5, SSP5, 4, 0);
+static APBC_CLK(gpio, GPIO, 0, 13000000);
+static APBC_CLK(keypad, KPC, 0, 32000);
+static APBC_CLK(rtc, RTC, 8, 32768);
+
+static APMU_CLK(nand, NAND, 0x19b, 156000000);
+static APMU_CLK(lcd, LCD, 0x7f, 312000000);
+static APMU_CLK(eth, ETH, 0x09, 0);
+static APMU_CLK(usb, USB, 0x12, 0);
+
+/* device and clock bindings */
+static struct clk_lookup pxa168_clkregs[] = {
+       INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
+       INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
+       INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL),
+       INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL),
+       INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL),
+       INIT_CLKREG(&clk_pwm1, "pxa168-pwm.0", NULL),
+       INIT_CLKREG(&clk_pwm2, "pxa168-pwm.1", NULL),
+       INIT_CLKREG(&clk_pwm3, "pxa168-pwm.2", NULL),
+       INIT_CLKREG(&clk_pwm4, "pxa168-pwm.3", NULL),
+       INIT_CLKREG(&clk_ssp1, "pxa168-ssp.0", NULL),
+       INIT_CLKREG(&clk_ssp2, "pxa168-ssp.1", NULL),
+       INIT_CLKREG(&clk_ssp3, "pxa168-ssp.2", NULL),
+       INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL),
+       INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL),
+       INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
+       INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL),
+       INIT_CLKREG(&clk_gpio, "pxa-gpio", NULL),
+       INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
+       INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"),
+       INIT_CLKREG(&clk_usb, NULL, "PXA168-USBCLK"),
+       INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL),
+};
+
+void __init pxa168_clk_init(void)
+{
+       clkdev_add_table(ARRAY_AND_SIZE(pxa168_clkregs));
+}
diff --git a/arch/arm/mach-mmp/clock-pxa910.c b/arch/arm/mach-mmp/clock-pxa910.c
new file mode 100644 (file)
index 0000000..933ea71
--- /dev/null
@@ -0,0 +1,67 @@
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/list.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+
+#include <mach/addr-map.h>
+
+#include "common.h"
+#include "clock.h"
+
+/*
+ * APB Clock register offsets for PXA910
+ */
+#define APBC_UART0     APBC_REG(0x000)
+#define APBC_UART1     APBC_REG(0x004)
+#define APBC_GPIO      APBC_REG(0x008)
+#define APBC_PWM1      APBC_REG(0x00c)
+#define APBC_PWM2      APBC_REG(0x010)
+#define APBC_PWM3      APBC_REG(0x014)
+#define APBC_PWM4      APBC_REG(0x018)
+#define APBC_SSP1      APBC_REG(0x01c)
+#define APBC_SSP2      APBC_REG(0x020)
+#define APBC_RTC       APBC_REG(0x028)
+#define APBC_TWSI0     APBC_REG(0x02c)
+#define APBC_KPC       APBC_REG(0x030)
+#define APBC_SSP3      APBC_REG(0x04c)
+#define APBC_TWSI1     APBC_REG(0x06c)
+
+#define APMU_NAND      APMU_REG(0x060)
+#define APMU_USB       APMU_REG(0x05c)
+
+static APBC_CLK(uart1, UART0, 1, 14745600);
+static APBC_CLK(uart2, UART1, 1, 14745600);
+static APBC_CLK(twsi0, TWSI0, 1, 33000000);
+static APBC_CLK(twsi1, TWSI1, 1, 33000000);
+static APBC_CLK(pwm1, PWM1, 1, 13000000);
+static APBC_CLK(pwm2, PWM2, 1, 13000000);
+static APBC_CLK(pwm3, PWM3, 1, 13000000);
+static APBC_CLK(pwm4, PWM4, 1, 13000000);
+static APBC_CLK(gpio, GPIO, 0, 13000000);
+static APBC_CLK(rtc, RTC, 8, 32768);
+
+static APMU_CLK(nand, NAND, 0x19b, 156000000);
+static APMU_CLK(u2o, USB, 0x1b, 480000000);
+
+/* device and clock bindings */
+static struct clk_lookup pxa910_clkregs[] = {
+       INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
+       INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
+       INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL),
+       INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL),
+       INIT_CLKREG(&clk_pwm1, "pxa910-pwm.0", NULL),
+       INIT_CLKREG(&clk_pwm2, "pxa910-pwm.1", NULL),
+       INIT_CLKREG(&clk_pwm3, "pxa910-pwm.2", NULL),
+       INIT_CLKREG(&clk_pwm4, "pxa910-pwm.3", NULL),
+       INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
+       INIT_CLKREG(&clk_gpio, "pxa-gpio", NULL),
+       INIT_CLKREG(&clk_u2o, NULL, "U2OCLK"),
+       INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL),
+};
+
+void __init pxa910_clk_init(void)
+{
+       clkdev_add_table(ARRAY_AND_SIZE(pxa910_clkregs));
+}
index 1c9d6c1..bd45327 100644 (file)
@@ -7,3 +7,6 @@ extern void timer_init(int irq);
 extern void __init icu_init_irq(void);
 extern void __init mmp_map_io(void);
 extern void mmp_restart(char, const char *);
+extern void __init pxa168_clk_init(void);
+extern void __init pxa910_clk_init(void);
+extern void __init mmp2_clk_init(void);
index 68b0c93..ddc812f 100644 (file)
 
 #include <mach/addr-map.h>
 
-/*
- * APB clock register offsets for PXA168
- */
-#define APBC_PXA168_UART1      APBC_REG(0x000)
-#define APBC_PXA168_UART2      APBC_REG(0x004)
-#define APBC_PXA168_GPIO       APBC_REG(0x008)
-#define APBC_PXA168_PWM1       APBC_REG(0x00c)
-#define APBC_PXA168_PWM2       APBC_REG(0x010)
-#define APBC_PXA168_PWM3       APBC_REG(0x014)
-#define APBC_PXA168_PWM4       APBC_REG(0x018)
-#define APBC_PXA168_RTC                APBC_REG(0x028)
-#define APBC_PXA168_TWSI0      APBC_REG(0x02c)
-#define APBC_PXA168_KPC                APBC_REG(0x030)
-#define APBC_PXA168_TIMERS     APBC_REG(0x034)
-#define APBC_PXA168_AIB                APBC_REG(0x03c)
-#define APBC_PXA168_SW_JTAG    APBC_REG(0x040)
-#define APBC_PXA168_ONEWIRE    APBC_REG(0x048)
-#define APBC_PXA168_ASFAR      APBC_REG(0x050)
-#define APBC_PXA168_ASSAR      APBC_REG(0x054)
-#define APBC_PXA168_TWSI1      APBC_REG(0x06c)
-#define APBC_PXA168_UART3      APBC_REG(0x070)
-#define APBC_PXA168_AC97       APBC_REG(0x084)
-#define APBC_PXA168_SSP1       APBC_REG(0x81c)
-#define APBC_PXA168_SSP2       APBC_REG(0x820)
-#define APBC_PXA168_SSP3       APBC_REG(0x84c)
-#define APBC_PXA168_SSP4       APBC_REG(0x858)
-#define APBC_PXA168_SSP5       APBC_REG(0x85c)
-
-/*
- * APB Clock register offsets for PXA910
- */
-#define APBC_PXA910_UART0      APBC_REG(0x000)
-#define APBC_PXA910_UART1      APBC_REG(0x004)
-#define APBC_PXA910_GPIO       APBC_REG(0x008)
-#define APBC_PXA910_PWM1       APBC_REG(0x00c)
-#define APBC_PXA910_PWM2       APBC_REG(0x010)
-#define APBC_PXA910_PWM3       APBC_REG(0x014)
-#define APBC_PXA910_PWM4       APBC_REG(0x018)
-#define APBC_PXA910_SSP1       APBC_REG(0x01c)
-#define APBC_PXA910_SSP2       APBC_REG(0x020)
-#define APBC_PXA910_IPC                APBC_REG(0x024)
-#define APBC_PXA910_RTC                APBC_REG(0x028)
-#define APBC_PXA910_TWSI0      APBC_REG(0x02c)
-#define APBC_PXA910_KPC                APBC_REG(0x030)
-#define APBC_PXA910_TIMERS     APBC_REG(0x034)
-#define APBC_PXA910_TBROT      APBC_REG(0x038)
-#define APBC_PXA910_AIB                APBC_REG(0x03c)
-#define APBC_PXA910_SW_JTAG    APBC_REG(0x040)
-#define APBC_PXA910_TIMERS1    APBC_REG(0x044)
-#define APBC_PXA910_ONEWIRE    APBC_REG(0x048)
-#define APBC_PXA910_SSP3       APBC_REG(0x04c)
-#define APBC_PXA910_ASFAR      APBC_REG(0x050)
-#define APBC_PXA910_ASSAR      APBC_REG(0x054)
-
-/*
- * APB Clock register offsets for MMP2
- */
-#define APBC_MMP2_RTC          APBC_REG(0x000)
-#define APBC_MMP2_TWSI1                APBC_REG(0x004)
-#define APBC_MMP2_TWSI2                APBC_REG(0x008)
-#define APBC_MMP2_TWSI3                APBC_REG(0x00c)
-#define APBC_MMP2_TWSI4                APBC_REG(0x010)
-#define APBC_MMP2_ONEWIRE      APBC_REG(0x014)
-#define APBC_MMP2_KPC          APBC_REG(0x018)
-#define APBC_MMP2_TB_ROTARY    APBC_REG(0x01c)
-#define APBC_MMP2_SW_JTAG      APBC_REG(0x020)
-#define APBC_MMP2_TIMERS       APBC_REG(0x024)
-#define APBC_MMP2_UART1                APBC_REG(0x02c)
-#define APBC_MMP2_UART2                APBC_REG(0x030)
-#define APBC_MMP2_UART3                APBC_REG(0x034)
-#define APBC_MMP2_GPIO         APBC_REG(0x038)
-#define APBC_MMP2_PWM0         APBC_REG(0x03c)
-#define APBC_MMP2_PWM1         APBC_REG(0x040)
-#define APBC_MMP2_PWM2         APBC_REG(0x044)
-#define APBC_MMP2_PWM3         APBC_REG(0x048)
-#define APBC_MMP2_SSP0         APBC_REG(0x04c)
-#define APBC_MMP2_SSP1         APBC_REG(0x050)
-#define APBC_MMP2_SSP2         APBC_REG(0x054)
-#define APBC_MMP2_SSP3         APBC_REG(0x058)
-#define APBC_MMP2_SSP4         APBC_REG(0x05c)
-#define APBC_MMP2_SSP5         APBC_REG(0x060)
-#define APBC_MMP2_AIB          APBC_REG(0x064)
-#define APBC_MMP2_ASFAR                APBC_REG(0x068)
-#define APBC_MMP2_ASSAR                APBC_REG(0x06c)
-#define APBC_MMP2_USIM         APBC_REG(0x070)
-#define APBC_MMP2_MPMU         APBC_REG(0x074)
-#define APBC_MMP2_IPC          APBC_REG(0x078)
-#define APBC_MMP2_TWSI5                APBC_REG(0x07c)
-#define APBC_MMP2_TWSI6                APBC_REG(0x080)
-#define APBC_MMP2_TWSI_INTSTS  APBC_REG(0x084)
-#define APBC_MMP2_UART4                APBC_REG(0x088)
-#define APBC_MMP2_RIPC         APBC_REG(0x08c)
-#define APBC_MMP2_THSENS1      APBC_REG(0x090) /* Thermal Sensor */
-#define APBC_MMP2_THSENS_INTSTS        APBC_REG(0x0a4)
-
 /* Common APB clock register bit definitions */
 #define APBC_APBCLK    (1 << 0)  /* APB Bus Clock Enable */
 #define APBC_FNCLK     (1 << 1)  /* Functional Clock Enable */
index 7af8deb..93c8d0e 100644 (file)
 
 #include <mach/addr-map.h>
 
-/* Clock Reset Control */
-#define APMU_IRE       APMU_REG(0x048)
-#define APMU_LCD       APMU_REG(0x04c)
-#define APMU_CCIC      APMU_REG(0x050)
-#define APMU_SDH0      APMU_REG(0x054)
-#define APMU_SDH1      APMU_REG(0x058)
-#define APMU_USB       APMU_REG(0x05c)
-#define APMU_NAND      APMU_REG(0x060)
-#define APMU_DMA       APMU_REG(0x064)
-#define APMU_GEU       APMU_REG(0x068)
-#define APMU_BUS       APMU_REG(0x06c)
-#define APMU_SDH2      APMU_REG(0x0e8)
-#define APMU_SDH3      APMU_REG(0x0ec)
-#define APMU_ETH       APMU_REG(0x0fc)
-
 #define APMU_FNCLK_EN  (1 << 4)
 #define APMU_AXICLK_EN (1 << 3)
 #define APMU_FNRST_DIS (1 << 1)
index c709a24..3a3768c 100644 (file)
@@ -20,7 +20,6 @@
 #include <asm/mach/time.h>
 #include <mach/addr-map.h>
 #include <mach/regs-apbc.h>
-#include <mach/regs-apmu.h>
 #include <mach/cputype.h>
 #include <mach/irqs.h>
 #include <mach/dma.h>
@@ -29,7 +28,6 @@
 #include <mach/mmp2.h>
 
 #include "common.h"
-#include "clock.h"
 
 #define MFPR_VIRT_BASE (APB_VIRT_BASE + 0x1e000)
 
@@ -98,95 +96,36 @@ void __init mmp2_init_irq(void)
        mmp2_init_icu();
 }
 
-static void sdhc_clk_enable(struct clk *clk)
-{
-       uint32_t clk_rst;
-
-       clk_rst  =  __raw_readl(clk->clk_rst);
-       clk_rst |= clk->enable_val;
-       __raw_writel(clk_rst, clk->clk_rst);
-}
-
-static void sdhc_clk_disable(struct clk *clk)
-{
-       uint32_t clk_rst;
-
-       clk_rst  =  __raw_readl(clk->clk_rst);
-       clk_rst &= ~clk->enable_val;
-       __raw_writel(clk_rst, clk->clk_rst);
-}
-
-struct clkops sdhc_clk_ops = {
-       .enable         = sdhc_clk_enable,
-       .disable        = sdhc_clk_disable,
-};
-
-/* APB peripheral clocks */
-static APBC_CLK(uart1, MMP2_UART1, 1, 26000000);
-static APBC_CLK(uart2, MMP2_UART2, 1, 26000000);
-static APBC_CLK(uart3, MMP2_UART3, 1, 26000000);
-static APBC_CLK(uart4, MMP2_UART4, 1, 26000000);
-static APBC_CLK(twsi1, MMP2_TWSI1, 0, 26000000);
-static APBC_CLK(twsi2, MMP2_TWSI2, 0, 26000000);
-static APBC_CLK(twsi3, MMP2_TWSI3, 0, 26000000);
-static APBC_CLK(twsi4, MMP2_TWSI4, 0, 26000000);
-static APBC_CLK(twsi5, MMP2_TWSI5, 0, 26000000);
-static APBC_CLK(twsi6, MMP2_TWSI6, 0, 26000000);
-static APBC_CLK(gpio, MMP2_GPIO, 0, 26000000);
-
-static APMU_CLK(nand, NAND, 0xbf, 100000000);
-static APMU_CLK_OPS(sdh0, SDH0, 0x1b, 200000000, &sdhc_clk_ops);
-static APMU_CLK_OPS(sdh1, SDH1, 0x1b, 200000000, &sdhc_clk_ops);
-static APMU_CLK_OPS(sdh2, SDH2, 0x1b, 200000000, &sdhc_clk_ops);
-static APMU_CLK_OPS(sdh3, SDH3, 0x1b, 200000000, &sdhc_clk_ops);
-
-static struct clk_lookup mmp2_clkregs[] = {
-       INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
-       INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
-       INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL),
-       INIT_CLKREG(&clk_uart4, "pxa2xx-uart.3", NULL),
-       INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.0", NULL),
-       INIT_CLKREG(&clk_twsi2, "pxa2xx-i2c.1", NULL),
-       INIT_CLKREG(&clk_twsi3, "pxa2xx-i2c.2", NULL),
-       INIT_CLKREG(&clk_twsi4, "pxa2xx-i2c.3", NULL),
-       INIT_CLKREG(&clk_twsi5, "pxa2xx-i2c.4", NULL),
-       INIT_CLKREG(&clk_twsi6, "pxa2xx-i2c.5", NULL),
-       INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
-       INIT_CLKREG(&clk_gpio, "pxa-gpio", NULL),
-       INIT_CLKREG(&clk_sdh0, "sdhci-pxav3.0", "PXA-SDHCLK"),
-       INIT_CLKREG(&clk_sdh1, "sdhci-pxav3.1", "PXA-SDHCLK"),
-       INIT_CLKREG(&clk_sdh2, "sdhci-pxav3.2", "PXA-SDHCLK"),
-       INIT_CLKREG(&clk_sdh3, "sdhci-pxav3.3", "PXA-SDHCLK"),
-};
-
 static int __init mmp2_init(void)
 {
        if (cpu_is_mmp2()) {
 #ifdef CONFIG_CACHE_TAUROS2
-               tauros2_init();
+               tauros2_init(0);
 #endif
                mfp_init_base(MFPR_VIRT_BASE);
                mfp_init_addr(mmp2_addr_map);
                pxa_init_dma(IRQ_MMP2_DMA_RIQ, 16);
-               clkdev_add_table(ARRAY_AND_SIZE(mmp2_clkregs));
+               mmp2_clk_init();
        }
 
        return 0;
 }
 postcore_initcall(mmp2_init);
 
+#define APBC_TIMERS    APBC_REG(0x024)
+
 static void __init mmp2_timer_init(void)
 {
        unsigned long clk_rst;
 
-       __raw_writel(APBC_APBCLK | APBC_RST, APBC_MMP2_TIMERS);
+       __raw_writel(APBC_APBCLK | APBC_RST, APBC_TIMERS);
 
        /*
         * enable bus/functional clock, enable 6.5MHz (divider 4),
         * release reset
         */
        clk_rst = APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(1);
-       __raw_writel(clk_rst, APBC_MMP2_TIMERS);
+       __raw_writel(clk_rst, APBC_TIMERS);
 
        timer_init(IRQ_MMP2_TIMER1);
 }
index 62d787c..b7f074f 100644 (file)
@@ -18,8 +18,8 @@
 
 #include <asm/mach/time.h>
 #include <asm/system_misc.h>
-#include <mach/addr-map.h>
 #include <mach/cputype.h>
+#include <mach/addr-map.h>
 #include <mach/regs-apbc.h>
 #include <mach/regs-apmu.h>
 #include <mach/irqs.h>
@@ -50,62 +50,13 @@ void __init pxa168_init_irq(void)
        icu_init_irq();
 }
 
-/* APB peripheral clocks */
-static APBC_CLK(uart1, PXA168_UART1, 1, 14745600);
-static APBC_CLK(uart2, PXA168_UART2, 1, 14745600);
-static APBC_CLK(uart3, PXA168_UART3, 1, 14745600);
-static APBC_CLK(twsi0, PXA168_TWSI0, 1, 33000000);
-static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000);
-static APBC_CLK(pwm1, PXA168_PWM1, 1, 13000000);
-static APBC_CLK(pwm2, PXA168_PWM2, 1, 13000000);
-static APBC_CLK(pwm3, PXA168_PWM3, 1, 13000000);
-static APBC_CLK(pwm4, PXA168_PWM4, 1, 13000000);
-static APBC_CLK(ssp1, PXA168_SSP1, 4, 0);
-static APBC_CLK(ssp2, PXA168_SSP2, 4, 0);
-static APBC_CLK(ssp3, PXA168_SSP3, 4, 0);
-static APBC_CLK(ssp4, PXA168_SSP4, 4, 0);
-static APBC_CLK(ssp5, PXA168_SSP5, 4, 0);
-static APBC_CLK(gpio, PXA168_GPIO, 0, 13000000);
-static APBC_CLK(keypad, PXA168_KPC, 0, 32000);
-static APBC_CLK(rtc, PXA168_RTC, 8, 32768);
-
-static APMU_CLK(nand, NAND, 0x19b, 156000000);
-static APMU_CLK(lcd, LCD, 0x7f, 312000000);
-static APMU_CLK(eth, ETH, 0x09, 0);
-static APMU_CLK(usb, USB, 0x12, 0);
-
-/* device and clock bindings */
-static struct clk_lookup pxa168_clkregs[] = {
-       INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
-       INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
-       INIT_CLKREG(&clk_uart3, "pxa2xx-uart.2", NULL),
-       INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL),
-       INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL),
-       INIT_CLKREG(&clk_pwm1, "pxa168-pwm.0", NULL),
-       INIT_CLKREG(&clk_pwm2, "pxa168-pwm.1", NULL),
-       INIT_CLKREG(&clk_pwm3, "pxa168-pwm.2", NULL),
-       INIT_CLKREG(&clk_pwm4, "pxa168-pwm.3", NULL),
-       INIT_CLKREG(&clk_ssp1, "pxa168-ssp.0", NULL),
-       INIT_CLKREG(&clk_ssp2, "pxa168-ssp.1", NULL),
-       INIT_CLKREG(&clk_ssp3, "pxa168-ssp.2", NULL),
-       INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL),
-       INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL),
-       INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
-       INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL),
-       INIT_CLKREG(&clk_gpio, "pxa-gpio", NULL),
-       INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
-       INIT_CLKREG(&clk_eth, "pxa168-eth", "MFUCLK"),
-       INIT_CLKREG(&clk_usb, NULL, "PXA168-USBCLK"),
-       INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL),
-};
-
 static int __init pxa168_init(void)
 {
        if (cpu_is_pxa168()) {
                mfp_init_base(MFPR_VIRT_BASE);
                mfp_init_addr(pxa168_mfp_addr_map);
                pxa_init_dma(IRQ_PXA168_DMA_INT0, 32);
-               clkdev_add_table(ARRAY_AND_SIZE(pxa168_clkregs));
+               pxa168_clk_init();
        }
 
        return 0;
@@ -114,6 +65,7 @@ postcore_initcall(pxa168_init);
 
 /* system timer - clock enabled, 3.25MHz */
 #define TIMER_CLK_RST  (APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(3))
+#define APBC_TIMERS    APBC_REG(0x34)
 
 static void __init pxa168_timer_init(void)
 {
@@ -121,10 +73,10 @@ static void __init pxa168_timer_init(void)
         * ourselves instead of using clk_* API. Clock rate is defined
         * by APBC_TIMERS_CLK_RST (3.25MHz) and enabled free-running
         */
-       __raw_writel(APBC_APBCLK | APBC_RST, APBC_PXA168_TIMERS);
+       __raw_writel(APBC_APBCLK | APBC_RST, APBC_TIMERS);
 
        /* 3.25MHz, bus/functional clock enabled, release reset */
-       __raw_writel(TIMER_CLK_RST, APBC_PXA168_TIMERS);
+       __raw_writel(TIMER_CLK_RST, APBC_TIMERS);
 
        timer_init(IRQ_PXA168_TIMER1);
 }
index 6da52e9..8b1e16f 100644 (file)
 #include <linux/io.h>
 #include <linux/platform_device.h>
 
+#include <asm/hardware/cache-tauros2.h>
 #include <asm/mach/time.h>
 #include <mach/addr-map.h>
 #include <mach/regs-apbc.h>
-#include <mach/regs-apmu.h>
 #include <mach/cputype.h>
 #include <mach/irqs.h>
 #include <mach/dma.h>
@@ -25,7 +25,6 @@
 #include <mach/devices.h>
 
 #include "common.h"
-#include "clock.h"
 
 #define MFPR_VIRT_BASE (APB_VIRT_BASE + 0x1e000)
 
@@ -82,44 +81,16 @@ void __init pxa910_init_irq(void)
        icu_init_irq();
 }
 
-/* APB peripheral clocks */
-static APBC_CLK(uart1, PXA910_UART0, 1, 14745600);
-static APBC_CLK(uart2, PXA910_UART1, 1, 14745600);
-static APBC_CLK(twsi0, PXA168_TWSI0, 1, 33000000);
-static APBC_CLK(twsi1, PXA168_TWSI1, 1, 33000000);
-static APBC_CLK(pwm1, PXA910_PWM1, 1, 13000000);
-static APBC_CLK(pwm2, PXA910_PWM2, 1, 13000000);
-static APBC_CLK(pwm3, PXA910_PWM3, 1, 13000000);
-static APBC_CLK(pwm4, PXA910_PWM4, 1, 13000000);
-static APBC_CLK(gpio, PXA910_GPIO, 0, 13000000);
-static APBC_CLK(rtc, PXA910_RTC, 8, 32768);
-
-static APMU_CLK(nand, NAND, 0x19b, 156000000);
-static APMU_CLK(u2o, USB, 0x1b, 480000000);
-
-/* device and clock bindings */
-static struct clk_lookup pxa910_clkregs[] = {
-       INIT_CLKREG(&clk_uart1, "pxa2xx-uart.0", NULL),
-       INIT_CLKREG(&clk_uart2, "pxa2xx-uart.1", NULL),
-       INIT_CLKREG(&clk_twsi0, "pxa2xx-i2c.0", NULL),
-       INIT_CLKREG(&clk_twsi1, "pxa2xx-i2c.1", NULL),
-       INIT_CLKREG(&clk_pwm1, "pxa910-pwm.0", NULL),
-       INIT_CLKREG(&clk_pwm2, "pxa910-pwm.1", NULL),
-       INIT_CLKREG(&clk_pwm3, "pxa910-pwm.2", NULL),
-       INIT_CLKREG(&clk_pwm4, "pxa910-pwm.3", NULL),
-       INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
-       INIT_CLKREG(&clk_gpio, "pxa-gpio", NULL),
-       INIT_CLKREG(&clk_u2o, NULL, "U2OCLK"),
-       INIT_CLKREG(&clk_rtc, "sa1100-rtc", NULL),
-};
-
 static int __init pxa910_init(void)
 {
        if (cpu_is_pxa910()) {
+#ifdef CONFIG_CACHE_TAUROS2
+               tauros2_init(0);
+#endif
                mfp_init_base(MFPR_VIRT_BASE);
                mfp_init_addr(pxa910_mfp_addr_map);
                pxa_init_dma(IRQ_PXA910_DMA_INT0, 32);
-               clkdev_add_table(ARRAY_AND_SIZE(pxa910_clkregs));
+               pxa910_clk_init();
        }
 
        return 0;
@@ -128,12 +99,13 @@ postcore_initcall(pxa910_init);
 
 /* system timer - clock enabled, 3.25MHz */
 #define TIMER_CLK_RST  (APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(3))
+#define APBC_TIMERS    APBC_REG(0x34)
 
 static void __init pxa910_timer_init(void)
 {
        /* reset and configure */
-       __raw_writel(APBC_APBCLK | APBC_RST, APBC_PXA910_TIMERS);
-       __raw_writel(TIMER_CLK_RST, APBC_PXA910_TIMERS);
+       __raw_writel(APBC_APBCLK | APBC_RST, APBC_TIMERS);
+       __raw_writel(TIMER_CLK_RST, APBC_TIMERS);
 
        timer_init(IRQ_PXA910_AP1_TIMER1);
 }
index 1cd40ad..b2740c8 100644 (file)
@@ -38,8 +38,6 @@ config ARCH_QSD8X50
 
 config ARCH_MSM8X60
        bool "MSM8X60"
-       select MACH_MSM8X60_SURF if (!MACH_MSM8X60_RUMI3 && !MACH_MSM8X60_SIM \
-                                 && !MACH_MSM8X60_FFA)
        select ARCH_MSM_SCORPIONMP
        select ARM_GIC
        select CPU_V7
@@ -47,16 +45,17 @@ config ARCH_MSM8X60
        select GPIO_MSM_V2
        select MSM_GPIOMUX
        select MSM_SCM if SMP
+       select USE_OF
 
 config ARCH_MSM8960
        bool "MSM8960"
        select ARCH_MSM_SCORPIONMP
-       select MACH_MSM8960_SIM if (!MACH_MSM8960_RUMI3)
        select ARM_GIC
        select CPU_V7
        select MSM_V2_TLMM
        select MSM_GPIOMUX
        select MSM_SCM if SMP
+       select USE_OF
 
 endchoice
 
@@ -112,42 +111,6 @@ config MACH_QSD8X50A_ST1_5
        help
          Support for the Qualcomm ST1.5.
 
-config MACH_MSM8X60_RUMI3
-       depends on ARCH_MSM8X60
-       bool "MSM8x60 RUMI3"
-       help
-         Support for the Qualcomm MSM8x60 RUMI3 emulator.
-
-config MACH_MSM8X60_SURF
-       depends on ARCH_MSM8X60
-       bool "MSM8x60 SURF"
-       help
-         Support for the Qualcomm MSM8x60 SURF eval board.
-
-config MACH_MSM8X60_SIM
-       depends on ARCH_MSM8X60
-       bool "MSM8x60 Simulator"
-       help
-         Support for the Qualcomm MSM8x60 simulator.
-
-config MACH_MSM8X60_FFA
-       depends on ARCH_MSM8X60
-       bool "MSM8x60 FFA"
-       help
-         Support for the Qualcomm MSM8x60 FFA eval board.
-
-config MACH_MSM8960_SIM
-       depends on ARCH_MSM8960
-       bool "MSM8960 Simulator"
-       help
-         Support for the Qualcomm MSM8960 simulator.
-
-config MACH_MSM8960_RUMI3
-       depends on ARCH_MSM8960
-       bool "MSM8960 RUMI3"
-       help
-         Support for the Qualcomm MSM8960 RUMI3 emulator.
-
 endmenu
 
 config MSM_SMD_PKG3
index 4ad3969..17519fa 100644 (file)
@@ -1,11 +1,11 @@
-obj-y += io.o idle.o timer.o
+obj-y += io.o timer.o
 obj-y += clock.o
 obj-$(CONFIG_DEBUG_FS) += clock-debug.o
 
 obj-$(CONFIG_MSM_VIC) += irq-vic.o
 obj-$(CONFIG_MSM_IOMMU) += devices-iommu.o
 
-obj-$(CONFIG_ARCH_MSM7X00A) += dma.o irq.o acpuclock-arm11.o
+obj-$(CONFIG_ARCH_MSM7X00A) += dma.o irq.o
 obj-$(CONFIG_ARCH_MSM7X30) += dma.o
 obj-$(CONFIG_ARCH_QSD8X50) += dma.o sirc.o
 
@@ -25,8 +25,8 @@ obj-$(CONFIG_MACH_TROUT) += board-trout.o board-trout-gpio.o board-trout-mmc.o b
 obj-$(CONFIG_MACH_HALIBUT) += board-halibut.o devices-msm7x00.o
 obj-$(CONFIG_ARCH_MSM7X30) += board-msm7x30.o devices-msm7x30.o
 obj-$(CONFIG_ARCH_QSD8X50) += board-qsd8x50.o devices-qsd8x50.o
-obj-$(CONFIG_ARCH_MSM8X60) += board-msm8x60.o
-obj-$(CONFIG_ARCH_MSM8960) += board-msm8960.o devices-msm8960.o
+obj-$(CONFIG_ARCH_MSM8X60) += board-dt-8660.o
+obj-$(CONFIG_ARCH_MSM8960) += board-dt-8960.o
 
 obj-$(CONFIG_ARCH_MSM7X30) += gpiomux-v1.o gpiomux.o
 obj-$(CONFIG_ARCH_QSD8X50) += gpiomux-8x50.o gpiomux-v1.o gpiomux.o
index 9b803a5..f7d6ae9 100644 (file)
@@ -1,3 +1,6 @@
   zreladdr-y           += 0x10008000
 params_phys-y          := 0x10000100
 initrd_phys-y          := 0x10800000
+
+dtb-$(CONFIG_ARCH_MSM8X60) += msm8660-surf.dtb
+dtb-$(CONFIG_ARCH_MSM8960) += msm8960-cdp.dtb
diff --git a/arch/arm/mach-msm/acpuclock-arm11.c b/arch/arm/mach-msm/acpuclock-arm11.c
deleted file mode 100644 (file)
index 805d4ee..0000000
+++ /dev/null
@@ -1,525 +0,0 @@
-/* arch/arm/mach-msm/acpuclock.c
- *
- * MSM architecture clock driver
- *
- * Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2007 QUALCOMM Incorporated
- * Author: San Mehat <san@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/init.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/delay.h>
-#include <linux/clk.h>
-#include <linux/cpufreq.h>
-#include <linux/mutex.h>
-#include <linux/io.h>
-#include <mach/board.h>
-#include <mach/msm_iomap.h>
-
-#include "proc_comm.h"
-#include "acpuclock.h"
-
-
-#define A11S_CLK_CNTL_ADDR (MSM_CSR_BASE + 0x100)
-#define A11S_CLK_SEL_ADDR (MSM_CSR_BASE + 0x104)
-#define A11S_VDD_SVS_PLEVEL_ADDR (MSM_CSR_BASE + 0x124)
-
-/*
- * ARM11 clock configuration for specific ACPU speeds
- */
-
-#define ACPU_PLL_TCXO  -1
-#define ACPU_PLL_0     0
-#define ACPU_PLL_1     1
-#define ACPU_PLL_2     2
-#define ACPU_PLL_3     3
-
-#define PERF_SWITCH_DEBUG 0
-#define PERF_SWITCH_STEP_DEBUG 0
-
-struct clock_state
-{
-       struct clkctl_acpu_speed        *current_speed;
-       struct mutex                    lock;
-       uint32_t                        acpu_switch_time_us;
-       uint32_t                        max_speed_delta_khz;
-       uint32_t                        vdd_switch_time_us;
-       unsigned long                   power_collapse_khz;
-       unsigned long                   wait_for_irq_khz;
-};
-
-static struct clk *ebi1_clk;
-static struct clock_state drv_state = { 0 };
-
-static void __init acpuclk_init(void);
-
-/* MSM7201A Levels 3-6 all correspond to 1.2V, level 7 corresponds to 1.325V. */
-enum {
-       VDD_0 = 0,
-       VDD_1 = 1,
-       VDD_2 = 2,
-       VDD_3 = 3,
-       VDD_4 = 3,
-       VDD_5 = 3,
-       VDD_6 = 3,
-       VDD_7 = 7,
-       VDD_END
-};
-
-struct clkctl_acpu_speed {
-       unsigned int    a11clk_khz;
-       int             pll;
-       unsigned int    a11clk_src_sel;
-       unsigned int    a11clk_src_div;
-       unsigned int    ahbclk_khz;
-       unsigned int    ahbclk_div;
-       int             vdd;
-       unsigned int    axiclk_khz;
-       unsigned long   lpj; /* loops_per_jiffy */
-/* Index in acpu_freq_tbl[] for steppings. */
-       short           down;
-       short           up;
-};
-
-/*
- * ACPU speed table. Complete table is shown but certain speeds are commented
- * out to optimized speed switching. Initialize loops_per_jiffy to 0.
- *
- * Table stepping up/down is optimized for 256mhz jumps while staying on the
- * same PLL.
- */
-#if (0)
-static struct clkctl_acpu_speed  acpu_freq_tbl[] = {
-       { 19200, ACPU_PLL_TCXO, 0, 0, 19200, 0, VDD_0, 30720, 0, 0, 8 },
-       { 61440, ACPU_PLL_0,  4, 3, 61440,  0, VDD_0, 30720,  0, 0, 8 },
-       { 81920, ACPU_PLL_0,  4, 2, 40960,  1, VDD_0, 61440,  0, 0, 8 },
-       { 96000, ACPU_PLL_1,  1, 7, 48000,  1, VDD_0, 61440,  0, 0, 9 },
-       { 122880, ACPU_PLL_0, 4, 1, 61440,  1, VDD_3, 61440,  0, 0, 8 },
-       { 128000, ACPU_PLL_1, 1, 5, 64000,  1, VDD_3, 61440,  0, 0, 12 },
-       { 176000, ACPU_PLL_2, 2, 5, 88000,  1, VDD_3, 61440,  0, 0, 11 },
-       { 192000, ACPU_PLL_1, 1, 3, 64000,  2, VDD_3, 61440,  0, 0, 12 },
-       { 245760, ACPU_PLL_0, 4, 0, 81920,  2, VDD_4, 61440,  0, 0, 12 },
-       { 256000, ACPU_PLL_1, 1, 2, 128000, 2, VDD_5, 128000, 0, 0, 12 },
-       { 264000, ACPU_PLL_2, 2, 3, 88000,  2, VDD_5, 128000, 0, 6, 13 },
-       { 352000, ACPU_PLL_2, 2, 2, 88000,  3, VDD_5, 128000, 0, 6, 13 },
-       { 384000, ACPU_PLL_1, 1, 1, 128000, 2, VDD_6, 128000, 0, 5, -1 },
-       { 528000, ACPU_PLL_2, 2, 1, 132000, 3, VDD_7, 128000, 0, 11, -1 },
-       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
-};
-#else /* Table of freq we currently use. */
-static struct clkctl_acpu_speed  acpu_freq_tbl[] = {
-       { 19200, ACPU_PLL_TCXO, 0, 0, 19200, 0, VDD_0, 30720, 0, 0, 4 },
-       { 122880, ACPU_PLL_0, 4, 1, 61440, 1, VDD_3, 61440, 0, 0, 4 },
-       { 128000, ACPU_PLL_1, 1, 5, 64000, 1, VDD_3, 61440, 0, 0, 6 },
-       { 176000, ACPU_PLL_2, 2, 5, 88000, 1, VDD_3, 61440, 0, 0, 5 },
-       { 245760, ACPU_PLL_0, 4, 0, 81920, 2, VDD_4, 61440, 0, 0, 5 },
-       { 352000, ACPU_PLL_2, 2, 2, 88000, 3, VDD_5, 128000, 0, 3, 7 },
-       { 384000, ACPU_PLL_1, 1, 1, 128000, 2, VDD_6, 128000, 0, 2, -1 },
-       { 528000, ACPU_PLL_2, 2, 1, 132000, 3, VDD_7, 128000, 0, 5, -1 },
-       { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
-};
-#endif
-
-
-#ifdef CONFIG_CPU_FREQ_TABLE
-static struct cpufreq_frequency_table freq_table[] = {
-       { 0, 122880 },
-       { 1, 128000 },
-       { 2, 245760 },
-       { 3, 384000 },
-       { 4, 528000 },
-       { 5, CPUFREQ_TABLE_END },
-};
-#endif
-
-static int pc_pll_request(unsigned id, unsigned on)
-{
-       int res;
-       on = !!on;
-
-#if PERF_SWITCH_DEBUG
-       if (on)
-               printk(KERN_DEBUG "Enabling PLL %d\n", id);
-       else
-               printk(KERN_DEBUG "Disabling PLL %d\n", id);
-#endif
-
-       res = msm_proc_comm(PCOM_CLKCTL_RPC_PLL_REQUEST, &id, &on);
-       if (res < 0)
-               return res;
-
-#if PERF_SWITCH_DEBUG
-       if (on)
-               printk(KERN_DEBUG "PLL %d enabled\n", id);
-       else
-               printk(KERN_DEBUG "PLL %d disabled\n", id);
-#endif
-       return res;
-}
-
-
-/*----------------------------------------------------------------------------
- * ARM11 'owned' clock control
- *---------------------------------------------------------------------------*/
-
-unsigned long acpuclk_power_collapse(void) {
-       int ret = acpuclk_get_rate();
-       ret *= 1000;
-       if (ret > drv_state.power_collapse_khz)
-               acpuclk_set_rate(drv_state.power_collapse_khz, 1);
-       return ret;
-}
-
-unsigned long acpuclk_get_wfi_rate(void)
-{
-       return drv_state.wait_for_irq_khz;
-}
-
-unsigned long acpuclk_wait_for_irq(void) {
-       int ret = acpuclk_get_rate();
-       ret *= 1000;
-       if (ret > drv_state.wait_for_irq_khz)
-               acpuclk_set_rate(drv_state.wait_for_irq_khz, 1);
-       return ret;
-}
-
-static int acpuclk_set_vdd_level(int vdd)
-{
-       uint32_t current_vdd;
-
-       current_vdd = readl(A11S_VDD_SVS_PLEVEL_ADDR) & 0x07;
-
-#if PERF_SWITCH_DEBUG
-       printk(KERN_DEBUG "acpuclock: Switching VDD from %u -> %d\n",
-              current_vdd, vdd);
-#endif
-       writel((1 << 7) | (vdd << 3), A11S_VDD_SVS_PLEVEL_ADDR);
-       udelay(drv_state.vdd_switch_time_us);
-       if ((readl(A11S_VDD_SVS_PLEVEL_ADDR) & 0x7) != vdd) {
-#if PERF_SWITCH_DEBUG
-               printk(KERN_ERR "acpuclock: VDD set failed\n");
-#endif
-               return -EIO;
-       }
-
-#if PERF_SWITCH_DEBUG
-       printk(KERN_DEBUG "acpuclock: VDD switched\n");
-#endif
-       return 0;
-}
-
-/* Set proper dividers for the given clock speed. */
-static void acpuclk_set_div(const struct clkctl_acpu_speed *hunt_s) {
-       uint32_t reg_clkctl, reg_clksel, clk_div;
-
-       /* AHB_CLK_DIV */
-       clk_div = (readl(A11S_CLK_SEL_ADDR) >> 1) & 0x03;
-       /*
-        * If the new clock divider is higher than the previous, then
-        * program the divider before switching the clock
-        */
-       if (hunt_s->ahbclk_div > clk_div) {
-               reg_clksel = readl(A11S_CLK_SEL_ADDR);
-               reg_clksel &= ~(0x3 << 1);
-               reg_clksel |= (hunt_s->ahbclk_div << 1);
-               writel(reg_clksel, A11S_CLK_SEL_ADDR);
-       }
-       if ((readl(A11S_CLK_SEL_ADDR) & 0x01) == 0) {
-               /* SRC0 */
-
-               /* Program clock source */
-               reg_clkctl = readl(A11S_CLK_CNTL_ADDR);
-               reg_clkctl &= ~(0x07 << 4);
-               reg_clkctl |= (hunt_s->a11clk_src_sel << 4);
-               writel(reg_clkctl, A11S_CLK_CNTL_ADDR);
-
-               /* Program clock divider */
-               reg_clkctl = readl(A11S_CLK_CNTL_ADDR);
-               reg_clkctl &= ~0xf;
-               reg_clkctl |= hunt_s->a11clk_src_div;
-               writel(reg_clkctl, A11S_CLK_CNTL_ADDR);
-
-               /* Program clock source selection */
-               reg_clksel = readl(A11S_CLK_SEL_ADDR);
-               reg_clksel |= 1; /* CLK_SEL_SRC1NO  == SRC1 */
-               writel(reg_clksel, A11S_CLK_SEL_ADDR);
-       } else {
-               /* SRC1 */
-
-               /* Program clock source */
-               reg_clkctl = readl(A11S_CLK_CNTL_ADDR);
-               reg_clkctl &= ~(0x07 << 12);
-               reg_clkctl |= (hunt_s->a11clk_src_sel << 12);
-               writel(reg_clkctl, A11S_CLK_CNTL_ADDR);
-
-               /* Program clock divider */
-               reg_clkctl = readl(A11S_CLK_CNTL_ADDR);
-               reg_clkctl &= ~(0xf << 8);
-               reg_clkctl |= (hunt_s->a11clk_src_div << 8);
-               writel(reg_clkctl, A11S_CLK_CNTL_ADDR);
-
-               /* Program clock source selection */
-               reg_clksel = readl(A11S_CLK_SEL_ADDR);
-               reg_clksel &= ~1; /* CLK_SEL_SRC1NO  == SRC0 */
-               writel(reg_clksel, A11S_CLK_SEL_ADDR);
-       }
-
-       /*
-        * If the new clock divider is lower than the previous, then
-        * program the divider after switching the clock
-        */
-       if (hunt_s->ahbclk_div < clk_div) {
-               reg_clksel = readl(A11S_CLK_SEL_ADDR);
-               reg_clksel &= ~(0x3 << 1);
-               reg_clksel |= (hunt_s->ahbclk_div << 1);
-               writel(reg_clksel, A11S_CLK_SEL_ADDR);
-       }
-}
-
-int acpuclk_set_rate(unsigned long rate, int for_power_collapse)
-{
-       uint32_t reg_clkctl;
-       struct clkctl_acpu_speed *cur_s, *tgt_s, *strt_s;
-       int rc = 0;
-       unsigned int plls_enabled = 0, pll;
-
-       strt_s = cur_s = drv_state.current_speed;
-
-       WARN_ONCE(cur_s == NULL, "acpuclk_set_rate: not initialized\n");
-       if (cur_s == NULL)
-               return -ENOENT;
-
-       if (rate == (cur_s->a11clk_khz * 1000))
-               return 0;
-
-       for (tgt_s = acpu_freq_tbl; tgt_s->a11clk_khz != 0; tgt_s++) {
-               if (tgt_s->a11clk_khz == (rate / 1000))
-                       break;
-       }
-
-       if (tgt_s->a11clk_khz == 0)
-               return -EINVAL;
-
-       /* Choose the highest speed speed at or below 'rate' with same PLL. */
-       if (for_power_collapse && tgt_s->a11clk_khz < cur_s->a11clk_khz) {
-               while (tgt_s->pll != ACPU_PLL_TCXO && tgt_s->pll != cur_s->pll)
-                       tgt_s--;
-       }
-
-       if (strt_s->pll != ACPU_PLL_TCXO)
-               plls_enabled |= 1 << strt_s->pll;
-
-       if (!for_power_collapse) {
-               mutex_lock(&drv_state.lock);
-               if (strt_s->pll != tgt_s->pll && tgt_s->pll != ACPU_PLL_TCXO) {
-                       rc = pc_pll_request(tgt_s->pll, 1);
-                       if (rc < 0) {
-                               pr_err("PLL%d enable failed (%d)\n",
-                                       tgt_s->pll, rc);
-                               goto out;
-                       }
-                       plls_enabled |= 1 << tgt_s->pll;
-               }
-               /* Increase VDD if needed. */
-               if (tgt_s->vdd > cur_s->vdd) {
-                       if ((rc = acpuclk_set_vdd_level(tgt_s->vdd)) < 0) {
-                               printk(KERN_ERR "Unable to switch ACPU vdd\n");
-                               goto out;
-                       }
-               }
-       }
-
-       /* Set wait states for CPU between frequency changes */
-       reg_clkctl = readl(A11S_CLK_CNTL_ADDR);
-       reg_clkctl |= (100 << 16); /* set WT_ST_CNT */
-       writel(reg_clkctl, A11S_CLK_CNTL_ADDR);
-
-#if PERF_SWITCH_DEBUG
-       printk(KERN_INFO "acpuclock: Switching from ACPU rate %u -> %u\n",
-              strt_s->a11clk_khz * 1000, tgt_s->a11clk_khz * 1000);
-#endif
-
-       while (cur_s != tgt_s) {
-               /*
-                * Always jump to target freq if within 256mhz, regulardless of
-                * PLL. If differnece is greater, use the predefinied
-                * steppings in the table.
-                */
-               int d = abs((int)(cur_s->a11clk_khz - tgt_s->a11clk_khz));
-               if (d > drv_state.max_speed_delta_khz) {
-                       /* Step up or down depending on target vs current. */
-                       int clk_index = tgt_s->a11clk_khz > cur_s->a11clk_khz ?
-                               cur_s->up : cur_s->down;
-                       if (clk_index < 0) { /* This should not happen. */
-                               printk(KERN_ERR "cur:%u target: %u\n",
-                                       cur_s->a11clk_khz, tgt_s->a11clk_khz);
-                               rc = -EINVAL;
-                               goto out;
-                       }
-                       cur_s = &acpu_freq_tbl[clk_index];
-               } else {
-                       cur_s = tgt_s;
-               }
-#if PERF_SWITCH_STEP_DEBUG
-               printk(KERN_DEBUG "%s: STEP khz = %u, pll = %d\n",
-                       __FUNCTION__, cur_s->a11clk_khz, cur_s->pll);
-#endif
-               if (!for_power_collapse&& cur_s->pll != ACPU_PLL_TCXO
-                   && !(plls_enabled & (1 << cur_s->pll))) {
-                       rc = pc_pll_request(cur_s->pll, 1);
-                       if (rc < 0) {
-                               pr_err("PLL%d enable failed (%d)\n",
-                                       cur_s->pll, rc);
-                               goto out;
-                       }
-                       plls_enabled |= 1 << cur_s->pll;
-               }
-
-               acpuclk_set_div(cur_s);
-               drv_state.current_speed = cur_s;
-               /* Re-adjust lpj for the new clock speed. */
-               loops_per_jiffy = cur_s->lpj;
-               udelay(drv_state.acpu_switch_time_us);
-       }
-
-       /* Nothing else to do for power collapse. */
-       if (for_power_collapse)
-               return 0;
-
-       /* Disable PLLs we are not using anymore. */
-       plls_enabled &= ~(1 << tgt_s->pll);
-       for (pll = ACPU_PLL_0; pll <= ACPU_PLL_2; pll++)
-               if (plls_enabled & (1 << pll)) {
-                       rc = pc_pll_request(pll, 0);
-                       if (rc < 0) {
-                               pr_err("PLL%d disable failed (%d)\n", pll, rc);
-                               goto out;
-                       }
-               }
-
-       /* Change the AXI bus frequency if we can. */
-       if (strt_s->axiclk_khz != tgt_s->axiclk_khz) {
-               rc = clk_set_rate(ebi1_clk, tgt_s->axiclk_khz * 1000);
-               if (rc < 0)
-                       pr_err("Setting AXI min rate failed!\n");
-       }
-
-       /* Drop VDD level if we can. */
-       if (tgt_s->vdd < strt_s->vdd) {
-               if (acpuclk_set_vdd_level(tgt_s->vdd) < 0)
-                       printk(KERN_ERR "acpuclock: Unable to drop ACPU vdd\n");
-       }
-
-#if PERF_SWITCH_DEBUG
-       printk(KERN_DEBUG "%s: ACPU speed change complete\n", __FUNCTION__);
-#endif
-out:
-       if (!for_power_collapse)
-               mutex_unlock(&drv_state.lock);
-       return rc;
-}
-
-static void __init acpuclk_init(void)
-{
-       struct clkctl_acpu_speed *speed;
-       uint32_t div, sel;
-       int rc;
-
-       /*
-        * Determine the rate of ACPU clock
-        */
-
-       if (!(readl(A11S_CLK_SEL_ADDR) & 0x01)) { /* CLK_SEL_SRC1N0 */
-               /* CLK_SRC0_SEL */
-               sel = (readl(A11S_CLK_CNTL_ADDR) >> 12) & 0x7;
-               /* CLK_SRC0_DIV */
-               div = (readl(A11S_CLK_CNTL_ADDR) >> 8) & 0x0f;
-       } else {
-               /* CLK_SRC1_SEL */
-               sel = (readl(A11S_CLK_CNTL_ADDR) >> 4) & 0x07;
-               /* CLK_SRC1_DIV */
-               div = readl(A11S_CLK_CNTL_ADDR) & 0x0f;
-       }
-
-       for (speed = acpu_freq_tbl; speed->a11clk_khz != 0; speed++) {
-               if (speed->a11clk_src_sel == sel
-                && (speed->a11clk_src_div == div))
-                       break;
-       }
-       if (speed->a11clk_khz == 0) {
-               printk(KERN_WARNING "Warning - ACPU clock reports invalid speed\n");
-               return;
-       }
-
-       drv_state.current_speed = speed;
-
-       rc = clk_set_rate(ebi1_clk, speed->axiclk_khz * 1000);
-       if (rc < 0)
-               pr_err("Setting AXI min rate failed!\n");
-
-       printk(KERN_INFO "ACPU running at %d KHz\n", speed->a11clk_khz);
-}
-
-unsigned long acpuclk_get_rate(void)
-{
-       WARN_ONCE(drv_state.current_speed == NULL,
-                 "acpuclk_get_rate: not initialized\n");
-       if (drv_state.current_speed)
-               return drv_state.current_speed->a11clk_khz;
-       else
-               return 0;
-}
-
-uint32_t acpuclk_get_switch_time(void)
-{
-       return drv_state.acpu_switch_time_us;
-}
-
-/*----------------------------------------------------------------------------
- * Clock driver initialization
- *---------------------------------------------------------------------------*/
-
-/* Initialize the lpj field in the acpu_freq_tbl. */
-static void __init lpj_init(void)
-{
-       int i;
-       const struct clkctl_acpu_speed *base_clk = drv_state.current_speed;
-       for (i = 0; acpu_freq_tbl[i].a11clk_khz; i++) {
-               acpu_freq_tbl[i].lpj = cpufreq_scale(loops_per_jiffy,
-                                               base_clk->a11clk_khz,
-                                               acpu_freq_tbl[i].a11clk_khz);
-       }
-}
-
-void __init msm_acpu_clock_init(struct msm_acpu_clock_platform_data *clkdata)
-{
-       pr_info("acpu_clock_init()\n");
-
-       ebi1_clk = clk_get(NULL, "ebi1_clk");
-
-       mutex_init(&drv_state.lock);
-       drv_state.acpu_switch_time_us = clkdata->acpu_switch_time_us;
-       drv_state.max_speed_delta_khz = clkdata->max_speed_delta_khz;
-       drv_state.vdd_switch_time_us = clkdata->vdd_switch_time_us;
-       drv_state.power_collapse_khz = clkdata->power_collapse_khz;
-       drv_state.wait_for_irq_khz = clkdata->wait_for_irq_khz;
-       acpuclk_init();
-       lpj_init();
-#ifdef CONFIG_CPU_FREQ_TABLE
-       cpufreq_frequency_table_get_attr(freq_table, smp_processor_id());
-#endif
-}
diff --git a/arch/arm/mach-msm/acpuclock.h b/arch/arm/mach-msm/acpuclock.h
deleted file mode 100644 (file)
index 415de2e..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/* arch/arm/mach-msm/acpuclock.h
- *
- * MSM architecture clock driver header
- *
- * Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2007 QUALCOMM Incorporated
- * Author: San Mehat <san@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 __ARCH_ARM_MACH_MSM_ACPUCLOCK_H
-#define __ARCH_ARM_MACH_MSM_ACPUCLOCK_H
-
-int acpuclk_set_rate(unsigned long rate, int for_power_collapse);
-unsigned long acpuclk_get_rate(void);
-uint32_t acpuclk_get_switch_time(void);
-unsigned long acpuclk_wait_for_irq(void);
-unsigned long acpuclk_power_collapse(void);
-unsigned long acpuclk_get_wfi_rate(void);
-
-
-#endif
-
diff --git a/arch/arm/mach-msm/board-dt-8660.c b/arch/arm/mach-msm/board-dt-8660.c
new file mode 100644 (file)
index 0000000..f77f57f
--- /dev/null
@@ -0,0 +1,63 @@
+/* Copyright (c) 2010-2012, 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/init.h>
+#include <linux/of.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+
+#include <asm/mach/arch.h>
+#include <asm/hardware/gic.h>
+
+#include <mach/board.h>
+#include "common.h"
+
+static const struct of_device_id msm_dt_gic_match[] __initconst = {
+       { .compatible = "qcom,msm-8660-qgic", .data = gic_of_init },
+       {}
+};
+
+static void __init msm8x60_init_irq(void)
+{
+       of_irq_init(msm_dt_gic_match);
+}
+
+static void __init msm8x60_init_late(void)
+{
+       smd_debugfs_init();
+}
+
+static struct of_dev_auxdata msm_auxdata_lookup[] __initdata = {
+       {}
+};
+
+static void __init msm8x60_dt_init(void)
+{
+       of_platform_populate(NULL, of_default_bus_match_table,
+                       msm_auxdata_lookup, NULL);
+}
+
+static const char *msm8x60_fluid_match[] __initdata = {
+       "qcom,msm8660-fluid",
+       "qcom,msm8660-surf",
+       NULL
+};
+
+DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)")
+       .map_io = msm_map_msm8x60_io,
+       .init_irq = msm8x60_init_irq,
+       .handle_irq = gic_handle_irq,
+       .init_machine = msm8x60_dt_init,
+       .init_late = msm8x60_init_late,
+       .timer = &msm_dt_timer,
+       .dt_compat = msm8x60_fluid_match,
+MACHINE_END
diff --git a/arch/arm/mach-msm/board-dt-8960.c b/arch/arm/mach-msm/board-dt-8960.c
new file mode 100644 (file)
index 0000000..8df99b8
--- /dev/null
@@ -0,0 +1,49 @@
+/* Copyright (c) 2012, 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/init.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+
+#include <asm/hardware/gic.h>
+#include <asm/mach/arch.h>
+
+#include "common.h"
+
+static const struct of_device_id msm_dt_gic_match[] __initconst = {
+       { .compatible = "qcom,msm-qgic2", .data = gic_of_init },
+       { }
+};
+
+static void __init msm_dt_init_irq(void)
+{
+       of_irq_init(msm_dt_gic_match);
+}
+
+static void __init msm_dt_init(void)
+{
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+}
+
+static const char * const msm8960_dt_match[] __initconst = {
+       "qcom,msm8960-cdp",
+       NULL
+};
+
+DT_MACHINE_START(MSM8960_DT, "Qualcomm MSM (Flattened Device Tree)")
+       .map_io = msm_map_msm8960_io,
+       .init_irq = msm_dt_init_irq,
+       .timer = &msm_dt_timer,
+       .init_machine = msm_dt_init,
+       .dt_compat = msm8960_dt_match,
+       .handle_irq = gic_handle_irq,
+MACHINE_END
index 4fa3e99..6ce542e 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/mtd/partitions.h>
 
 #include "devices.h"
+#include "common.h"
 
 static struct resource smc91x_resources[] = {
        [0] = {
@@ -66,8 +67,6 @@ static struct platform_device *devices[] __initdata = {
        &smc91x_device,
 };
 
-extern struct sys_timer msm_timer;
-
 static void __init halibut_init_early(void)
 {
        arch_ioremap_caller = __msm_ioremap_caller;
@@ -107,5 +106,5 @@ MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)")
        .init_irq       = halibut_init_irq,
        .init_machine   = halibut_init,
        .init_late      = halibut_init_late,
-       .timer          = &msm_timer,
+       .timer          = &msm7x01_timer,
 MACHINE_END
index cf1f89a..df00bc0 100644 (file)
@@ -30,7 +30,6 @@
 
 #include <mach/board.h>
 #include <mach/hardware.h>
-#include <mach/system.h>
 
 #include "board-mahimahi.h"
 #include "devices.h"
diff --git a/arch/arm/mach-msm/board-msm7x27.c b/arch/arm/mach-msm/board-msm7x27.c
deleted file mode 100644 (file)
index 451ab1d..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2008-2009, Code Aurora Forum. All rights reserved.
- * Author: Brian Swetland <swetland@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/gpio.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/input.h>
-#include <linux/io.h>
-#include <linux/delay.h>
-#include <linux/power_supply.h>
-
-#include <mach/hardware.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/mach/flash.h>
-#include <asm/setup.h>
-#ifdef CONFIG_CACHE_L2X0
-#include <asm/hardware/cache-l2x0.h>
-#endif
-
-#include <mach/vreg.h>
-#include <mach/mpp.h>
-#include <mach/board.h>
-#include <mach/msm_iomap.h>
-
-#include <linux/mtd/nand.h>
-#include <linux/mtd/partitions.h>
-
-#include "devices.h"
-#include "socinfo.h"
-#include "clock.h"
-
-static struct resource smc91x_resources[] = {
-       [0] = {
-               .start  = 0x9C004300,
-               .end    = 0x9C0043ff,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = MSM_GPIO_TO_INT(132),
-               .end    = MSM_GPIO_TO_INT(132),
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device smc91x_device = {
-       .name           = "smc91x",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(smc91x_resources),
-       .resource       = smc91x_resources,
-};
-
-static struct platform_device *devices[] __initdata = {
-       &msm_device_uart3,
-       &msm_device_smd,
-       &msm_device_dmov,
-       &msm_device_nand,
-       &smc91x_device,
-};
-
-extern struct sys_timer msm_timer;
-
-static void __init msm7x2x_init_irq(void)
-{
-       msm_init_irq();
-}
-
-static void __init msm7x2x_init(void)
-{
-       if (socinfo_init() < 0)
-               BUG();
-
-       if (machine_is_msm7x25_ffa() || machine_is_msm7x27_ffa()) {
-               smc91x_resources[0].start = 0x98000300;
-               smc91x_resources[0].end = 0x980003ff;
-               smc91x_resources[1].start = MSM_GPIO_TO_INT(85);
-               smc91x_resources[1].end = MSM_GPIO_TO_INT(85);
-               if (gpio_tlmm_config(GPIO_CFG(85, 0,
-                                             GPIO_INPUT,
-                                             GPIO_PULL_DOWN,
-                                             GPIO_2MA),
-                                    GPIO_ENABLE)) {
-                       printk(KERN_ERR
-                              "%s: Err: Config GPIO-85 INT\n",
-                               __func__);
-               }
-       }
-
-       platform_add_devices(devices, ARRAY_SIZE(devices));
-}
-
-static void __init msm7x2x_map_io(void)
-{
-       msm_map_common_io();
-       /* Technically dependent on the SoC but using machine_is
-        * macros since socinfo is not available this early and there
-        * are plans to restructure the code which will eliminate the
-        * need for socinfo.
-        */
-       if (machine_is_msm7x27_surf() || machine_is_msm7x27_ffa())
-               msm_clock_init(msm_clocks_7x27, msm_num_clocks_7x27);
-
-       if (machine_is_msm7x25_surf() || machine_is_msm7x25_ffa())
-               msm_clock_init(msm_clocks_7x25, msm_num_clocks_7x25);
-
-#ifdef CONFIG_CACHE_L2X0
-       if (machine_is_msm7x27_surf() || machine_is_msm7x27_ffa()) {
-               /* 7x27 has 256KB L2 cache:
-                       64Kb/Way and 4-Way Associativity;
-                       R/W latency: 3 cycles;
-                       evmon/parity/share disabled. */
-               l2x0_init(MSM_L2CC_BASE, 0x00068012, 0xfe000000);
-       }
-#endif
-}
-
-static void __init msm7x2x_init_late(void)
-{
-       smd_debugfs_init();
-}
-
-MACHINE_START(MSM7X27_SURF, "QCT MSM7x27 SURF")
-       .atag_offset    = 0x100,
-       .map_io         = msm7x2x_map_io,
-       .init_irq       = msm7x2x_init_irq,
-       .init_machine   = msm7x2x_init,
-       .init_late      = msm7x2x_init_late,
-       .timer          = &msm_timer,
-MACHINE_END
-
-MACHINE_START(MSM7X27_FFA, "QCT MSM7x27 FFA")
-       .atag_offset    = 0x100,
-       .map_io         = msm7x2x_map_io,
-       .init_irq       = msm7x2x_init_irq,
-       .init_machine   = msm7x2x_init,
-       .init_late      = msm7x2x_init_late,
-       .timer          = &msm_timer,
-MACHINE_END
-
-MACHINE_START(MSM7X25_SURF, "QCT MSM7x25 SURF")
-       .atag_offset    = 0x100,
-       .map_io         = msm7x2x_map_io,
-       .init_irq       = msm7x2x_init_irq,
-       .init_machine   = msm7x2x_init,
-       .init_late      = msm7x2x_init_late,
-       .timer          = &msm_timer,
-MACHINE_END
-
-MACHINE_START(MSM7X25_FFA, "QCT MSM7x25 FFA")
-       .atag_offset    = 0x100,
-       .map_io         = msm7x2x_map_io,
-       .init_irq       = msm7x2x_init_irq,
-       .init_machine   = msm7x2x_init,
-       .init_late      = msm7x2x_init_late,
-       .timer          = &msm_timer,
-MACHINE_END
index a500137..effa6f4 100644 (file)
@@ -38,8 +38,7 @@
 #include "devices.h"
 #include "gpiomux.h"
 #include "proc_comm.h"
-
-extern struct sys_timer msm_timer;
+#include "common.h"
 
 static void __init msm7x30_fixup(struct tag *tag, char **cmdline,
                struct meminfo *mi)
@@ -132,7 +131,7 @@ MACHINE_START(MSM7X30_SURF, "QCT MSM7X30 SURF")
        .init_irq = msm7x30_init_irq,
        .init_machine = msm7x30_init,
        .init_late = msm7x30_init_late,
-       .timer = &msm_timer,
+       .timer = &msm7x30_timer,
 MACHINE_END
 
 MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA")
@@ -143,7 +142,7 @@ MACHINE_START(MSM7X30_FFA, "QCT MSM7X30 FFA")
        .init_irq = msm7x30_init_irq,
        .init_machine = msm7x30_init,
        .init_late = msm7x30_init_late,
-       .timer = &msm_timer,
+       .timer = &msm7x30_timer,
 MACHINE_END
 
 MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID")
@@ -154,5 +153,5 @@ MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID")
        .init_irq = msm7x30_init_irq,
        .init_machine = msm7x30_init,
        .init_late = msm7x30_init_late,
-       .timer = &msm_timer,
+       .timer = &msm7x30_timer,
 MACHINE_END
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c
deleted file mode 100644 (file)
index 65f4a1d..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-/* Copyright (c) 2011, Code Aurora Forum. 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.
- *
- * 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/kernel.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/irq.h>
-#include <linux/clkdev.h>
-#include <linux/memblock.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/hardware/gic.h>
-#include <asm/setup.h>
-
-#include <mach/board.h>
-#include <mach/msm_iomap.h>
-
-#include "devices.h"
-
-static void __init msm8960_fixup(struct tag *tag, char **cmdline,
-               struct meminfo *mi)
-{
-       for (; tag->hdr.size; tag = tag_next(tag))
-               if (tag->hdr.tag == ATAG_MEM &&
-                               tag->u.mem.start == 0x40200000) {
-                       tag->u.mem.start = 0x40000000;
-                       tag->u.mem.size += SZ_2M;
-               }
-}
-
-static void __init msm8960_reserve(void)
-{
-       memblock_remove(0x40000000, SZ_2M);
-}
-
-static void __init msm8960_map_io(void)
-{
-       msm_map_msm8960_io();
-}
-
-static void __init msm8960_init_irq(void)
-{
-       unsigned int i;
-       gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE,
-                (void *)MSM_QGIC_CPU_BASE);
-
-       /* Edge trigger PPIs except AVS_SVICINT and AVS_SVICINTSWDONE */
-       writel(0xFFFFD7FF, MSM_QGIC_DIST_BASE + GIC_DIST_CONFIG + 4);
-
-       if (machine_is_msm8960_rumi3())
-               writel(0x0000FFFF, MSM_QGIC_DIST_BASE + GIC_DIST_ENABLE_SET);
-
-       /* FIXME: Not installing AVS_SVICINT and AVS_SVICINTSWDONE yet
-        * as they are configured as level, which does not play nice with
-        * handle_percpu_irq.
-        */
-       for (i = GIC_PPI_START; i < GIC_SPI_START; i++) {
-               if (i != AVS_SVICINT && i != AVS_SVICINTSWDONE)
-                       irq_set_handler(i, handle_percpu_irq);
-       }
-}
-
-static struct platform_device *sim_devices[] __initdata = {
-       &msm8960_device_uart_gsbi2,
-};
-
-static struct platform_device *rumi3_devices[] __initdata = {
-       &msm8960_device_uart_gsbi5,
-};
-
-static void __init msm8960_sim_init(void)
-{
-       platform_add_devices(sim_devices, ARRAY_SIZE(sim_devices));
-}
-
-static void __init msm8960_rumi3_init(void)
-{
-       platform_add_devices(rumi3_devices, ARRAY_SIZE(rumi3_devices));
-}
-
-static void __init msm8960_init_late(void)
-{
-       smd_debugfs_init();
-}
-
-MACHINE_START(MSM8960_SIM, "QCT MSM8960 SIMULATOR")
-       .fixup = msm8960_fixup,
-       .reserve = msm8960_reserve,
-       .map_io = msm8960_map_io,
-       .init_irq = msm8960_init_irq,
-       .timer = &msm_timer,
-       .handle_irq = gic_handle_irq,
-       .init_machine = msm8960_sim_init,
-       .init_late = msm8960_init_late,
-MACHINE_END
-
-MACHINE_START(MSM8960_RUMI3, "QCT MSM8960 RUMI3")
-       .fixup = msm8960_fixup,
-       .reserve = msm8960_reserve,
-       .map_io = msm8960_map_io,
-       .init_irq = msm8960_init_irq,
-       .timer = &msm_timer,
-       .handle_irq = gic_handle_irq,
-       .init_machine = msm8960_rumi3_init,
-       .init_late = msm8960_init_late,
-MACHINE_END
-
diff --git a/arch/arm/mach-msm/board-msm8x60.c b/arch/arm/mach-msm/board-msm8x60.c
deleted file mode 100644 (file)
index e37a724..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/* Copyright (c) 2010, 2011, Code Aurora Forum. 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/kernel.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/irq.h>
-#include <linux/irqdomain.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
-#include <linux/of_irq.h>
-#include <linux/of_platform.h>
-#include <linux/memblock.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/hardware/gic.h>
-#include <asm/setup.h>
-
-#include <mach/board.h>
-#include <mach/msm_iomap.h>
-
-static void __init msm8x60_fixup(struct tag *tag, char **cmdline,
-               struct meminfo *mi)
-{
-       for (; tag->hdr.size; tag = tag_next(tag))
-               if (tag->hdr.tag == ATAG_MEM &&
-                               tag->u.mem.start == 0x40200000) {
-                       tag->u.mem.start = 0x40000000;
-                       tag->u.mem.size += SZ_2M;
-               }
-}
-
-static void __init msm8x60_reserve(void)
-{
-       memblock_remove(0x40000000, SZ_2M);
-}
-
-static void __init msm8x60_map_io(void)
-{
-       msm_map_msm8x60_io();
-}
-
-#ifdef CONFIG_OF
-static struct of_device_id msm_dt_gic_match[] __initdata = {
-       { .compatible = "qcom,msm-8660-qgic", .data = gic_of_init },
-       {}
-};
-#endif
-
-static void __init msm8x60_init_irq(void)
-{
-       if (!of_have_populated_dt())
-               gic_init(0, GIC_PPI_START, MSM_QGIC_DIST_BASE,
-                        (void *)MSM_QGIC_CPU_BASE);
-#ifdef CONFIG_OF
-       else
-               of_irq_init(msm_dt_gic_match);
-#endif
-
-       /* Edge trigger PPIs except AVS_SVICINT and AVS_SVICINTSWDONE */
-       writel(0xFFFFD7FF, MSM_QGIC_DIST_BASE + GIC_DIST_CONFIG + 4);
-
-       /* RUMI does not adhere to GIC spec by enabling STIs by default.
-        * Enable/clear is supposed to be RO for STIs, but is RW on RUMI.
-        */
-       if (!machine_is_msm8x60_sim())
-               writel(0x0000FFFF, MSM_QGIC_DIST_BASE + GIC_DIST_ENABLE_SET);
-}
-
-static void __init msm8x60_init(void)
-{
-}
-
-static void __init msm8x60_init_late(void)
-{
-       smd_debugfs_init();
-}
-
-#ifdef CONFIG_OF
-static struct of_dev_auxdata msm_auxdata_lookup[] __initdata = {
-       {}
-};
-
-static void __init msm8x60_dt_init(void)
-{
-       if (of_machine_is_compatible("qcom,msm8660-surf")) {
-               printk(KERN_INFO "Init surf UART registers\n");
-               msm8x60_init_uart12dm();
-       }
-
-       of_platform_populate(NULL, of_default_bus_match_table,
-                       msm_auxdata_lookup, NULL);
-}
-
-static const char *msm8x60_fluid_match[] __initdata = {
-       "qcom,msm8660-fluid",
-       "qcom,msm8660-surf",
-       NULL
-};
-#endif /* CONFIG_OF */
-
-MACHINE_START(MSM8X60_RUMI3, "QCT MSM8X60 RUMI3")
-       .fixup = msm8x60_fixup,
-       .reserve = msm8x60_reserve,
-       .map_io = msm8x60_map_io,
-       .init_irq = msm8x60_init_irq,
-       .handle_irq = gic_handle_irq,
-       .init_machine = msm8x60_init,
-       .init_late = msm8x60_init_late,
-       .timer = &msm_timer,
-MACHINE_END
-
-MACHINE_START(MSM8X60_SURF, "QCT MSM8X60 SURF")
-       .fixup = msm8x60_fixup,
-       .reserve = msm8x60_reserve,
-       .map_io = msm8x60_map_io,
-       .init_irq = msm8x60_init_irq,
-       .handle_irq = gic_handle_irq,
-       .init_machine = msm8x60_init,
-       .init_late = msm8x60_init_late,
-       .timer = &msm_timer,
-MACHINE_END
-
-MACHINE_START(MSM8X60_SIM, "QCT MSM8X60 SIMULATOR")
-       .fixup = msm8x60_fixup,
-       .reserve = msm8x60_reserve,
-       .map_io = msm8x60_map_io,
-       .init_irq = msm8x60_init_irq,
-       .handle_irq = gic_handle_irq,
-       .init_machine = msm8x60_init,
-       .init_late = msm8x60_init_late,
-       .timer = &msm_timer,
-MACHINE_END
-
-MACHINE_START(MSM8X60_FFA, "QCT MSM8X60 FFA")
-       .fixup = msm8x60_fixup,
-       .reserve = msm8x60_reserve,
-       .map_io = msm8x60_map_io,
-       .init_irq = msm8x60_init_irq,
-       .handle_irq = gic_handle_irq,
-       .init_machine = msm8x60_init,
-       .init_late = msm8x60_init_late,
-       .timer = &msm_timer,
-MACHINE_END
-
-#ifdef CONFIG_OF
-/* TODO: General device tree support for all MSM. */
-DT_MACHINE_START(MSM_DT, "Qualcomm MSM (Flattened Device Tree)")
-       .map_io = msm8x60_map_io,
-       .init_irq = msm8x60_init_irq,
-       .init_machine = msm8x60_dt_init,
-       .init_late = msm8x60_init_late,
-       .timer = &msm_timer,
-       .dt_compat = msm8x60_fluid_match,
-MACHINE_END
-#endif /* CONFIG_OF */
index c8fe0ed..b16b71a 100644 (file)
@@ -35,8 +35,7 @@
 #include <mach/mmc.h>
 
 #include "devices.h"
-
-extern struct sys_timer msm_timer;
+#include "common.h"
 
 static const resource_size_t qsd8x50_surf_smc91x_base __initdata = 0x70000300;
 static const unsigned        qsd8x50_surf_smc91x_gpio __initdata = 156;
@@ -201,7 +200,7 @@ MACHINE_START(QSD8X50_SURF, "QCT QSD8X50 SURF")
        .init_irq = qsd8x50_init_irq,
        .init_machine = qsd8x50_init,
        .init_late = qsd8x50_init_late,
-       .timer = &msm_timer,
+       .timer = &qsd8x50_timer,
 MACHINE_END
 
 MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5")
@@ -210,5 +209,5 @@ MACHINE_START(QSD8X50A_ST1_5, "QCT QSD8X50A ST1.5")
        .init_irq = qsd8x50_init_irq,
        .init_machine = qsd8x50_init,
        .init_late = qsd8x50_init_late,
-       .timer = &msm_timer,
+       .timer = &qsd8x50_timer,
 MACHINE_END
index 2e569ab..b7b0fc7 100644 (file)
@@ -27,7 +27,6 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/flash.h>
-#include <mach/system.h>
 #include <mach/vreg.h>
 #include <mach/board.h>
 
index bbe13f1..4ba0800 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "devices.h"
 #include "board-trout.h"
+#include "common.h"
 
 extern int trout_init_mmc(unsigned int);
 
@@ -42,8 +43,6 @@ static struct platform_device *devices[] __initdata = {
        &msm_device_i2c,
 };
 
-extern struct sys_timer msm_timer;
-
 static void __init trout_init_early(void)
 {
        arch_ioremap_caller = __msm_ioremap_caller;
@@ -111,5 +110,5 @@ MACHINE_START(TROUT, "HTC Dream")
        .init_irq       = trout_init_irq,
        .init_machine   = trout_init,
        .init_late      = trout_init_late,
-       .timer          = &msm_timer,
+       .timer          = &msm7x01_timer,
 MACHINE_END
index 63b7113..a52c970 100644 (file)
@@ -25,7 +25,7 @@
 /*
  * glue for the proc_comm interface
  */
-int pc_clk_enable(unsigned id)
+static int pc_clk_enable(unsigned id)
 {
        int rc = msm_proc_comm(PCOM_CLKCTL_RPC_ENABLE, &id, NULL);
        if (rc < 0)
@@ -34,7 +34,7 @@ int pc_clk_enable(unsigned id)
                return (int)id < 0 ? -EINVAL : 0;
 }
 
-void pc_clk_disable(unsigned id)
+static void pc_clk_disable(unsigned id)
 {
        msm_proc_comm(PCOM_CLKCTL_RPC_DISABLE, &id, NULL);
 }
@@ -54,7 +54,7 @@ int pc_clk_reset(unsigned id, enum clk_reset_action action)
                return (int)id < 0 ? -EINVAL : 0;
 }
 
-int pc_clk_set_rate(unsigned id, unsigned rate)
+static int pc_clk_set_rate(unsigned id, unsigned rate)
 {
        /* The rate _might_ be rounded off to the nearest KHz value by the
         * remote function. So a return value of 0 doesn't necessarily mean
@@ -67,7 +67,7 @@ int pc_clk_set_rate(unsigned id, unsigned rate)
                return (int)id < 0 ? -EINVAL : 0;
 }
 
-int pc_clk_set_min_rate(unsigned id, unsigned rate)
+static int pc_clk_set_min_rate(unsigned id, unsigned rate)
 {
        int rc = msm_proc_comm(PCOM_CLKCTL_RPC_MIN_RATE, &id, &rate);
        if (rc < 0)
@@ -76,7 +76,7 @@ int pc_clk_set_min_rate(unsigned id, unsigned rate)
                return (int)id < 0 ? -EINVAL : 0;
 }
 
-int pc_clk_set_max_rate(unsigned id, unsigned rate)
+static int pc_clk_set_max_rate(unsigned id, unsigned rate)
 {
        int rc = msm_proc_comm(PCOM_CLKCTL_RPC_MAX_RATE, &id, &rate);
        if (rc < 0)
@@ -85,7 +85,7 @@ int pc_clk_set_max_rate(unsigned id, unsigned rate)
                return (int)id < 0 ? -EINVAL : 0;
 }
 
-int pc_clk_set_flags(unsigned id, unsigned flags)
+static int pc_clk_set_flags(unsigned id, unsigned flags)
 {
        int rc = msm_proc_comm(PCOM_CLKCTL_RPC_SET_FLAGS, &id, &flags);
        if (rc < 0)
@@ -94,7 +94,7 @@ int pc_clk_set_flags(unsigned id, unsigned flags)
                return (int)id < 0 ? -EINVAL : 0;
 }
 
-unsigned pc_clk_get_rate(unsigned id)
+static unsigned pc_clk_get_rate(unsigned id)
 {
        if (msm_proc_comm(PCOM_CLKCTL_RPC_RATE, &id, NULL))
                return 0;
@@ -102,7 +102,7 @@ unsigned pc_clk_get_rate(unsigned id)
                return id;
 }
 
-unsigned pc_clk_is_enabled(unsigned id)
+static unsigned pc_clk_is_enabled(unsigned id)
 {
        if (msm_proc_comm(PCOM_CLKCTL_RPC_ENABLED, &id, NULL))
                return 0;
@@ -110,7 +110,7 @@ unsigned pc_clk_is_enabled(unsigned id)
                return id;
 }
 
-long pc_clk_round_rate(unsigned id, unsigned rate)
+static long pc_clk_round_rate(unsigned id, unsigned rate)
 {
 
        /* Not really supported; pc_clk_set_rate() does rounding on it's own. */
diff --git a/arch/arm/mach-msm/common.h b/arch/arm/mach-msm/common.h
new file mode 100644 (file)
index 0000000..d68e5d7
--- /dev/null
@@ -0,0 +1,30 @@
+/* Copyright (c) 2012, 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.
+ */
+#ifndef __MACH_COMMON_H
+#define __MACH_COMMON_H
+
+extern struct sys_timer msm7x01_timer;
+extern struct sys_timer msm7x30_timer;
+extern struct sys_timer msm_dt_timer;
+extern struct sys_timer qsd8x50_timer;
+
+extern void msm_map_common_io(void);
+extern void msm_map_msm7x30_io(void);
+extern void msm_map_msm8x60_io(void);
+extern void msm_map_msm8960_io(void);
+extern void msm_map_qsd8x50_io(void);
+
+extern void __iomem *__msm_ioremap_caller(unsigned long phys_addr, size_t size,
+                                         unsigned int mtype, void *caller);
+
+
+#endif
diff --git a/arch/arm/mach-msm/devices-msm8960.c b/arch/arm/mach-msm/devices-msm8960.c
deleted file mode 100644 (file)
index d9e1f26..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/* Copyright (c) 2011, Code Aurora Forum. 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.
- *
- * 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/kernel.h>
-#include <linux/platform_device.h>
-
-#include <linux/dma-mapping.h>
-#include <mach/irqs-8960.h>
-#include <mach/board.h>
-
-#include "devices.h"
-
-#define MSM_GSBI2_PHYS         0x16100000
-#define MSM_UART2DM_PHYS       (MSM_GSBI2_PHYS + 0x40000)
-
-#define MSM_GSBI5_PHYS         0x16400000
-#define MSM_UART5DM_PHYS       (MSM_GSBI5_PHYS + 0x40000)
-
-static struct resource resources_uart_gsbi2[] = {
-       {
-               .start  = GSBI2_UARTDM_IRQ,
-               .end    = GSBI2_UARTDM_IRQ,
-               .flags  = IORESOURCE_IRQ,
-       },
-       {
-               .start  = MSM_UART2DM_PHYS,
-               .end    = MSM_UART2DM_PHYS + PAGE_SIZE - 1,
-               .name   = "uart_resource",
-               .flags  = IORESOURCE_MEM,
-       },
-       {
-               .start  = MSM_GSBI2_PHYS,
-               .end    = MSM_GSBI2_PHYS + PAGE_SIZE - 1,
-               .name   = "gsbi_resource",
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-struct platform_device msm8960_device_uart_gsbi2 = {
-       .name   = "msm_serial",
-       .id     = 0,
-       .num_resources  = ARRAY_SIZE(resources_uart_gsbi2),
-       .resource       = resources_uart_gsbi2,
-};
-
-static struct resource resources_uart_gsbi5[] = {
-       {
-               .start  = GSBI5_UARTDM_IRQ,
-               .end    = GSBI5_UARTDM_IRQ,
-               .flags  = IORESOURCE_IRQ,
-       },
-       {
-               .start  = MSM_UART5DM_PHYS,
-               .end    = MSM_UART5DM_PHYS + PAGE_SIZE - 1,
-               .name   = "uart_resource",
-               .flags  = IORESOURCE_MEM,
-       },
-       {
-               .start  = MSM_GSBI5_PHYS,
-               .end    = MSM_GSBI5_PHYS + PAGE_SIZE - 1,
-               .name   = "gsbi_resource",
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-struct platform_device msm8960_device_uart_gsbi5 = {
-       .name   = "msm_serial",
-       .id     = 0,
-       .num_resources  = ARRAY_SIZE(resources_uart_gsbi5),
-       .resource       = resources_uart_gsbi5,
-};
index 02cae5e..354b91d 100644 (file)
@@ -223,8 +223,7 @@ static irqreturn_t msm_datamover_irq_handler(int irq, void *dev_id)
                        PRINT_FLOW("msm_datamover_irq_handler id %d, status %x\n", id, ch_status);
                        if ((ch_status & DMOV_STATUS_CMD_PTR_RDY) && !list_empty(&ready_commands[id])) {
                                cmd = list_entry(ready_commands[id].next, typeof(*cmd), list);
-                               list_del(&cmd->list);
-                               list_add_tail(&cmd->list, &active_commands[id]);
+                               list_move_tail(&cmd->list, &active_commands[id]);
                                if (cmd->execute_func)
                                        cmd->execute_func(cmd);
                                PRINT_FLOW("msm_datamover_irq_handler id %d, start command\n", id);
diff --git a/arch/arm/mach-msm/idle.c b/arch/arm/mach-msm/idle.c
deleted file mode 100644 (file)
index 0c9e13c..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/* arch/arm/mach-msm/idle.c
- *
- * Idle processing for MSM7K - work around bugs with SWFI.
- *
- * Copyright (c) 2007 QUALCOMM Incorporated.
- * Copyright (C) 2007 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/init.h>
-#include <asm/system.h>
-
-static void msm_idle(void)
-{
-#ifdef CONFIG_MSM7X00A_IDLE
-       asm volatile (
-
-       "mrc     p15, 0, r1, c1, c0, 0    /* read current CR    */ \n\t"
-       "bic     r0, r1, #(1 << 2)        /* clear dcache bit   */ \n\t"
-       "bic     r0, r0, #(1 << 12)       /* clear icache bit   */ \n\t"
-       "mcr     p15, 0, r0, c1, c0, 0    /* disable d/i cache  */ \n\t"
-
-       "mov     r0, #0                   /* prepare wfi value  */ \n\t"
-       "mcr     p15, 0, r0, c7, c10, 0   /* flush the cache    */ \n\t"
-       "mcr     p15, 0, r0, c7, c10, 4   /* memory barrier     */ \n\t"
-       "mcr     p15, 0, r0, c7, c0, 4    /* wait for interrupt */ \n\t"
-
-       "mcr     p15, 0, r1, c1, c0, 0    /* restore d/i cache  */ \n\t"
-
-       : : : "r0","r1" );
-#endif
-}
-
-static int __init msm_idle_init(void)
-{
-       arm_pm_idle = msm_idle;
-       return 0;
-}
-
-arch_initcall(msm_idle_init);
index 435f8ed..0a0c393 100644 (file)
 
 /* platform device data structures */
 
-struct msm_acpu_clock_platform_data
-{
-       uint32_t acpu_switch_time_us;
-       uint32_t max_speed_delta_khz;
-       uint32_t vdd_switch_time_us;
-       unsigned long power_collapse_khz;
-       unsigned long wait_for_irq_khz;
-};
-
 struct clk_lookup;
 
-extern struct sys_timer msm_timer;
-
 /* common init routines for use by arch/arm/mach-msm/board-*.c */
 
 void __init msm_add_devices(void);
-void __init msm_map_common_io(void);
 void __init msm_init_irq(void);
 void __init msm_init_gpio(void);
 void __init msm_clock_init(struct clk_lookup *clock_tbl, unsigned num_clocks);
-void __init msm_acpu_clock_init(struct msm_acpu_clock_platform_data *);
 int __init msm_add_sdcc(unsigned int controller,
                        struct msm_mmc_platform_data *plat,
                        unsigned int stat_irq, unsigned long stat_irq_flags);
index 6c4046c..67dc0e9 100644 (file)
 #define MSM_AD5_PHYS          0xAC000000
 #define MSM_AD5_SIZE          (SZ_1M*13)
 
-#ifndef __ASSEMBLY__
-
-extern void __iomem *__msm_ioremap_caller(unsigned long phys_addr, size_t size,
-                                         unsigned int mtype, void *caller);
-
-#endif
-
 #endif
index f944fe6..198202c 100644 (file)
 #define MSM_HSUSB_PHYS        0xA3600000
 #define MSM_HSUSB_SIZE        SZ_1K
 
-#ifndef __ASSEMBLY__
-extern void msm_map_msm7x30_io(void);
-#endif
-
 #endif
index a1752c0..9819a55 100644 (file)
 #define MSM8960_TMR0_SIZE      SZ_4K
 
 #ifdef CONFIG_DEBUG_MSM8960_UART
-#define MSM_DEBUG_UART_BASE    0xE1040000
+#define MSM_DEBUG_UART_BASE    0xF0040000
 #define MSM_DEBUG_UART_PHYS    0x16440000
 #endif
 
-#ifndef __ASSEMBLY__
-extern void msm_map_msm8960_io(void);
-#endif
-
 #endif
index da77cc1..0faa894 100644 (file)
 #define MSM_SDC4_PHYS          0xA0600000
 #define MSM_SDC4_SIZE          SZ_4K
 
-#ifndef __ASSEMBLY__
-extern void msm_map_qsd8x50_io(void);
-#endif
-
 #endif
index 5aed57d..c6d38f1 100644 (file)
 #define MSM8X60_TMR0_SIZE      SZ_4K
 
 #ifdef CONFIG_DEBUG_MSM8660_UART
-#define MSM_DEBUG_UART_BASE    0xE1040000
+#define MSM_DEBUG_UART_BASE    0xF0040000
 #define MSM_DEBUG_UART_PHYS    0x19C40000
 #endif
 
-#ifndef __ASSEMBLY__
-extern void msm_map_msm8x60_io(void);
-#endif
-
 #endif
diff --git a/arch/arm/mach-msm/include/mach/system.h b/arch/arm/mach-msm/include/mach/system.h
deleted file mode 100644 (file)
index f5fb2ec..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/* arch/arm/mach-msm/include/mach/system.h
- *
- * Copyright (C) 2007 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.
- *
- */
-
-/* low level hardware reset hook -- for example, hitting the
- * PSHOLD line on the PMIC to hard reset the system
- */
-extern void (*msm_hw_reset_hook)(void);
index a1e7b11..3854f6f 100644 (file)
 
 #include <mach/board.h>
 
-#define MSM_CHIP_DEVICE(name, chip) {                        \
+#include "common.h"
+
+#define MSM_CHIP_DEVICE_TYPE(name, chip, mem_type) {                         \
                .virtual = (unsigned long) MSM_##name##_BASE, \
                .pfn = __phys_to_pfn(chip##_##name##_PHYS), \
                .length = chip##_##name##_SIZE, \
-               .type = MT_DEVICE_NONSHARED, \
+               .type = mem_type, \
         }
 
+#define MSM_DEVICE_TYPE(name, mem_type) \
+               MSM_CHIP_DEVICE_TYPE(name, MSM, mem_type)
+#define MSM_CHIP_DEVICE(name, chip) \
+               MSM_CHIP_DEVICE_TYPE(name, chip, MT_DEVICE)
 #define MSM_DEVICE(name) MSM_CHIP_DEVICE(name, MSM)
 
-#if defined(CONFIG_ARCH_MSM7X00A) || defined(CONFIG_ARCH_MSM7X27) \
-       || defined(CONFIG_ARCH_MSM7X25)
+#if defined(CONFIG_ARCH_MSM7X00A)
 static struct map_desc msm_io_desc[] __initdata = {
-       MSM_DEVICE(VIC),
-       MSM_CHIP_DEVICE(CSR, MSM7X00),
-       MSM_DEVICE(DMOV),
-       MSM_CHIP_DEVICE(GPIO1, MSM7X00),
-       MSM_CHIP_DEVICE(GPIO2, MSM7X00),
-       MSM_DEVICE(CLK_CTL),
+       MSM_DEVICE_TYPE(VIC, MT_DEVICE_NONSHARED),
+       MSM_CHIP_DEVICE_TYPE(CSR, MSM7X00, MT_DEVICE_NONSHARED),
+       MSM_DEVICE_TYPE(DMOV, MT_DEVICE_NONSHARED),
+       MSM_CHIP_DEVICE_TYPE(GPIO1, MSM7X00, MT_DEVICE_NONSHARED),
+       MSM_CHIP_DEVICE_TYPE(GPIO2, MSM7X00, MT_DEVICE_NONSHARED),
+       MSM_DEVICE_TYPE(CLK_CTL, MT_DEVICE_NONSHARED),
 #if defined(CONFIG_DEBUG_MSM_UART1) || defined(CONFIG_DEBUG_MSM_UART2) || \
        defined(CONFIG_DEBUG_MSM_UART3)
-       MSM_DEVICE(DEBUG_UART),
-#endif
-#ifdef CONFIG_ARCH_MSM7X30
-       MSM_DEVICE(GCC),
+       MSM_DEVICE_TYPE(DEBUG_UART, MT_DEVICE_NONSHARED),
 #endif
        {
                .virtual =  (unsigned long) MSM_SHARED_RAM_BASE,
index e012dc8..2d791e6 100644 (file)
 #include <asm/mach-types.h>
 #include <asm/smp_plat.h>
 
-#include <mach/msm_iomap.h>
-
 #include "scm-boot.h"
 
 #define VDD_SC1_ARRAY_CLAMP_GFS_CTL 0x15A0
 #define SCSS_CPU1CORE_RESET 0xD80
 #define SCSS_DBG_STATUS_CORE_PWRDUP 0xE64
 
-/* Mask for edge trigger PPIs except AVS_SVICINT and AVS_SVICINTSWDONE */
-#define GIC_PPI_EDGE_MASK 0xFFFFD7FF
-
 extern void msm_secondary_startup(void);
 /*
  * control for which core is the next to come out of the secondary
@@ -50,9 +45,6 @@ static inline int get_core_count(void)
 
 void __cpuinit platform_secondary_init(unsigned int cpu)
 {
-       /* Configure edge-triggered PPIs */
-       writel(GIC_PPI_EDGE_MASK, MSM_QGIC_DIST_BASE + GIC_DIST_CONFIG + 4);
-
        /*
         * if any interrupts are already enabled for the primary
         * core (e.g. timer irq), then they will not have been enabled
index 9980dc7..8f1eecd 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/io.h>
 #include <linux/spinlock.h>
 #include <mach/msm_iomap.h>
-#include <mach/system.h>
 
 #include "proc_comm.h"
 
index 657be73..84183ed 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/delay.h>
 
 #include <mach/msm_smd.h>
-#include <mach/system.h>
 
 #include "smd_private.h"
 #include "proc_comm.h"
@@ -39,8 +38,6 @@
 #define CONFIG_QDSP6 1
 #endif
 
-void (*msm_hw_reset_hook)(void);
-
 #define MODULE_NAME "msm_smd"
 
 enum {
@@ -101,10 +98,6 @@ static void handle_modem_crash(void)
        pr_err("ARM9 has CRASHED\n");
        smd_diag();
 
-       /* hard reboot if possible */
-       if (msm_hw_reset_hook)
-               msm_hw_reset_hook();
-
        /* in this case the modem or watchdog should reboot us */
        for (;;)
                ;
index 8128082..476549a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *
  * Copyright (C) 2007 Google, Inc.
- * Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
+ * Copyright (c) 2009-2012, The Linux Foundation. All rights reserved.
  *
  * This software is licensed under the terms of the GNU General Public
  * License version 2, as published by the Free Software Foundation, and
 #include <linux/interrupt.h>
 #include <linux/irq.h>
 #include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
 
 #include <asm/mach/time.h>
 #include <asm/hardware/gic.h>
 #include <asm/localtimer.h>
 #include <asm/sched_clock.h>
 
-#include <mach/msm_iomap.h>
-#include <mach/cpu.h>
-#include <mach/board.h>
+#include "common.h"
 
 #define TIMER_MATCH_VAL         0x0000
 #define TIMER_COUNT_VAL         0x0004
@@ -36,7 +37,6 @@
 #define TIMER_ENABLE_CLR_ON_MATCH_EN    BIT(1)
 #define TIMER_ENABLE_EN                 BIT(0)
 #define TIMER_CLEAR             0x000C
-#define DGT_CLK_CTL             0x0034
 #define DGT_CLK_CTL_DIV_4      0x3
 
 #define GPT_HZ 32768
@@ -101,7 +101,7 @@ static struct clock_event_device msm_clockevent = {
 
 static union {
        struct clock_event_device *evt;
-       struct clock_event_device __percpu **percpu_evt;
+       struct clock_event_device * __percpu *percpu_evt;
 } msm_evt;
 
 static void __iomem *source_base;
@@ -151,7 +151,7 @@ static int __cpuinit msm_local_timer_setup(struct clock_event_device *evt)
 
        *__this_cpu_ptr(msm_evt.percpu_evt) = evt;
        clockevents_register_device(evt);
-       enable_percpu_irq(evt->irq, 0);
+       enable_percpu_irq(evt->irq, IRQ_TYPE_EDGE_RISING);
        return 0;
 }
 
@@ -172,44 +172,21 @@ static notrace u32 msm_sched_clock_read(void)
        return msm_clocksource.read(&msm_clocksource);
 }
 
-static void __init msm_timer_init(void)
+static void __init msm_timer_init(u32 dgt_hz, int sched_bits, int irq,
+                                 bool percpu)
 {
        struct clock_event_device *ce = &msm_clockevent;
        struct clocksource *cs = &msm_clocksource;
        int res;
-       u32 dgt_hz;
-
-       if (cpu_is_msm7x01()) {
-               event_base = MSM_CSR_BASE;
-               source_base = MSM_CSR_BASE + 0x10;
-               dgt_hz = 19200000 >> MSM_DGT_SHIFT; /* 600 KHz */
-               cs->read = msm_read_timer_count_shift;
-               cs->mask = CLOCKSOURCE_MASK((32 - MSM_DGT_SHIFT));
-       } else if (cpu_is_msm7x30()) {
-               event_base = MSM_CSR_BASE + 0x04;
-               source_base = MSM_CSR_BASE + 0x24;
-               dgt_hz = 24576000 / 4;
-       } else if (cpu_is_qsd8x50()) {
-               event_base = MSM_CSR_BASE;
-               source_base = MSM_CSR_BASE + 0x10;
-               dgt_hz = 19200000 / 4;
-       } else if (cpu_is_msm8x60() || cpu_is_msm8960()) {
-               event_base = MSM_TMR_BASE + 0x04;
-               /* Use CPU0's timer as the global clock source. */
-               source_base = MSM_TMR0_BASE + 0x24;
-               dgt_hz = 27000000 / 4;
-               writel_relaxed(DGT_CLK_CTL_DIV_4, MSM_TMR_BASE + DGT_CLK_CTL);
-       } else
-               BUG();
 
        writel_relaxed(0, event_base + TIMER_ENABLE);
        writel_relaxed(0, event_base + TIMER_CLEAR);
        writel_relaxed(~0, event_base + TIMER_MATCH_VAL);
        ce->cpumask = cpumask_of(0);
+       ce->irq = irq;
 
-       ce->irq = INT_GP_TIMER_EXP;
        clockevents_config_and_register(ce, GPT_HZ, 4, 0xffffffff);
-       if (cpu_is_msm8x60() || cpu_is_msm8960()) {
+       if (percpu) {
                msm_evt.percpu_evt = alloc_percpu(struct clock_event_device *);
                if (!msm_evt.percpu_evt) {
                        pr_err("memory allocation failed for %s\n", ce->name);
@@ -219,7 +196,7 @@ static void __init msm_timer_init(void)
                res = request_percpu_irq(ce->irq, msm_timer_interrupt,
                                         ce->name, msm_evt.percpu_evt);
                if (!res) {
-                       enable_percpu_irq(ce->irq, 0);
+                       enable_percpu_irq(ce->irq, IRQ_TYPE_EDGE_RISING);
 #ifdef CONFIG_LOCAL_TIMERS
                        local_timer_register(&msm_local_timer_ops);
 #endif
@@ -238,10 +215,143 @@ err:
        res = clocksource_register_hz(cs, dgt_hz);
        if (res)
                pr_err("clocksource_register failed\n");
-       setup_sched_clock(msm_sched_clock_read,
-                       cpu_is_msm7x01() ? 32 - MSM_DGT_SHIFT : 32, dgt_hz);
+       setup_sched_clock(msm_sched_clock_read, sched_bits, dgt_hz);
 }
 
-struct sys_timer msm_timer = {
-       .init = msm_timer_init
+#ifdef CONFIG_OF
+static const struct of_device_id msm_dgt_match[] __initconst = {
+       { .compatible = "qcom,msm-dgt" },
+       { },
+};
+
+static const struct of_device_id msm_gpt_match[] __initconst = {
+       { .compatible = "qcom,msm-gpt" },
+       { },
+};
+
+static void __init msm_dt_timer_init(void)
+{
+       struct device_node *np;
+       u32 freq;
+       int irq;
+       struct resource res;
+       u32 percpu_offset;
+       void __iomem *dgt_clk_ctl;
+
+       np = of_find_matching_node(NULL, msm_gpt_match);
+       if (!np) {
+               pr_err("Can't find GPT DT node\n");
+               return;
+       }
+
+       event_base = of_iomap(np, 0);
+       if (!event_base) {
+               pr_err("Failed to map event base\n");
+               return;
+       }
+
+       irq = irq_of_parse_and_map(np, 0);
+       if (irq <= 0) {
+               pr_err("Can't get irq\n");
+               return;
+       }
+       of_node_put(np);
+
+       np = of_find_matching_node(NULL, msm_dgt_match);
+       if (!np) {
+               pr_err("Can't find DGT DT node\n");
+               return;
+       }
+
+       if (of_property_read_u32(np, "cpu-offset", &percpu_offset))
+               percpu_offset = 0;
+
+       if (of_address_to_resource(np, 0, &res)) {
+               pr_err("Failed to parse DGT resource\n");
+               return;
+       }
+
+       source_base = ioremap(res.start + percpu_offset, resource_size(&res));
+       if (!source_base) {
+               pr_err("Failed to map source base\n");
+               return;
+       }
+
+       if (!of_address_to_resource(np, 1, &res)) {
+               dgt_clk_ctl = ioremap(res.start + percpu_offset,
+                                     resource_size(&res));
+               if (!dgt_clk_ctl) {
+                       pr_err("Failed to map DGT control base\n");
+                       return;
+               }
+               writel_relaxed(DGT_CLK_CTL_DIV_4, dgt_clk_ctl);
+               iounmap(dgt_clk_ctl);
+       }
+
+       if (of_property_read_u32(np, "clock-frequency", &freq)) {
+               pr_err("Unknown frequency\n");
+               return;
+       }
+       of_node_put(np);
+
+       msm_timer_init(freq, 32, irq, !!percpu_offset);
+}
+
+struct sys_timer msm_dt_timer = {
+       .init = msm_dt_timer_init
+};
+#endif
+
+static int __init msm_timer_map(phys_addr_t event, phys_addr_t source)
+{
+       event_base = ioremap(event, SZ_64);
+       if (!event_base) {
+               pr_err("Failed to map event base\n");
+               return 1;
+       }
+       source_base = ioremap(source, SZ_64);
+       if (!source_base) {
+               pr_err("Failed to map source base\n");
+               return 1;
+       }
+       return 0;
+}
+
+static void __init msm7x01_timer_init(void)
+{
+       struct clocksource *cs = &msm_clocksource;
+
+       if (msm_timer_map(0xc0100000, 0xc0100010))
+               return;
+       cs->read = msm_read_timer_count_shift;
+       cs->mask = CLOCKSOURCE_MASK((32 - MSM_DGT_SHIFT));
+       /* 600 KHz */
+       msm_timer_init(19200000 >> MSM_DGT_SHIFT, 32 - MSM_DGT_SHIFT, 7,
+                       false);
+}
+
+struct sys_timer msm7x01_timer = {
+       .init = msm7x01_timer_init
+};
+
+static void __init msm7x30_timer_init(void)
+{
+       if (msm_timer_map(0xc0100004, 0xc0100024))
+               return;
+       msm_timer_init(24576000 / 4, 32, 1, false);
+}
+
+struct sys_timer msm7x30_timer = {
+       .init = msm7x30_timer_init
+};
+
+static void __init qsd8x50_timer_init(void)
+{
+       if (msm_timer_map(0xAC100000, 0xAC100010))
+               return;
+       msm_timer_init(19200000 / 4, 32, 7, false);
+}
+
+struct sys_timer qsd8x50_timer = {
+       .init = qsd8x50_timer_init
 };
index a9bc841..137e479 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/mbus.h>
 #include <linux/io.h>
 #include <plat/addr-map.h>
+#include <mach/mv78xx0.h>
 #include "common.h"
 
 /*
@@ -81,7 +82,7 @@ void __init mv78xx0_setup_pcie_io_win(int window, u32 base, u32 size,
                                      int maj, int min)
 {
        orion_setup_cpu_win(&addr_map_cfg, window, base, size,
-                           TARGET_PCIE(maj), ATTR_PCIE_IO(min), -1);
+                           TARGET_PCIE(maj), ATTR_PCIE_IO(min), 0);
 }
 
 void __init mv78xx0_setup_pcie_mem_win(int window, u32 base, u32 size,
index 3057f7d..6b0c387 100644 (file)
@@ -135,11 +135,6 @@ static struct map_desc mv78xx0_io_desc[] __initdata = {
                .length         = MV78XX0_CORE_REGS_SIZE,
                .type           = MT_DEVICE,
        }, {
-               .virtual        = MV78XX0_PCIE_IO_VIRT_BASE(0),
-               .pfn            = __phys_to_pfn(MV78XX0_PCIE_IO_PHYS_BASE(0)),
-               .length         = MV78XX0_PCIE_IO_SIZE * 8,
-               .type           = MT_DEVICE,
-       }, {
                .virtual        = MV78XX0_REGS_VIRT_BASE,
                .pfn            = __phys_to_pfn(MV78XX0_REGS_PHYS_BASE),
                .length         = MV78XX0_REGS_SIZE,
diff --git a/arch/arm/mach-mv78xx0/include/mach/io.h b/arch/arm/mach-mv78xx0/include/mach/io.h
deleted file mode 100644 (file)
index c7d9d00..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * arch/arm/mach-mv78xx0/include/mach/io.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 __ASM_ARCH_IO_H
-#define __ASM_ARCH_IO_H
-
-#include "mv78xx0.h"
-
-#define IO_SPACE_LIMIT         0xffffffff
-
-static inline void __iomem *__io(unsigned long addr)
-{
-       return (void __iomem *)((addr - MV78XX0_PCIE_IO_PHYS_BASE(0))
-                                       + MV78XX0_PCIE_IO_VIRT_BASE(0));
-}
-
-#define __io(a)                        __io(a)
-
-#endif
index e807c4c..bd03fed 100644 (file)
  *
  * virt                phys            size
  * fe400000    f102x000        16K     core-specific peripheral registers
- * fe700000    f0800000        1M      PCIe #0 I/O space
- * fe800000    f0900000        1M      PCIe #1 I/O space
- * fe900000    f0a00000        1M      PCIe #2 I/O space
- * fea00000    f0b00000        1M      PCIe #3 I/O space
- * feb00000    f0c00000        1M      PCIe #4 I/O space
- * fec00000    f0d00000        1M      PCIe #5 I/O space
- * fed00000    f0e00000        1M      PCIe #6 I/O space
- * fee00000    f0f00000        1M      PCIe #7 I/O space
- * fef00000    f1000000        1M      on-chip peripheral registers
+ * fee00000    f0800000        64K     PCIe #0 I/O space
+ * fee10000    f0900000        64K     PCIe #1 I/O space
+ * fee20000    f0a00000        64K     PCIe #2 I/O space
+ * fee30000    f0b00000        64K     PCIe #3 I/O space
+ * fee40000    f0c00000        64K     PCIe #4 I/O space
+ * fee50000    f0d00000        64K     PCIe #5 I/O space
+ * fee60000    f0e00000        64K     PCIe #6 I/O space
+ * fee70000    f0f00000        64K     PCIe #7 I/O space
+ * fd000000    f1000000        1M      on-chip peripheral registers
  */
 #define MV78XX0_CORE0_REGS_PHYS_BASE   0xf1020000
 #define MV78XX0_CORE1_REGS_PHYS_BASE   0xf1024000
 #define MV78XX0_CORE_REGS_SIZE         SZ_16K
 
 #define MV78XX0_PCIE_IO_PHYS_BASE(i)   (0xf0800000 + ((i) << 20))
-#define MV78XX0_PCIE_IO_VIRT_BASE(i)   (0xfe700000 + ((i) << 20))
 #define MV78XX0_PCIE_IO_SIZE           SZ_1M
 
 #define MV78XX0_REGS_PHYS_BASE         0xf1000000
-#define MV78XX0_REGS_VIRT_BASE         0xfef00000
+#define MV78XX0_REGS_VIRT_BASE         0xfd000000
 #define MV78XX0_REGS_SIZE              SZ_1M
 
 #define MV78XX0_PCIE_MEM_PHYS_BASE     0xc0000000
index 2e56e86..26a059b 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/mach/pci.h>
 #include <plat/pcie.h>
 #include <plat/addr-map.h>
+#include <mach/mv78xx0.h>
 #include "common.h"
 
 struct pcie_port {
@@ -23,16 +24,13 @@ struct pcie_port {
        u8                      root_bus_nr;
        void __iomem            *base;
        spinlock_t              conf_lock;
-       char                    io_space_name[16];
        char                    mem_space_name[16];
-       struct resource         res[2];
+       struct resource         res;
 };
 
 static struct pcie_port pcie_port[8];
 static int num_pcie_ports;
 static struct resource pcie_io_space;
-static struct resource pcie_mem_space;
-
 
 void __init mv78xx0_pcie_id(u32 *dev, u32 *rev)
 {
@@ -40,102 +38,59 @@ void __init mv78xx0_pcie_id(u32 *dev, u32 *rev)
        *rev = orion_pcie_rev((void __iomem *)PCIE00_VIRT_BASE);
 }
 
+u32 pcie_port_size[8] = {
+       0,
+       0x30000000,
+       0x10000000,
+       0x10000000,
+       0x08000000,
+       0x08000000,
+       0x08000000,
+       0x04000000,
+};
+
 static void __init mv78xx0_pcie_preinit(void)
 {
        int i;
        u32 size_each;
        u32 start;
-       int win;
+       int win = 0;
 
        pcie_io_space.name = "PCIe I/O Space";
        pcie_io_space.start = MV78XX0_PCIE_IO_PHYS_BASE(0);
        pcie_io_space.end =
                MV78XX0_PCIE_IO_PHYS_BASE(0) + MV78XX0_PCIE_IO_SIZE * 8 - 1;
-       pcie_io_space.flags = IORESOURCE_IO;
+       pcie_io_space.flags = IORESOURCE_MEM;
        if (request_resource(&iomem_resource, &pcie_io_space))
                panic("can't allocate PCIe I/O space");
 
-       pcie_mem_space.name = "PCIe MEM Space";
-       pcie_mem_space.start = MV78XX0_PCIE_MEM_PHYS_BASE;
-       pcie_mem_space.end =
-               MV78XX0_PCIE_MEM_PHYS_BASE + MV78XX0_PCIE_MEM_SIZE - 1;
-       pcie_mem_space.flags = IORESOURCE_MEM;
-       if (request_resource(&iomem_resource, &pcie_mem_space))
-               panic("can't allocate PCIe MEM space");
+       if (num_pcie_ports > 7)
+               panic("invalid number of PCIe ports");
+
+       size_each = pcie_port_size[num_pcie_ports];
 
+       start = MV78XX0_PCIE_MEM_PHYS_BASE;
        for (i = 0; i < num_pcie_ports; i++) {
                struct pcie_port *pp = pcie_port + i;
 
-               snprintf(pp->io_space_name, sizeof(pp->io_space_name),
-                       "PCIe %d.%d I/O", pp->maj, pp->min);
-               pp->io_space_name[sizeof(pp->io_space_name) - 1] = 0;
-               pp->res[0].name = pp->io_space_name;
-               pp->res[0].start = MV78XX0_PCIE_IO_PHYS_BASE(i);
-               pp->res[0].end = pp->res[0].start + MV78XX0_PCIE_IO_SIZE - 1;
-               pp->res[0].flags = IORESOURCE_IO;
-
                snprintf(pp->mem_space_name, sizeof(pp->mem_space_name),
                        "PCIe %d.%d MEM", pp->maj, pp->min);
                pp->mem_space_name[sizeof(pp->mem_space_name) - 1] = 0;
-               pp->res[1].name = pp->mem_space_name;
-               pp->res[1].flags = IORESOURCE_MEM;
-       }
-
-       switch (num_pcie_ports) {
-       case 0:
-               size_each = 0;
-               break;
-
-       case 1:
-               size_each = 0x30000000;
-               break;
-
-       case 2 ... 3:
-               size_each = 0x10000000;
-               break;
-
-       case 4 ... 6:
-               size_each = 0x08000000;
-               break;
-
-       case 7:
-               size_each = 0x04000000;
-               break;
-
-       default:
-               panic("invalid number of PCIe ports");
-       }
-
-       start = MV78XX0_PCIE_MEM_PHYS_BASE;
-       for (i = 0; i < num_pcie_ports; i++) {
-               struct pcie_port *pp = pcie_port + i;
-
-               pp->res[1].start = start;
-               pp->res[1].end = start + size_each - 1;
+               pp->res.name = pp->mem_space_name;
+               pp->res.flags = IORESOURCE_MEM;
+               pp->res.start = start;
+               pp->res.end = start + size_each - 1;
                start += size_each;
-       }
-
-       for (i = 0; i < num_pcie_ports; i++) {
-               struct pcie_port *pp = pcie_port + i;
 
-               if (request_resource(&pcie_io_space, &pp->res[0]))
-                       panic("can't allocate PCIe I/O sub-space");
-
-               if (request_resource(&pcie_mem_space, &pp->res[1]))
+               if (request_resource(&iomem_resource, &pp->res))
                        panic("can't allocate PCIe MEM sub-space");
-       }
 
-       win = 0;
-       for (i = 0; i < num_pcie_ports; i++) {
-               struct pcie_port *pp = pcie_port + i;
+               mv78xx0_setup_pcie_mem_win(win + i + 8, pp->res.start,
+                                          resource_size(&pp->res),
+                                          pp->maj, pp->min);
 
-               mv78xx0_setup_pcie_io_win(win++, pp->res[0].start,
-                                         resource_size(&pp->res[0]),
+               mv78xx0_setup_pcie_io_win(win + i, i * SZ_64K, SZ_64K,
                                          pp->maj, pp->min);
-
-               mv78xx0_setup_pcie_mem_win(win++, pp->res[1].start,
-                                          resource_size(&pp->res[1]),
-                                          pp->maj, pp->min);
        }
 }
 
@@ -156,8 +111,9 @@ static int __init mv78xx0_pcie_setup(int nr, struct pci_sys_data *sys)
        orion_pcie_set_local_bus_nr(pp->base, sys->busnr);
        orion_pcie_setup(pp->base);
 
-       pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset);
-       pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset);
+       pci_ioremap_io(nr * SZ_64K, MV78XX0_PCIE_IO_PHYS_BASE(nr));
+
+       pci_add_resource_offset(&sys->resources, &pp->res, sys->mem_offset);
 
        return 1;
 }
@@ -281,7 +237,7 @@ static void __init add_pcie_port(int maj, int min, unsigned long base)
                pp->root_bus_nr = -1;
                pp->base = (void __iomem *)base;
                spin_lock_init(&pp->conf_lock);
-               memset(pp->res, 0, sizeof(pp->res));
+               memset(&pp->res, 0, sizeof(pp->res));
        } else {
                printk("link down, ignoring\n");
        }
index 9a8bbda..ecc4319 100644 (file)
@@ -1,7 +1,5 @@
 if ARCH_MXS
 
-source "arch/arm/mach-mxs/devices/Kconfig"
-
 config SOC_IMX23
        bool
        select ARM_AMBA
@@ -27,91 +25,4 @@ config MACH_MXS_DT
          Include support for Freescale MXS platforms(i.MX23 and i.MX28)
          using the device tree for discovery
 
-config MACH_STMP378X_DEVB
-       bool "Support STMP378x_devb Platform"
-       select SOC_IMX23
-       select MXS_HAVE_AMBA_DUART
-       select MXS_HAVE_PLATFORM_AUART
-       select MXS_HAVE_PLATFORM_MXS_MMC
-       select MXS_HAVE_PLATFORM_RTC_STMP3XXX
-       help
-         Include support for STMP378x-devb platform. This includes specific
-         configurations for the board and its peripherals.
-
-config MACH_MX23EVK
-       bool "Support MX23EVK Platform"
-       select SOC_IMX23
-       select MXS_HAVE_AMBA_DUART
-       select MXS_HAVE_PLATFORM_AUART
-       select MXS_HAVE_PLATFORM_MXS_MMC
-       select MXS_HAVE_PLATFORM_MXSFB
-       select MXS_HAVE_PLATFORM_RTC_STMP3XXX
-       help
-         Include support for MX23EVK platform. This includes specific
-         configurations for the board and its peripherals.
-
-config MACH_MX28EVK
-       bool "Support MX28EVK Platform"
-       select SOC_IMX28
-       select LEDS_GPIO_REGISTER
-       select MXS_HAVE_AMBA_DUART
-       select MXS_HAVE_PLATFORM_AUART
-       select MXS_HAVE_PLATFORM_FEC
-       select MXS_HAVE_PLATFORM_FLEXCAN
-       select MXS_HAVE_PLATFORM_MXS_MMC
-       select MXS_HAVE_PLATFORM_MXSFB
-       select MXS_HAVE_PLATFORM_MXS_SAIF
-       select MXS_HAVE_PLATFORM_MXS_I2C
-       select MXS_HAVE_PLATFORM_RTC_STMP3XXX
-       help
-         Include support for MX28EVK platform. This includes specific
-         configurations for the board and its peripherals.
-
-config MODULE_TX28
-       bool
-       select SOC_IMX28
-       select LEDS_GPIO_REGISTER
-       select MXS_HAVE_AMBA_DUART
-       select MXS_HAVE_PLATFORM_AUART
-       select MXS_HAVE_PLATFORM_FEC
-       select MXS_HAVE_PLATFORM_MXS_I2C
-       select MXS_HAVE_PLATFORM_MXS_MMC
-       select MXS_HAVE_PLATFORM_MXS_PWM
-       select MXS_HAVE_PLATFORM_RTC_STMP3XXX
-
-config MODULE_M28
-       bool
-       select SOC_IMX28
-       select LEDS_GPIO_REGISTER
-       select MXS_HAVE_AMBA_DUART
-       select MXS_HAVE_PLATFORM_AUART
-       select MXS_HAVE_PLATFORM_FEC
-       select MXS_HAVE_PLATFORM_FLEXCAN
-       select MXS_HAVE_PLATFORM_MXS_I2C
-       select MXS_HAVE_PLATFORM_MXS_MMC
-       select MXS_HAVE_PLATFORM_MXSFB
-
-config MODULE_APX4
-       bool
-       select SOC_IMX28
-       select LEDS_GPIO_REGISTER
-       select MXS_HAVE_AMBA_DUART
-       select MXS_HAVE_PLATFORM_AUART
-       select MXS_HAVE_PLATFORM_FEC
-       select MXS_HAVE_PLATFORM_MXS_I2C
-       select MXS_HAVE_PLATFORM_MXS_MMC
-       select MXS_HAVE_PLATFORM_MXS_SAIF
-
-config MACH_TX28
-       bool "Ka-Ro TX28 module"
-       select MODULE_TX28
-
-config MACH_M28EVK
-       bool "Support DENX M28EVK Platform"
-       select MODULE_M28
-
-config MACH_APX4DEVKIT
-       bool "Support Bluegiga APX4 Development Kit"
-       select MODULE_APX4
-
 endif
index fed3695..3d3c8a9 100644 (file)
@@ -1,15 +1,6 @@
 # Common support
-obj-y := devices.o icoll.o iomux.o ocotp.o system.o timer.o mm.o
+obj-y := icoll.o ocotp.o system.o timer.o mm.o
 
 obj-$(CONFIG_PM) += pm.o
 
 obj-$(CONFIG_MACH_MXS_DT) += mach-mxs.o
-obj-$(CONFIG_MACH_STMP378X_DEVB) += mach-stmp378x_devb.o
-obj-$(CONFIG_MACH_MX23EVK) += mach-mx23evk.o
-obj-$(CONFIG_MACH_MX28EVK) += mach-mx28evk.o
-obj-$(CONFIG_MACH_M28EVK)    += mach-m28evk.o
-obj-$(CONFIG_MACH_APX4DEVKIT) += mach-apx4devkit.o
-obj-$(CONFIG_MODULE_TX28) += module-tx28.o
-obj-$(CONFIG_MACH_TX28)    += mach-tx28.o
-
-obj-y += devices/
diff --git a/arch/arm/mach-mxs/devices-mx23.h b/arch/arm/mach-mxs/devices-mx23.h
deleted file mode 100644 (file)
index 9ee5ced..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2010 Pengutronix
- * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
- *
- * Copyright 2010 Freescale Semiconductor, Inc. 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 <mach/mx23.h>
-#include <mach/devices-common.h>
-#include <linux/mxsfb.h>
-#include <linux/amba/bus.h>
-
-static inline int mx23_add_duart(void)
-{
-       struct amba_device *d;
-
-       d = amba_ahb_device_add(NULL, "duart", MX23_DUART_BASE_ADDR, SZ_8K,
-                               MX23_INT_DUART, 0, 0, 0);
-       return IS_ERR(d) ? PTR_ERR(d) : 0;
-}
-
-extern const struct mxs_auart_data mx23_auart_data[] __initconst;
-#define mx23_add_auart(id)     mxs_add_auart(&mx23_auart_data[id])
-#define mx23_add_auart0()              mx23_add_auart(0)
-#define mx23_add_auart1()              mx23_add_auart(1)
-
-extern const struct mxs_gpmi_nand_data mx23_gpmi_nand_data __initconst;
-#define mx23_add_gpmi_nand(pdata)      \
-       mxs_add_gpmi_nand(pdata, &mx23_gpmi_nand_data)
-
-extern const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst;
-#define mx23_add_mxs_mmc(id, pdata) \
-       mxs_add_mxs_mmc(&mx23_mxs_mmc_data[id], pdata)
-
-#define mx23_add_mxs_pwm(id)           mxs_add_mxs_pwm(MX23_PWM_BASE_ADDR, id)
-
-struct platform_device *__init mx23_add_mxsfb(
-               const struct mxsfb_platform_data *pdata);
-
-struct platform_device *__init mx23_add_rtc_stmp3xxx(void);
diff --git a/arch/arm/mach-mxs/devices-mx28.h b/arch/arm/mach-mxs/devices-mx28.h
deleted file mode 100644 (file)
index fcab431..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2010 Pengutronix
- * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
- *
- * Copyright 2010 Freescale Semiconductor, Inc. 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 <mach/mx28.h>
-#include <mach/devices-common.h>
-#include <linux/mxsfb.h>
-#include <linux/amba/bus.h>
-
-static inline int mx28_add_duart(void)
-{
-       struct amba_device *d;
-
-       d = amba_ahb_device_add(NULL, "duart", MX28_DUART_BASE_ADDR, SZ_8K,
-                               MX28_INT_DUART, 0, 0, 0);
-       return IS_ERR(d) ? PTR_ERR(d) : 0;
-}
-
-extern const struct mxs_auart_data mx28_auart_data[] __initconst;
-#define mx28_add_auart(id)     mxs_add_auart(&mx28_auart_data[id])
-#define mx28_add_auart0()              mx28_add_auart(0)
-#define mx28_add_auart1()              mx28_add_auart(1)
-#define mx28_add_auart2()              mx28_add_auart(2)
-#define mx28_add_auart3()              mx28_add_auart(3)
-#define mx28_add_auart4()              mx28_add_auart(4)
-
-extern const struct mxs_fec_data mx28_fec_data[] __initconst;
-#define mx28_add_fec(id, pdata) \
-       mxs_add_fec(&mx28_fec_data[id], pdata)
-
-extern const struct mxs_flexcan_data mx28_flexcan_data[] __initconst;
-#define mx28_add_flexcan(id, pdata)    \
-       mxs_add_flexcan(&mx28_flexcan_data[id], pdata)
-#define mx28_add_flexcan0(pdata)       mx28_add_flexcan(0, pdata)
-#define mx28_add_flexcan1(pdata)       mx28_add_flexcan(1, pdata)
-
-extern const struct mxs_gpmi_nand_data mx28_gpmi_nand_data __initconst;
-#define mx28_add_gpmi_nand(pdata)      \
-       mxs_add_gpmi_nand(pdata, &mx28_gpmi_nand_data)
-
-extern const struct mxs_mxs_i2c_data mx28_mxs_i2c_data[] __initconst;
-#define mx28_add_mxs_i2c(id)           mxs_add_mxs_i2c(&mx28_mxs_i2c_data[id])
-
-extern const struct mxs_mxs_mmc_data mx28_mxs_mmc_data[] __initconst;
-#define mx28_add_mxs_mmc(id, pdata) \
-       mxs_add_mxs_mmc(&mx28_mxs_mmc_data[id], pdata)
-
-#define mx28_add_mxs_pwm(id)           mxs_add_mxs_pwm(MX28_PWM_BASE_ADDR, id)
-
-struct platform_device *__init mx28_add_mxsfb(
-               const struct mxsfb_platform_data *pdata);
-
-extern const struct mxs_saif_data mx28_saif_data[] __initconst;
-#define mx28_add_saif(id, pdata) \
-       mxs_add_saif(&mx28_saif_data[id], pdata)
-
-struct platform_device *__init mx28_add_rtc_stmp3xxx(void);
diff --git a/arch/arm/mach-mxs/devices.c b/arch/arm/mach-mxs/devices.c
deleted file mode 100644 (file)
index cf50b5a..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2008 Sascha Hauer, 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
- * 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/kernel.h>
-#include <linux/slab.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/amba/bus.h>
-
-struct platform_device *__init mxs_add_platform_device_dmamask(
-               const char *name, int id,
-               const struct resource *res, unsigned int num_resources,
-               const void *data, size_t size_data, u64 dmamask)
-{
-       int ret = -ENOMEM;
-       struct platform_device *pdev;
-
-       pdev = platform_device_alloc(name, id);
-       if (!pdev)
-               goto err;
-
-       if (dmamask) {
-               /*
-                * This memory isn't freed when the device is put,
-                * I don't have a nice idea for that though.  Conceptually
-                * dma_mask in struct device should not be a pointer.
-                * See http://thread.gmane.org/gmane.linux.kernel.pci/9081
-                */
-               pdev->dev.dma_mask =
-                       kmalloc(sizeof(*pdev->dev.dma_mask), GFP_KERNEL);
-               if (!pdev->dev.dma_mask)
-                       /* ret is still -ENOMEM; */
-                       goto err;
-
-               *pdev->dev.dma_mask = dmamask;
-               pdev->dev.coherent_dma_mask = dmamask;
-       }
-
-       if (res) {
-               ret = platform_device_add_resources(pdev, res, num_resources);
-               if (ret)
-                       goto err;
-       }
-
-       if (data) {
-               ret = platform_device_add_data(pdev, data, size_data);
-               if (ret)
-                       goto err;
-       }
-
-       ret = platform_device_add(pdev);
-       if (ret) {
-err:
-               if (dmamask)
-                       kfree(pdev->dev.dma_mask);
-               platform_device_put(pdev);
-               return ERR_PTR(ret);
-       }
-
-       return pdev;
-}
-
-struct device mxs_apbh_bus = {
-       .init_name      = "mxs_apbh",
-       .parent         = &platform_bus,
-};
-
-static int __init mxs_device_init(void)
-{
-       return device_register(&mxs_apbh_bus);
-}
-core_initcall(mxs_device_init);
diff --git a/arch/arm/mach-mxs/devices/Kconfig b/arch/arm/mach-mxs/devices/Kconfig
deleted file mode 100644 (file)
index 19659de..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-config MXS_HAVE_AMBA_DUART
-       bool
-
-config MXS_HAVE_PLATFORM_AUART
-       bool
-
-config MXS_HAVE_PLATFORM_FEC
-       bool
-
-config MXS_HAVE_PLATFORM_FLEXCAN
-       select HAVE_CAN_FLEXCAN if CAN
-       bool
-
-config MXS_HAVE_PLATFORM_GPMI_NAND
-       bool
-
-config MXS_HAVE_PLATFORM_MXS_I2C
-       bool
-
-config MXS_HAVE_PLATFORM_MXS_MMC
-       bool
-
-config MXS_HAVE_PLATFORM_MXS_PWM
-       bool
-
-config MXS_HAVE_PLATFORM_MXSFB
-       bool
-
-config MXS_HAVE_PLATFORM_MXS_SAIF
-       bool
-
-config MXS_HAVE_PLATFORM_RTC_STMP3XXX
-       bool
diff --git a/arch/arm/mach-mxs/devices/Makefile b/arch/arm/mach-mxs/devices/Makefile
deleted file mode 100644 (file)
index 5f72d97..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-obj-$(CONFIG_MXS_HAVE_PLATFORM_AUART) += platform-auart.o
-obj-y += platform-dma.o
-obj-$(CONFIG_MXS_HAVE_PLATFORM_FEC) += platform-fec.o
-obj-$(CONFIG_MXS_HAVE_PLATFORM_FLEXCAN) += platform-flexcan.o
-obj-$(CONFIG_MXS_HAVE_PLATFORM_GPMI_NAND) += platform-gpmi-nand.o
-obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_I2C) += platform-mxs-i2c.o
-obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_MMC) += platform-mxs-mmc.o
-obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_PWM) += platform-mxs-pwm.o
-obj-y += platform-gpio-mxs.o
-obj-$(CONFIG_MXS_HAVE_PLATFORM_MXSFB) += platform-mxsfb.o
-obj-$(CONFIG_MXS_HAVE_PLATFORM_MXS_SAIF) += platform-mxs-saif.o
-obj-$(CONFIG_MXS_HAVE_PLATFORM_RTC_STMP3XXX) += platform-rtc-stmp3xxx.o
diff --git a/arch/arm/mach-mxs/devices/platform-auart.c b/arch/arm/mach-mxs/devices/platform-auart.c
deleted file mode 100644 (file)
index 27608f5..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2010 Pengutronix
- * Sascha Hauer <s.hauer@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 <linux/dma-mapping.h>
-#include <asm/sizes.h>
-#include <mach/mx23.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-
-#define mxs_auart_data_entry_single(soc, _id, hwid)                    \
-       {                                                               \
-               .id = _id,                                              \
-               .iobase = soc ## _AUART ## hwid ## _BASE_ADDR,          \
-               .irq = soc ## _INT_AUART ## hwid,                       \
-       }
-
-#define mxs_auart_data_entry(soc, _id, hwid)                           \
-       [_id] = mxs_auart_data_entry_single(soc, _id, hwid)
-
-#ifdef CONFIG_SOC_IMX23
-const struct mxs_auart_data mx23_auart_data[] __initconst = {
-#define mx23_auart_data_entry(_id, hwid)                               \
-       mxs_auart_data_entry(MX23, _id, hwid)
-       mx23_auart_data_entry(0, 1),
-       mx23_auart_data_entry(1, 2),
-};
-#endif
-
-#ifdef CONFIG_SOC_IMX28
-const struct mxs_auart_data mx28_auart_data[] __initconst = {
-#define mx28_auart_data_entry(_id)                                     \
-       mxs_auart_data_entry(MX28, _id, _id)
-       mx28_auart_data_entry(0),
-       mx28_auart_data_entry(1),
-       mx28_auart_data_entry(2),
-       mx28_auart_data_entry(3),
-       mx28_auart_data_entry(4),
-};
-#endif
-
-struct platform_device *__init mxs_add_auart(
-               const struct mxs_auart_data *data)
-{
-       struct resource res[] = {
-               {
-                       .start = data->iobase,
-                       .end = data->iobase + SZ_8K - 1,
-                       .flags = IORESOURCE_MEM,
-               }, {
-                       .start = data->irq,
-                       .end = data->irq,
-                       .flags = IORESOURCE_IRQ,
-               },
-       };
-
-       return mxs_add_platform_device_dmamask("mxs-auart", data->id,
-                                       res, ARRAY_SIZE(res), NULL, 0,
-                                       DMA_BIT_MASK(32));
-}
-
diff --git a/arch/arm/mach-mxs/devices/platform-dma.c b/arch/arm/mach-mxs/devices/platform-dma.c
deleted file mode 100644 (file)
index 4682450..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2011 Freescale Semiconductor, Inc. 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/compiler.h>
-#include <linux/dma-mapping.h>
-#include <linux/err.h>
-#include <linux/init.h>
-
-#include <mach/mx23.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-
-struct platform_device *__init mxs_add_dma(const char *devid,
-                                               resource_size_t base)
-{
-       struct resource res[] = {
-               {
-                       .start = base,
-                       .end = base + SZ_8K - 1,
-                       .flags = IORESOURCE_MEM,
-               }
-       };
-
-       return mxs_add_platform_device_dmamask(devid, -1,
-                               res, ARRAY_SIZE(res), NULL, 0,
-                               DMA_BIT_MASK(32));
-}
diff --git a/arch/arm/mach-mxs/devices/platform-fec.c b/arch/arm/mach-mxs/devices/platform-fec.c
deleted file mode 100644 (file)
index ae96a4f..0000000
+++ /dev/null
@@ -1,52 +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 <linux/dma-mapping.h>
-#include <asm/sizes.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-
-#define mxs_fec_data_entry_single(soc, _id)                            \
-       {                                                               \
-               .id = _id,                                              \
-               .iobase = soc ## _ENET_MAC ## _id ## _BASE_ADDR,        \
-               .irq = soc ## _INT_ENET_MAC ## _id,                     \
-       }
-
-#define mxs_fec_data_entry(soc, _id)                                   \
-       [_id] = mxs_fec_data_entry_single(soc, _id)
-
-#ifdef CONFIG_SOC_IMX28
-const struct mxs_fec_data mx28_fec_data[] __initconst = {
-#define mx28_fec_data_entry(_id)                                       \
-       mxs_fec_data_entry(MX28, _id)
-       mx28_fec_data_entry(0),
-       mx28_fec_data_entry(1),
-};
-#endif
-
-struct platform_device *__init mxs_add_fec(
-               const struct mxs_fec_data *data,
-               const struct fec_platform_data *pdata)
-{
-       struct resource res[] = {
-               {
-                       .start = data->iobase,
-                       .end = data->iobase + SZ_16K - 1,
-                       .flags = IORESOURCE_MEM,
-               }, {
-                       .start = data->irq,
-                       .end = data->irq,
-                       .flags = IORESOURCE_IRQ,
-               },
-       };
-
-       return mxs_add_platform_device_dmamask("imx28-fec", data->id,
-                       res, ARRAY_SIZE(res), pdata, sizeof(*pdata),
-                       DMA_BIT_MASK(32));
-}
diff --git a/arch/arm/mach-mxs/devices/platform-flexcan.c b/arch/arm/mach-mxs/devices/platform-flexcan.c
deleted file mode 100644 (file)
index 43a6b4b..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2010, 2011 Pengutronix,
- *                          Marc Kleine-Budde <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.
- */
-#include <asm/sizes.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-
-#define mxs_flexcan_data_entry_single(soc, _id, _hwid, _size)          \
-       {                                                               \
-               .id = _id,                                              \
-               .iobase = soc ## _CAN ## _hwid ## _BASE_ADDR,           \
-               .iosize = _size,                                        \
-               .irq = soc ## _INT_CAN ## _hwid,                        \
-       }
-
-#define mxs_flexcan_data_entry(soc, _id, _hwid, _size)                 \
-       [_id] = mxs_flexcan_data_entry_single(soc, _id, _hwid, _size)
-
-#ifdef CONFIG_SOC_IMX28
-const struct mxs_flexcan_data mx28_flexcan_data[] __initconst = {
-#define mx28_flexcan_data_entry(_id, _hwid)                            \
-       mxs_flexcan_data_entry_single(MX28, _id, _hwid, SZ_8K)
-       mx28_flexcan_data_entry(0, 0),
-       mx28_flexcan_data_entry(1, 1),
-};
-#endif /* ifdef CONFIG_SOC_IMX28 */
-
-struct platform_device *__init mxs_add_flexcan(
-               const struct mxs_flexcan_data *data,
-               const struct flexcan_platform_data *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 mxs_add_platform_device("flexcan", data->id,
-                       res, ARRAY_SIZE(res), pdata, sizeof(*pdata));
-}
diff --git a/arch/arm/mach-mxs/devices/platform-gpio-mxs.c b/arch/arm/mach-mxs/devices/platform-gpio-mxs.c
deleted file mode 100644 (file)
index cd99f19..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2011 Freescale Semiconductor, Inc. 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/compiler.h>
-#include <linux/err.h>
-#include <linux/init.h>
-
-#include <mach/mx23.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-
-struct platform_device *__init mxs_add_gpio(
-       char *name, int id, resource_size_t iobase, int irq)
-{
-       struct resource res[] = {
-               {
-                       .start = iobase,
-                       .end = iobase + SZ_8K - 1,
-                       .flags = IORESOURCE_MEM,
-               }, {
-                       .start = irq,
-                       .end = irq,
-                       .flags = IORESOURCE_IRQ,
-               },
-       };
-
-       return platform_device_register_resndata(&mxs_apbh_bus,
-                       name, id, res, ARRAY_SIZE(res), NULL, 0);
-}
diff --git a/arch/arm/mach-mxs/devices/platform-gpmi-nand.c b/arch/arm/mach-mxs/devices/platform-gpmi-nand.c
deleted file mode 100644 (file)
index 3e22df5..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2011 Freescale Semiconductor, Inc. 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 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 <asm/sizes.h>
-#include <mach/mx23.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-#include <linux/dma-mapping.h>
-
-#ifdef CONFIG_SOC_IMX23
-const struct mxs_gpmi_nand_data mx23_gpmi_nand_data __initconst = {
-       .devid = "imx23-gpmi-nand",
-       .res = {
-               /* GPMI */
-               DEFINE_RES_MEM_NAMED(MX23_GPMI_BASE_ADDR, SZ_8K,
-                                       GPMI_NAND_GPMI_REGS_ADDR_RES_NAME),
-               DEFINE_RES_IRQ_NAMED(MX23_INT_GPMI_ATTENTION,
-                                       GPMI_NAND_GPMI_INTERRUPT_RES_NAME),
-               /* BCH */
-               DEFINE_RES_MEM_NAMED(MX23_BCH_BASE_ADDR, SZ_8K,
-                                       GPMI_NAND_BCH_REGS_ADDR_RES_NAME),
-               DEFINE_RES_IRQ_NAMED(MX23_INT_BCH,
-                                       GPMI_NAND_BCH_INTERRUPT_RES_NAME),
-               /* DMA */
-               DEFINE_RES_NAMED(MX23_DMA_GPMI0,
-                                       MX23_DMA_GPMI3 - MX23_DMA_GPMI0 + 1,
-                                       GPMI_NAND_DMA_CHANNELS_RES_NAME,
-                                       IORESOURCE_DMA),
-               DEFINE_RES_IRQ_NAMED(MX23_INT_GPMI_DMA,
-                                       GPMI_NAND_DMA_INTERRUPT_RES_NAME),
-       },
-};
-#endif
-
-#ifdef CONFIG_SOC_IMX28
-const struct mxs_gpmi_nand_data mx28_gpmi_nand_data __initconst = {
-       .devid = "imx28-gpmi-nand",
-       .res = {
-               /* GPMI */
-               DEFINE_RES_MEM_NAMED(MX28_GPMI_BASE_ADDR, SZ_8K,
-                                       GPMI_NAND_GPMI_REGS_ADDR_RES_NAME),
-               DEFINE_RES_IRQ_NAMED(MX28_INT_GPMI,
-                                       GPMI_NAND_GPMI_INTERRUPT_RES_NAME),
-               /* BCH */
-               DEFINE_RES_MEM_NAMED(MX28_BCH_BASE_ADDR, SZ_8K,
-                                       GPMI_NAND_BCH_REGS_ADDR_RES_NAME),
-               DEFINE_RES_IRQ_NAMED(MX28_INT_BCH,
-                                       GPMI_NAND_BCH_INTERRUPT_RES_NAME),
-               /* DMA */
-               DEFINE_RES_NAMED(MX28_DMA_GPMI0,
-                                       MX28_DMA_GPMI7 - MX28_DMA_GPMI0 + 1,
-                                       GPMI_NAND_DMA_CHANNELS_RES_NAME,
-                                       IORESOURCE_DMA),
-               DEFINE_RES_IRQ_NAMED(MX28_INT_GPMI_DMA,
-                                       GPMI_NAND_DMA_INTERRUPT_RES_NAME),
-       },
-};
-#endif
-
-struct platform_device *__init
-mxs_add_gpmi_nand(const struct gpmi_nand_platform_data *pdata,
-               const struct mxs_gpmi_nand_data *data)
-{
-       return mxs_add_platform_device_dmamask(data->devid, -1,
-                               data->res, GPMI_NAND_RES_SIZE,
-                               pdata, sizeof(*pdata), DMA_BIT_MASK(32));
-}
diff --git a/arch/arm/mach-mxs/devices/platform-mxs-i2c.c b/arch/arm/mach-mxs/devices/platform-mxs-i2c.c
deleted file mode 100644 (file)
index 79222ec..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2011 Pengutronix
- * Wolfram Sang <w.sang@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 <asm/sizes.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-
-#define mxs_i2c_data_entry_single(soc, _id)                            \
-       {                                                               \
-               .id = _id,                                              \
-               .iobase = soc ## _I2C ## _id ## _BASE_ADDR,             \
-               .errirq = soc ## _INT_I2C ## _id ## _ERROR,             \
-               .dmairq = soc ## _INT_I2C ## _id ## _DMA,               \
-       }
-
-#define mxs_i2c_data_entry(soc, _id)                                   \
-       [_id] = mxs_i2c_data_entry_single(soc, _id)
-
-#ifdef CONFIG_SOC_IMX28
-const struct mxs_mxs_i2c_data mx28_mxs_i2c_data[] __initconst = {
-       mxs_i2c_data_entry(MX28, 0),
-       mxs_i2c_data_entry(MX28, 1),
-};
-#endif
-
-struct platform_device *__init mxs_add_mxs_i2c(
-               const struct mxs_mxs_i2c_data *data)
-{
-       struct resource res[] = {
-               {
-                       .start = data->iobase,
-                       .end = data->iobase + SZ_8K - 1,
-                       .flags = IORESOURCE_MEM,
-               }, {
-                       .start = data->errirq,
-                       .end = data->errirq,
-                       .flags = IORESOURCE_IRQ,
-               }, {
-                       .start = data->dmairq,
-                       .end = data->dmairq,
-                       .flags = IORESOURCE_IRQ,
-               },
-       };
-
-       return mxs_add_platform_device("mxs-i2c", data->id, res,
-                                       ARRAY_SIZE(res), NULL, 0);
-}
diff --git a/arch/arm/mach-mxs/devices/platform-mxs-mmc.c b/arch/arm/mach-mxs/devices/platform-mxs-mmc.c
deleted file mode 100644 (file)
index b33c9d0..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2010 Pengutronix
- * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
- *
- * Copyright 2011 Freescale Semiconductor, Inc. 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/compiler.h>
-#include <linux/err.h>
-#include <linux/init.h>
-
-#include <mach/mx23.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-
-#define mxs_mxs_mmc_data_entry_single(soc, _devid, _id, hwid)          \
-       {                                                               \
-               .devid = _devid,                                        \
-               .id = _id,                                              \
-               .iobase = soc ## _SSP ## hwid ## _BASE_ADDR,            \
-               .dma = soc ## _DMA_SSP ## hwid,                         \
-               .irq_err = soc ## _INT_SSP ## hwid ## _ERROR,           \
-               .irq_dma = soc ## _INT_SSP ## hwid ## _DMA,             \
-       }
-
-#define mxs_mxs_mmc_data_entry(soc, _devid, _id, hwid)                 \
-       [_id] = mxs_mxs_mmc_data_entry_single(soc, _devid, _id, hwid)
-
-
-#ifdef CONFIG_SOC_IMX23
-const struct mxs_mxs_mmc_data mx23_mxs_mmc_data[] __initconst = {
-       mxs_mxs_mmc_data_entry(MX23, "imx23-mmc", 0, 1),
-       mxs_mxs_mmc_data_entry(MX23, "imx23-mmc", 1, 2),
-};
-#endif
-
-#ifdef CONFIG_SOC_IMX28
-const struct mxs_mxs_mmc_data mx28_mxs_mmc_data[] __initconst = {
-       mxs_mxs_mmc_data_entry(MX28, "imx28-mmc", 0, 0),
-       mxs_mxs_mmc_data_entry(MX28, "imx28-mmc", 1, 1),
-       mxs_mxs_mmc_data_entry(MX28, "imx28-mmc", 2, 2),
-       mxs_mxs_mmc_data_entry(MX28, "imx28-mmc", 3, 3),
-};
-#endif
-
-struct platform_device *__init mxs_add_mxs_mmc(
-               const struct mxs_mxs_mmc_data *data,
-               const struct mxs_mmc_platform_data *pdata)
-{
-       struct resource res[] = {
-               {
-                       .start  = data->iobase,
-                       .end    = data->iobase + SZ_8K - 1,
-                       .flags  = IORESOURCE_MEM,
-               }, {
-                       .start  = data->dma,
-                       .end    = data->dma,
-                       .flags  = IORESOURCE_DMA,
-               }, {
-                       .start  = data->irq_err,
-                       .end    = data->irq_err,
-                       .flags  = IORESOURCE_IRQ,
-               }, {
-                       .start  = data->irq_dma,
-                       .end    = data->irq_dma,
-                       .flags  = IORESOURCE_IRQ,
-               },
-       };
-
-       return mxs_add_platform_device(data->devid, data->id,
-                       res, ARRAY_SIZE(res), pdata, sizeof(*pdata));
-}
diff --git a/arch/arm/mach-mxs/devices/platform-mxs-pwm.c b/arch/arm/mach-mxs/devices/platform-mxs-pwm.c
deleted file mode 100644 (file)
index 680f5a9..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2010 Pengutronix
- * Sascha Hauer <s.hauer@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 <asm/sizes.h>
-#include <mach/devices-common.h>
-
-struct platform_device *__init mxs_add_mxs_pwm(resource_size_t iobase, int id)
-{
-       struct resource res = {
-               .flags = IORESOURCE_MEM,
-       };
-
-       res.start = iobase + 0x10 + 0x20 * id;
-       res.end = res.start + 0x1f;
-
-       return mxs_add_platform_device("mxs-pwm", id, &res, 1, NULL, 0);
-}
diff --git a/arch/arm/mach-mxs/devices/platform-mxs-saif.c b/arch/arm/mach-mxs/devices/platform-mxs-saif.c
deleted file mode 100644 (file)
index f6e3a60..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2011 Freescale Semiconductor, Inc. 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/compiler.h>
-#include <linux/err.h>
-#include <linux/init.h>
-
-#include <mach/mx23.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-
-#define mxs_saif_data_entry_single(soc, _id)                           \
-       {                                                               \
-               .id = _id,                                              \
-               .iobase = soc ## _SAIF ## _id ## _BASE_ADDR,            \
-               .irq = soc ## _INT_SAIF ## _id,                         \
-               .dma = soc ## _DMA_SAIF ## _id,                         \
-               .dmairq = soc ## _INT_SAIF ## _id ##_DMA,               \
-       }
-
-#define mxs_saif_data_entry(soc, _id)                                  \
-       [_id] = mxs_saif_data_entry_single(soc, _id)
-
-#ifdef CONFIG_SOC_IMX28
-const struct mxs_saif_data mx28_saif_data[] __initconst = {
-       mxs_saif_data_entry(MX28, 0),
-       mxs_saif_data_entry(MX28, 1),
-};
-#endif
-
-struct platform_device *__init mxs_add_saif(const struct mxs_saif_data *data,
-                               const struct mxs_saif_platform_data *pdata)
-{
-       struct resource res[] = {
-               {
-                       .start = data->iobase,
-                       .end = data->iobase + SZ_4K - 1,
-                       .flags = IORESOURCE_MEM,
-               }, {
-                       .start = data->irq,
-                       .end = data->irq,
-                       .flags = IORESOURCE_IRQ,
-               }, {
-                       .start = data->dma,
-                       .end = data->dma,
-                       .flags = IORESOURCE_DMA,
-               }, {
-                       .start = data->dmairq,
-                       .end = data->dmairq,
-                       .flags = IORESOURCE_IRQ,
-               },
-
-       };
-
-       return mxs_add_platform_device("mxs-saif", data->id, res,
-                               ARRAY_SIZE(res), pdata, sizeof(*pdata));
-}
diff --git a/arch/arm/mach-mxs/devices/platform-mxsfb.c b/arch/arm/mach-mxs/devices/platform-mxsfb.c
deleted file mode 100644 (file)
index 76b53f7..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2011 Pengutronix, Sascha Hauer <s.hauer@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 <linux/dma-mapping.h>
-#include <asm/sizes.h>
-#include <mach/mx23.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-#include <linux/mxsfb.h>
-
-#ifdef CONFIG_SOC_IMX23
-struct platform_device *__init mx23_add_mxsfb(
-               const struct mxsfb_platform_data *pdata)
-{
-       struct resource res[] = {
-               {
-                       .start = MX23_LCDIF_BASE_ADDR,
-                       .end = MX23_LCDIF_BASE_ADDR + SZ_8K - 1,
-                       .flags = IORESOURCE_MEM,
-               },
-       };
-
-       return mxs_add_platform_device_dmamask("imx23-fb", -1,
-                       res, ARRAY_SIZE(res), pdata, sizeof(*pdata), DMA_BIT_MASK(32));
-}
-#endif /* ifdef CONFIG_SOC_IMX23 */
-
-#ifdef CONFIG_SOC_IMX28
-struct platform_device *__init mx28_add_mxsfb(
-               const struct mxsfb_platform_data *pdata)
-{
-       struct resource res[] = {
-               {
-                       .start = MX28_LCDIF_BASE_ADDR,
-                       .end = MX28_LCDIF_BASE_ADDR + SZ_8K - 1,
-                       .flags = IORESOURCE_MEM,
-               },
-       };
-
-       return mxs_add_platform_device_dmamask("imx28-fb", -1,
-                       res, ARRAY_SIZE(res), pdata, sizeof(*pdata), DMA_BIT_MASK(32));
-}
-#endif /* ifdef CONFIG_SOC_IMX28 */
diff --git a/arch/arm/mach-mxs/devices/platform-rtc-stmp3xxx.c b/arch/arm/mach-mxs/devices/platform-rtc-stmp3xxx.c
deleted file mode 100644 (file)
index 639eaee..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2011 Pengutronix, Wolfram Sang <w.sang@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 <asm/sizes.h>
-#include <mach/mx23.h>
-#include <mach/mx28.h>
-#include <mach/devices-common.h>
-
-#ifdef CONFIG_SOC_IMX23
-struct platform_device *__init mx23_add_rtc_stmp3xxx(void)
-{
-       struct resource res[] = {
-               {
-                       .start = MX23_RTC_BASE_ADDR,
-                       .end = MX23_RTC_BASE_ADDR + SZ_8K - 1,
-                       .flags = IORESOURCE_MEM,
-               }, {
-                       .start = MX23_INT_RTC_ALARM,
-                       .end = MX23_INT_RTC_ALARM,
-                       .flags = IORESOURCE_IRQ,
-               },
-       };
-
-       return mxs_add_platform_device("stmp3xxx-rtc", 0, res, ARRAY_SIZE(res),
-                                       NULL, 0);
-}
-#endif /* CONFIG_SOC_IMX23 */
-
-#ifdef CONFIG_SOC_IMX28
-struct platform_device *__init mx28_add_rtc_stmp3xxx(void)
-{
-       struct resource res[] = {
-               {
-                       .start = MX28_RTC_BASE_ADDR,
-                       .end = MX28_RTC_BASE_ADDR + SZ_8K - 1,
-                       .flags = IORESOURCE_MEM,
-               }, {
-                       .start = MX28_INT_RTC_ALARM,
-                       .end = MX28_INT_RTC_ALARM,
-                       .flags = IORESOURCE_IRQ,
-               },
-       };
-
-       return mxs_add_platform_device("stmp3xxx-rtc", 0, res, ARRAY_SIZE(res),
-                                       NULL, 0);
-}
-#endif /* CONFIG_SOC_IMX28 */
index de6c7ba..4dec795 100644 (file)
@@ -17,21 +17,12 @@ extern void mxs_timer_init(int);
 extern void mxs_restart(char, const char *);
 extern int mxs_saif_clkmux_select(unsigned int clkmux);
 
-extern void mx23_soc_init(void);
 extern int mx23_clocks_init(void);
 extern void mx23_map_io(void);
-extern void mx23_init_irq(void);
 
-extern void mx28_soc_init(void);
 extern int mx28_clocks_init(void);
 extern void mx28_map_io(void);
-extern void mx28_init_irq(void);
 
 extern void icoll_init_irq(void);
 
-extern struct platform_device *mxs_add_dma(const char *devid,
-                                               resource_size_t base);
-extern struct platform_device *mxs_add_gpio(char *name, int id,
-                                           resource_size_t iobase, int irq);
-
 #endif /* __MACH_MXS_COMMON_H__ */
diff --git a/arch/arm/mach-mxs/include/mach/devices-common.h b/arch/arm/mach-mxs/include/mach/devices-common.h
deleted file mode 100644 (file)
index e8b1d95..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (C) 2009-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 <linux/kernel.h>
-#include <linux/platform_device.h>
-#include <linux/init.h>
-#include <linux/amba/bus.h>
-
-extern struct device mxs_apbh_bus;
-
-struct platform_device *mxs_add_platform_device_dmamask(
-               const char *name, int id,
-               const struct resource *res, unsigned int num_resources,
-               const void *data, size_t size_data, u64 dmamask);
-
-static inline struct platform_device *mxs_add_platform_device(
-               const char *name, int id,
-               const struct resource *res, unsigned int num_resources,
-               const void *data, size_t size_data)
-{
-       return mxs_add_platform_device_dmamask(
-                       name, id, res, num_resources, data, size_data, 0);
-}
-
-/* auart */
-struct mxs_auart_data {
-       int id;
-       resource_size_t iobase;
-       resource_size_t iosize;
-       resource_size_t irq;
-};
-struct platform_device *__init mxs_add_auart(
-               const struct mxs_auart_data *data);
-
-/* fec */
-#include <linux/fec.h>
-struct mxs_fec_data {
-       int id;
-       resource_size_t iobase;
-       resource_size_t iosize;
-       resource_size_t irq;
-};
-struct platform_device *__init mxs_add_fec(
-               const struct mxs_fec_data *data,
-               const struct fec_platform_data *pdata);
-
-/* flexcan */
-#include <linux/can/platform/flexcan.h>
-struct mxs_flexcan_data {
-       int id;
-       resource_size_t iobase;
-       resource_size_t iosize;
-       resource_size_t irq;
-};
-struct platform_device *__init mxs_add_flexcan(
-               const struct mxs_flexcan_data *data,
-               const struct flexcan_platform_data *pdata);
-
-/* gpmi-nand */
-#include <linux/mtd/gpmi-nand.h>
-struct mxs_gpmi_nand_data {
-       const char *devid;
-       const struct resource res[GPMI_NAND_RES_SIZE];
-};
-struct platform_device *__init
-mxs_add_gpmi_nand(const struct gpmi_nand_platform_data *pdata,
-               const struct mxs_gpmi_nand_data *data);
-
-/* i2c */
-struct mxs_mxs_i2c_data {
-       int id;
-       resource_size_t iobase;
-       resource_size_t errirq;
-       resource_size_t dmairq;
-};
-struct platform_device * __init mxs_add_mxs_i2c(
-               const struct mxs_mxs_i2c_data *data);
-
-/* mmc */
-#include <linux/mmc/mxs-mmc.h>
-struct mxs_mxs_mmc_data {
-       const char *devid;
-       int id;
-       resource_size_t iobase;
-       resource_size_t dma;
-       resource_size_t irq_err;
-       resource_size_t irq_dma;
-};
-struct platform_device *__init mxs_add_mxs_mmc(
-               const struct mxs_mxs_mmc_data *data,
-               const struct mxs_mmc_platform_data *pdata);
-
-/* pwm */
-struct platform_device *__init mxs_add_mxs_pwm(
-               resource_size_t iobase, int id);
-
-/* saif */
-#include <sound/saif.h>
-struct mxs_saif_data {
-       int id;
-       resource_size_t iobase;
-       resource_size_t irq;
-       resource_size_t dma;
-       resource_size_t dmairq;
-};
-
-struct platform_device *__init mxs_add_saif(
-               const struct mxs_saif_data *data,
-               const struct mxs_saif_platform_data *pdata);
diff --git a/arch/arm/mach-mxs/include/mach/iomux-mx23.h b/arch/arm/mach-mxs/include/mach/iomux-mx23.h
deleted file mode 100644 (file)
index b0190a4..0000000
+++ /dev/null
@@ -1,355 +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_MX23_H__
-#define __MACH_IOMUX_MX23_H__
-
-#include <mach/iomux.h>
-
-/*
- * The naming convention for the pad modes is MX23_PAD_<padname>__<padmode>
- * If <padname> or <padmode> refers to a GPIO, it is named GPIO_<unit>_<num>
- * See also iomux.h
- *
- *                                                                     BANK    PIN     MUX
- */
-/* MUXSEL_0 */
-#define MX23_PAD_GPMI_D00__GPMI_D00            MXS_IOMUX_PAD_NAKED(0,  0, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D01__GPMI_D01            MXS_IOMUX_PAD_NAKED(0,  1, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D02__GPMI_D02            MXS_IOMUX_PAD_NAKED(0,  2, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D03__GPMI_D03            MXS_IOMUX_PAD_NAKED(0,  3, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D04__GPMI_D04            MXS_IOMUX_PAD_NAKED(0,  4, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D05__GPMI_D05            MXS_IOMUX_PAD_NAKED(0,  5, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D06__GPMI_D06            MXS_IOMUX_PAD_NAKED(0,  6, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D07__GPMI_D07            MXS_IOMUX_PAD_NAKED(0,  7, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D08__GPMI_D08            MXS_IOMUX_PAD_NAKED(0,  8, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D09__GPMI_D09            MXS_IOMUX_PAD_NAKED(0,  9, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D10__GPMI_D10            MXS_IOMUX_PAD_NAKED(0, 10, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D11__GPMI_D11            MXS_IOMUX_PAD_NAKED(0, 11, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D12__GPMI_D12            MXS_IOMUX_PAD_NAKED(0, 12, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D13__GPMI_D13            MXS_IOMUX_PAD_NAKED(0, 13, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D14__GPMI_D14            MXS_IOMUX_PAD_NAKED(0, 14, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_D15__GPMI_D15            MXS_IOMUX_PAD_NAKED(0, 15, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_CLE__GPMI_CLE            MXS_IOMUX_PAD_NAKED(0, 16, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_ALE__GPMI_ALE            MXS_IOMUX_PAD_NAKED(0, 17, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_CE2N__GPMI_CE2N          MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_RDY0__GPMI_RDY0          MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_RDY1__GPMI_RDY1          MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_RDY2__GPMI_RDY2          MXS_IOMUX_PAD_NAKED(0, 21, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_RDY3__GPMI_RDY3          MXS_IOMUX_PAD_NAKED(0, 22, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_WPN__GPMI_WPN            MXS_IOMUX_PAD_NAKED(0, 23, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_WRN__GPMI_WRN            MXS_IOMUX_PAD_NAKED(0, 24, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_RDN__GPMI_RDN            MXS_IOMUX_PAD_NAKED(0, 25, PAD_MUXSEL_0)
-#define MX23_PAD_AUART1_CTS__AUART1_CTS                MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_0)
-#define MX23_PAD_AUART1_RTS__AUART1_RTS                MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_0)
-#define MX23_PAD_AUART1_RX__AUART1_RX          MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_0)
-#define MX23_PAD_AUART1_TX__AUART1_TX          MXS_IOMUX_PAD_NAKED(0, 29, PAD_MUXSEL_0)
-#define MX23_PAD_I2C_SCL__I2C_SCL              MXS_IOMUX_PAD_NAKED(0, 30, PAD_MUXSEL_0)
-#define MX23_PAD_I2C_SDA__I2C_SDA              MXS_IOMUX_PAD_NAKED(0, 31, PAD_MUXSEL_0)
-
-#define MX23_PAD_LCD_D00__LCD_D00              MXS_IOMUX_PAD_NAKED(1,  0, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D01__LCD_D01              MXS_IOMUX_PAD_NAKED(1,  1, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D02__LCD_D02              MXS_IOMUX_PAD_NAKED(1,  2, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D03__LCD_D03              MXS_IOMUX_PAD_NAKED(1,  3, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D04__LCD_D04              MXS_IOMUX_PAD_NAKED(1,  4, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D05__LCD_D05              MXS_IOMUX_PAD_NAKED(1,  5, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D06__LCD_D06              MXS_IOMUX_PAD_NAKED(1,  6, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D07__LCD_D07              MXS_IOMUX_PAD_NAKED(1,  7, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D08__LCD_D08              MXS_IOMUX_PAD_NAKED(1,  8, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D09__LCD_D09              MXS_IOMUX_PAD_NAKED(1,  9, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D10__LCD_D10              MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D11__LCD_D11              MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D12__LCD_D12              MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D13__LCD_D13              MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D14__LCD_D14              MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D15__LCD_D15              MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D16__LCD_D16              MXS_IOMUX_PAD_NAKED(1, 16, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_D17__LCD_D17              MXS_IOMUX_PAD_NAKED(1, 17, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_RESET__LCD_RESET          MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_RS__LCD_RS                        MXS_IOMUX_PAD_NAKED(1, 19, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_WR__LCD_WR                        MXS_IOMUX_PAD_NAKED(1, 20, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_CS__LCD_CS                        MXS_IOMUX_PAD_NAKED(1, 21, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_DOTCK__LCD_DOTCK          MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_ENABLE__LCD_ENABLE                MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_HSYNC__LCD_HSYNC          MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_0)
-#define MX23_PAD_LCD_VSYNC__LCD_VSYNC          MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_0)
-#define MX23_PAD_PWM0__PWM0                    MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_0)
-#define MX23_PAD_PWM1__PWM1                    MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_0)
-#define MX23_PAD_PWM2__PWM2                    MXS_IOMUX_PAD_NAKED(1, 28, PAD_MUXSEL_0)
-#define MX23_PAD_PWM3__PWM3                    MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_0)
-#define MX23_PAD_PWM4__PWM4                    MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_0)
-
-#define MX23_PAD_SSP1_CMD__SSP1_CMD            MXS_IOMUX_PAD_NAKED(2,  0, PAD_MUXSEL_0)
-#define MX23_PAD_SSP1_DETECT__SSP1_DETECT      MXS_IOMUX_PAD_NAKED(2,  1, PAD_MUXSEL_0)
-#define MX23_PAD_SSP1_DATA0__SSP1_DATA0                MXS_IOMUX_PAD_NAKED(2,  2, PAD_MUXSEL_0)
-#define MX23_PAD_SSP1_DATA1__SSP1_DATA1                MXS_IOMUX_PAD_NAKED(2,  3, PAD_MUXSEL_0)
-#define MX23_PAD_SSP1_DATA2__SSP1_DATA2                MXS_IOMUX_PAD_NAKED(2,  4, PAD_MUXSEL_0)
-#define MX23_PAD_SSP1_DATA3__SSP1_DATA3                MXS_IOMUX_PAD_NAKED(2,  5, PAD_MUXSEL_0)
-#define MX23_PAD_SSP1_SCK__SSP1_SCK            MXS_IOMUX_PAD_NAKED(2,  6, PAD_MUXSEL_0)
-#define MX23_PAD_ROTARYA__ROTARYA              MXS_IOMUX_PAD_NAKED(2,  7, PAD_MUXSEL_0)
-#define MX23_PAD_ROTARYB__ROTARYB              MXS_IOMUX_PAD_NAKED(2,  8, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A00__EMI_A00              MXS_IOMUX_PAD_NAKED(2,  9, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A01__EMI_A01              MXS_IOMUX_PAD_NAKED(2, 10, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A02__EMI_A02              MXS_IOMUX_PAD_NAKED(2, 11, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A03__EMI_A03              MXS_IOMUX_PAD_NAKED(2, 12, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A04__EMI_A04              MXS_IOMUX_PAD_NAKED(2, 13, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A05__EMI_A05              MXS_IOMUX_PAD_NAKED(2, 14, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A06__EMI_A06              MXS_IOMUX_PAD_NAKED(2, 15, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A07__EMI_A07              MXS_IOMUX_PAD_NAKED(2, 16, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A08__EMI_A08              MXS_IOMUX_PAD_NAKED(2, 17, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A09__EMI_A09              MXS_IOMUX_PAD_NAKED(2, 18, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A10__EMI_A10              MXS_IOMUX_PAD_NAKED(2, 19, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A11__EMI_A11              MXS_IOMUX_PAD_NAKED(2, 20, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_A12__EMI_A12              MXS_IOMUX_PAD_NAKED(2, 21, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_BA0__EMI_BA0              MXS_IOMUX_PAD_NAKED(2, 22, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_BA1__EMI_BA1              MXS_IOMUX_PAD_NAKED(2, 23, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_CASN__EMI_CASN            MXS_IOMUX_PAD_NAKED(2, 24, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_CE0N__EMI_CE0N            MXS_IOMUX_PAD_NAKED(2, 25, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_CE1N__EMI_CE1N            MXS_IOMUX_PAD_NAKED(2, 26, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_CE1N__GPMI_CE1N          MXS_IOMUX_PAD_NAKED(2, 27, PAD_MUXSEL_0)
-#define MX23_PAD_GPMI_CE0N__GPMI_CE0N          MXS_IOMUX_PAD_NAKED(2, 28, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_CKE__EMI_CKE              MXS_IOMUX_PAD_NAKED(2, 29, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_RASN__EMI_RASN            MXS_IOMUX_PAD_NAKED(2, 30, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_WEN__EMI_WEN              MXS_IOMUX_PAD_NAKED(2, 31, PAD_MUXSEL_0)
-
-#define MX23_PAD_EMI_D00__EMI_D00              MXS_IOMUX_PAD_NAKED(3,  0, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D01__EMI_D01              MXS_IOMUX_PAD_NAKED(3,  1, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D02__EMI_D02              MXS_IOMUX_PAD_NAKED(3,  2, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D03__EMI_D03              MXS_IOMUX_PAD_NAKED(3,  3, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D04__EMI_D04              MXS_IOMUX_PAD_NAKED(3,  4, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D05__EMI_D05              MXS_IOMUX_PAD_NAKED(3,  5, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D06__EMI_D06              MXS_IOMUX_PAD_NAKED(3,  6, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D07__EMI_D07              MXS_IOMUX_PAD_NAKED(3,  7, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D08__EMI_D08              MXS_IOMUX_PAD_NAKED(3,  8, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D09__EMI_D09              MXS_IOMUX_PAD_NAKED(3,  9, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D10__EMI_D10              MXS_IOMUX_PAD_NAKED(3, 10, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D11__EMI_D11              MXS_IOMUX_PAD_NAKED(3, 11, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D12__EMI_D12              MXS_IOMUX_PAD_NAKED(3, 12, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D13__EMI_D13              MXS_IOMUX_PAD_NAKED(3, 13, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D14__EMI_D14              MXS_IOMUX_PAD_NAKED(3, 14, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_D15__EMI_D15              MXS_IOMUX_PAD_NAKED(3, 15, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_DQM0__EMI_DQM0            MXS_IOMUX_PAD_NAKED(3, 16, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_DQM1__EMI_DQM1            MXS_IOMUX_PAD_NAKED(3, 17, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_DQS0__EMI_DQS0            MXS_IOMUX_PAD_NAKED(3, 18, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_DQS1__EMI_DQS1            MXS_IOMUX_PAD_NAKED(3, 19, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_CLK__EMI_CLK              MXS_IOMUX_PAD_NAKED(3, 20, PAD_MUXSEL_0)
-#define MX23_PAD_EMI_CLKN__EMI_CLKN            MXS_IOMUX_PAD_NAKED(3, 21, PAD_MUXSEL_0)
-
-/* MUXSEL_1 */
-#define MX23_PAD_GPMI_D00__LCD_D8              MXS_IOMUX_PAD_NAKED(0,  0, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D01__LCD_D9              MXS_IOMUX_PAD_NAKED(0,  1, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D02__LCD_D10             MXS_IOMUX_PAD_NAKED(0,  2, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D03__LCD_D11             MXS_IOMUX_PAD_NAKED(0,  3, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D04__LCD_D12             MXS_IOMUX_PAD_NAKED(0,  4, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D05__LCD_D13             MXS_IOMUX_PAD_NAKED(0,  5, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D06__LCD_D14             MXS_IOMUX_PAD_NAKED(0,  6, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D07__LCD_D15             MXS_IOMUX_PAD_NAKED(0,  7, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D08__LCD_D18             MXS_IOMUX_PAD_NAKED(0,  8, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D09__LCD_D19             MXS_IOMUX_PAD_NAKED(0,  9, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D10__LCD_D20             MXS_IOMUX_PAD_NAKED(0, 10, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D11__LCD_D21             MXS_IOMUX_PAD_NAKED(0, 11, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D12__LCD_D22             MXS_IOMUX_PAD_NAKED(0, 12, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D13__LCD_D23             MXS_IOMUX_PAD_NAKED(0, 13, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D14__AUART2_RX           MXS_IOMUX_PAD_NAKED(0, 14, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_D15__AUART2_TX           MXS_IOMUX_PAD_NAKED(0, 15, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_CLE__LCD_D16             MXS_IOMUX_PAD_NAKED(0, 16, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_ALE__LCD_D17             MXS_IOMUX_PAD_NAKED(0, 17, PAD_MUXSEL_1)
-#define MX23_PAD_GPMI_CE2N__ATA_A2             MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_1)
-#define MX23_PAD_AUART1_RTS__IR_CLK            MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_1)
-#define MX23_PAD_AUART1_RX__IR_RX              MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_1)
-#define MX23_PAD_AUART1_TX__IR_TX              MXS_IOMUX_PAD_NAKED(0, 29, PAD_MUXSEL_1)
-#define MX23_PAD_I2C_SCL__GPMI_RDY2            MXS_IOMUX_PAD_NAKED(0, 30, PAD_MUXSEL_1)
-#define MX23_PAD_I2C_SDA__GPMI_CE2N            MXS_IOMUX_PAD_NAKED(0, 31, PAD_MUXSEL_1)
-
-#define MX23_PAD_LCD_D00__ETM_DA8              MXS_IOMUX_PAD_NAKED(1,  0, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D01__ETM_DA9              MXS_IOMUX_PAD_NAKED(1,  1, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D02__ETM_DA10             MXS_IOMUX_PAD_NAKED(1,  2, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D03__ETM_DA11             MXS_IOMUX_PAD_NAKED(1,  3, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D04__ETM_DA12             MXS_IOMUX_PAD_NAKED(1,  4, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D05__ETM_DA13             MXS_IOMUX_PAD_NAKED(1,  5, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D06__ETM_DA14             MXS_IOMUX_PAD_NAKED(1,  6, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D07__ETM_DA15             MXS_IOMUX_PAD_NAKED(1,  7, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D08__ETM_DA0              MXS_IOMUX_PAD_NAKED(1,  8, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D09__ETM_DA1              MXS_IOMUX_PAD_NAKED(1,  9, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D10__ETM_DA2              MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D11__ETM_DA3              MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D12__ETM_DA4              MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D13__ETM_DA5              MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D14__ETM_DA6              MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_D15__ETM_DA7              MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_RESET__ETM_TCTL           MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_RS__ETM_TCLK              MXS_IOMUX_PAD_NAKED(1, 19, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_DOTCK__GPMI_RDY3          MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_ENABLE__I2C_SCL           MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_HSYNC__I2C_SDA            MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_1)
-#define MX23_PAD_LCD_VSYNC__LCD_BUSY           MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_1)
-#define MX23_PAD_PWM0__ROTARYA                 MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_1)
-#define MX23_PAD_PWM1__ROTARYB                 MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_1)
-#define MX23_PAD_PWM2__GPMI_RDY3               MXS_IOMUX_PAD_NAKED(1, 28, PAD_MUXSEL_1)
-#define MX23_PAD_PWM3__ETM_TCTL                        MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_1)
-#define MX23_PAD_PWM4__ETM_TCLK                        MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_1)
-
-#define MX23_PAD_SSP1_DETECT__GPMI_CE3N                MXS_IOMUX_PAD_NAKED(2,  1, PAD_MUXSEL_1)
-#define MX23_PAD_SSP1_DATA1__I2C_SCL           MXS_IOMUX_PAD_NAKED(2,  3, PAD_MUXSEL_1)
-#define MX23_PAD_SSP1_DATA2__I2C_SDA           MXS_IOMUX_PAD_NAKED(2,  4, PAD_MUXSEL_1)
-#define MX23_PAD_ROTARYA__AUART2_RTS           MXS_IOMUX_PAD_NAKED(2,  7, PAD_MUXSEL_1)
-#define MX23_PAD_ROTARYB__AUART2_CTS           MXS_IOMUX_PAD_NAKED(2,  8, PAD_MUXSEL_1)
-
-/* MUXSEL_2 */
-#define MX23_PAD_GPMI_D00__SSP2_DATA0          MXS_IOMUX_PAD_NAKED(0,  0, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D01__SSP2_DATA1          MXS_IOMUX_PAD_NAKED(0,  1, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D02__SSP2_DATA2          MXS_IOMUX_PAD_NAKED(0,  2, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D03__SSP2_DATA3          MXS_IOMUX_PAD_NAKED(0,  3, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D04__SSP2_DATA4          MXS_IOMUX_PAD_NAKED(0,  4, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D05__SSP2_DATA5          MXS_IOMUX_PAD_NAKED(0,  5, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D06__SSP2_DATA6          MXS_IOMUX_PAD_NAKED(0,  6, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D07__SSP2_DATA7          MXS_IOMUX_PAD_NAKED(0,  7, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D08__SSP1_DATA4          MXS_IOMUX_PAD_NAKED(0,  8, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D09__SSP1_DATA5          MXS_IOMUX_PAD_NAKED(0,  9, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D10__SSP1_DATA6          MXS_IOMUX_PAD_NAKED(0, 10, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D11__SSP1_DATA7          MXS_IOMUX_PAD_NAKED(0, 11, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_D15__GPMI_CE3N           MXS_IOMUX_PAD_NAKED(0, 15, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_RDY0__SSP2_DETECT                MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_RDY1__SSP2_CMD           MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_2)
-#define MX23_PAD_GPMI_WRN__SSP2_SCK            MXS_IOMUX_PAD_NAKED(0, 24, PAD_MUXSEL_2)
-#define MX23_PAD_AUART1_CTS__SSP1_DATA4                MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_2)
-#define MX23_PAD_AUART1_RTS__SSP1_DATA5                MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_2)
-#define MX23_PAD_AUART1_RX__SSP1_DATA6         MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_2)
-#define MX23_PAD_AUART1_TX__SSP1_DATA7         MXS_IOMUX_PAD_NAKED(0, 29, PAD_MUXSEL_2)
-#define MX23_PAD_I2C_SCL__AUART1_TX            MXS_IOMUX_PAD_NAKED(0, 30, PAD_MUXSEL_2)
-#define MX23_PAD_I2C_SDA__AUART1_RX            MXS_IOMUX_PAD_NAKED(0, 31, PAD_MUXSEL_2)
-
-#define MX23_PAD_LCD_D08__SAIF2_SDATA0         MXS_IOMUX_PAD_NAKED(1,  8, PAD_MUXSEL_2)
-#define MX23_PAD_LCD_D09__SAIF1_SDATA0         MXS_IOMUX_PAD_NAKED(1,  9, PAD_MUXSEL_2)
-#define MX23_PAD_LCD_D10__SAIF_MCLK_BITCLK     MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_2)
-#define MX23_PAD_LCD_D11__SAIF_LRCLK           MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_2)
-#define MX23_PAD_LCD_D12__SAIF2_SDATA1         MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_2)
-#define MX23_PAD_LCD_D13__SAIF2_SDATA2         MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_2)
-#define MX23_PAD_LCD_D14__SAIF1_SDATA2         MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_2)
-#define MX23_PAD_LCD_D15__SAIF1_SDATA1         MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_2)
-#define MX23_PAD_LCD_D16__SAIF_ALT_BITCLK      MXS_IOMUX_PAD_NAKED(1, 16, PAD_MUXSEL_2)
-#define MX23_PAD_LCD_RESET__GPMI_CE3N          MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_2)
-#define MX23_PAD_PWM0__DUART_RX                        MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_2)
-#define MX23_PAD_PWM1__DUART_TX                        MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_2)
-#define MX23_PAD_PWM3__AUART1_CTS              MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_2)
-#define MX23_PAD_PWM4__AUART1_RTS              MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_2)
-
-#define MX23_PAD_SSP1_CMD__JTAG_TDO            MXS_IOMUX_PAD_NAKED(2,  0, PAD_MUXSEL_2)
-#define MX23_PAD_SSP1_DETECT__USB_OTG_ID       MXS_IOMUX_PAD_NAKED(2,  1, PAD_MUXSEL_2)
-#define MX23_PAD_SSP1_DATA0__JTAG_TDI          MXS_IOMUX_PAD_NAKED(2,  2, PAD_MUXSEL_2)
-#define MX23_PAD_SSP1_DATA1__JTAG_TCLK         MXS_IOMUX_PAD_NAKED(2,  3, PAD_MUXSEL_2)
-#define MX23_PAD_SSP1_DATA2__JTAG_RTCK         MXS_IOMUX_PAD_NAKED(2,  4, PAD_MUXSEL_2)
-#define MX23_PAD_SSP1_DATA3__JTAG_TMS          MXS_IOMUX_PAD_NAKED(2,  5, PAD_MUXSEL_2)
-#define MX23_PAD_SSP1_SCK__JTAG_TRST           MXS_IOMUX_PAD_NAKED(2,  6, PAD_MUXSEL_2)
-#define MX23_PAD_ROTARYA__SPDIF                        MXS_IOMUX_PAD_NAKED(2,  7, PAD_MUXSEL_2)
-#define MX23_PAD_ROTARYB__GPMI_CE3N            MXS_IOMUX_PAD_NAKED(2,  8, PAD_MUXSEL_2)
-
-/* MUXSEL_GPIO */
-#define MX23_PAD_GPMI_D00__GPIO_0_0            MXS_IOMUX_PAD_NAKED(0,  0, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D01__GPIO_0_1            MXS_IOMUX_PAD_NAKED(0,  1, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D02__GPIO_0_2            MXS_IOMUX_PAD_NAKED(0,  2, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D03__GPIO_0_3            MXS_IOMUX_PAD_NAKED(0,  3, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D04__GPIO_0_4            MXS_IOMUX_PAD_NAKED(0,  4, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D05__GPIO_0_5            MXS_IOMUX_PAD_NAKED(0,  5, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D06__GPIO_0_6            MXS_IOMUX_PAD_NAKED(0,  6, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D07__GPIO_0_7            MXS_IOMUX_PAD_NAKED(0,  7, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D08__GPIO_0_8            MXS_IOMUX_PAD_NAKED(0,  8, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D09__GPIO_0_9            MXS_IOMUX_PAD_NAKED(0,  9, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D10__GPIO_0_10           MXS_IOMUX_PAD_NAKED(0, 10, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D11__GPIO_0_11           MXS_IOMUX_PAD_NAKED(0, 11, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D12__GPIO_0_12           MXS_IOMUX_PAD_NAKED(0, 12, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D13__GPIO_0_13           MXS_IOMUX_PAD_NAKED(0, 13, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D14__GPIO_0_14           MXS_IOMUX_PAD_NAKED(0, 14, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_D15__GPIO_0_15           MXS_IOMUX_PAD_NAKED(0, 15, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_CLE__GPIO_0_16           MXS_IOMUX_PAD_NAKED(0, 16, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_ALE__GPIO_0_17           MXS_IOMUX_PAD_NAKED(0, 17, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_CE2N__GPIO_0_18          MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_RDY0__GPIO_0_19          MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_RDY1__GPIO_0_20          MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_RDY2__GPIO_0_21          MXS_IOMUX_PAD_NAKED(0, 21, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_RDY3__GPIO_0_22          MXS_IOMUX_PAD_NAKED(0, 22, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_WPN__GPIO_0_23           MXS_IOMUX_PAD_NAKED(0, 23, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_WRN__GPIO_0_24           MXS_IOMUX_PAD_NAKED(0, 24, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_RDN__GPIO_0_25           MXS_IOMUX_PAD_NAKED(0, 25, PAD_MUXSEL_GPIO)
-#define MX23_PAD_AUART1_CTS__GPIO_0_26         MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_GPIO)
-#define MX23_PAD_AUART1_RTS__GPIO_0_27         MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_GPIO)
-#define MX23_PAD_AUART1_RX__GPIO_0_28          MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_GPIO)
-#define MX23_PAD_AUART1_TX__GPIO_0_29          MXS_IOMUX_PAD_NAKED(0, 29, PAD_MUXSEL_GPIO)
-#define MX23_PAD_I2C_SCL__GPIO_0_30            MXS_IOMUX_PAD_NAKED(0, 30, PAD_MUXSEL_GPIO)
-#define MX23_PAD_I2C_SDA__GPIO_0_31            MXS_IOMUX_PAD_NAKED(0, 31, PAD_MUXSEL_GPIO)
-
-#define MX23_PAD_LCD_D00__GPIO_1_0             MXS_IOMUX_PAD_NAKED(1,  0, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D01__GPIO_1_1             MXS_IOMUX_PAD_NAKED(1,  1, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D02__GPIO_1_2             MXS_IOMUX_PAD_NAKED(1,  2, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D03__GPIO_1_3             MXS_IOMUX_PAD_NAKED(1,  3, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D04__GPIO_1_4             MXS_IOMUX_PAD_NAKED(1,  4, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D05__GPIO_1_5             MXS_IOMUX_PAD_NAKED(1,  5, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D06__GPIO_1_6             MXS_IOMUX_PAD_NAKED(1,  6, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D07__GPIO_1_7             MXS_IOMUX_PAD_NAKED(1,  7, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D08__GPIO_1_8             MXS_IOMUX_PAD_NAKED(1,  8, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D09__GPIO_1_9             MXS_IOMUX_PAD_NAKED(1,  9, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D10__GPIO_1_10            MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D11__GPIO_1_11            MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D12__GPIO_1_12            MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D13__GPIO_1_13            MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D14__GPIO_1_14            MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D15__GPIO_1_15            MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D16__GPIO_1_16            MXS_IOMUX_PAD_NAKED(1, 16, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_D17__GPIO_1_17            MXS_IOMUX_PAD_NAKED(1, 17, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_RESET__GPIO_1_18          MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_RS__GPIO_1_19             MXS_IOMUX_PAD_NAKED(1, 19, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_WR__GPIO_1_20             MXS_IOMUX_PAD_NAKED(1, 20, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_CS__GPIO_1_21             MXS_IOMUX_PAD_NAKED(1, 21, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_DOTCK__GPIO_1_22          MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_ENABLE__GPIO_1_23         MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_HSYNC__GPIO_1_24          MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_GPIO)
-#define MX23_PAD_LCD_VSYNC__GPIO_1_25          MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_GPIO)
-#define MX23_PAD_PWM0__GPIO_1_26               MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_GPIO)
-#define MX23_PAD_PWM1__GPIO_1_27               MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_GPIO)
-#define MX23_PAD_PWM2__GPIO_1_28               MXS_IOMUX_PAD_NAKED(1, 28, PAD_MUXSEL_GPIO)
-#define MX23_PAD_PWM3__GPIO_1_29               MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_GPIO)
-#define MX23_PAD_PWM4__GPIO_1_30               MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_GPIO)
-
-#define MX23_PAD_SSP1_CMD__GPIO_2_0            MXS_IOMUX_PAD_NAKED(2,  0, PAD_MUXSEL_GPIO)
-#define MX23_PAD_SSP1_DETECT__GPIO_2_1         MXS_IOMUX_PAD_NAKED(2,  1, PAD_MUXSEL_GPIO)
-#define MX23_PAD_SSP1_DATA0__GPIO_2_2          MXS_IOMUX_PAD_NAKED(2,  2, PAD_MUXSEL_GPIO)
-#define MX23_PAD_SSP1_DATA1__GPIO_2_3          MXS_IOMUX_PAD_NAKED(2,  3, PAD_MUXSEL_GPIO)
-#define MX23_PAD_SSP1_DATA2__GPIO_2_4          MXS_IOMUX_PAD_NAKED(2,  4, PAD_MUXSEL_GPIO)
-#define MX23_PAD_SSP1_DATA3__GPIO_2_5          MXS_IOMUX_PAD_NAKED(2,  5, PAD_MUXSEL_GPIO)
-#define MX23_PAD_SSP1_SCK__GPIO_2_6            MXS_IOMUX_PAD_NAKED(2,  6, PAD_MUXSEL_GPIO)
-#define MX23_PAD_ROTARYA__GPIO_2_7             MXS_IOMUX_PAD_NAKED(2,  7, PAD_MUXSEL_GPIO)
-#define MX23_PAD_ROTARYB__GPIO_2_8             MXS_IOMUX_PAD_NAKED(2,  8, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A00__GPIO_2_9             MXS_IOMUX_PAD_NAKED(2,  9, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A01__GPIO_2_10            MXS_IOMUX_PAD_NAKED(2, 10, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A02__GPIO_2_11            MXS_IOMUX_PAD_NAKED(2, 11, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A03__GPIO_2_12            MXS_IOMUX_PAD_NAKED(2, 12, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A04__GPIO_2_13            MXS_IOMUX_PAD_NAKED(2, 13, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A05__GPIO_2_14            MXS_IOMUX_PAD_NAKED(2, 14, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A06__GPIO_2_15            MXS_IOMUX_PAD_NAKED(2, 15, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A07__GPIO_2_16            MXS_IOMUX_PAD_NAKED(2, 16, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A08__GPIO_2_17            MXS_IOMUX_PAD_NAKED(2, 17, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A09__GPIO_2_18            MXS_IOMUX_PAD_NAKED(2, 18, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A10__GPIO_2_19            MXS_IOMUX_PAD_NAKED(2, 19, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A11__GPIO_2_20            MXS_IOMUX_PAD_NAKED(2, 20, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_A12__GPIO_2_21            MXS_IOMUX_PAD_NAKED(2, 21, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_BA0__GPIO_2_22            MXS_IOMUX_PAD_NAKED(2, 22, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_BA1__GPIO_2_23            MXS_IOMUX_PAD_NAKED(2, 23, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_CASN__GPIO_2_24           MXS_IOMUX_PAD_NAKED(2, 24, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_CE0N__GPIO_2_25           MXS_IOMUX_PAD_NAKED(2, 25, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_CE1N__GPIO_2_26           MXS_IOMUX_PAD_NAKED(2, 26, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_CE1N__GPIO_2_27          MXS_IOMUX_PAD_NAKED(2, 27, PAD_MUXSEL_GPIO)
-#define MX23_PAD_GPMI_CE0N__GPIO_2_28          MXS_IOMUX_PAD_NAKED(2, 28, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_CKE__GPIO_2_29            MXS_IOMUX_PAD_NAKED(2, 29, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_RASN__GPIO_2_30           MXS_IOMUX_PAD_NAKED(2, 30, PAD_MUXSEL_GPIO)
-#define MX23_PAD_EMI_WEN__GPIO_2_31            MXS_IOMUX_PAD_NAKED(2, 31, PAD_MUXSEL_GPIO)
-
-#endif /* __MACH_IOMUX_MX23_H__ */
diff --git a/arch/arm/mach-mxs/include/mach/iomux-mx28.h b/arch/arm/mach-mxs/include/mach/iomux-mx28.h
deleted file mode 100644 (file)
index f50fefd..0000000
+++ /dev/null
@@ -1,537 +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_MX28_H__
-#define __MACH_IOMUX_MX28_H__
-
-#include <mach/iomux.h>
-
-/*
- * The naming convention for the pad modes is MX28_PAD_<padname>__<padmode>
- * If <padname> or <padmode> refers to a GPIO, it is named GPIO_<unit>_<num>
- * See also iomux.h
- *
- *                                                                     BANK    PIN     MUX
- */
-/* MUXSEL_0 */
-#define MX28_PAD_GPMI_D00__GPMI_D0                     MXS_IOMUX_PAD_NAKED(0,  0, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_D01__GPMI_D1                     MXS_IOMUX_PAD_NAKED(0,  1, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_D02__GPMI_D2                     MXS_IOMUX_PAD_NAKED(0,  2, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_D03__GPMI_D3                     MXS_IOMUX_PAD_NAKED(0,  3, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_D04__GPMI_D4                     MXS_IOMUX_PAD_NAKED(0,  4, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_D05__GPMI_D5                     MXS_IOMUX_PAD_NAKED(0,  5, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_D06__GPMI_D6                     MXS_IOMUX_PAD_NAKED(0,  6, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_D07__GPMI_D7                     MXS_IOMUX_PAD_NAKED(0,  7, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_CE0N__GPMI_CE0N                  MXS_IOMUX_PAD_NAKED(0, 16, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_CE1N__GPMI_CE1N                  MXS_IOMUX_PAD_NAKED(0, 17, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_CE2N__GPMI_CE2N                  MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_CE3N__GPMI_CE3N                  MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_RDY0__GPMI_READY0                        MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_RDY1__GPMI_READY1                        MXS_IOMUX_PAD_NAKED(0, 21, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_RDY2__GPMI_READY2                        MXS_IOMUX_PAD_NAKED(0, 22, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_RDY3__GPMI_READY3                        MXS_IOMUX_PAD_NAKED(0, 23, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_RDN__GPMI_RDN                    MXS_IOMUX_PAD_NAKED(0, 24, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_WRN__GPMI_WRN                    MXS_IOMUX_PAD_NAKED(0, 25, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_ALE__GPMI_ALE                    MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_CLE__GPMI_CLE                    MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_0)
-#define MX28_PAD_GPMI_RESETN__GPMI_RESETN              MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_0)
-
-#define MX28_PAD_LCD_D00__LCD_D0                       MXS_IOMUX_PAD_NAKED(1,  0, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D01__LCD_D1                       MXS_IOMUX_PAD_NAKED(1,  1, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D02__LCD_D2                       MXS_IOMUX_PAD_NAKED(1,  2, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D03__LCD_D3                       MXS_IOMUX_PAD_NAKED(1,  3, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D04__LCD_D4                       MXS_IOMUX_PAD_NAKED(1,  4, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D05__LCD_D5                       MXS_IOMUX_PAD_NAKED(1,  5, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D06__LCD_D6                       MXS_IOMUX_PAD_NAKED(1,  6, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D07__LCD_D7                       MXS_IOMUX_PAD_NAKED(1,  7, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D08__LCD_D8                       MXS_IOMUX_PAD_NAKED(1,  8, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D09__LCD_D9                       MXS_IOMUX_PAD_NAKED(1,  9, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D10__LCD_D10                      MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D11__LCD_D11                      MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D12__LCD_D12                      MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D13__LCD_D13                      MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D14__LCD_D14                      MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D15__LCD_D15                      MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D16__LCD_D16                      MXS_IOMUX_PAD_NAKED(1, 16, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D17__LCD_D17                      MXS_IOMUX_PAD_NAKED(1, 17, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D18__LCD_D18                      MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D19__LCD_D19                      MXS_IOMUX_PAD_NAKED(1, 19, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D20__LCD_D20                      MXS_IOMUX_PAD_NAKED(1, 20, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D21__LCD_D21                      MXS_IOMUX_PAD_NAKED(1, 21, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D22__LCD_D22                      MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_D23__LCD_D23                      MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_RD_E__LCD_RD_E                    MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_WR_RWN__LCD_WR_RWN                        MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_RS__LCD_RS                                MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_CS__LCD_CS                                MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_VSYNC__LCD_VSYNC                  MXS_IOMUX_PAD_NAKED(1, 28, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_HSYNC__LCD_HSYNC                  MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_DOTCLK__LCD_DOTCLK                        MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_ENABLE__LCD_ENABLE                        MXS_IOMUX_PAD_NAKED(1, 31, PAD_MUXSEL_0)
-
-#define MX28_PAD_SSP0_DATA0__SSP0_D0                   MXS_IOMUX_PAD_NAKED(2,  0, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_DATA1__SSP0_D1                   MXS_IOMUX_PAD_NAKED(2,  1, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_DATA2__SSP0_D2                   MXS_IOMUX_PAD_NAKED(2,  2, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_DATA3__SSP0_D3                   MXS_IOMUX_PAD_NAKED(2,  3, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_DATA4__SSP0_D4                   MXS_IOMUX_PAD_NAKED(2,  4, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_DATA5__SSP0_D5                   MXS_IOMUX_PAD_NAKED(2,  5, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_DATA6__SSP0_D6                   MXS_IOMUX_PAD_NAKED(2,  6, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_DATA7__SSP0_D7                   MXS_IOMUX_PAD_NAKED(2,  7, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_CMD__SSP0_CMD                    MXS_IOMUX_PAD_NAKED(2,  8, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT         MXS_IOMUX_PAD_NAKED(2,  9, PAD_MUXSEL_0)
-#define MX28_PAD_SSP0_SCK__SSP0_SCK                    MXS_IOMUX_PAD_NAKED(2, 10, PAD_MUXSEL_0)
-#define MX28_PAD_SSP1_SCK__SSP1_SCK                    MXS_IOMUX_PAD_NAKED(2, 12, PAD_MUXSEL_0)
-#define MX28_PAD_SSP1_CMD__SSP1_CMD                    MXS_IOMUX_PAD_NAKED(2, 13, PAD_MUXSEL_0)
-#define MX28_PAD_SSP1_DATA0__SSP1_D0                   MXS_IOMUX_PAD_NAKED(2, 14, PAD_MUXSEL_0)
-#define MX28_PAD_SSP1_DATA3__SSP1_D3                   MXS_IOMUX_PAD_NAKED(2, 15, PAD_MUXSEL_0)
-#define MX28_PAD_SSP2_SCK__SSP2_SCK                    MXS_IOMUX_PAD_NAKED(2, 16, PAD_MUXSEL_0)
-#define MX28_PAD_SSP2_MOSI__SSP2_CMD                   MXS_IOMUX_PAD_NAKED(2, 17, PAD_MUXSEL_0)
-#define MX28_PAD_SSP2_MISO__SSP2_D0                    MXS_IOMUX_PAD_NAKED(2, 18, PAD_MUXSEL_0)
-#define MX28_PAD_SSP2_SS0__SSP2_D3                     MXS_IOMUX_PAD_NAKED(2, 19, PAD_MUXSEL_0)
-#define MX28_PAD_SSP2_SS1__SSP2_D4                     MXS_IOMUX_PAD_NAKED(2, 20, PAD_MUXSEL_0)
-#define MX28_PAD_SSP2_SS2__SSP2_D5                     MXS_IOMUX_PAD_NAKED(2, 21, PAD_MUXSEL_0)
-#define MX28_PAD_SSP3_SCK__SSP3_SCK                    MXS_IOMUX_PAD_NAKED(2, 24, PAD_MUXSEL_0)
-#define MX28_PAD_SSP3_MOSI__SSP3_CMD                   MXS_IOMUX_PAD_NAKED(2, 25, PAD_MUXSEL_0)
-#define MX28_PAD_SSP3_MISO__SSP3_D0                    MXS_IOMUX_PAD_NAKED(2, 26, PAD_MUXSEL_0)
-#define MX28_PAD_SSP3_SS0__SSP3_D3                     MXS_IOMUX_PAD_NAKED(2, 27, PAD_MUXSEL_0)
-
-#define MX28_PAD_AUART0_RX__AUART0_RX                  MXS_IOMUX_PAD_NAKED(3,  0, PAD_MUXSEL_0)
-#define MX28_PAD_AUART0_TX__AUART0_TX                  MXS_IOMUX_PAD_NAKED(3,  1, PAD_MUXSEL_0)
-#define MX28_PAD_AUART0_CTS__AUART0_CTS                        MXS_IOMUX_PAD_NAKED(3,  2, PAD_MUXSEL_0)
-#define MX28_PAD_AUART0_RTS__AUART0_RTS                        MXS_IOMUX_PAD_NAKED(3,  3, PAD_MUXSEL_0)
-#define MX28_PAD_AUART1_RX__AUART1_RX                  MXS_IOMUX_PAD_NAKED(3,  4, PAD_MUXSEL_0)
-#define MX28_PAD_AUART1_TX__AUART1_TX                  MXS_IOMUX_PAD_NAKED(3,  5, PAD_MUXSEL_0)
-#define MX28_PAD_AUART1_CTS__AUART1_CTS                        MXS_IOMUX_PAD_NAKED(3,  6, PAD_MUXSEL_0)
-#define MX28_PAD_AUART1_RTS__AUART1_RTS                        MXS_IOMUX_PAD_NAKED(3,  7, PAD_MUXSEL_0)
-#define MX28_PAD_AUART2_RX__AUART2_RX                  MXS_IOMUX_PAD_NAKED(3,  8, PAD_MUXSEL_0)
-#define MX28_PAD_AUART2_TX__AUART2_TX                  MXS_IOMUX_PAD_NAKED(3,  9, PAD_MUXSEL_0)
-#define MX28_PAD_AUART2_CTS__AUART2_CTS                        MXS_IOMUX_PAD_NAKED(3, 10, PAD_MUXSEL_0)
-#define MX28_PAD_AUART2_RTS__AUART2_RTS                        MXS_IOMUX_PAD_NAKED(3, 11, PAD_MUXSEL_0)
-#define MX28_PAD_AUART3_RX__AUART3_RX                  MXS_IOMUX_PAD_NAKED(3, 12, PAD_MUXSEL_0)
-#define MX28_PAD_AUART3_TX__AUART3_TX                  MXS_IOMUX_PAD_NAKED(3, 13, PAD_MUXSEL_0)
-#define MX28_PAD_AUART3_CTS__AUART3_CTS                        MXS_IOMUX_PAD_NAKED(3, 14, PAD_MUXSEL_0)
-#define MX28_PAD_AUART3_RTS__AUART3_RTS                        MXS_IOMUX_PAD_NAKED(3, 15, PAD_MUXSEL_0)
-#define MX28_PAD_PWM0__PWM_0                           MXS_IOMUX_PAD_NAKED(3, 16, PAD_MUXSEL_0)
-#define MX28_PAD_PWM1__PWM_1                           MXS_IOMUX_PAD_NAKED(3, 17, PAD_MUXSEL_0)
-#define MX28_PAD_PWM2__PWM_2                           MXS_IOMUX_PAD_NAKED(3, 18, PAD_MUXSEL_0)
-#define MX28_PAD_SAIF0_MCLK__SAIF0_MCLK                        MXS_IOMUX_PAD_NAKED(3, 20, PAD_MUXSEL_0)
-#define MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK              MXS_IOMUX_PAD_NAKED(3, 21, PAD_MUXSEL_0)
-#define MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK            MXS_IOMUX_PAD_NAKED(3, 22, PAD_MUXSEL_0)
-#define MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0            MXS_IOMUX_PAD_NAKED(3, 23, PAD_MUXSEL_0)
-#define MX28_PAD_I2C0_SCL__I2C0_SCL                    MXS_IOMUX_PAD_NAKED(3, 24, PAD_MUXSEL_0)
-#define MX28_PAD_I2C0_SDA__I2C0_SDA                    MXS_IOMUX_PAD_NAKED(3, 25, PAD_MUXSEL_0)
-#define MX28_PAD_SAIF1_SDATA0__SAIF1_SDATA0            MXS_IOMUX_PAD_NAKED(3, 26, PAD_MUXSEL_0)
-#define MX28_PAD_SPDIF__SPDIF_TX                       MXS_IOMUX_PAD_NAKED(3, 27, PAD_MUXSEL_0)
-#define MX28_PAD_PWM3__PWM_3                           MXS_IOMUX_PAD_NAKED(3, 28, PAD_MUXSEL_0)
-#define MX28_PAD_PWM4__PWM_4                           MXS_IOMUX_PAD_NAKED(3, 29, PAD_MUXSEL_0)
-#define MX28_PAD_LCD_RESET__LCD_RESET                  MXS_IOMUX_PAD_NAKED(3, 30, PAD_MUXSEL_0)
-
-#define MX28_PAD_ENET0_MDC__ENET0_MDC                  MXS_IOMUX_PAD_NAKED(4,  0, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_MDIO__ENET0_MDIO                        MXS_IOMUX_PAD_NAKED(4,  1, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_RX_EN__ENET0_RX_EN              MXS_IOMUX_PAD_NAKED(4,  2, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_RXD0__ENET0_RXD0                        MXS_IOMUX_PAD_NAKED(4,  3, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_RXD1__ENET0_RXD1                        MXS_IOMUX_PAD_NAKED(4,  4, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_TX_CLK__ENET0_TX_CLK            MXS_IOMUX_PAD_NAKED(4,  5, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_TX_EN__ENET0_TX_EN              MXS_IOMUX_PAD_NAKED(4,  6, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_TXD0__ENET0_TXD0                        MXS_IOMUX_PAD_NAKED(4,  7, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_TXD1__ENET0_TXD1                        MXS_IOMUX_PAD_NAKED(4,  8, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_RXD2__ENET0_RXD2                        MXS_IOMUX_PAD_NAKED(4,  9, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_RXD3__ENET0_RXD3                        MXS_IOMUX_PAD_NAKED(4, 10, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_TXD2__ENET0_TXD2                        MXS_IOMUX_PAD_NAKED(4, 11, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_TXD3__ENET0_TXD3                        MXS_IOMUX_PAD_NAKED(4, 12, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_RX_CLK__ENET0_RX_CLK            MXS_IOMUX_PAD_NAKED(4, 13, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_COL__ENET0_COL                  MXS_IOMUX_PAD_NAKED(4, 14, PAD_MUXSEL_0)
-#define MX28_PAD_ENET0_CRS__ENET0_CRS                  MXS_IOMUX_PAD_NAKED(4, 15, PAD_MUXSEL_0)
-#define MX28_PAD_ENET_CLK__CLKCTRL_ENET                        MXS_IOMUX_PAD_NAKED(4, 16, PAD_MUXSEL_0)
-#define MX28_PAD_JTAG_RTCK__JTAG_RTCK                  MXS_IOMUX_PAD_NAKED(4, 20, PAD_MUXSEL_0)
-
-#define MX28_PAD_EMI_D00__EMI_DATA0                    MXS_IOMUX_PAD_NAKED(5,  0, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D01__EMI_DATA1                    MXS_IOMUX_PAD_NAKED(5,  1, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D02__EMI_DATA2                    MXS_IOMUX_PAD_NAKED(5,  2, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D03__EMI_DATA3                    MXS_IOMUX_PAD_NAKED(5,  3, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D04__EMI_DATA4                    MXS_IOMUX_PAD_NAKED(5,  4, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D05__EMI_DATA5                    MXS_IOMUX_PAD_NAKED(5,  5, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D06__EMI_DATA6                    MXS_IOMUX_PAD_NAKED(5,  6, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D07__EMI_DATA7                    MXS_IOMUX_PAD_NAKED(5,  7, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D08__EMI_DATA8                    MXS_IOMUX_PAD_NAKED(5,  8, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D09__EMI_DATA9                    MXS_IOMUX_PAD_NAKED(5,  9, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D10__EMI_DATA10                   MXS_IOMUX_PAD_NAKED(5, 10, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D11__EMI_DATA11                   MXS_IOMUX_PAD_NAKED(5, 11, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D12__EMI_DATA12                   MXS_IOMUX_PAD_NAKED(5, 12, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D13__EMI_DATA13                   MXS_IOMUX_PAD_NAKED(5, 13, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D14__EMI_DATA14                   MXS_IOMUX_PAD_NAKED(5, 14, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_D15__EMI_DATA15                   MXS_IOMUX_PAD_NAKED(5, 15, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_ODT0__EMI_ODT0                    MXS_IOMUX_PAD_NAKED(5, 16, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_DQM0__EMI_DQM0                    MXS_IOMUX_PAD_NAKED(5, 17, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_ODT1__EMI_ODT1                    MXS_IOMUX_PAD_NAKED(5, 18, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_DQM1__EMI_DQM1                    MXS_IOMUX_PAD_NAKED(5, 19, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_DDR_OPEN_FB__EMI_DDR_OPEN_FEEDBACK        MXS_IOMUX_PAD_NAKED(5, 20, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_CLK__EMI_CLK                      MXS_IOMUX_PAD_NAKED(5, 21, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_DQS0__EMI_DQS0                    MXS_IOMUX_PAD_NAKED(5, 22, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_DQS1__EMI_DQS1                    MXS_IOMUX_PAD_NAKED(5, 23, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_DDR_OPEN__EMI_DDR_OPEN            MXS_IOMUX_PAD_NAKED(5, 26, PAD_MUXSEL_0)
-
-#define MX28_PAD_EMI_A00__EMI_ADDR0                    MXS_IOMUX_PAD_NAKED(6,  0, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A01__EMI_ADDR1                    MXS_IOMUX_PAD_NAKED(6,  1, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A02__EMI_ADDR2                    MXS_IOMUX_PAD_NAKED(6,  2, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A03__EMI_ADDR3                    MXS_IOMUX_PAD_NAKED(6,  3, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A04__EMI_ADDR4                    MXS_IOMUX_PAD_NAKED(6,  4, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A05__EMI_ADDR5                    MXS_IOMUX_PAD_NAKED(6,  5, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A06__EMI_ADDR6                    MXS_IOMUX_PAD_NAKED(6,  6, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A07__EMI_ADDR7                    MXS_IOMUX_PAD_NAKED(6,  7, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A08__EMI_ADDR8                    MXS_IOMUX_PAD_NAKED(6,  8, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A09__EMI_ADDR9                    MXS_IOMUX_PAD_NAKED(6,  9, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A10__EMI_ADDR10                   MXS_IOMUX_PAD_NAKED(6, 10, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A11__EMI_ADDR11                   MXS_IOMUX_PAD_NAKED(6, 11, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A12__EMI_ADDR12                   MXS_IOMUX_PAD_NAKED(6, 12, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A13__EMI_ADDR13                   MXS_IOMUX_PAD_NAKED(6, 13, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_A14__EMI_ADDR14                   MXS_IOMUX_PAD_NAKED(6, 14, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_BA0__EMI_BA0                      MXS_IOMUX_PAD_NAKED(6, 16, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_BA1__EMI_BA1                      MXS_IOMUX_PAD_NAKED(6, 17, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_BA2__EMI_BA2                      MXS_IOMUX_PAD_NAKED(6, 18, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_CASN__EMI_CASN                    MXS_IOMUX_PAD_NAKED(6, 19, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_RASN__EMI_RASN                    MXS_IOMUX_PAD_NAKED(6, 20, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_WEN__EMI_WEN                      MXS_IOMUX_PAD_NAKED(6, 21, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_CE0N__EMI_CE0N                    MXS_IOMUX_PAD_NAKED(6, 22, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_CE1N__EMI_CE1N                    MXS_IOMUX_PAD_NAKED(6, 23, PAD_MUXSEL_0)
-#define MX28_PAD_EMI_CKE__EMI_CKE                      MXS_IOMUX_PAD_NAKED(6, 24, PAD_MUXSEL_0)
-
-/* MUXSEL_1 */
-#define MX28_PAD_GPMI_D00__SSP1_D0                     MXS_IOMUX_PAD_NAKED(0,  0, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_D01__SSP1_D1                     MXS_IOMUX_PAD_NAKED(0,  1, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_D02__SSP1_D2                     MXS_IOMUX_PAD_NAKED(0,  2, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_D03__SSP1_D3                     MXS_IOMUX_PAD_NAKED(0,  3, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_D04__SSP1_D4                     MXS_IOMUX_PAD_NAKED(0,  4, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_D05__SSP1_D5                     MXS_IOMUX_PAD_NAKED(0,  5, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_D06__SSP1_D6                     MXS_IOMUX_PAD_NAKED(0,  6, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_D07__SSP1_D7                     MXS_IOMUX_PAD_NAKED(0,  7, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_CE0N__SSP3_D0                    MXS_IOMUX_PAD_NAKED(0, 16, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_CE1N__SSP3_D3                    MXS_IOMUX_PAD_NAKED(0, 17, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_CE2N__CAN1_TX                    MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_CE3N__CAN1_RX                    MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_RDY0__SSP1_CARD_DETECT           MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_RDY1__SSP1_CMD                   MXS_IOMUX_PAD_NAKED(0, 21, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_RDY2__CAN0_TX                    MXS_IOMUX_PAD_NAKED(0, 22, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_RDY3__CAN0_RX                    MXS_IOMUX_PAD_NAKED(0, 23, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_RDN__SSP3_SCK                    MXS_IOMUX_PAD_NAKED(0, 24, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_WRN__SSP1_SCK                    MXS_IOMUX_PAD_NAKED(0, 25, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_ALE__SSP3_D1                     MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_CLE__SSP3_D2                     MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_1)
-#define MX28_PAD_GPMI_RESETN__SSP3_CMD                 MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_1)
-
-#define MX28_PAD_LCD_D03__ETM_DA8                      MXS_IOMUX_PAD_NAKED(1,  3, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_D04__ETM_DA9                      MXS_IOMUX_PAD_NAKED(1,  4, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_D08__ETM_DA3                      MXS_IOMUX_PAD_NAKED(1,  8, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_D09__ETM_DA4                      MXS_IOMUX_PAD_NAKED(1,  9, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_D20__ENET1_1588_EVENT2_OUT                MXS_IOMUX_PAD_NAKED(1, 20, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_D21__ENET1_1588_EVENT2_IN         MXS_IOMUX_PAD_NAKED(1, 21, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_D22__ENET1_1588_EVENT3_OUT                MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_D23__ENET1_1588_EVENT3_IN         MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_RD_E__LCD_VSYNC                   MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_WR_RWN__LCD_HSYNC                 MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_RS__LCD_DOTCLK                    MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_CS__LCD_ENABLE                    MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_VSYNC__SAIF1_SDATA0               MXS_IOMUX_PAD_NAKED(1, 28, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_HSYNC__SAIF1_SDATA1               MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_DOTCLK__SAIF1_MCLK                        MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_1)
-
-#define MX28_PAD_SSP0_DATA4__SSP2_D0                   MXS_IOMUX_PAD_NAKED(2,  4, PAD_MUXSEL_1)
-#define MX28_PAD_SSP0_DATA5__SSP2_D3                   MXS_IOMUX_PAD_NAKED(2,  5, PAD_MUXSEL_1)
-#define MX28_PAD_SSP0_DATA6__SSP2_CMD                  MXS_IOMUX_PAD_NAKED(2,  6, PAD_MUXSEL_1)
-#define MX28_PAD_SSP0_DATA7__SSP2_SCK                  MXS_IOMUX_PAD_NAKED(2,  7, PAD_MUXSEL_1)
-#define MX28_PAD_SSP1_SCK__SSP2_D1                     MXS_IOMUX_PAD_NAKED(2, 12, PAD_MUXSEL_1)
-#define MX28_PAD_SSP1_CMD__SSP2_D2                     MXS_IOMUX_PAD_NAKED(2, 13, PAD_MUXSEL_1)
-#define MX28_PAD_SSP1_DATA0__SSP2_D6                   MXS_IOMUX_PAD_NAKED(2, 14, PAD_MUXSEL_1)
-#define MX28_PAD_SSP1_DATA3__SSP2_D7                   MXS_IOMUX_PAD_NAKED(2, 15, PAD_MUXSEL_1)
-#define MX28_PAD_SSP2_SCK__AUART2_RX                   MXS_IOMUX_PAD_NAKED(2, 16, PAD_MUXSEL_1)
-#define MX28_PAD_SSP2_MOSI__AUART2_TX                  MXS_IOMUX_PAD_NAKED(2, 17, PAD_MUXSEL_1)
-#define MX28_PAD_SSP2_MISO__AUART3_RX                  MXS_IOMUX_PAD_NAKED(2, 18, PAD_MUXSEL_1)
-#define MX28_PAD_SSP2_SS0__AUART3_TX                   MXS_IOMUX_PAD_NAKED(2, 19, PAD_MUXSEL_1)
-#define MX28_PAD_SSP2_SS1__SSP2_D1                     MXS_IOMUX_PAD_NAKED(2, 20, PAD_MUXSEL_1)
-#define MX28_PAD_SSP2_SS2__SSP2_D2                     MXS_IOMUX_PAD_NAKED(2, 21, PAD_MUXSEL_1)
-#define MX28_PAD_SSP3_SCK__AUART4_TX                   MXS_IOMUX_PAD_NAKED(2, 24, PAD_MUXSEL_1)
-#define MX28_PAD_SSP3_MOSI__AUART4_RX                  MXS_IOMUX_PAD_NAKED(2, 25, PAD_MUXSEL_1)
-#define MX28_PAD_SSP3_MISO__AUART4_RTS                 MXS_IOMUX_PAD_NAKED(2, 26, PAD_MUXSEL_1)
-#define MX28_PAD_SSP3_SS0__AUART4_CTS                  MXS_IOMUX_PAD_NAKED(2, 27, PAD_MUXSEL_1)
-
-#define MX28_PAD_AUART0_RX__I2C0_SCL                   MXS_IOMUX_PAD_NAKED(3,  0, PAD_MUXSEL_1)
-#define MX28_PAD_AUART0_TX__I2C0_SDA                   MXS_IOMUX_PAD_NAKED(3,  1, PAD_MUXSEL_1)
-#define MX28_PAD_AUART0_CTS__AUART4_RX                 MXS_IOMUX_PAD_NAKED(3,  2, PAD_MUXSEL_1)
-#define MX28_PAD_AUART0_RTS__AUART4_TX                 MXS_IOMUX_PAD_NAKED(3,  3, PAD_MUXSEL_1)
-#define MX28_PAD_AUART1_RX__SSP2_CARD_DETECT           MXS_IOMUX_PAD_NAKED(3,  4, PAD_MUXSEL_1)
-#define MX28_PAD_AUART1_TX__SSP3_CARD_DETECT           MXS_IOMUX_PAD_NAKED(3,  5, PAD_MUXSEL_1)
-#define MX28_PAD_AUART1_CTS__USB0_OVERCURRENT          MXS_IOMUX_PAD_NAKED(3,  6, PAD_MUXSEL_1)
-#define MX28_PAD_AUART1_RTS__USB0_ID                   MXS_IOMUX_PAD_NAKED(3,  7, PAD_MUXSEL_1)
-#define MX28_PAD_AUART2_RX__SSP3_D1                    MXS_IOMUX_PAD_NAKED(3,  8, PAD_MUXSEL_1)
-#define MX28_PAD_AUART2_TX__SSP3_D2                    MXS_IOMUX_PAD_NAKED(3,  9, PAD_MUXSEL_1)
-#define MX28_PAD_AUART2_CTS__I2C1_SCL                  MXS_IOMUX_PAD_NAKED(3, 10, PAD_MUXSEL_1)
-#define MX28_PAD_AUART2_RTS__I2C1_SDA                  MXS_IOMUX_PAD_NAKED(3, 11, PAD_MUXSEL_1)
-#define MX28_PAD_AUART3_RX__CAN0_TX                    MXS_IOMUX_PAD_NAKED(3, 12, PAD_MUXSEL_1)
-#define MX28_PAD_AUART3_TX__CAN0_RX                    MXS_IOMUX_PAD_NAKED(3, 13, PAD_MUXSEL_1)
-#define MX28_PAD_AUART3_CTS__CAN1_TX                   MXS_IOMUX_PAD_NAKED(3, 14, PAD_MUXSEL_1)
-#define MX28_PAD_AUART3_RTS__CAN1_RX                   MXS_IOMUX_PAD_NAKED(3, 15, PAD_MUXSEL_1)
-#define MX28_PAD_PWM0__I2C1_SCL                                MXS_IOMUX_PAD_NAKED(3, 16, PAD_MUXSEL_1)
-#define MX28_PAD_PWM1__I2C1_SDA                                MXS_IOMUX_PAD_NAKED(3, 17, PAD_MUXSEL_1)
-#define MX28_PAD_PWM2__USB0_ID                         MXS_IOMUX_PAD_NAKED(3, 18, PAD_MUXSEL_1)
-#define MX28_PAD_SAIF0_MCLK__PWM_3                     MXS_IOMUX_PAD_NAKED(3, 20, PAD_MUXSEL_1)
-#define MX28_PAD_SAIF0_LRCLK__PWM_4                    MXS_IOMUX_PAD_NAKED(3, 21, PAD_MUXSEL_1)
-#define MX28_PAD_SAIF0_BITCLK__PWM_5                   MXS_IOMUX_PAD_NAKED(3, 22, PAD_MUXSEL_1)
-#define MX28_PAD_SAIF0_SDATA0__PWM_6                   MXS_IOMUX_PAD_NAKED(3, 23, PAD_MUXSEL_1)
-#define MX28_PAD_I2C0_SCL__TIMROT_ROTARYA              MXS_IOMUX_PAD_NAKED(3, 24, PAD_MUXSEL_1)
-#define MX28_PAD_I2C0_SDA__TIMROT_ROTARYB              MXS_IOMUX_PAD_NAKED(3, 25, PAD_MUXSEL_1)
-#define MX28_PAD_SAIF1_SDATA0__PWM_7                   MXS_IOMUX_PAD_NAKED(3, 26, PAD_MUXSEL_1)
-#define MX28_PAD_LCD_RESET__LCD_VSYNC                  MXS_IOMUX_PAD_NAKED(3, 30, PAD_MUXSEL_1)
-
-#define MX28_PAD_ENET0_MDC__GPMI_CE4N                  MXS_IOMUX_PAD_NAKED(4,  0, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_MDIO__GPMI_CE5N                 MXS_IOMUX_PAD_NAKED(4,  1, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_RX_EN__GPMI_CE6N                        MXS_IOMUX_PAD_NAKED(4,  2, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_RXD0__GPMI_CE7N                 MXS_IOMUX_PAD_NAKED(4,  3, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_RXD1__GPMI_READY4               MXS_IOMUX_PAD_NAKED(4,  4, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_TX_CLK__HSADC_TRIGGER           MXS_IOMUX_PAD_NAKED(4,  5, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_TX_EN__GPMI_READY5              MXS_IOMUX_PAD_NAKED(4,  6, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_TXD0__GPMI_READY6               MXS_IOMUX_PAD_NAKED(4,  7, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_TXD1__GPMI_READY7               MXS_IOMUX_PAD_NAKED(4,  8, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_RXD2__ENET1_RXD0                        MXS_IOMUX_PAD_NAKED(4,  9, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_RXD3__ENET1_RXD1                        MXS_IOMUX_PAD_NAKED(4, 10, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_TXD2__ENET1_TXD0                        MXS_IOMUX_PAD_NAKED(4, 11, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_TXD3__ENET1_TXD1                        MXS_IOMUX_PAD_NAKED(4, 12, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_RX_CLK__ENET0_RX_ER             MXS_IOMUX_PAD_NAKED(4, 13, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_COL__ENET1_TX_EN                        MXS_IOMUX_PAD_NAKED(4, 14, PAD_MUXSEL_1)
-#define MX28_PAD_ENET0_CRS__ENET1_RX_EN                        MXS_IOMUX_PAD_NAKED(4, 15, PAD_MUXSEL_1)
-
-/* MUXSEL_2 */
-#define MX28_PAD_GPMI_CE2N__ENET0_RX_ER                        MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_2)
-#define MX28_PAD_GPMI_CE3N__SAIF1_MCLK                 MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_2)
-#define MX28_PAD_GPMI_RDY0__USB0_ID                    MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_2)
-#define MX28_PAD_GPMI_RDY2__ENET0_TX_ER                        MXS_IOMUX_PAD_NAKED(0, 22, PAD_MUXSEL_2)
-#define MX28_PAD_GPMI_RDY3__HSADC_TRIGGER              MXS_IOMUX_PAD_NAKED(0, 23, PAD_MUXSEL_2)
-#define MX28_PAD_GPMI_ALE__SSP3_D4                     MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_2)
-#define MX28_PAD_GPMI_CLE__SSP3_D5                     MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_2)
-
-#define MX28_PAD_LCD_D00__ETM_DA0                      MXS_IOMUX_PAD_NAKED(1,  0, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D01__ETM_DA1                      MXS_IOMUX_PAD_NAKED(1,  1, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D02__ETM_DA2                      MXS_IOMUX_PAD_NAKED(1,  2, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D03__ETM_DA3                      MXS_IOMUX_PAD_NAKED(1,  3, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D04__ETM_DA4                      MXS_IOMUX_PAD_NAKED(1,  4, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D05__ETM_DA5                      MXS_IOMUX_PAD_NAKED(1,  5, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D06__ETM_DA6                      MXS_IOMUX_PAD_NAKED(1,  6, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D07__ETM_DA7                      MXS_IOMUX_PAD_NAKED(1,  7, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D08__ETM_DA8                      MXS_IOMUX_PAD_NAKED(1,  8, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D09__ETM_DA9                      MXS_IOMUX_PAD_NAKED(1,  9, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D10__ETM_DA10                     MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D11__ETM_DA11                     MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D12__ETM_DA12                     MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D13__ETM_DA13                     MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D14__ETM_DA14                     MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D15__ETM_DA15                     MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D16__ETM_DA7                      MXS_IOMUX_PAD_NAKED(1, 16, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D17__ETM_DA6                      MXS_IOMUX_PAD_NAKED(1, 17, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D18__ETM_DA5                      MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D19__ETM_DA4                      MXS_IOMUX_PAD_NAKED(1, 19, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D20__ETM_DA3                      MXS_IOMUX_PAD_NAKED(1, 20, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D21__ETM_DA2                      MXS_IOMUX_PAD_NAKED(1, 21, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D22__ETM_DA1                      MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_D23__ETM_DA0                      MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_RD_E__ETM_TCTL                    MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_WR_RWN__ETM_TCLK                  MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_HSYNC__ETM_TCTL                   MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_2)
-#define MX28_PAD_LCD_DOTCLK__ETM_TCLK                  MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_2)
-
-#define MX28_PAD_SSP1_SCK__ENET0_1588_EVENT2_OUT       MXS_IOMUX_PAD_NAKED(2, 12, PAD_MUXSEL_2)
-#define MX28_PAD_SSP1_CMD__ENET0_1588_EVENT2_IN                MXS_IOMUX_PAD_NAKED(2, 13, PAD_MUXSEL_2)
-#define MX28_PAD_SSP1_DATA0__ENET0_1588_EVENT3_OUT     MXS_IOMUX_PAD_NAKED(2, 14, PAD_MUXSEL_2)
-#define MX28_PAD_SSP1_DATA3__ENET0_1588_EVENT3_IN      MXS_IOMUX_PAD_NAKED(2, 15, PAD_MUXSEL_2)
-#define MX28_PAD_SSP2_SCK__SAIF0_SDATA1                        MXS_IOMUX_PAD_NAKED(2, 16, PAD_MUXSEL_2)
-#define MX28_PAD_SSP2_MOSI__SAIF0_SDATA2               MXS_IOMUX_PAD_NAKED(2, 17, PAD_MUXSEL_2)
-#define MX28_PAD_SSP2_MISO__SAIF1_SDATA1               MXS_IOMUX_PAD_NAKED(2, 18, PAD_MUXSEL_2)
-#define MX28_PAD_SSP2_SS0__SAIF1_SDATA2                        MXS_IOMUX_PAD_NAKED(2, 19, PAD_MUXSEL_2)
-#define MX28_PAD_SSP2_SS1__USB1_OVERCURRENT            MXS_IOMUX_PAD_NAKED(2, 20, PAD_MUXSEL_2)
-#define MX28_PAD_SSP2_SS2__USB0_OVERCURRENT            MXS_IOMUX_PAD_NAKED(2, 21, PAD_MUXSEL_2)
-#define MX28_PAD_SSP3_SCK__ENET1_1588_EVENT0_OUT       MXS_IOMUX_PAD_NAKED(2, 24, PAD_MUXSEL_2)
-#define MX28_PAD_SSP3_MOSI__ENET1_1588_EVENT0_IN       MXS_IOMUX_PAD_NAKED(2, 25, PAD_MUXSEL_2)
-#define MX28_PAD_SSP3_MISO__ENET1_1588_EVENT1_OUT      MXS_IOMUX_PAD_NAKED(2, 26, PAD_MUXSEL_2)
-#define MX28_PAD_SSP3_SS0__ENET1_1588_EVENT1_IN                MXS_IOMUX_PAD_NAKED(2, 27, PAD_MUXSEL_2)
-
-#define MX28_PAD_AUART0_RX__DUART_CTS                  MXS_IOMUX_PAD_NAKED(3,  0, PAD_MUXSEL_2)
-#define MX28_PAD_AUART0_TX__DUART_RTS                  MXS_IOMUX_PAD_NAKED(3,  1, PAD_MUXSEL_2)
-#define MX28_PAD_AUART0_CTS__DUART_RX                  MXS_IOMUX_PAD_NAKED(3,  2, PAD_MUXSEL_2)
-#define MX28_PAD_AUART0_RTS__DUART_TX                  MXS_IOMUX_PAD_NAKED(3,  3, PAD_MUXSEL_2)
-#define MX28_PAD_AUART1_RX__PWM_0                      MXS_IOMUX_PAD_NAKED(3,  4, PAD_MUXSEL_2)
-#define MX28_PAD_AUART1_TX__PWM_1                      MXS_IOMUX_PAD_NAKED(3,  5, PAD_MUXSEL_2)
-#define MX28_PAD_AUART1_CTS__TIMROT_ROTARYA            MXS_IOMUX_PAD_NAKED(3,  6, PAD_MUXSEL_2)
-#define MX28_PAD_AUART1_RTS__TIMROT_ROTARYB            MXS_IOMUX_PAD_NAKED(3,  7, PAD_MUXSEL_2)
-#define MX28_PAD_AUART2_RX__SSP3_D4                    MXS_IOMUX_PAD_NAKED(3,  8, PAD_MUXSEL_2)
-#define MX28_PAD_AUART2_TX__SSP3_D5                    MXS_IOMUX_PAD_NAKED(3,  9, PAD_MUXSEL_2)
-#define MX28_PAD_AUART2_CTS__SAIF1_BITCLK              MXS_IOMUX_PAD_NAKED(3, 10, PAD_MUXSEL_2)
-#define MX28_PAD_AUART2_RTS__SAIF1_LRCLK               MXS_IOMUX_PAD_NAKED(3, 11, PAD_MUXSEL_2)
-#define MX28_PAD_AUART3_RX__ENET0_1588_EVENT0_OUT      MXS_IOMUX_PAD_NAKED(3, 12, PAD_MUXSEL_2)
-#define MX28_PAD_AUART3_TX__ENET0_1588_EVENT0_IN       MXS_IOMUX_PAD_NAKED(3, 13, PAD_MUXSEL_2)
-#define MX28_PAD_AUART3_CTS__ENET0_1588_EVENT1_OUT     MXS_IOMUX_PAD_NAKED(3, 14, PAD_MUXSEL_2)
-#define MX28_PAD_AUART3_RTS__ENET0_1588_EVENT1_IN      MXS_IOMUX_PAD_NAKED(3, 15, PAD_MUXSEL_2)
-#define MX28_PAD_PWM0__DUART_RX                                MXS_IOMUX_PAD_NAKED(3, 16, PAD_MUXSEL_2)
-#define MX28_PAD_PWM1__DUART_TX                                MXS_IOMUX_PAD_NAKED(3, 17, PAD_MUXSEL_2)
-#define MX28_PAD_PWM2__USB1_OVERCURRENT                        MXS_IOMUX_PAD_NAKED(3, 18, PAD_MUXSEL_2)
-#define MX28_PAD_SAIF0_MCLK__AUART4_CTS                        MXS_IOMUX_PAD_NAKED(3, 20, PAD_MUXSEL_2)
-#define MX28_PAD_SAIF0_LRCLK__AUART4_RTS               MXS_IOMUX_PAD_NAKED(3, 21, PAD_MUXSEL_2)
-#define MX28_PAD_SAIF0_BITCLK__AUART4_RX               MXS_IOMUX_PAD_NAKED(3, 22, PAD_MUXSEL_2)
-#define MX28_PAD_SAIF0_SDATA0__AUART4_TX               MXS_IOMUX_PAD_NAKED(3, 23, PAD_MUXSEL_2)
-#define MX28_PAD_I2C0_SCL__DUART_RX                    MXS_IOMUX_PAD_NAKED(3, 24, PAD_MUXSEL_2)
-#define MX28_PAD_I2C0_SDA__DUART_TX                    MXS_IOMUX_PAD_NAKED(3, 25, PAD_MUXSEL_2)
-#define MX28_PAD_SAIF1_SDATA0__SAIF0_SDATA1            MXS_IOMUX_PAD_NAKED(3, 26, PAD_MUXSEL_2)
-#define MX28_PAD_SPDIF__ENET1_RX_ER                    MXS_IOMUX_PAD_NAKED(3, 27, PAD_MUXSEL_2)
-
-#define MX28_PAD_ENET0_MDC__SAIF0_SDATA1               MXS_IOMUX_PAD_NAKED(4,  0, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_MDIO__SAIF0_SDATA2              MXS_IOMUX_PAD_NAKED(4,  1, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_RX_EN__SAIF1_SDATA1             MXS_IOMUX_PAD_NAKED(4,  2, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_RXD0__SAIF1_SDATA2              MXS_IOMUX_PAD_NAKED(4,  3, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_TX_CLK__ENET0_1588_EVENT2_OUT   MXS_IOMUX_PAD_NAKED(4,  5, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_RXD2__ENET0_1588_EVENT0_OUT     MXS_IOMUX_PAD_NAKED(4,  9, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_RXD3__ENET0_1588_EVENT0_IN      MXS_IOMUX_PAD_NAKED(4, 10, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_TXD2__ENET0_1588_EVENT1_OUT     MXS_IOMUX_PAD_NAKED(4, 11, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_TXD3__ENET0_1588_EVENT1_IN      MXS_IOMUX_PAD_NAKED(4, 12, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_RX_CLK__ENET0_1588_EVENT2_IN    MXS_IOMUX_PAD_NAKED(4, 13, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_COL__ENET0_1588_EVENT3_OUT      MXS_IOMUX_PAD_NAKED(4, 14, PAD_MUXSEL_2)
-#define MX28_PAD_ENET0_CRS__ENET0_1588_EVENT3_IN       MXS_IOMUX_PAD_NAKED(4, 15, PAD_MUXSEL_2)
-
-/* MUXSEL_GPIO */
-#define MX28_PAD_GPMI_D00__GPIO_0_0                    MXS_IOMUX_PAD_NAKED(0,  0, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_D01__GPIO_0_1                    MXS_IOMUX_PAD_NAKED(0,  1, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_D02__GPIO_0_2                    MXS_IOMUX_PAD_NAKED(0,  2, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_D03__GPIO_0_3                    MXS_IOMUX_PAD_NAKED(0,  3, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_D04__GPIO_0_4                    MXS_IOMUX_PAD_NAKED(0,  4, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_D05__GPIO_0_5                    MXS_IOMUX_PAD_NAKED(0,  5, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_D06__GPIO_0_6                    MXS_IOMUX_PAD_NAKED(0,  6, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_D07__GPIO_0_7                    MXS_IOMUX_PAD_NAKED(0,  7, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_CE0N__GPIO_0_16                  MXS_IOMUX_PAD_NAKED(0, 16, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_CE1N__GPIO_0_17                  MXS_IOMUX_PAD_NAKED(0, 17, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_CE2N__GPIO_0_18                  MXS_IOMUX_PAD_NAKED(0, 18, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_CE3N__GPIO_0_19                  MXS_IOMUX_PAD_NAKED(0, 19, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_RDY0__GPIO_0_20                  MXS_IOMUX_PAD_NAKED(0, 20, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_RDY1__GPIO_0_21                  MXS_IOMUX_PAD_NAKED(0, 21, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_RDY2__GPIO_0_22                  MXS_IOMUX_PAD_NAKED(0, 22, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_RDY3__GPIO_0_23                  MXS_IOMUX_PAD_NAKED(0, 23, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_RDN__GPIO_0_24                   MXS_IOMUX_PAD_NAKED(0, 24, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_WRN__GPIO_0_25                   MXS_IOMUX_PAD_NAKED(0, 25, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_ALE__GPIO_0_26                   MXS_IOMUX_PAD_NAKED(0, 26, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_CLE__GPIO_0_27                   MXS_IOMUX_PAD_NAKED(0, 27, PAD_MUXSEL_GPIO)
-#define MX28_PAD_GPMI_RESETN__GPIO_0_28                        MXS_IOMUX_PAD_NAKED(0, 28, PAD_MUXSEL_GPIO)
-
-#define MX28_PAD_LCD_D00__GPIO_1_0                     MXS_IOMUX_PAD_NAKED(1,  0, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D01__GPIO_1_1                     MXS_IOMUX_PAD_NAKED(1,  1, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D02__GPIO_1_2                     MXS_IOMUX_PAD_NAKED(1,  2, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D03__GPIO_1_3                     MXS_IOMUX_PAD_NAKED(1,  3, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D04__GPIO_1_4                     MXS_IOMUX_PAD_NAKED(1,  4, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D05__GPIO_1_5                     MXS_IOMUX_PAD_NAKED(1,  5, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D06__GPIO_1_6                     MXS_IOMUX_PAD_NAKED(1,  6, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D07__GPIO_1_7                     MXS_IOMUX_PAD_NAKED(1,  7, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D08__GPIO_1_8                     MXS_IOMUX_PAD_NAKED(1,  8, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D09__GPIO_1_9                     MXS_IOMUX_PAD_NAKED(1,  9, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D10__GPIO_1_10                    MXS_IOMUX_PAD_NAKED(1, 10, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D11__GPIO_1_11                    MXS_IOMUX_PAD_NAKED(1, 11, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D12__GPIO_1_12                    MXS_IOMUX_PAD_NAKED(1, 12, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D13__GPIO_1_13                    MXS_IOMUX_PAD_NAKED(1, 13, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D14__GPIO_1_14                    MXS_IOMUX_PAD_NAKED(1, 14, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D15__GPIO_1_15                    MXS_IOMUX_PAD_NAKED(1, 15, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D16__GPIO_1_16                    MXS_IOMUX_PAD_NAKED(1, 16, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D17__GPIO_1_17                    MXS_IOMUX_PAD_NAKED(1, 17, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D18__GPIO_1_18                    MXS_IOMUX_PAD_NAKED(1, 18, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D19__GPIO_1_19                    MXS_IOMUX_PAD_NAKED(1, 19, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D20__GPIO_1_20                    MXS_IOMUX_PAD_NAKED(1, 20, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D21__GPIO_1_21                    MXS_IOMUX_PAD_NAKED(1, 21, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D22__GPIO_1_22                    MXS_IOMUX_PAD_NAKED(1, 22, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_D23__GPIO_1_23                    MXS_IOMUX_PAD_NAKED(1, 23, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_RD_E__GPIO_1_24                   MXS_IOMUX_PAD_NAKED(1, 24, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_WR_RWN__GPIO_1_25                 MXS_IOMUX_PAD_NAKED(1, 25, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_RS__GPIO_1_26                     MXS_IOMUX_PAD_NAKED(1, 26, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_CS__GPIO_1_27                     MXS_IOMUX_PAD_NAKED(1, 27, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_VSYNC__GPIO_1_28                  MXS_IOMUX_PAD_NAKED(1, 28, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_HSYNC__GPIO_1_29                  MXS_IOMUX_PAD_NAKED(1, 29, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_DOTCLK__GPIO_1_30                 MXS_IOMUX_PAD_NAKED(1, 30, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_ENABLE__GPIO_1_31                 MXS_IOMUX_PAD_NAKED(1, 31, PAD_MUXSEL_GPIO)
-
-#define MX28_PAD_SSP0_DATA0__GPIO_2_0                  MXS_IOMUX_PAD_NAKED(2,  0, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_DATA1__GPIO_2_1                  MXS_IOMUX_PAD_NAKED(2,  1, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_DATA2__GPIO_2_2                  MXS_IOMUX_PAD_NAKED(2,  2, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_DATA3__GPIO_2_3                  MXS_IOMUX_PAD_NAKED(2,  3, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_DATA4__GPIO_2_4                  MXS_IOMUX_PAD_NAKED(2,  4, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_DATA5__GPIO_2_5                  MXS_IOMUX_PAD_NAKED(2,  5, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_DATA6__GPIO_2_6                  MXS_IOMUX_PAD_NAKED(2,  6, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_DATA7__GPIO_2_7                  MXS_IOMUX_PAD_NAKED(2,  7, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_CMD__GPIO_2_8                    MXS_IOMUX_PAD_NAKED(2,  8, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_DETECT__GPIO_2_9                 MXS_IOMUX_PAD_NAKED(2,  9, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP0_SCK__GPIO_2_10                   MXS_IOMUX_PAD_NAKED(2, 10, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP1_SCK__GPIO_2_12                   MXS_IOMUX_PAD_NAKED(2, 12, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP1_CMD__GPIO_2_13                   MXS_IOMUX_PAD_NAKED(2, 13, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP1_DATA0__GPIO_2_14                 MXS_IOMUX_PAD_NAKED(2, 14, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP1_DATA3__GPIO_2_15                 MXS_IOMUX_PAD_NAKED(2, 15, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP2_SCK__GPIO_2_16                   MXS_IOMUX_PAD_NAKED(2, 16, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP2_MOSI__GPIO_2_17                  MXS_IOMUX_PAD_NAKED(2, 17, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP2_MISO__GPIO_2_18                  MXS_IOMUX_PAD_NAKED(2, 18, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP2_SS0__GPIO_2_19                   MXS_IOMUX_PAD_NAKED(2, 19, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP2_SS1__GPIO_2_20                   MXS_IOMUX_PAD_NAKED(2, 20, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP2_SS2__GPIO_2_21                   MXS_IOMUX_PAD_NAKED(2, 21, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP3_SCK__GPIO_2_24                   MXS_IOMUX_PAD_NAKED(2, 24, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP3_MOSI__GPIO_2_25                  MXS_IOMUX_PAD_NAKED(2, 25, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP3_MISO__GPIO_2_26                  MXS_IOMUX_PAD_NAKED(2, 26, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SSP3_SS0__GPIO_2_27                   MXS_IOMUX_PAD_NAKED(2, 27, PAD_MUXSEL_GPIO)
-
-#define MX28_PAD_AUART0_RX__GPIO_3_0                   MXS_IOMUX_PAD_NAKED(3,  0, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART0_TX__GPIO_3_1                   MXS_IOMUX_PAD_NAKED(3,  1, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART0_CTS__GPIO_3_2                  MXS_IOMUX_PAD_NAKED(3,  2, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART0_RTS__GPIO_3_3                  MXS_IOMUX_PAD_NAKED(3,  3, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART1_RX__GPIO_3_4                   MXS_IOMUX_PAD_NAKED(3,  4, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART1_TX__GPIO_3_5                   MXS_IOMUX_PAD_NAKED(3,  5, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART1_CTS__GPIO_3_6                  MXS_IOMUX_PAD_NAKED(3,  6, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART1_RTS__GPIO_3_7                  MXS_IOMUX_PAD_NAKED(3,  7, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART2_RX__GPIO_3_8                   MXS_IOMUX_PAD_NAKED(3,  8, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART2_TX__GPIO_3_9                   MXS_IOMUX_PAD_NAKED(3,  9, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART2_CTS__GPIO_3_10                 MXS_IOMUX_PAD_NAKED(3, 10, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART2_RTS__GPIO_3_11                 MXS_IOMUX_PAD_NAKED(3, 11, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART3_RX__GPIO_3_12                  MXS_IOMUX_PAD_NAKED(3, 12, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART3_TX__GPIO_3_13                  MXS_IOMUX_PAD_NAKED(3, 13, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART3_CTS__GPIO_3_14                 MXS_IOMUX_PAD_NAKED(3, 14, PAD_MUXSEL_GPIO)
-#define MX28_PAD_AUART3_RTS__GPIO_3_15                 MXS_IOMUX_PAD_NAKED(3, 15, PAD_MUXSEL_GPIO)
-#define MX28_PAD_PWM0__GPIO_3_16                       MXS_IOMUX_PAD_NAKED(3, 16, PAD_MUXSEL_GPIO)
-#define MX28_PAD_PWM1__GPIO_3_17                       MXS_IOMUX_PAD_NAKED(3, 17, PAD_MUXSEL_GPIO)
-#define MX28_PAD_PWM2__GPIO_3_18                       MXS_IOMUX_PAD_NAKED(3, 18, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SAIF0_MCLK__GPIO_3_20                 MXS_IOMUX_PAD_NAKED(3, 20, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SAIF0_LRCLK__GPIO_3_21                        MXS_IOMUX_PAD_NAKED(3, 21, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SAIF0_BITCLK__GPIO_3_22               MXS_IOMUX_PAD_NAKED(3, 22, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SAIF0_SDATA0__GPIO_3_23               MXS_IOMUX_PAD_NAKED(3, 23, PAD_MUXSEL_GPIO)
-#define MX28_PAD_I2C0_SCL__GPIO_3_24                   MXS_IOMUX_PAD_NAKED(3, 24, PAD_MUXSEL_GPIO)
-#define MX28_PAD_I2C0_SDA__GPIO_3_25                   MXS_IOMUX_PAD_NAKED(3, 25, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SAIF1_SDATA0__GPIO_3_26               MXS_IOMUX_PAD_NAKED(3, 26, PAD_MUXSEL_GPIO)
-#define MX28_PAD_SPDIF__GPIO_3_27                      MXS_IOMUX_PAD_NAKED(3, 27, PAD_MUXSEL_GPIO)
-#define MX28_PAD_PWM3__GPIO_3_28                       MXS_IOMUX_PAD_NAKED(3, 28, PAD_MUXSEL_GPIO)
-#define MX28_PAD_PWM4__GPIO_3_29                       MXS_IOMUX_PAD_NAKED(3, 29, PAD_MUXSEL_GPIO)
-#define MX28_PAD_LCD_RESET__GPIO_3_30                  MXS_IOMUX_PAD_NAKED(3, 30, PAD_MUXSEL_GPIO)
-
-#define MX28_PAD_ENET0_MDC__GPIO_4_0                   MXS_IOMUX_PAD_NAKED(4,  0, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_MDIO__GPIO_4_1                  MXS_IOMUX_PAD_NAKED(4,  1, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_RX_EN__GPIO_4_2                 MXS_IOMUX_PAD_NAKED(4,  2, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_RXD0__GPIO_4_3                  MXS_IOMUX_PAD_NAKED(4,  3, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_RXD1__GPIO_4_4                  MXS_IOMUX_PAD_NAKED(4,  4, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_TX_CLK__GPIO_4_5                        MXS_IOMUX_PAD_NAKED(4,  5, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_TX_EN__GPIO_4_6                 MXS_IOMUX_PAD_NAKED(4,  6, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_TXD0__GPIO_4_7                  MXS_IOMUX_PAD_NAKED(4,  7, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_TXD1__GPIO_4_8                  MXS_IOMUX_PAD_NAKED(4,  8, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_RXD2__GPIO_4_9                  MXS_IOMUX_PAD_NAKED(4,  9, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_RXD3__GPIO_4_10                 MXS_IOMUX_PAD_NAKED(4, 10, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_TXD2__GPIO_4_11                 MXS_IOMUX_PAD_NAKED(4, 11, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_TXD3__GPIO_4_12                 MXS_IOMUX_PAD_NAKED(4, 12, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_RX_CLK__GPIO_4_13               MXS_IOMUX_PAD_NAKED(4, 13, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_COL__GPIO_4_14                  MXS_IOMUX_PAD_NAKED(4, 14, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET0_CRS__GPIO_4_15                  MXS_IOMUX_PAD_NAKED(4, 15, PAD_MUXSEL_GPIO)
-#define MX28_PAD_ENET_CLK__GPIO_4_16                   MXS_IOMUX_PAD_NAKED(4, 16, PAD_MUXSEL_GPIO)
-#define MX28_PAD_JTAG_RTCK__GPIO_4_20                  MXS_IOMUX_PAD_NAKED(4, 20, PAD_MUXSEL_GPIO)
-
-#endif /* __MACH_IOMUX_MX28_H__ */
diff --git a/arch/arm/mach-mxs/include/mach/iomux.h b/arch/arm/mach-mxs/include/mach/iomux.h
deleted file mode 100644 (file)
index 7abdf58..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH,
- *                     <armlinux@phytec.de>
- * Copyright (C) 2010 Freescale Semiconductor, Inc. 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
- * 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.
- */
-
-#ifndef __MACH_MXS_IOMUX_H__
-#define __MACH_MXS_IOMUX_H__
-
-/*
- * IOMUX/PAD Bit field definitions
- *
- * PAD_BANK:            0..2   (3)
- * PAD_PIN:             3..7   (5)
- * PAD_MUXSEL:          8..9   (2)
- * PAD_MA:             10..11  (2)
- * PAD_MA_VALID:       12      (1)
- * PAD_VOL:            13      (1)
- * PAD_VOL_VALID:      14      (1)
- * PAD_PULL:           15      (1)
- * PAD_PULL_VALID:     16      (1)
- * RESERVED:           17..31  (15)
- */
-typedef u32 iomux_cfg_t;
-
-#define MXS_PAD_BANK_SHIFT     0
-#define MXS_PAD_BANK_MASK      ((iomux_cfg_t)0x7 << MXS_PAD_BANK_SHIFT)
-#define MXS_PAD_PIN_SHIFT      3
-#define MXS_PAD_PIN_MASK       ((iomux_cfg_t)0x1f << MXS_PAD_PIN_SHIFT)
-#define MXS_PAD_MUXSEL_SHIFT   8
-#define MXS_PAD_MUXSEL_MASK    ((iomux_cfg_t)0x3 << MXS_PAD_MUXSEL_SHIFT)
-#define MXS_PAD_MA_SHIFT       10
-#define MXS_PAD_MA_MASK                ((iomux_cfg_t)0x3 << MXS_PAD_MA_SHIFT)
-#define MXS_PAD_MA_VALID_SHIFT 12
-#define MXS_PAD_MA_VALID_MASK  ((iomux_cfg_t)0x1 << MXS_PAD_MA_VALID_SHIFT)
-#define MXS_PAD_VOL_SHIFT      13
-#define MXS_PAD_VOL_MASK       ((iomux_cfg_t)0x1 << MXS_PAD_VOL_SHIFT)
-#define MXS_PAD_VOL_VALID_SHIFT        14
-#define MXS_PAD_VOL_VALID_MASK ((iomux_cfg_t)0x1 << MXS_PAD_VOL_VALID_SHIFT)
-#define MXS_PAD_PULL_SHIFT     15
-#define MXS_PAD_PULL_MASK      ((iomux_cfg_t)0x1 << MXS_PAD_PULL_SHIFT)
-#define MXS_PAD_PULL_VALID_SHIFT 16
-#define MXS_PAD_PULL_VALID_MASK        ((iomux_cfg_t)0x1 << MXS_PAD_PULL_VALID_SHIFT)
-
-#define PAD_MUXSEL_0           0
-#define PAD_MUXSEL_1           1
-#define PAD_MUXSEL_2           2
-#define PAD_MUXSEL_GPIO                3
-
-#define PAD_4MA                        0
-#define PAD_8MA                        1
-#define PAD_12MA               2
-#define PAD_16MA               3
-
-#define PAD_1V8                        0
-#define PAD_3V3                        1
-
-#define PAD_NOPULL             0
-#define PAD_PULLUP             1
-
-#define MXS_PAD_4MA    ((PAD_4MA << MXS_PAD_MA_SHIFT) | \
-                                       MXS_PAD_MA_VALID_MASK)
-#define MXS_PAD_8MA    ((PAD_8MA << MXS_PAD_MA_SHIFT) | \
-                                       MXS_PAD_MA_VALID_MASK)
-#define MXS_PAD_12MA   ((PAD_12MA << MXS_PAD_MA_SHIFT) | \
-                                       MXS_PAD_MA_VALID_MASK)
-#define MXS_PAD_16MA   ((PAD_16MA << MXS_PAD_MA_SHIFT) | \
-                                       MXS_PAD_MA_VALID_MASK)
-
-#define MXS_PAD_1V8    ((PAD_1V8 << MXS_PAD_VOL_SHIFT) | \
-                                       MXS_PAD_VOL_VALID_MASK)
-#define MXS_PAD_3V3    ((PAD_3V3 << MXS_PAD_VOL_SHIFT) | \
-                                       MXS_PAD_VOL_VALID_MASK)
-
-#define MXS_PAD_NOPULL ((PAD_NOPULL << MXS_PAD_PULL_SHIFT) | \
-                                       MXS_PAD_PULL_VALID_MASK)
-#define MXS_PAD_PULLUP ((PAD_PULLUP << MXS_PAD_PULL_SHIFT) | \
-                                       MXS_PAD_PULL_VALID_MASK)
-
-/* generic pad control used in most cases */
-#define MXS_PAD_CTRL   (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL)
-
-#define MXS_IOMUX_PAD(_bank, _pin, _muxsel, _ma, _vol, _pull)          \
-               (((iomux_cfg_t)(_bank) << MXS_PAD_BANK_SHIFT) |         \
-               ((iomux_cfg_t)(_pin) << MXS_PAD_PIN_SHIFT) |            \
-               ((iomux_cfg_t)(_muxsel) << MXS_PAD_MUXSEL_SHIFT) |      \
-               ((iomux_cfg_t)(_ma) << MXS_PAD_MA_SHIFT) |              \
-               ((iomux_cfg_t)(_vol) << MXS_PAD_VOL_SHIFT) |            \
-               ((iomux_cfg_t)(_pull) << MXS_PAD_PULL_SHIFT))
-
-/*
- * A pad becomes naked, when none of mA, vol or pull
- * validity bits is set.
- */
-#define MXS_IOMUX_PAD_NAKED(_bank, _pin, _muxsel) \
-               MXS_IOMUX_PAD(_bank, _pin, _muxsel, 0, 0, 0)
-
-static inline unsigned int PAD_BANK(iomux_cfg_t pad)
-{
-       return (pad & MXS_PAD_BANK_MASK) >> MXS_PAD_BANK_SHIFT;
-}
-
-static inline unsigned int PAD_PIN(iomux_cfg_t pad)
-{
-       return (pad & MXS_PAD_PIN_MASK) >> MXS_PAD_PIN_SHIFT;
-}
-
-static inline unsigned int PAD_MUXSEL(iomux_cfg_t pad)
-{
-       return (pad & MXS_PAD_MUXSEL_MASK) >> MXS_PAD_MUXSEL_SHIFT;
-}
-
-static inline unsigned int PAD_MA(iomux_cfg_t pad)
-{
-       return (pad & MXS_PAD_MA_MASK) >> MXS_PAD_MA_SHIFT;
-}
-
-static inline unsigned int PAD_MA_VALID(iomux_cfg_t pad)
-{
-       return (pad & MXS_PAD_MA_VALID_MASK) >> MXS_PAD_MA_VALID_SHIFT;
-}
-
-static inline unsigned int PAD_VOL(iomux_cfg_t pad)
-{
-       return (pad & MXS_PAD_VOL_MASK) >> MXS_PAD_VOL_SHIFT;
-}
-
-static inline unsigned int PAD_VOL_VALID(iomux_cfg_t pad)
-{
-       return (pad & MXS_PAD_VOL_VALID_MASK) >> MXS_PAD_VOL_VALID_SHIFT;
-}
-
-static inline unsigned int PAD_PULL(iomux_cfg_t pad)
-{
-       return (pad & MXS_PAD_PULL_MASK) >> MXS_PAD_PULL_SHIFT;
-}
-
-static inline unsigned int PAD_PULL_VALID(iomux_cfg_t pad)
-{
-       return (pad & MXS_PAD_PULL_VALID_MASK) >> MXS_PAD_PULL_VALID_SHIFT;
-}
-
-/*
- * configures a single pad in the iomuxer
- */
-int mxs_iomux_setup_pad(iomux_cfg_t pad);
-
-/*
- * configures multiple pads
- * convenient way to call the above function with tables
- */
-int mxs_iomux_setup_multiple_pads(const iomux_cfg_t *pad_list, unsigned count);
-
-#endif /* __MACH_MXS_IOMUX_H__*/
diff --git a/arch/arm/mach-mxs/iomux.c b/arch/arm/mach-mxs/iomux.c
deleted file mode 100644 (file)
index 0e804e2..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2004-2006,2010 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright (C) 2008 by Sascha Hauer <kernel@pengutronix.de>
- * Copyright (C) 2009 by Jan Weitzel Phytec Messtechnik GmbH,
- *                       <armlinux@phytec.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.
- *
- * 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/errno.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/string.h>
-#include <linux/gpio.h>
-
-#include <asm/mach/map.h>
-
-#include <mach/mxs.h>
-#include <mach/iomux.h>
-
-/*
- * configures a single pad in the iomuxer
- */
-int mxs_iomux_setup_pad(iomux_cfg_t pad)
-{
-       u32 reg, ofs, bp, bm;
-       void __iomem *iomux_base = MXS_IO_ADDRESS(MXS_PINCTRL_BASE_ADDR);
-
-       /* muxsel */
-       ofs = 0x100;
-       ofs += PAD_BANK(pad) * 0x20 + PAD_PIN(pad) / 16 * 0x10;
-       bp = PAD_PIN(pad) % 16 * 2;
-       bm = 0x3 << bp;
-       reg = __raw_readl(iomux_base + ofs);
-       reg &= ~bm;
-       reg |= PAD_MUXSEL(pad) << bp;
-       __raw_writel(reg, iomux_base + ofs);
-
-       /* drive */
-       ofs = cpu_is_mx23() ? 0x200 : 0x300;
-       ofs += PAD_BANK(pad) * 0x40 + PAD_PIN(pad) / 8 * 0x10;
-       /* mA */
-       if (PAD_MA_VALID(pad)) {
-               bp = PAD_PIN(pad) % 8 * 4;
-               bm = 0x3 << bp;
-               reg = __raw_readl(iomux_base + ofs);
-               reg &= ~bm;
-               reg |= PAD_MA(pad) << bp;
-               __raw_writel(reg, iomux_base + ofs);
-       }
-       /* vol */
-       if (PAD_VOL_VALID(pad)) {
-               bp = PAD_PIN(pad) % 8 * 4 + 2;
-               if (PAD_VOL(pad))
-                       __mxs_setl(1 << bp, iomux_base + ofs);
-               else
-                       __mxs_clrl(1 << bp, iomux_base + ofs);
-       }
-
-       /* pull */
-       if (PAD_PULL_VALID(pad)) {
-               ofs = cpu_is_mx23() ? 0x400 : 0x600;
-               ofs += PAD_BANK(pad) * 0x10;
-               bp = PAD_PIN(pad);
-               if (PAD_PULL(pad))
-                       __mxs_setl(1 << bp, iomux_base + ofs);
-               else
-                       __mxs_clrl(1 << bp, iomux_base + ofs);
-       }
-
-       return 0;
-}
-
-int mxs_iomux_setup_multiple_pads(const iomux_cfg_t *pad_list, unsigned count)
-{
-       const iomux_cfg_t *p = pad_list;
-       int i;
-       int ret;
-
-       for (i = 0; i < count; i++) {
-               ret = mxs_iomux_setup_pad(*p);
-               if (ret)
-                       return ret;
-               p++;
-       }
-
-       return 0;
-}
diff --git a/arch/arm/mach-mxs/mach-apx4devkit.c b/arch/arm/mach-mxs/mach-apx4devkit.c
deleted file mode 100644 (file)
index f5f0617..0000000
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2011-2012
- * Lauri Hintsala, Bluegiga, <lauri.hintsala@bluegiga.com>
- * Veli-Pekka Peltola, Bluegiga, <veli-pekka.peltola@bluegiga.com>
- *
- * based on: mach-mx28evk.c
- * Copyright 2010 Freescale Semiconductor, Inc. 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 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/delay.h>
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <linux/leds.h>
-#include <linux/clk.h>
-#include <linux/i2c.h>
-#include <linux/regulator/machine.h>
-#include <linux/regulator/fixed.h>
-#include <linux/micrel_phy.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include <mach/common.h>
-#include <mach/digctl.h>
-#include <mach/iomux-mx28.h>
-
-#include "devices-mx28.h"
-
-#define APX4DEVKIT_GPIO_USERLED        MXS_GPIO_NR(3, 28)
-
-static const iomux_cfg_t apx4devkit_pads[] __initconst = {
-       /* duart */
-       MX28_PAD_PWM0__DUART_RX | MXS_PAD_CTRL,
-       MX28_PAD_PWM1__DUART_TX | MXS_PAD_CTRL,
-
-       /* auart0 */
-       MX28_PAD_AUART0_RX__AUART0_RX | MXS_PAD_CTRL,
-       MX28_PAD_AUART0_TX__AUART0_TX | MXS_PAD_CTRL,
-       MX28_PAD_AUART0_CTS__AUART0_CTS | MXS_PAD_CTRL,
-       MX28_PAD_AUART0_RTS__AUART0_RTS | MXS_PAD_CTRL,
-
-       /* auart1 */
-       MX28_PAD_AUART1_RX__AUART1_RX | MXS_PAD_CTRL,
-       MX28_PAD_AUART1_TX__AUART1_TX | MXS_PAD_CTRL,
-
-       /* auart2 */
-       MX28_PAD_SSP2_SCK__AUART2_RX | MXS_PAD_CTRL,
-       MX28_PAD_SSP2_MOSI__AUART2_TX | MXS_PAD_CTRL,
-
-       /* auart3 */
-       MX28_PAD_SSP2_MISO__AUART3_RX | MXS_PAD_CTRL,
-       MX28_PAD_SSP2_SS0__AUART3_TX | MXS_PAD_CTRL,
-
-#define MXS_PAD_FEC    (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP)
-       /* fec0 */
-       MX28_PAD_ENET0_MDC__ENET0_MDC | MXS_PAD_FEC,
-       MX28_PAD_ENET0_MDIO__ENET0_MDIO | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MXS_PAD_FEC,
-       MX28_PAD_ENET_CLK__CLKCTRL_ENET | MXS_PAD_FEC,
-
-       /* i2c */
-       MX28_PAD_I2C0_SCL__I2C0_SCL,
-       MX28_PAD_I2C0_SDA__I2C0_SDA,
-
-       /* mmc0 */
-       MX28_PAD_SSP0_DATA0__SSP0_D0 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA1__SSP0_D1 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA2__SSP0_D2 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA3__SSP0_D3 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA4__SSP0_D4 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA5__SSP0_D5 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA6__SSP0_D6 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA7__SSP0_D7 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_CMD__SSP0_CMD |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       MX28_PAD_SSP0_SCK__SSP0_SCK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-
-       /* led */
-       MX28_PAD_PWM3__GPIO_3_28 | MXS_PAD_CTRL,
-
-       /* saif0 & saif1 */
-       MX28_PAD_SAIF0_MCLK__SAIF0_MCLK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0 |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SAIF1_SDATA0__SAIF1_SDATA0 |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-};
-
-/* led */
-static const struct gpio_led apx4devkit_leds[] __initconst = {
-       {
-               .name = "user-led",
-               .default_trigger = "heartbeat",
-               .gpio = APX4DEVKIT_GPIO_USERLED,
-       },
-};
-
-static const struct gpio_led_platform_data apx4devkit_led_data __initconst = {
-       .leds = apx4devkit_leds,
-       .num_leds = ARRAY_SIZE(apx4devkit_leds),
-};
-
-static const struct fec_platform_data mx28_fec_pdata __initconst = {
-       .phy = PHY_INTERFACE_MODE_RMII,
-};
-
-static const struct mxs_mmc_platform_data apx4devkit_mmc_pdata __initconst = {
-       .wp_gpio = -EINVAL,
-       .flags = SLOTF_4_BIT_CAPABLE,
-};
-
-static const struct i2c_board_info apx4devkit_i2c_boardinfo[] __initconst = {
-       { I2C_BOARD_INFO("sgtl5000", 0x0a) }, /* ASoC */
-       { I2C_BOARD_INFO("pcf8563", 0x51) }, /* RTC */
-};
-
-#if defined(CONFIG_REGULATOR_FIXED_VOLTAGE) || \
-               defined(CONFIG_REGULATOR_FIXED_VOLTAGE_MODULE)
-static struct regulator_consumer_supply apx4devkit_audio_consumer_supplies[] = {
-       REGULATOR_SUPPLY("VDDA", "0-000a"),
-       REGULATOR_SUPPLY("VDDIO", "0-000a"),
-};
-
-static struct regulator_init_data apx4devkit_vdd_reg_init_data = {
-       .constraints    = {
-               .name   = "3V3",
-               .always_on = 1,
-       },
-       .consumer_supplies = apx4devkit_audio_consumer_supplies,
-       .num_consumer_supplies = ARRAY_SIZE(apx4devkit_audio_consumer_supplies),
-};
-
-static struct fixed_voltage_config apx4devkit_vdd_pdata = {
-       .supply_name    = "board-3V3",
-       .microvolts     = 3300000,
-       .gpio           = -EINVAL,
-       .enabled_at_boot = 1,
-       .init_data      = &apx4devkit_vdd_reg_init_data,
-};
-
-static struct platform_device apx4devkit_voltage_regulator = {
-       .name           = "reg-fixed-voltage",
-       .id             = -1,
-       .num_resources  = 0,
-       .dev            = {
-               .platform_data  = &apx4devkit_vdd_pdata,
-       },
-};
-
-static void __init apx4devkit_add_regulators(void)
-{
-       platform_device_register(&apx4devkit_voltage_regulator);
-}
-#else
-static void __init apx4devkit_add_regulators(void) {}
-#endif
-
-static const struct mxs_saif_platform_data
-                       apx4devkit_mxs_saif_pdata[] __initconst = {
-       /* working on EXTMSTR0 mode (saif0 master, saif1 slave) */
-       {
-               .master_mode = 1,
-               .master_id = 0,
-       }, {
-               .master_mode = 0,
-               .master_id = 0,
-       },
-};
-
-static int apx4devkit_phy_fixup(struct phy_device *phy)
-{
-       phy->dev_flags |= MICREL_PHY_50MHZ_CLK;
-       return 0;
-}
-
-static void __init apx4devkit_fec_phy_clk_enable(void)
-{
-       struct clk *clk;
-
-       /* Enable fec phy clock */
-       clk = clk_get_sys("enet_out", NULL);
-       if (!IS_ERR(clk))
-               clk_prepare_enable(clk);
-}
-
-static void __init apx4devkit_init(void)
-{
-       mx28_soc_init();
-
-       mxs_iomux_setup_multiple_pads(apx4devkit_pads,
-                       ARRAY_SIZE(apx4devkit_pads));
-
-       mx28_add_duart();
-       mx28_add_auart0();
-       mx28_add_auart1();
-       mx28_add_auart2();
-       mx28_add_auart3();
-
-       /*
-        * Register fixup for the Micrel KS8031 PHY clock
-        * (shares same ID with KS8051)
-        */
-       phy_register_fixup_for_uid(PHY_ID_KS8051, MICREL_PHY_ID_MASK,
-                       apx4devkit_phy_fixup);
-
-       apx4devkit_fec_phy_clk_enable();
-       mx28_add_fec(0, &mx28_fec_pdata);
-
-       mx28_add_mxs_mmc(0, &apx4devkit_mmc_pdata);
-
-       gpio_led_register_device(0, &apx4devkit_led_data);
-
-       mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
-       mx28_add_saif(0, &apx4devkit_mxs_saif_pdata[0]);
-       mx28_add_saif(1, &apx4devkit_mxs_saif_pdata[1]);
-
-       apx4devkit_add_regulators();
-
-       mx28_add_mxs_i2c(0);
-       i2c_register_board_info(0, apx4devkit_i2c_boardinfo,
-                       ARRAY_SIZE(apx4devkit_i2c_boardinfo));
-
-       mxs_add_platform_device("mxs-sgtl5000", 0, NULL, 0, NULL, 0);
-}
-
-static void __init apx4devkit_timer_init(void)
-{
-       mx28_clocks_init();
-}
-
-static struct sys_timer apx4devkit_timer = {
-       .init   = apx4devkit_timer_init,
-};
-
-MACHINE_START(APX4DEVKIT, "Bluegiga APX4 Development Kit")
-       .map_io         = mx28_map_io,
-       .init_irq       = mx28_init_irq,
-       .timer          = &apx4devkit_timer,
-       .init_machine   = apx4devkit_init,
-       .restart        = mxs_restart,
-MACHINE_END
diff --git a/arch/arm/mach-mxs/mach-m28evk.c b/arch/arm/mach-mxs/mach-m28evk.c
deleted file mode 100644 (file)
index 4c00c87..0000000
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright (C) 2011
- * Stefano Babic, DENX Software Engineering, <sbabic@denx.de>
- *
- * based on: mach-mx28_evk.c
- * Copyright 2010 Freescale Semiconductor, Inc. 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 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/delay.h>
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <linux/leds.h>
-#include <linux/irq.h>
-#include <linux/clk.h>
-#include <linux/i2c.h>
-#include <linux/i2c/at24.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include <mach/common.h>
-#include <mach/iomux-mx28.h>
-
-#include "devices-mx28.h"
-
-#define M28EVK_GPIO_USERLED1   MXS_GPIO_NR(3, 16)
-#define M28EVK_GPIO_USERLED2   MXS_GPIO_NR(3, 17)
-
-#define MX28EVK_BL_ENABLE      MXS_GPIO_NR(3, 18)
-#define M28EVK_LCD_ENABLE      MXS_GPIO_NR(3, 28)
-
-#define MX28EVK_MMC0_WRITE_PROTECT     MXS_GPIO_NR(2, 12)
-#define MX28EVK_MMC1_WRITE_PROTECT     MXS_GPIO_NR(0, 28)
-
-static const iomux_cfg_t m28evk_pads[] __initconst = {
-       /* duart */
-       MX28_PAD_AUART0_CTS__DUART_RX | MXS_PAD_CTRL,
-       MX28_PAD_AUART0_RTS__DUART_TX | MXS_PAD_CTRL,
-
-       /* auart0 */
-       MX28_PAD_AUART0_RX__AUART0_RX | MXS_PAD_CTRL,
-       MX28_PAD_AUART0_TX__AUART0_TX | MXS_PAD_CTRL,
-
-       /* auart3 */
-       MX28_PAD_AUART3_RX__AUART3_RX | MXS_PAD_CTRL,
-       MX28_PAD_AUART3_TX__AUART3_TX | MXS_PAD_CTRL,
-       MX28_PAD_AUART3_CTS__AUART3_CTS | MXS_PAD_CTRL,
-       MX28_PAD_AUART3_RTS__AUART3_RTS | MXS_PAD_CTRL,
-
-#define MXS_PAD_FEC    (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP)
-       /* fec0 */
-       MX28_PAD_ENET0_MDC__ENET0_MDC | MXS_PAD_FEC,
-       MX28_PAD_ENET0_MDIO__ENET0_MDIO | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MXS_PAD_FEC,
-       MX28_PAD_ENET_CLK__CLKCTRL_ENET | MXS_PAD_FEC,
-       /* fec1 */
-       MX28_PAD_ENET0_CRS__ENET1_RX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD2__ENET1_RXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD3__ENET1_RXD1 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_COL__ENET1_TX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD2__ENET1_TXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD3__ENET1_TXD1 | MXS_PAD_FEC,
-
-       /* flexcan0 */
-       MX28_PAD_GPMI_RDY2__CAN0_TX,
-       MX28_PAD_GPMI_RDY3__CAN0_RX,
-
-       /* flexcan1 */
-       MX28_PAD_GPMI_CE2N__CAN1_TX,
-       MX28_PAD_GPMI_CE3N__CAN1_RX,
-
-       /* I2C */
-       MX28_PAD_I2C0_SCL__I2C0_SCL,
-       MX28_PAD_I2C0_SDA__I2C0_SDA,
-
-       /* mxsfb (lcdif) */
-       MX28_PAD_LCD_D00__LCD_D0 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D01__LCD_D1 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D02__LCD_D2 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D03__LCD_D3 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D04__LCD_D4 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D05__LCD_D5 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D06__LCD_D6 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D07__LCD_D7 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D08__LCD_D8 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D09__LCD_D9 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D10__LCD_D10 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D11__LCD_D11 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D12__LCD_D12 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D13__LCD_D13 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D14__LCD_D14 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D15__LCD_D15 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D16__LCD_D16 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D17__LCD_D17 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D18__LCD_D18 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D19__LCD_D19 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D20__LCD_D20 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D21__LCD_D21 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D22__LCD_D22 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D23__LCD_D23 | MXS_PAD_CTRL,
-
-       MX28_PAD_LCD_ENABLE__LCD_ENABLE | MXS_PAD_CTRL,
-       MX28_PAD_LCD_DOTCLK__LCD_DOTCLK | MXS_PAD_CTRL,
-
-       /* mmc0 */
-       MX28_PAD_SSP0_DATA0__SSP0_D0 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA1__SSP0_D1 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA2__SSP0_D2 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA3__SSP0_D3 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA4__SSP0_D4 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA5__SSP0_D5 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA6__SSP0_D6 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA7__SSP0_D7 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_CMD__SSP0_CMD |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       MX28_PAD_SSP0_SCK__SSP0_SCK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-
-       /* mmc1 */
-       MX28_PAD_GPMI_D00__SSP1_D0 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D01__SSP1_D1 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D02__SSP1_D2 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D03__SSP1_D3 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D04__SSP1_D4 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D05__SSP1_D5 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D06__SSP1_D6 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D07__SSP1_D7 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_RDY1__SSP1_CMD |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_RDY0__SSP1_CARD_DETECT |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_WRN__SSP1_SCK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       /* write protect */
-       MX28_PAD_GPMI_RESETN__GPIO_0_28 |
-               (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       /* slot power enable */
-       MX28_PAD_PWM4__GPIO_3_29 |
-               (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-
-       /* led */
-       MX28_PAD_PWM0__GPIO_3_16 | MXS_PAD_CTRL,
-       MX28_PAD_PWM1__GPIO_3_17 | MXS_PAD_CTRL,
-
-       /* nand */
-       MX28_PAD_GPMI_D00__GPMI_D0 |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_D01__GPMI_D1 |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_D02__GPMI_D2 |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_D03__GPMI_D3 |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_D04__GPMI_D4 |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_D05__GPMI_D5 |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_D06__GPMI_D6 |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_D07__GPMI_D7 |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_CE0N__GPMI_CE0N |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_RDY0__GPMI_READY0 |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_RDN__GPMI_RDN |
-               (MXS_PAD_12MA | MXS_PAD_1V8 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_WRN__GPMI_WRN |
-               (MXS_PAD_12MA | MXS_PAD_1V8 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_ALE__GPMI_ALE |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_CLE__GPMI_CLE |
-               (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_RESETN__GPMI_RESETN |
-               (MXS_PAD_12MA | MXS_PAD_1V8 | MXS_PAD_PULLUP),
-
-       /* Backlight */
-       MX28_PAD_PWM3__GPIO_3_28 | MXS_PAD_CTRL,
-};
-
-/* led */
-static const struct gpio_led m28evk_leds[] __initconst = {
-       {
-               .name = "user-led1",
-               .default_trigger = "heartbeat",
-               .gpio = M28EVK_GPIO_USERLED1,
-       },
-       {
-               .name = "user-led2",
-               .default_trigger = "heartbeat",
-               .gpio = M28EVK_GPIO_USERLED2,
-       },
-};
-
-static const struct gpio_led_platform_data m28evk_led_data __initconst = {
-       .leds = m28evk_leds,
-       .num_leds = ARRAY_SIZE(m28evk_leds),
-};
-
-static struct fec_platform_data mx28_fec_pdata[] __initdata = {
-       {
-               /* fec0 */
-               .phy = PHY_INTERFACE_MODE_RMII,
-       }, {
-               /* fec1 */
-               .phy = PHY_INTERFACE_MODE_RMII,
-       },
-};
-
-static int __init m28evk_fec_get_mac(void)
-{
-       int i;
-       u32 val;
-       const u32 *ocotp = mxs_get_ocotp();
-
-       if (!ocotp)
-               return -ETIMEDOUT;
-
-       /*
-        * OCOTP only stores the last 4 octets for each mac address,
-        * so hard-code DENX OUI (C0:E5:4E) here.
-        */
-       for (i = 0; i < 2; i++) {
-               val = ocotp[i];
-               mx28_fec_pdata[i].mac[0] = 0xC0;
-               mx28_fec_pdata[i].mac[1] = 0xE5;
-               mx28_fec_pdata[i].mac[2] = 0x4E;
-               mx28_fec_pdata[i].mac[3] = (val >> 16) & 0xff;
-               mx28_fec_pdata[i].mac[4] = (val >> 8) & 0xff;
-               mx28_fec_pdata[i].mac[5] = (val >> 0) & 0xff;
-       }
-
-       return 0;
-}
-
-/* mxsfb (lcdif) */
-static struct fb_videomode m28evk_video_modes[] = {
-       {
-               .name           = "Ampire AM-800480R2TMQW-T01H",
-               .refresh        = 60,
-               .xres           = 800,
-               .yres           = 480,
-               .pixclock       = 30066, /* picosecond (33.26 MHz) */
-               .left_margin    = 0,
-               .right_margin   = 256,
-               .upper_margin   = 0,
-               .lower_margin   = 45,
-               .hsync_len      = 1,
-               .vsync_len      = 1,
-               .sync           = FB_SYNC_DATA_ENABLE_HIGH_ACT,
-       },
-};
-
-static const struct mxsfb_platform_data m28evk_mxsfb_pdata __initconst = {
-       .mode_list      = m28evk_video_modes,
-       .mode_count     = ARRAY_SIZE(m28evk_video_modes),
-       .default_bpp    = 16,
-       .ld_intf_width  = STMLCDIF_18BIT,
-};
-
-static struct at24_platform_data m28evk_eeprom = {
-       .byte_len = 16384,
-       .page_size = 32,
-       .flags = AT24_FLAG_ADDR16,
-};
-
-static struct i2c_board_info m28_stk5v3_i2c_boardinfo[] __initdata = {
-       {
-               I2C_BOARD_INFO("at24", 0x51),   /* E0=1, E1=0, E2=0 */
-               .platform_data = &m28evk_eeprom,
-       },
-};
-
-static struct mxs_mmc_platform_data m28evk_mmc_pdata[] __initdata = {
-       {
-               /* mmc0 */
-               .wp_gpio = MX28EVK_MMC0_WRITE_PROTECT,
-               .flags = SLOTF_8_BIT_CAPABLE,
-       }, {
-               /* mmc1 */
-               .wp_gpio = MX28EVK_MMC1_WRITE_PROTECT,
-               .flags = SLOTF_8_BIT_CAPABLE,
-       },
-};
-
-static void __init m28evk_init(void)
-{
-       mx28_soc_init();
-
-       mxs_iomux_setup_multiple_pads(m28evk_pads, ARRAY_SIZE(m28evk_pads));
-
-       mx28_add_duart();
-       mx28_add_auart0();
-       mx28_add_auart3();
-
-       if (!m28evk_fec_get_mac()) {
-               mx28_add_fec(0, &mx28_fec_pdata[0]);
-               mx28_add_fec(1, &mx28_fec_pdata[1]);
-       }
-
-       mx28_add_flexcan(0, NULL);
-       mx28_add_flexcan(1, NULL);
-
-       mx28_add_mxsfb(&m28evk_mxsfb_pdata);
-
-       mx28_add_mxs_mmc(0, &m28evk_mmc_pdata[0]);
-       mx28_add_mxs_mmc(1, &m28evk_mmc_pdata[1]);
-
-       gpio_led_register_device(0, &m28evk_led_data);
-
-       /* I2C */
-       mx28_add_mxs_i2c(0);
-       i2c_register_board_info(0, m28_stk5v3_i2c_boardinfo,
-                       ARRAY_SIZE(m28_stk5v3_i2c_boardinfo));
-}
-
-static void __init m28evk_timer_init(void)
-{
-       mx28_clocks_init();
-}
-
-static struct sys_timer m28evk_timer = {
-       .init   = m28evk_timer_init,
-};
-
-MACHINE_START(M28EVK, "DENX M28 EVK")
-       .map_io         = mx28_map_io,
-       .init_irq       = mx28_init_irq,
-       .timer          = &m28evk_timer,
-       .init_machine   = m28evk_init,
-       .restart        = mxs_restart,
-MACHINE_END
diff --git a/arch/arm/mach-mxs/mach-mx23evk.c b/arch/arm/mach-mxs/mach-mx23evk.c
deleted file mode 100644 (file)
index e7272a4..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright 2010 Freescale Semiconductor, Inc. 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 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/delay.h>
-#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 <mach/common.h>
-#include <mach/iomux-mx23.h>
-
-#include "devices-mx23.h"
-
-#define MX23EVK_LCD_ENABLE     MXS_GPIO_NR(1, 18)
-#define MX23EVK_BL_ENABLE      MXS_GPIO_NR(1, 28)
-#define MX23EVK_MMC0_WRITE_PROTECT     MXS_GPIO_NR(1, 30)
-#define MX23EVK_MMC0_SLOT_POWER                MXS_GPIO_NR(1, 29)
-
-static const iomux_cfg_t mx23evk_pads[] __initconst = {
-       /* duart */
-       MX23_PAD_PWM0__DUART_RX | MXS_PAD_CTRL,
-       MX23_PAD_PWM1__DUART_TX | MXS_PAD_CTRL,
-
-       /* auart */
-       MX23_PAD_AUART1_RX__AUART1_RX | MXS_PAD_CTRL,
-       MX23_PAD_AUART1_TX__AUART1_TX | MXS_PAD_CTRL,
-       MX23_PAD_AUART1_CTS__AUART1_CTS | MXS_PAD_CTRL,
-       MX23_PAD_AUART1_RTS__AUART1_RTS | MXS_PAD_CTRL,
-
-       /* mxsfb (lcdif) */
-       MX23_PAD_LCD_D00__LCD_D00 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D01__LCD_D01 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D02__LCD_D02 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D03__LCD_D03 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D04__LCD_D04 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D05__LCD_D05 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D06__LCD_D06 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D07__LCD_D07 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D08__LCD_D08 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D09__LCD_D09 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D10__LCD_D10 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D11__LCD_D11 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D12__LCD_D12 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D13__LCD_D13 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D14__LCD_D14 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D15__LCD_D15 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D16__LCD_D16 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_D17__LCD_D17 | MXS_PAD_CTRL,
-       MX23_PAD_GPMI_D08__LCD_D18 | MXS_PAD_CTRL,
-       MX23_PAD_GPMI_D09__LCD_D19 | MXS_PAD_CTRL,
-       MX23_PAD_GPMI_D10__LCD_D20 | MXS_PAD_CTRL,
-       MX23_PAD_GPMI_D11__LCD_D21 | MXS_PAD_CTRL,
-       MX23_PAD_GPMI_D12__LCD_D22 | MXS_PAD_CTRL,
-       MX23_PAD_GPMI_D13__LCD_D23 | MXS_PAD_CTRL,
-       MX23_PAD_LCD_VSYNC__LCD_VSYNC | MXS_PAD_CTRL,
-       MX23_PAD_LCD_HSYNC__LCD_HSYNC | MXS_PAD_CTRL,
-       MX23_PAD_LCD_DOTCK__LCD_DOTCK | MXS_PAD_CTRL,
-       MX23_PAD_LCD_ENABLE__LCD_ENABLE | MXS_PAD_CTRL,
-       /* LCD panel enable */
-       MX23_PAD_LCD_RESET__GPIO_1_18 | MXS_PAD_CTRL,
-       /* backlight control */
-       MX23_PAD_PWM2__GPIO_1_28 | MXS_PAD_CTRL,
-
-       /* mmc */
-       MX23_PAD_SSP1_DATA0__SSP1_DATA0 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_DATA1__SSP1_DATA1 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_DATA2__SSP1_DATA2 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_DATA3__SSP1_DATA3 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_GPMI_D08__SSP1_DATA4 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_GPMI_D09__SSP1_DATA5 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_GPMI_D10__SSP1_DATA6 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_GPMI_D11__SSP1_DATA7 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_CMD__SSP1_CMD |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_DETECT__SSP1_DETECT |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       MX23_PAD_SSP1_SCK__SSP1_SCK |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       /* write protect */
-       MX23_PAD_PWM4__GPIO_1_30 |
-               (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       /* slot power enable */
-       MX23_PAD_PWM3__GPIO_1_29 |
-               (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-};
-
-/* mxsfb (lcdif) */
-static struct fb_videomode mx23evk_video_modes[] = {
-       {
-               .name           = "Samsung-LMS430HF02",
-               .refresh        = 60,
-               .xres           = 480,
-               .yres           = 272,
-               .pixclock       = 108096, /* picosecond (9.2 MHz) */
-               .left_margin    = 15,
-               .right_margin   = 8,
-               .upper_margin   = 12,
-               .lower_margin   = 4,
-               .hsync_len      = 1,
-               .vsync_len      = 1,
-               .sync           = FB_SYNC_DATA_ENABLE_HIGH_ACT |
-                                 FB_SYNC_DOTCLK_FAILING_ACT,
-       },
-};
-
-static const struct mxsfb_platform_data mx23evk_mxsfb_pdata __initconst = {
-       .mode_list      = mx23evk_video_modes,
-       .mode_count     = ARRAY_SIZE(mx23evk_video_modes),
-       .default_bpp    = 32,
-       .ld_intf_width  = STMLCDIF_24BIT,
-};
-
-static struct mxs_mmc_platform_data mx23evk_mmc_pdata __initdata = {
-       .wp_gpio = MX23EVK_MMC0_WRITE_PROTECT,
-       .flags = SLOTF_8_BIT_CAPABLE,
-};
-
-static void __init mx23evk_init(void)
-{
-       int ret;
-
-       mx23_soc_init();
-
-       mxs_iomux_setup_multiple_pads(mx23evk_pads, ARRAY_SIZE(mx23evk_pads));
-
-       mx23_add_duart();
-       mx23_add_auart0();
-
-       /* power on mmc slot by writing 0 to the gpio */
-       ret = gpio_request_one(MX23EVK_MMC0_SLOT_POWER, GPIOF_OUT_INIT_LOW,
-                              "mmc0-slot-power");
-       if (ret)
-               pr_warn("failed to request gpio mmc0-slot-power: %d\n", ret);
-       mx23_add_mxs_mmc(0, &mx23evk_mmc_pdata);
-
-       ret = gpio_request_one(MX23EVK_LCD_ENABLE, GPIOF_DIR_OUT, "lcd-enable");
-       if (ret)
-               pr_warn("failed to request gpio lcd-enable: %d\n", ret);
-       else
-               gpio_set_value(MX23EVK_LCD_ENABLE, 1);
-
-       ret = gpio_request_one(MX23EVK_BL_ENABLE, GPIOF_DIR_OUT, "bl-enable");
-       if (ret)
-               pr_warn("failed to request gpio bl-enable: %d\n", ret);
-       else
-               gpio_set_value(MX23EVK_BL_ENABLE, 1);
-
-       mx23_add_mxsfb(&mx23evk_mxsfb_pdata);
-       mx23_add_rtc_stmp3xxx();
-}
-
-static void __init mx23evk_timer_init(void)
-{
-       mx23_clocks_init();
-}
-
-static struct sys_timer mx23evk_timer = {
-       .init   = mx23evk_timer_init,
-};
-
-MACHINE_START(MX23EVK, "Freescale MX23 EVK")
-       /* Maintainer: Freescale Semiconductor, Inc. */
-       .map_io         = mx23_map_io,
-       .init_irq       = mx23_init_irq,
-       .timer          = &mx23evk_timer,
-       .init_machine   = mx23evk_init,
-       .restart        = mxs_restart,
-MACHINE_END
diff --git a/arch/arm/mach-mxs/mach-mx28evk.c b/arch/arm/mach-mxs/mach-mx28evk.c
deleted file mode 100644 (file)
index dafd48e..0000000
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- * Copyright 2010 Freescale Semiconductor, Inc. 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 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/delay.h>
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <linux/leds.h>
-#include <linux/clk.h>
-#include <linux/i2c.h>
-#include <linux/regulator/machine.h>
-#include <linux/regulator/fixed.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include <mach/common.h>
-#include <mach/iomux-mx28.h>
-#include <mach/digctl.h>
-
-#include "devices-mx28.h"
-
-#define MX28EVK_FLEXCAN_SWITCH MXS_GPIO_NR(2, 13)
-#define MX28EVK_FEC_PHY_POWER  MXS_GPIO_NR(2, 15)
-#define MX28EVK_GPIO_LED       MXS_GPIO_NR(3, 5)
-#define MX28EVK_BL_ENABLE      MXS_GPIO_NR(3, 18)
-#define MX28EVK_LCD_ENABLE     MXS_GPIO_NR(3, 30)
-#define MX28EVK_FEC_PHY_RESET  MXS_GPIO_NR(4, 13)
-
-#define MX28EVK_MMC0_WRITE_PROTECT     MXS_GPIO_NR(2, 12)
-#define MX28EVK_MMC1_WRITE_PROTECT     MXS_GPIO_NR(0, 28)
-#define MX28EVK_MMC0_SLOT_POWER                MXS_GPIO_NR(3, 28)
-#define MX28EVK_MMC1_SLOT_POWER                MXS_GPIO_NR(3, 29)
-
-static const iomux_cfg_t mx28evk_pads[] __initconst = {
-       /* duart */
-       MX28_PAD_PWM0__DUART_RX | MXS_PAD_CTRL,
-       MX28_PAD_PWM1__DUART_TX | MXS_PAD_CTRL,
-
-       /* auart0 */
-       MX28_PAD_AUART0_RX__AUART0_RX | MXS_PAD_CTRL,
-       MX28_PAD_AUART0_TX__AUART0_TX | MXS_PAD_CTRL,
-       MX28_PAD_AUART0_CTS__AUART0_CTS | MXS_PAD_CTRL,
-       MX28_PAD_AUART0_RTS__AUART0_RTS | MXS_PAD_CTRL,
-       /* auart3 */
-       MX28_PAD_AUART3_RX__AUART3_RX | MXS_PAD_CTRL,
-       MX28_PAD_AUART3_TX__AUART3_TX | MXS_PAD_CTRL,
-       MX28_PAD_AUART3_CTS__AUART3_CTS | MXS_PAD_CTRL,
-       MX28_PAD_AUART3_RTS__AUART3_RTS | MXS_PAD_CTRL,
-
-#define MXS_PAD_FEC    (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP)
-       /* fec0 */
-       MX28_PAD_ENET0_MDC__ENET0_MDC | MXS_PAD_FEC,
-       MX28_PAD_ENET0_MDIO__ENET0_MDIO | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD0__ENET0_RXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD1__ENET0_RXD1 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD0__ENET0_TXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD1__ENET0_TXD1 | MXS_PAD_FEC,
-       MX28_PAD_ENET_CLK__CLKCTRL_ENET | MXS_PAD_FEC,
-       /* fec1 */
-       MX28_PAD_ENET0_CRS__ENET1_RX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD2__ENET1_RXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_RXD3__ENET1_RXD1 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_COL__ENET1_TX_EN | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD2__ENET1_TXD0 | MXS_PAD_FEC,
-       MX28_PAD_ENET0_TXD3__ENET1_TXD1 | MXS_PAD_FEC,
-       /* phy power line */
-       MX28_PAD_SSP1_DATA3__GPIO_2_15 | MXS_PAD_CTRL,
-       /* phy reset line */
-       MX28_PAD_ENET0_RX_CLK__GPIO_4_13 | MXS_PAD_CTRL,
-
-       /* flexcan0 */
-       MX28_PAD_GPMI_RDY2__CAN0_TX,
-       MX28_PAD_GPMI_RDY3__CAN0_RX,
-       /* flexcan1 */
-       MX28_PAD_GPMI_CE2N__CAN1_TX,
-       MX28_PAD_GPMI_CE3N__CAN1_RX,
-       /* transceiver power control */
-       MX28_PAD_SSP1_CMD__GPIO_2_13,
-
-       /* mxsfb (lcdif) */
-       MX28_PAD_LCD_D00__LCD_D0 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D01__LCD_D1 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D02__LCD_D2 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D03__LCD_D3 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D04__LCD_D4 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D05__LCD_D5 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D06__LCD_D6 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D07__LCD_D7 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D08__LCD_D8 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D09__LCD_D9 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D10__LCD_D10 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D11__LCD_D11 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D12__LCD_D12 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D13__LCD_D13 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D14__LCD_D14 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D15__LCD_D15 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D16__LCD_D16 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D17__LCD_D17 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D18__LCD_D18 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D19__LCD_D19 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D20__LCD_D20 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D21__LCD_D21 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D22__LCD_D22 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_D23__LCD_D23 | MXS_PAD_CTRL,
-       MX28_PAD_LCD_RD_E__LCD_VSYNC | MXS_PAD_CTRL,
-       MX28_PAD_LCD_WR_RWN__LCD_HSYNC | MXS_PAD_CTRL,
-       MX28_PAD_LCD_RS__LCD_DOTCLK | MXS_PAD_CTRL,
-       MX28_PAD_LCD_CS__LCD_ENABLE | MXS_PAD_CTRL,
-       /* LCD panel enable */
-       MX28_PAD_LCD_RESET__GPIO_3_30 | MXS_PAD_CTRL,
-       /* backlight control */
-       MX28_PAD_PWM2__GPIO_3_18 | MXS_PAD_CTRL,
-       /* mmc0 */
-       MX28_PAD_SSP0_DATA0__SSP0_D0 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA1__SSP0_D1 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA2__SSP0_D2 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA3__SSP0_D3 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA4__SSP0_D4 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA5__SSP0_D5 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA6__SSP0_D6 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA7__SSP0_D7 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_CMD__SSP0_CMD |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       MX28_PAD_SSP0_SCK__SSP0_SCK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       /* write protect */
-       MX28_PAD_SSP1_SCK__GPIO_2_12 |
-               (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       /* slot power enable */
-       MX28_PAD_PWM3__GPIO_3_28 |
-               (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-
-       /* mmc1 */
-       MX28_PAD_GPMI_D00__SSP1_D0 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D01__SSP1_D1 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D02__SSP1_D2 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D03__SSP1_D3 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D04__SSP1_D4 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D05__SSP1_D5 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D06__SSP1_D6 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_D07__SSP1_D7 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_RDY1__SSP1_CMD |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_GPMI_RDY0__SSP1_CARD_DETECT |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       MX28_PAD_GPMI_WRN__SSP1_SCK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       /* write protect */
-       MX28_PAD_GPMI_RESETN__GPIO_0_28 |
-               (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       /* slot power enable */
-       MX28_PAD_PWM4__GPIO_3_29 |
-               (MXS_PAD_4MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-
-       /* led */
-       MX28_PAD_AUART1_TX__GPIO_3_5 | MXS_PAD_CTRL,
-
-       /* I2C */
-       MX28_PAD_I2C0_SCL__I2C0_SCL |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_I2C0_SDA__I2C0_SDA |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-
-       /* saif0 & saif1 */
-       MX28_PAD_SAIF0_MCLK__SAIF0_MCLK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SAIF0_LRCLK__SAIF0_LRCLK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SAIF0_BITCLK__SAIF0_BITCLK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SAIF0_SDATA0__SAIF0_SDATA0 |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SAIF1_SDATA0__SAIF1_SDATA0 |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-};
-
-/* led */
-static const struct gpio_led mx28evk_leds[] __initconst = {
-       {
-               .name = "GPIO-LED",
-               .default_trigger = "heartbeat",
-               .gpio = MX28EVK_GPIO_LED,
-       },
-};
-
-static const struct gpio_led_platform_data mx28evk_led_data __initconst = {
-       .leds = mx28evk_leds,
-       .num_leds = ARRAY_SIZE(mx28evk_leds),
-};
-
-/* fec */
-static void __init mx28evk_fec_reset(void)
-{
-       struct clk *clk;
-
-       /* Enable fec phy clock */
-       clk = clk_get_sys("enet_out", NULL);
-       if (!IS_ERR(clk))
-               clk_prepare_enable(clk);
-
-       gpio_set_value(MX28EVK_FEC_PHY_RESET, 0);
-       mdelay(1);
-       gpio_set_value(MX28EVK_FEC_PHY_RESET, 1);
-}
-
-static struct fec_platform_data mx28_fec_pdata[] __initdata = {
-       {
-               /* fec0 */
-               .phy = PHY_INTERFACE_MODE_RMII,
-       }, {
-               /* fec1 */
-               .phy = PHY_INTERFACE_MODE_RMII,
-       },
-};
-
-static int __init mx28evk_fec_get_mac(void)
-{
-       int i;
-       u32 val;
-       const u32 *ocotp = mxs_get_ocotp();
-
-       if (!ocotp)
-               return -ETIMEDOUT;
-
-       /*
-        * OCOTP only stores the last 4 octets for each mac address,
-        * so hard-code Freescale OUI (00:04:9f) here.
-        */
-       for (i = 0; i < 2; i++) {
-               val = ocotp[i];
-               mx28_fec_pdata[i].mac[0] = 0x00;
-               mx28_fec_pdata[i].mac[1] = 0x04;
-               mx28_fec_pdata[i].mac[2] = 0x9f;
-               mx28_fec_pdata[i].mac[3] = (val >> 16) & 0xff;
-               mx28_fec_pdata[i].mac[4] = (val >> 8) & 0xff;
-               mx28_fec_pdata[i].mac[5] = (val >> 0) & 0xff;
-       }
-
-       return 0;
-}
-
-/*
- * MX28EVK_FLEXCAN_SWITCH is shared between both flexcan controllers
- */
-static int flexcan0_en, flexcan1_en;
-
-static void mx28evk_flexcan_switch(void)
-{
-       if (flexcan0_en || flexcan1_en)
-               gpio_set_value(MX28EVK_FLEXCAN_SWITCH, 1);
-       else
-               gpio_set_value(MX28EVK_FLEXCAN_SWITCH, 0);
-}
-
-static void mx28evk_flexcan0_switch(int enable)
-{
-       flexcan0_en = enable;
-       mx28evk_flexcan_switch();
-}
-
-static void mx28evk_flexcan1_switch(int enable)
-{
-       flexcan1_en = enable;
-       mx28evk_flexcan_switch();
-}
-
-static const struct flexcan_platform_data
-               mx28evk_flexcan_pdata[] __initconst = {
-       {
-               .transceiver_switch = mx28evk_flexcan0_switch,
-       }, {
-               .transceiver_switch = mx28evk_flexcan1_switch,
-       }
-};
-
-/* mxsfb (lcdif) */
-static struct fb_videomode mx28evk_video_modes[] = {
-       {
-               .name           = "Seiko-43WVF1G",
-               .refresh        = 60,
-               .xres           = 800,
-               .yres           = 480,
-               .pixclock       = 29851, /* picosecond (33.5 MHz) */
-               .left_margin    = 89,
-               .right_margin   = 164,
-               .upper_margin   = 23,
-               .lower_margin   = 10,
-               .hsync_len      = 10,
-               .vsync_len      = 10,
-               .sync           = FB_SYNC_DATA_ENABLE_HIGH_ACT |
-                                 FB_SYNC_DOTCLK_FAILING_ACT,
-       },
-};
-
-static const struct mxsfb_platform_data mx28evk_mxsfb_pdata __initconst = {
-       .mode_list      = mx28evk_video_modes,
-       .mode_count     = ARRAY_SIZE(mx28evk_video_modes),
-       .default_bpp    = 32,
-       .ld_intf_width  = STMLCDIF_24BIT,
-};
-
-static struct mxs_mmc_platform_data mx28evk_mmc_pdata[] __initdata = {
-       {
-               /* mmc0 */
-               .wp_gpio = MX28EVK_MMC0_WRITE_PROTECT,
-               .flags = SLOTF_8_BIT_CAPABLE,
-       }, {
-               /* mmc1 */
-               .wp_gpio = MX28EVK_MMC1_WRITE_PROTECT,
-               .flags = SLOTF_8_BIT_CAPABLE,
-       },
-};
-
-static struct i2c_board_info mxs_i2c0_board_info[] __initdata = {
-       {
-               I2C_BOARD_INFO("sgtl5000", 0x0a),
-       },
-};
-
-#if defined(CONFIG_REGULATOR_FIXED_VOLTAGE) || defined(CONFIG_REGULATOR_FIXED_VOLTAGE_MODULE)
-static struct regulator_consumer_supply mx28evk_audio_consumer_supplies[] = {
-       REGULATOR_SUPPLY("VDDA", "0-000a"),
-       REGULATOR_SUPPLY("VDDIO", "0-000a"),
-};
-
-static struct regulator_init_data mx28evk_vdd_reg_init_data = {
-       .constraints    = {
-               .name   = "3V3",
-               .always_on = 1,
-       },
-       .consumer_supplies = mx28evk_audio_consumer_supplies,
-       .num_consumer_supplies = ARRAY_SIZE(mx28evk_audio_consumer_supplies),
-};
-
-static struct fixed_voltage_config mx28evk_vdd_pdata = {
-       .supply_name    = "board-3V3",
-       .microvolts     = 3300000,
-       .gpio           = -EINVAL,
-       .enabled_at_boot = 1,
-       .init_data      = &mx28evk_vdd_reg_init_data,
-};
-static struct platform_device mx28evk_voltage_regulator = {
-       .name           = "reg-fixed-voltage",
-       .id             = -1,
-       .num_resources  = 0,
-       .dev            = {
-               .platform_data  = &mx28evk_vdd_pdata,
-       },
-};
-static void __init mx28evk_add_regulators(void)
-{
-       platform_device_register(&mx28evk_voltage_regulator);
-}
-#else
-static void __init mx28evk_add_regulators(void) {}
-#endif
-
-static const struct gpio mx28evk_gpios[] __initconst = {
-       { MX28EVK_LCD_ENABLE, GPIOF_OUT_INIT_HIGH, "lcd-enable" },
-       { MX28EVK_BL_ENABLE, GPIOF_OUT_INIT_HIGH, "bl-enable" },
-       { MX28EVK_FLEXCAN_SWITCH, GPIOF_DIR_OUT, "flexcan-switch" },
-       { MX28EVK_MMC0_SLOT_POWER, GPIOF_OUT_INIT_LOW, "mmc0-slot-power" },
-       { MX28EVK_MMC1_SLOT_POWER, GPIOF_OUT_INIT_LOW, "mmc1-slot-power" },
-       { MX28EVK_FEC_PHY_POWER, GPIOF_OUT_INIT_LOW, "fec-phy-power" },
-       { MX28EVK_FEC_PHY_RESET, GPIOF_DIR_OUT, "fec-phy-reset" },
-};
-
-static const struct mxs_saif_platform_data
-                       mx28evk_mxs_saif_pdata[] __initconst = {
-       /* working on EXTMSTR0 mode (saif0 master, saif1 slave) */
-       {
-               .master_mode = 1,
-               .master_id = 0,
-       }, {
-               .master_mode = 0,
-               .master_id = 0,
-       },
-};
-
-static void __init mx28evk_init(void)
-{
-       int ret;
-
-       mx28_soc_init();
-
-       mxs_iomux_setup_multiple_pads(mx28evk_pads, ARRAY_SIZE(mx28evk_pads));
-
-       mx28_add_duart();
-       mx28_add_auart0();
-       mx28_add_auart3();
-
-       if (mx28evk_fec_get_mac())
-               pr_warn("%s: failed on fec mac setup\n", __func__);
-
-       ret = gpio_request_array(mx28evk_gpios, ARRAY_SIZE(mx28evk_gpios));
-       if (ret)
-               pr_err("One or more GPIOs failed to be requested: %d\n", ret);
-
-       mx28evk_fec_reset();
-       mx28_add_fec(0, &mx28_fec_pdata[0]);
-       mx28_add_fec(1, &mx28_fec_pdata[1]);
-
-       mx28_add_flexcan(0, &mx28evk_flexcan_pdata[0]);
-       mx28_add_flexcan(1, &mx28evk_flexcan_pdata[1]);
-
-       mx28_add_mxsfb(&mx28evk_mxsfb_pdata);
-
-       mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
-       mx28_add_saif(0, &mx28evk_mxs_saif_pdata[0]);
-       mx28_add_saif(1, &mx28evk_mxs_saif_pdata[1]);
-
-       mx28_add_mxs_i2c(0);
-       i2c_register_board_info(0, mxs_i2c0_board_info,
-                               ARRAY_SIZE(mxs_i2c0_board_info));
-
-       mx28evk_add_regulators();
-
-       mxs_add_platform_device("mxs-sgtl5000", 0, NULL, 0,
-                       NULL, 0);
-
-       mx28_add_mxs_mmc(0, &mx28evk_mmc_pdata[0]);
-       mx28_add_mxs_mmc(1, &mx28evk_mmc_pdata[1]);
-
-       mx28_add_rtc_stmp3xxx();
-
-       gpio_led_register_device(0, &mx28evk_led_data);
-}
-
-static void __init mx28evk_timer_init(void)
-{
-       mx28_clocks_init();
-}
-
-static struct sys_timer mx28evk_timer = {
-       .init   = mx28evk_timer_init,
-};
-
-MACHINE_START(MX28EVK, "Freescale MX28 EVK")
-       /* Maintainer: Freescale Semiconductor, Inc. */
-       .map_io         = mx28_map_io,
-       .init_irq       = mx28_init_irq,
-       .timer          = &mx28evk_timer,
-       .init_machine   = mx28evk_init,
-       .restart        = mxs_restart,
-MACHINE_END
index 8dabfe8..433af89 100644 (file)
 
 #include <linux/clk.h>
 #include <linux/clkdev.h>
+#include <linux/can/platform/flexcan.h>
+#include <linux/delay.h>
 #include <linux/err.h>
-#include <linux/init.h>
+#include <linux/gpio.h>
 #include <linux/init.h>
 #include <linux/irqdomain.h>
 #include <linux/micrel_phy.h>
 #include <linux/of_irq.h>
 #include <linux/of_platform.h>
 #include <linux/phy.h>
+#include <linux/pinctrl/consumer.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
 #include <mach/common.h>
+#include <mach/digctl.h>
+#include <mach/mxs.h>
 
 static struct fb_videomode mx23evk_video_modes[] = {
        {
@@ -99,9 +104,40 @@ static struct fb_videomode apx4devkit_video_modes[] = {
 
 static struct mxsfb_platform_data mxsfb_pdata __initdata;
 
+/*
+ * MX28EVK_FLEXCAN_SWITCH is shared between both flexcan controllers
+ */
+#define MX28EVK_FLEXCAN_SWITCH MXS_GPIO_NR(2, 13)
+
+static int flexcan0_en, flexcan1_en;
+
+static void mx28evk_flexcan_switch(void)
+{
+       if (flexcan0_en || flexcan1_en)
+               gpio_set_value(MX28EVK_FLEXCAN_SWITCH, 1);
+       else
+               gpio_set_value(MX28EVK_FLEXCAN_SWITCH, 0);
+}
+
+static void mx28evk_flexcan0_switch(int enable)
+{
+       flexcan0_en = enable;
+       mx28evk_flexcan_switch();
+}
+
+static void mx28evk_flexcan1_switch(int enable)
+{
+       flexcan1_en = enable;
+       mx28evk_flexcan_switch();
+}
+
+static struct flexcan_platform_data flexcan_pdata[2];
+
 static struct of_dev_auxdata mxs_auxdata_lookup[] __initdata = {
        OF_DEV_AUXDATA("fsl,imx23-lcdif", 0x80030000, NULL, &mxsfb_pdata),
        OF_DEV_AUXDATA("fsl,imx28-lcdif", 0x80030000, NULL, &mxsfb_pdata),
+       OF_DEV_AUXDATA("fsl,imx28-flexcan", 0x80032000, NULL, &flexcan_pdata[0]),
+       OF_DEV_AUXDATA("fsl,imx28-flexcan", 0x80034000, NULL, &flexcan_pdata[1]),
        { /* sentinel */ }
 };
 
@@ -237,13 +273,21 @@ static void __init imx28_evk_init(void)
        mxsfb_pdata.mode_count = ARRAY_SIZE(mx28evk_video_modes);
        mxsfb_pdata.default_bpp = 32;
        mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
+
+       mxs_saif_clkmux_select(MXS_DIGCTL_SAIF_CLKMUX_EXTMSTR0);
 }
 
-static void __init m28evk_init(void)
+static void __init imx28_evk_post_init(void)
 {
-       enable_clk_enet_out();
-       update_fec_mac_prop(OUI_DENX);
+       if (!gpio_request_one(MX28EVK_FLEXCAN_SWITCH, GPIOF_DIR_OUT,
+                             "flexcan-switch")) {
+               flexcan_pdata[0].transceiver_switch = mx28evk_flexcan0_switch;
+               flexcan_pdata[1].transceiver_switch = mx28evk_flexcan1_switch;
+       }
+}
 
+static void __init m28evk_init(void)
+{
        mxsfb_pdata.mode_list = m28evk_video_modes;
        mxsfb_pdata.mode_count = ARRAY_SIZE(m28evk_video_modes);
        mxsfb_pdata.default_bpp = 16;
@@ -270,6 +314,80 @@ static void __init apx4devkit_init(void)
        mxsfb_pdata.ld_intf_width = STMLCDIF_24BIT;
 }
 
+#define ENET0_MDC__GPIO_4_0    MXS_GPIO_NR(4, 0)
+#define ENET0_MDIO__GPIO_4_1   MXS_GPIO_NR(4, 1)
+#define ENET0_RX_EN__GPIO_4_2  MXS_GPIO_NR(4, 2)
+#define ENET0_RXD0__GPIO_4_3   MXS_GPIO_NR(4, 3)
+#define ENET0_RXD1__GPIO_4_4   MXS_GPIO_NR(4, 4)
+#define ENET0_TX_EN__GPIO_4_6  MXS_GPIO_NR(4, 6)
+#define ENET0_TXD0__GPIO_4_7   MXS_GPIO_NR(4, 7)
+#define ENET0_TXD1__GPIO_4_8   MXS_GPIO_NR(4, 8)
+#define ENET_CLK__GPIO_4_16    MXS_GPIO_NR(4, 16)
+
+#define TX28_FEC_PHY_POWER     MXS_GPIO_NR(3, 29)
+#define TX28_FEC_PHY_RESET     MXS_GPIO_NR(4, 13)
+#define TX28_FEC_nINT          MXS_GPIO_NR(4, 5)
+
+static const struct gpio tx28_gpios[] __initconst = {
+       { ENET0_MDC__GPIO_4_0, GPIOF_OUT_INIT_LOW, "GPIO_4_0" },
+       { ENET0_MDIO__GPIO_4_1, GPIOF_OUT_INIT_LOW, "GPIO_4_1" },
+       { ENET0_RX_EN__GPIO_4_2, GPIOF_OUT_INIT_LOW, "GPIO_4_2" },
+       { ENET0_RXD0__GPIO_4_3, GPIOF_OUT_INIT_LOW, "GPIO_4_3" },
+       { ENET0_RXD1__GPIO_4_4, GPIOF_OUT_INIT_LOW, "GPIO_4_4" },
+       { ENET0_TX_EN__GPIO_4_6, GPIOF_OUT_INIT_LOW, "GPIO_4_6" },
+       { ENET0_TXD0__GPIO_4_7, GPIOF_OUT_INIT_LOW, "GPIO_4_7" },
+       { ENET0_TXD1__GPIO_4_8, GPIOF_OUT_INIT_LOW, "GPIO_4_8" },
+       { ENET_CLK__GPIO_4_16, GPIOF_OUT_INIT_LOW, "GPIO_4_16" },
+       { TX28_FEC_PHY_POWER, GPIOF_OUT_INIT_LOW, "fec-phy-power" },
+       { TX28_FEC_PHY_RESET, GPIOF_OUT_INIT_LOW, "fec-phy-reset" },
+       { TX28_FEC_nINT, GPIOF_DIR_IN, "fec-int" },
+};
+
+static void __init tx28_post_init(void)
+{
+       struct device_node *np;
+       struct platform_device *pdev;
+       struct pinctrl *pctl;
+       int ret;
+
+       enable_clk_enet_out();
+
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx28-fec");
+       pdev = of_find_device_by_node(np);
+       if (!pdev) {
+               pr_err("%s: failed to find fec device\n", __func__);
+               return;
+       }
+
+       pctl = pinctrl_get_select(&pdev->dev, "gpio_mode");
+       if (IS_ERR(pctl)) {
+               pr_err("%s: failed to get pinctrl state\n", __func__);
+               return;
+       }
+
+       ret = gpio_request_array(tx28_gpios, ARRAY_SIZE(tx28_gpios));
+       if (ret) {
+               pr_err("%s: failed to request gpios: %d\n", __func__, ret);
+               return;
+       }
+
+       /* Power up fec phy */
+       gpio_set_value(TX28_FEC_PHY_POWER, 1);
+       msleep(26); /* 25ms according to data sheet */
+
+       /* Mode strap pins */
+       gpio_set_value(ENET0_RX_EN__GPIO_4_2, 1);
+       gpio_set_value(ENET0_RXD0__GPIO_4_3, 1);
+       gpio_set_value(ENET0_RXD1__GPIO_4_4, 1);
+
+       udelay(100); /* minimum assertion time for nRST */
+
+       /* Deasserting FEC PHY RESET */
+       gpio_set_value(TX28_FEC_PHY_RESET, 1);
+
+       pinctrl_put(pctl);
+}
+
 static void __init mxs_machine_init(void)
 {
        if (of_machine_is_compatible("fsl,imx28-evk"))
@@ -283,22 +401,20 @@ static void __init mxs_machine_init(void)
 
        of_platform_populate(NULL, of_default_bus_match_table,
                             mxs_auxdata_lookup, NULL);
+
+       if (of_machine_is_compatible("karo,tx28"))
+               tx28_post_init();
+
+       if (of_machine_is_compatible("fsl,imx28-evk"))
+               imx28_evk_post_init();
 }
 
 static const char *imx23_dt_compat[] __initdata = {
-       "fsl,imx23-evk",
-       "fsl,stmp378x_devb"
-       "olimex,imx23-olinuxino",
        "fsl,imx23",
        NULL,
 };
 
 static const char *imx28_dt_compat[] __initdata = {
-       "bluegiga,apx4devkit",
-       "crystalfontz,cfa10036",
-       "denx,m28evk",
-       "fsl,imx28-evk",
-       "karo,tx28",
        "fsl,imx28",
        NULL,
 };
diff --git a/arch/arm/mach-mxs/mach-stmp378x_devb.c b/arch/arm/mach-mxs/mach-stmp378x_devb.c
deleted file mode 100644 (file)
index 6548965..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * board setup for STMP378x-Development-Board
- *
- * based on mx23evk board setup and information gained form the original
- * plat-stmp based board setup, now converted to mach-mxs.
- *
- * Copyright 2010 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright (C) 2011 Wolfram Sang, Pengutronix e.K.
- *
- * 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.
- */
-
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <linux/spi/spi.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include <mach/common.h>
-#include <mach/iomux-mx23.h>
-
-#include "devices-mx23.h"
-
-#define STMP378X_DEVB_MMC0_WRITE_PROTECT       MXS_GPIO_NR(1, 30)
-#define STMP378X_DEVB_MMC0_SLOT_POWER          MXS_GPIO_NR(1, 29)
-
-#define STMP378X_DEVB_PAD_AUART (MXS_PAD_4MA | MXS_PAD_1V8 | MXS_PAD_NOPULL)
-
-static const iomux_cfg_t stmp378x_dvb_pads[] __initconst = {
-       /* duart (extended setup missing in old boardcode, too */
-       MX23_PAD_PWM0__DUART_RX,
-       MX23_PAD_PWM1__DUART_TX,
-
-       /* auart */
-       MX23_PAD_AUART1_RX__AUART1_RX | STMP378X_DEVB_PAD_AUART,
-       MX23_PAD_AUART1_TX__AUART1_TX | STMP378X_DEVB_PAD_AUART,
-       MX23_PAD_AUART1_CTS__AUART1_CTS | STMP378X_DEVB_PAD_AUART,
-       MX23_PAD_AUART1_RTS__AUART1_RTS | STMP378X_DEVB_PAD_AUART,
-
-       /* mmc */
-       MX23_PAD_SSP1_DATA0__SSP1_DATA0 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_DATA1__SSP1_DATA1 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_DATA2__SSP1_DATA2 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_DATA3__SSP1_DATA3 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_CMD__SSP1_CMD |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX23_PAD_SSP1_DETECT__SSP1_DETECT |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       MX23_PAD_SSP1_SCK__SSP1_SCK |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       MX23_PAD_PWM4__GPIO_1_30 | MXS_PAD_CTRL, /* write protect */
-       MX23_PAD_PWM3__GPIO_1_29 | MXS_PAD_CTRL, /* power enable */
-};
-
-static struct mxs_mmc_platform_data stmp378x_dvb_mmc_pdata __initdata = {
-       .wp_gpio = STMP378X_DEVB_MMC0_WRITE_PROTECT,
-};
-
-static struct spi_board_info spi_board_info[] __initdata = {
-#if defined(CONFIG_ENC28J60) || defined(CONFIG_ENC28J60_MODULE)
-       {
-               .modalias       = "enc28j60",
-               .max_speed_hz   = 6 * 1000 * 1000,
-               .bus_num        = 1,
-               .chip_select    = 0,
-               .platform_data  = NULL,
-       },
-#endif
-};
-
-static void __init stmp378x_dvb_init(void)
-{
-       int ret;
-
-       mx23_soc_init();
-
-       mxs_iomux_setup_multiple_pads(stmp378x_dvb_pads,
-                       ARRAY_SIZE(stmp378x_dvb_pads));
-
-       mx23_add_duart();
-       mx23_add_auart0();
-       mx23_add_rtc_stmp3xxx();
-
-       /* power on mmc slot */
-       ret = gpio_request_one(STMP378X_DEVB_MMC0_SLOT_POWER,
-               GPIOF_OUT_INIT_LOW, "mmc0-slot-power");
-       if (ret)
-               pr_warn("could not power mmc (%d)\n", ret);
-
-       mx23_add_mxs_mmc(0, &stmp378x_dvb_mmc_pdata);
-
-       spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
-}
-
-static void __init stmp378x_dvb_timer_init(void)
-{
-       mx23_clocks_init();
-}
-
-static struct sys_timer stmp378x_dvb_timer = {
-       .init   = stmp378x_dvb_timer_init,
-};
-
-MACHINE_START(STMP378X, "STMP378X")
-       .map_io         = mx23_map_io,
-       .init_irq       = mx23_init_irq,
-       .timer          = &stmp378x_dvb_timer,
-       .init_machine   = stmp378x_dvb_init,
-       .restart        = mxs_restart,
-MACHINE_END
diff --git a/arch/arm/mach-mxs/mach-tx28.c b/arch/arm/mach-mxs/mach-tx28.c
deleted file mode 100644 (file)
index 8837029..0000000
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2010 <LW@KARO-electronics.de>
- *
- * based on: mach-mx28_evk.c
- * Copyright 2010 Freescale Semiconductor, Inc. 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/kernel.h>
-#include <linux/gpio.h>
-#include <linux/leds.h>
-#include <linux/platform_device.h>
-#include <linux/spi/spi.h>
-#include <linux/spi/spi_gpio.h>
-#include <linux/i2c.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-
-#include <mach/common.h>
-#include <mach/iomux-mx28.h>
-
-#include "devices-mx28.h"
-#include "module-tx28.h"
-
-#define TX28_STK5_GPIO_LED             MXS_GPIO_NR(4, 10)
-
-static const iomux_cfg_t tx28_stk5v3_pads[] __initconst = {
-       /* LED */
-       MX28_PAD_ENET0_RXD3__GPIO_4_10 |
-               MXS_PAD_3V3 | MXS_PAD_4MA | MXS_PAD_NOPULL,
-
-       /* framebuffer */
-#define LCD_MODE (MXS_PAD_3V3 | MXS_PAD_4MA)
-       MX28_PAD_LCD_D00__LCD_D0 | LCD_MODE,
-       MX28_PAD_LCD_D01__LCD_D1 | LCD_MODE,
-       MX28_PAD_LCD_D02__LCD_D2 | LCD_MODE,
-       MX28_PAD_LCD_D03__LCD_D3 | LCD_MODE,
-       MX28_PAD_LCD_D04__LCD_D4 | LCD_MODE,
-       MX28_PAD_LCD_D05__LCD_D5 | LCD_MODE,
-       MX28_PAD_LCD_D06__LCD_D6 | LCD_MODE,
-       MX28_PAD_LCD_D07__LCD_D7 | LCD_MODE,
-       MX28_PAD_LCD_D08__LCD_D8 | LCD_MODE,
-       MX28_PAD_LCD_D09__LCD_D9 | LCD_MODE,
-       MX28_PAD_LCD_D10__LCD_D10 | LCD_MODE,
-       MX28_PAD_LCD_D11__LCD_D11 | LCD_MODE,
-       MX28_PAD_LCD_D12__LCD_D12 | LCD_MODE,
-       MX28_PAD_LCD_D13__LCD_D13 | LCD_MODE,
-       MX28_PAD_LCD_D14__LCD_D14 | LCD_MODE,
-       MX28_PAD_LCD_D15__LCD_D15 | LCD_MODE,
-       MX28_PAD_LCD_D16__LCD_D16 | LCD_MODE,
-       MX28_PAD_LCD_D17__LCD_D17 | LCD_MODE,
-       MX28_PAD_LCD_D18__LCD_D18 | LCD_MODE,
-       MX28_PAD_LCD_D19__LCD_D19 | LCD_MODE,
-       MX28_PAD_LCD_D20__LCD_D20 | LCD_MODE,
-       MX28_PAD_LCD_D21__LCD_D21 | LCD_MODE,
-       MX28_PAD_LCD_D22__LCD_D22 | LCD_MODE,
-       MX28_PAD_LCD_D23__LCD_D23 | LCD_MODE,
-       MX28_PAD_LCD_RD_E__LCD_VSYNC | LCD_MODE,
-       MX28_PAD_LCD_WR_RWN__LCD_HSYNC | LCD_MODE,
-       MX28_PAD_LCD_RS__LCD_DOTCLK | LCD_MODE,
-       MX28_PAD_LCD_CS__LCD_CS | LCD_MODE,
-       MX28_PAD_LCD_VSYNC__LCD_VSYNC | LCD_MODE,
-       MX28_PAD_LCD_HSYNC__LCD_HSYNC | LCD_MODE,
-       MX28_PAD_LCD_DOTCLK__LCD_DOTCLK | LCD_MODE,
-       MX28_PAD_LCD_ENABLE__GPIO_1_31 | LCD_MODE,
-       MX28_PAD_LCD_RESET__GPIO_3_30 | LCD_MODE,
-       MX28_PAD_PWM0__PWM_0 | LCD_MODE,
-
-       /* UART1 */
-       MX28_PAD_AUART0_CTS__DUART_RX,
-       MX28_PAD_AUART0_RTS__DUART_TX,
-       MX28_PAD_AUART0_TX__DUART_RTS,
-       MX28_PAD_AUART0_RX__DUART_CTS,
-
-       /* UART2 */
-       MX28_PAD_AUART1_RX__AUART1_RX,
-       MX28_PAD_AUART1_TX__AUART1_TX,
-       MX28_PAD_AUART1_RTS__AUART1_RTS,
-       MX28_PAD_AUART1_CTS__AUART1_CTS,
-
-       /* CAN */
-       MX28_PAD_GPMI_RDY2__CAN0_TX,
-       MX28_PAD_GPMI_RDY3__CAN0_RX,
-
-       /* I2C */
-       MX28_PAD_I2C0_SCL__I2C0_SCL,
-       MX28_PAD_I2C0_SDA__I2C0_SDA,
-
-       /* TSC2007 */
-       MX28_PAD_SAIF0_MCLK__GPIO_3_20 | MXS_PAD_3V3 | MXS_PAD_4MA | MXS_PAD_PULLUP,
-
-       /* MMC0 */
-       MX28_PAD_SSP0_DATA0__SSP0_D0 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA1__SSP0_D1 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA2__SSP0_D2 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DATA3__SSP0_D3 |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_CMD__SSP0_CMD |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_PULLUP),
-       MX28_PAD_SSP0_DETECT__SSP0_CARD_DETECT |
-               (MXS_PAD_8MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-       MX28_PAD_SSP0_SCK__SSP0_SCK |
-               (MXS_PAD_12MA | MXS_PAD_3V3 | MXS_PAD_NOPULL),
-};
-
-static const struct gpio_led tx28_stk5v3_leds[] __initconst = {
-       {
-               .name = "GPIO-LED",
-               .default_trigger = "heartbeat",
-               .gpio = TX28_STK5_GPIO_LED,
-       },
-};
-
-static const struct gpio_led_platform_data tx28_stk5v3_led_data __initconst = {
-       .leds = tx28_stk5v3_leds,
-       .num_leds = ARRAY_SIZE(tx28_stk5v3_leds),
-};
-
-static struct spi_board_info tx28_spi_board_info[] = {
-       {
-               .modalias = "spidev",
-               .max_speed_hz = 20000000,
-               .bus_num = 0,
-               .chip_select = 1,
-               .controller_data = (void *)SPI_GPIO_NO_CHIPSELECT,
-               .mode = SPI_MODE_0,
-       },
-};
-
-static struct i2c_board_info tx28_stk5v3_i2c_boardinfo[] __initdata = {
-       {
-               I2C_BOARD_INFO("ds1339", 0x68),
-       },
-};
-
-static struct mxs_mmc_platform_data tx28_mmc0_pdata __initdata = {
-       .wp_gpio = -EINVAL,
-       .flags = SLOTF_4_BIT_CAPABLE,
-};
-
-static void __init tx28_stk5v3_init(void)
-{
-       mx28_soc_init();
-
-       mxs_iomux_setup_multiple_pads(tx28_stk5v3_pads,
-                       ARRAY_SIZE(tx28_stk5v3_pads));
-
-       mx28_add_duart(); /* UART1 */
-       mx28_add_auart(1); /* UART2 */
-
-       tx28_add_fec0();
-       /* spi via ssp will be added when available */
-       spi_register_board_info(tx28_spi_board_info,
-                       ARRAY_SIZE(tx28_spi_board_info));
-       gpio_led_register_device(0, &tx28_stk5v3_led_data);
-       mx28_add_mxs_i2c(0);
-       i2c_register_board_info(0, tx28_stk5v3_i2c_boardinfo,
-                       ARRAY_SIZE(tx28_stk5v3_i2c_boardinfo));
-       mx28_add_mxs_mmc(0, &tx28_mmc0_pdata);
-       mx28_add_rtc_stmp3xxx();
-}
-
-static void __init tx28_timer_init(void)
-{
-       mx28_clocks_init();
-}
-
-static struct sys_timer tx28_timer = {
-       .init = tx28_timer_init,
-};
-
-MACHINE_START(TX28, "Ka-Ro electronics TX28 module")
-       .map_io = mx28_map_io,
-       .init_irq = mx28_init_irq,
-       .timer = &tx28_timer,
-       .init_machine = tx28_stk5v3_init,
-       .restart        = mxs_restart,
-MACHINE_END
index dccb67a..a4294aa 100644 (file)
 
 #include <linux/mm.h>
 #include <linux/init.h>
-#include <linux/pinctrl/machine.h>
 
 #include <asm/mach/map.h>
 
 #include <mach/mx23.h>
 #include <mach/mx28.h>
-#include <mach/common.h>
-#include <mach/iomux.h>
 
 /*
  * Define the MX23 memory map.
@@ -48,43 +45,7 @@ void __init mx23_map_io(void)
        iotable_init(mx23_io_desc, ARRAY_SIZE(mx23_io_desc));
 }
 
-void __init mx23_init_irq(void)
-{
-       icoll_init_irq();
-}
-
 void __init mx28_map_io(void)
 {
        iotable_init(mx28_io_desc, ARRAY_SIZE(mx28_io_desc));
 }
-
-void __init mx28_init_irq(void)
-{
-       icoll_init_irq();
-}
-
-void __init mx23_soc_init(void)
-{
-       pinctrl_provide_dummies();
-
-       mxs_add_dma("imx23-dma-apbh", MX23_APBH_DMA_BASE_ADDR);
-       mxs_add_dma("imx23-dma-apbx", MX23_APBX_DMA_BASE_ADDR);
-
-       mxs_add_gpio("imx23-gpio", 0, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO0);
-       mxs_add_gpio("imx23-gpio", 1, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO1);
-       mxs_add_gpio("imx23-gpio", 2, MX23_PINCTRL_BASE_ADDR, MX23_INT_GPIO2);
-}
-
-void __init mx28_soc_init(void)
-{
-       pinctrl_provide_dummies();
-
-       mxs_add_dma("imx28-dma-apbh", MX23_APBH_DMA_BASE_ADDR);
-       mxs_add_dma("imx28-dma-apbx", MX23_APBX_DMA_BASE_ADDR);
-
-       mxs_add_gpio("imx28-gpio", 0, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO0);
-       mxs_add_gpio("imx28-gpio", 1, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO1);
-       mxs_add_gpio("imx28-gpio", 2, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO2);
-       mxs_add_gpio("imx28-gpio", 3, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO3);
-       mxs_add_gpio("imx28-gpio", 4, MX28_PINCTRL_BASE_ADDR, MX28_INT_GPIO4);
-}
diff --git a/arch/arm/mach-mxs/module-tx28.c b/arch/arm/mach-mxs/module-tx28.c
deleted file mode 100644 (file)
index 0f71f82..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2010 <LW@KARO-electronics.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 <linux/delay.h>
-#include <linux/fec.h>
-#include <linux/gpio.h>
-
-#include <mach/iomux-mx28.h>
-#include "devices-mx28.h"
-
-#include "module-tx28.h"
-
-#define TX28_FEC_PHY_POWER     MXS_GPIO_NR(3, 29)
-#define TX28_FEC_PHY_RESET     MXS_GPIO_NR(4, 13)
-
-static const iomux_cfg_t tx28_fec_gpio_pads[] __initconst = {
-       /* PHY POWER */
-       MX28_PAD_PWM4__GPIO_3_29 |
-               MXS_PAD_4MA | MXS_PAD_NOPULL | MXS_PAD_3V3,
-       /* PHY RESET */
-       MX28_PAD_ENET0_RX_CLK__GPIO_4_13 |
-               MXS_PAD_4MA | MXS_PAD_NOPULL | MXS_PAD_3V3,
-       /* Mode strap pins 0-2 */
-       MX28_PAD_ENET0_RXD0__GPIO_4_3 |
-               MXS_PAD_8MA | MXS_PAD_PULLUP | MXS_PAD_3V3,
-       MX28_PAD_ENET0_RXD1__GPIO_4_4 |
-               MXS_PAD_8MA | MXS_PAD_PULLUP | MXS_PAD_3V3,
-       MX28_PAD_ENET0_RX_EN__GPIO_4_2 |
-               MXS_PAD_8MA | MXS_PAD_PULLUP | MXS_PAD_3V3,
-       /* nINT */
-       MX28_PAD_ENET0_TX_CLK__GPIO_4_5 |
-               MXS_PAD_4MA | MXS_PAD_NOPULL | MXS_PAD_3V3,
-
-       MX28_PAD_ENET0_MDC__GPIO_4_0,
-       MX28_PAD_ENET0_MDIO__GPIO_4_1,
-       MX28_PAD_ENET0_TX_EN__GPIO_4_6,
-       MX28_PAD_ENET0_TXD0__GPIO_4_7,
-       MX28_PAD_ENET0_TXD1__GPIO_4_8,
-       MX28_PAD_ENET_CLK__GPIO_4_16,
-};
-
-#define FEC_MODE (MXS_PAD_8MA | MXS_PAD_PULLUP | MXS_PAD_3V3)
-static const iomux_cfg_t tx28_fec0_pads[] __initconst = {
-       MX28_PAD_ENET0_MDC__ENET0_MDC | FEC_MODE,
-       MX28_PAD_ENET0_MDIO__ENET0_MDIO | FEC_MODE,
-       MX28_PAD_ENET0_RX_EN__ENET0_RX_EN | FEC_MODE,
-       MX28_PAD_ENET0_RXD0__ENET0_RXD0 | FEC_MODE,
-       MX28_PAD_ENET0_RXD1__ENET0_RXD1 | FEC_MODE,
-       MX28_PAD_ENET0_TX_EN__ENET0_TX_EN | FEC_MODE,
-       MX28_PAD_ENET0_TXD0__ENET0_TXD0 | FEC_MODE,
-       MX28_PAD_ENET0_TXD1__ENET0_TXD1 | FEC_MODE,
-       MX28_PAD_ENET_CLK__CLKCTRL_ENET | FEC_MODE,
-};
-
-static const iomux_cfg_t tx28_fec1_pads[] __initconst = {
-       MX28_PAD_ENET0_RXD2__ENET1_RXD0,
-       MX28_PAD_ENET0_RXD3__ENET1_RXD1,
-       MX28_PAD_ENET0_TXD2__ENET1_TXD0,
-       MX28_PAD_ENET0_TXD3__ENET1_TXD1,
-       MX28_PAD_ENET0_COL__ENET1_TX_EN,
-       MX28_PAD_ENET0_CRS__ENET1_RX_EN,
-};
-
-static const struct fec_platform_data tx28_fec0_data __initconst = {
-       .phy = PHY_INTERFACE_MODE_RMII,
-};
-
-static const struct fec_platform_data tx28_fec1_data __initconst = {
-       .phy = PHY_INTERFACE_MODE_RMII,
-};
-
-int __init tx28_add_fec0(void)
-{
-       int i, ret;
-
-       pr_debug("%s: Switching FEC PHY power off\n", __func__);
-       ret = mxs_iomux_setup_multiple_pads(tx28_fec_gpio_pads,
-                       ARRAY_SIZE(tx28_fec_gpio_pads));
-       for (i = 0; i < ARRAY_SIZE(tx28_fec_gpio_pads); i++) {
-               unsigned int gpio = MXS_GPIO_NR(PAD_BANK(tx28_fec_gpio_pads[i]),
-                       PAD_PIN(tx28_fec_gpio_pads[i]));
-
-               ret = gpio_request(gpio, "FEC");
-               if (ret) {
-                       pr_err("Failed to request GPIO_%d_%d: %d\n",
-                               PAD_BANK(tx28_fec_gpio_pads[i]),
-                               PAD_PIN(tx28_fec_gpio_pads[i]), ret);
-                       goto free_gpios;
-               }
-               ret = gpio_direction_output(gpio, 0);
-               if (ret) {
-                       pr_err("Failed to set direction of GPIO_%d_%d to output: %d\n",
-                                       gpio / 32 + 1, gpio % 32, ret);
-                       goto free_gpios;
-               }
-       }
-
-       /* Power up fec phy */
-       pr_debug("%s: Switching FEC PHY power on\n", __func__);
-       ret = gpio_direction_output(TX28_FEC_PHY_POWER, 1);
-       if (ret) {
-               pr_err("Failed to power on PHY: %d\n", ret);
-               goto free_gpios;
-       }
-       mdelay(26); /* 25ms according to data sheet */
-
-       /* nINT */
-       gpio_direction_input(MXS_GPIO_NR(4, 5));
-       /* Mode strap pins */
-       gpio_direction_output(MXS_GPIO_NR(4, 2), 1);
-       gpio_direction_output(MXS_GPIO_NR(4, 3), 1);
-       gpio_direction_output(MXS_GPIO_NR(4, 4), 1);
-
-       udelay(100); /* minimum assertion time for nRST */
-
-       pr_debug("%s: Deasserting FEC PHY RESET\n", __func__);
-       gpio_set_value(TX28_FEC_PHY_RESET, 1);
-
-       ret = mxs_iomux_setup_multiple_pads(tx28_fec0_pads,
-                       ARRAY_SIZE(tx28_fec0_pads));
-       if (ret) {
-               pr_debug("%s: mxs_iomux_setup_multiple_pads() failed with rc: %d\n",
-                               __func__, ret);
-               goto free_gpios;
-       }
-       pr_debug("%s: Registering FEC0 device\n", __func__);
-       mx28_add_fec(0, &tx28_fec0_data);
-       return 0;
-
-free_gpios:
-       while (--i >= 0) {
-               unsigned int gpio = MXS_GPIO_NR(PAD_BANK(tx28_fec_gpio_pads[i]),
-                       PAD_PIN(tx28_fec_gpio_pads[i]));
-
-               gpio_free(gpio);
-       }
-
-       return ret;
-}
-
-int __init tx28_add_fec1(void)
-{
-       int ret;
-
-       ret = mxs_iomux_setup_multiple_pads(tx28_fec1_pads,
-                       ARRAY_SIZE(tx28_fec1_pads));
-       if (ret) {
-               pr_debug("%s: mxs_iomux_setup_multiple_pads() failed with rc: %d\n",
-                               __func__, ret);
-               return ret;
-       }
-       pr_debug("%s: Registering FEC1 device\n", __func__);
-       mx28_add_fec(1, &tx28_fec1_data);
-       return 0;
-}
diff --git a/arch/arm/mach-mxs/module-tx28.h b/arch/arm/mach-mxs/module-tx28.h
deleted file mode 100644 (file)
index 8ed4254..0000000
+++ /dev/null
@@ -1,10 +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.
- */
-int __init tx28_add_fec0(void);
-int __init tx28_add_fec1(void);
index a051cb8..3d1e1c2 100644 (file)
@@ -16,8 +16,9 @@
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 
-#include <plat/board-ams-delta.h>
+#include <mach/board-ams-delta.h>
 
+#include <mach/irqs.h>
 #include <mach/ams-delta-fiq.h>
 
 #include "iomap.h"
index 68e8e56..f12a12a 100644 (file)
@@ -19,7 +19,7 @@
 #include <linux/module.h>
 #include <linux/io.h>
 
-#include <plat/board-ams-delta.h>
+#include <mach/board-ams-delta.h>
 
 #include <asm/fiq.h>
 
index c534698..9518bf5 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/export.h>
 #include <linux/omapfb.h>
 #include <linux/io.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <media/soc_camera.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board-ams-delta.h>
-#include <plat/keypad.h>
-#include <plat/mux.h>
-#include <plat/board.h>
+#include <mach/board-ams-delta.h>
+#include <linux/platform_data/keypad-omap.h>
+#include <mach/mux.h>
 
 #include <mach/hardware.h>
 #include <mach/ams-delta-fiq.h>
index 6872f3f..4b6de70 100644 (file)
 #include <asm/mach/map.h>
 
 #include <plat/tc.h>
-#include <plat/mux.h>
-#include <plat/flash.h>
+#include <mach/mux.h>
+#include <mach/flash.h>
 #include <plat/fpga.h>
-#include <plat/keypad.h>
-#include <plat/board.h>
+#include <linux/platform_data/keypad-omap.h>
 
 #include <mach/hardware.h>
 
index 6ec385e..4ec579f 100644 (file)
@@ -22,8 +22,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/mux.h>
-#include <plat/board.h>
+#include <mach/mux.h>
 
 #include <mach/usb.h>
 
@@ -52,9 +51,6 @@ static struct omap_usb_config generic1610_usb_config __initdata = {
 };
 #endif
 
-static struct omap_board_config_kernel generic_config[] __initdata = {
-};
-
 static void __init omap_generic_init(void)
 {
 #ifdef CONFIG_ARCH_OMAP15XX
@@ -76,8 +72,6 @@ static void __init omap_generic_init(void)
        }
 #endif
 
-       omap_board_config = generic_config;
-       omap_board_config_size = ARRAY_SIZE(generic_config);
        omap_serial_init();
        omap_register_i2c_bus(1, 100, NULL, 0);
 }
index 44a4ab1..af283a2 100644 (file)
 #include <linux/i2c/tps65010.h>
 #include <linux/smc91x.h>
 #include <linux/omapfb.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/dma.h>
 #include <plat/tc.h>
-#include <plat/irda.h>
-#include <plat/keypad.h>
-#include <plat/flash.h>
+#include <mach/irda.h>
+#include <linux/platform_data/keypad-omap.h>
+#include <mach/flash.h>
 
 #include <mach/hardware.h>
 #include <mach/usb.h>
index 86cb5a0..06d11b1 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/i2c/tps65010.h>
 #include <linux/smc91x.h>
 #include <linux/omapfb.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <asm/setup.h>
 #include <asm/page.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/tc.h>
-#include <plat/keypad.h>
+#include <linux/platform_data/keypad-omap.h>
 #include <plat/dma.h>
-#include <plat/flash.h>
+#include <mach/flash.h>
 
 #include <mach/hardware.h>
 #include <mach/irqs.h>
index b3f6e94..87ab208 100644 (file)
 #include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
 #include <linux/omapfb.h>
+#include <linux/platform_data/keypad-omap.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
-#include <plat/omap7xx.h>
-#include <plat/board.h>
-#include <plat/keypad.h>
+#include <mach/omap7xx.h>
 #include <plat/mmc.h>
 
 #include <mach/irqs.h>
@@ -476,8 +475,7 @@ static void __init htcherald_lcd_init(void)
                                break;
                }
                if (!tries)
-                       printk(KERN_WARNING "Timeout waiting for end of frame "
-                              "-- LCD may not be available\n");
+                       pr_err("Timeout waiting for end of frame -- LCD may not be available\n");
 
                /* turn off DMA */
                reg = omap_readw(OMAP_DMA_LCD_CCR);
index f21c296..db5f7d2 100644 (file)
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/mux.h>
-#include <plat/flash.h>
+#include <mach/mux.h>
+#include <mach/flash.h>
 #include <plat/fpga.h>
 #include <plat/tc.h>
-#include <plat/keypad.h>
+#include <linux/platform_data/keypad-omap.h>
 #include <plat/mmc.h>
 
 #include <mach/hardware.h>
index 2c0ca8f..7d5c06d 100644 (file)
 #include <linux/workqueue.h>
 #include <linux/delay.h>
 
+#include <linux/platform_data/keypad-omap.h>
+#include <linux/platform_data/lcd-mipid.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/mux.h>
-#include <plat/board.h>
-#include <plat/keypad.h>
-#include <plat/lcd_mipid.h>
+#include <mach/mux.h>
 #include <plat/mmc.h>
 #include <plat/clock.h>
 
index 8784705..2f1f9b9 100644 (file)
 #include <linux/mtd/partitions.h>
 #include <linux/mtd/physmap.h>
 #include <linux/i2c/tps65010.h>
+#include <linux/platform_data/gpio-omap.h>
+#include <linux/platform_data/omap1_bl.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/flash.h>
-#include <plat/mux.h>
+#include <mach/flash.h>
+#include <mach/mux.h>
 #include <plat/tc.h>
 
 #include <mach/hardware.h>
@@ -302,7 +304,7 @@ static struct omap_lcd_config osk_lcd_config __initdata = {
 #include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
 
-#include <plat/keypad.h>
+#include <linux/platform_data/keypad-omap.h>
 
 static struct at24_platform_data at24c04 = {
        .byte_len       = SZ_4K / 8,
index 26bcb9d..1c578d5 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/apm-emulation.h>
 #include <linux/omapfb.h>
+#include <linux/platform_data/omap1_bl.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/flash.h>
-#include <plat/mux.h>
+#include <mach/flash.h>
+#include <mach/mux.h>
 #include <plat/tc.h>
 #include <plat/dma.h>
-#include <plat/board.h>
-#include <plat/irda.h>
-#include <plat/keypad.h>
+#include <mach/irda.h>
+#include <linux/platform_data/keypad-omap.h>
 
 #include <mach/hardware.h>
 #include <mach/usb.h>
index 4d09944..9715809 100644 (file)
 #include <linux/omapfb.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
+#include <linux/platform_data/omap1_bl.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
 #include <plat/led.h>
-#include <plat/flash.h>
-#include <plat/mux.h>
+#include <mach/flash.h>
+#include <mach/mux.h>
 #include <plat/dma.h>
 #include <plat/tc.h>
-#include <plat/board.h>
-#include <plat/irda.h>
-#include <plat/keypad.h>
+#include <mach/irda.h>
+#include <linux/platform_data/keypad-omap.h>
 
 #include <mach/hardware.h>
 #include <mach/usb.h>
index 3559803..e311032 100644 (file)
 #include <linux/omapfb.h>
 #include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
+#include <linux/platform_data/omap1_bl.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/flash.h>
-#include <plat/mux.h>
+#include <mach/flash.h>
+#include <mach/mux.h>
 #include <plat/dma.h>
 #include <plat/tc.h>
-#include <plat/board.h>
-#include <plat/irda.h>
-#include <plat/keypad.h>
+#include <mach/irda.h>
+#include <linux/platform_data/keypad-omap.h>
 
 #include <mach/hardware.h>
 #include <mach/usb.h>
index 703d55e..198b054 100644 (file)
 #include <linux/input.h>
 #include <linux/smc91x.h>
 #include <linux/omapfb.h>
+#include <linux/platform_data/keypad-omap.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
 #include <plat/tc.h>
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/fpga.h>
-#include <plat/flash.h>
-#include <plat/keypad.h>
-#include <plat/board.h>
+#include <mach/flash.h>
 
 #include <mach/hardware.h>
 
index b59f788..5932d56 100644 (file)
@@ -17,7 +17,7 @@
 
 #include <mach/hardware.h>
 #include <plat/mmc.h>
-#include <plat/board-sx1.h>
+#include <mach/board-sx1.h>
 
 #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
 
index 8c665bd..13bf2cc 100644 (file)
 #include <linux/errno.h>
 #include <linux/export.h>
 #include <linux/omapfb.h>
+#include <linux/platform_data/keypad-omap.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/flash.h>
-#include <plat/mux.h>
+#include <mach/flash.h>
+#include <mach/mux.h>
 #include <plat/dma.h>
-#include <plat/irda.h>
+#include <mach/irda.h>
 #include <plat/tc.h>
-#include <plat/board.h>
-#include <plat/keypad.h>
-#include <plat/board-sx1.h>
+#include <mach/board-sx1.h>
 
 #include <mach/hardware.h>
 #include <mach/usb.h>
index 3497769..ad75e34 100644 (file)
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board-voiceblue.h>
-#include <plat/flash.h>
-#include <plat/mux.h>
+#include <mach/board-voiceblue.h>
+#include <mach/flash.h>
+#include <mach/mux.h>
 #include <plat/tc.h>
-#include <plat/board.h>
 
 #include <mach/hardware.h>
 #include <mach/usb.h>
@@ -155,9 +154,6 @@ static struct omap_usb_config voiceblue_usb_config __initdata = {
        .pins[2]        = 6,
 };
 
-static struct omap_board_config_kernel voiceblue_config[] = {
-};
-
 #define MACHINE_PANICED                1
 #define MACHINE_REBOOTING      2
 #define MACHINE_REBOOT         4
@@ -275,8 +271,6 @@ static void __init voiceblue_init(void)
        voiceblue_smc91x_resources[1].start = gpio_to_irq(8);
        voiceblue_smc91x_resources[1].end = gpio_to_irq(8);
        platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices));
-       omap_board_config = voiceblue_config;
-       omap_board_config_size = ARRAY_SIZE(voiceblue_config);
        omap_serial_init();
        omap1_usb_init(&voiceblue_usb_config);
        omap_register_i2c_bus(1, 100, NULL, 0);
index a9ee06b..638f407 100644 (file)
@@ -587,8 +587,8 @@ void omap1_clk_disable_unused(struct clk *clk)
        /* Clocks in the DSP domain need api_ck. Just assume bootloader
         * has not enabled any DSP clocks */
        if (clk->enable_reg == DSP_IDLECT2) {
-               printk(KERN_INFO "Skipping reset check for DSP domain "
-                      "clock \"%s\"\n", clk->name);
+               pr_info("Skipping reset check for DSP domain clock \"%s\"\n",
+                       clk->name);
                return;
        }
 
index c007d80..9b45f4b 100644 (file)
@@ -25,7 +25,6 @@
 #include <plat/clock.h>
 #include <plat/cpu.h>
 #include <plat/clkdev_omap.h>
-#include <plat/board.h>
 #include <plat/sram.h> /* for omap_sram_reprogram_clock() */
 
 #include <mach/hardware.h>
@@ -776,11 +775,10 @@ static struct clk_functions omap1_clk_functions = {
 
 static void __init omap1_show_rates(void)
 {
-       pr_notice("Clocking rate (xtal/DPLL1/MPU): "
-                       "%ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
-               ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
-               ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,
-               arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);
+       pr_notice("Clocking rate (xtal/DPLL1/MPU): %ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
+                 ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
+                 ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,
+                 arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);
 }
 
 u32 cpu_mask;
@@ -788,7 +786,6 @@ u32 cpu_mask;
 int __init omap1_clk_init(void)
 {
        struct omap_clk *c;
-       const struct omap_clock_config *info;
        int crystal_type = 0; /* Default 12 MHz */
        u32 reg;
 
@@ -837,19 +834,13 @@ int __init omap1_clk_init(void)
        ck_dpll1_p = clk_get(NULL, "ck_dpll1");
        ck_ref_p = clk_get(NULL, "ck_ref");
 
-       info = omap_get_config(OMAP_TAG_CLOCK, struct omap_clock_config);
-       if (info != NULL) {
-               if (!cpu_is_omap15xx())
-                       crystal_type = info->system_clock_type;
-       }
-
        if (cpu_is_omap7xx())
                ck_ref.rate = 13000000;
        if (cpu_is_omap16xx() && crystal_type == 2)
                ck_ref.rate = 19200000;
 
-       pr_info("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: "
-               "0x%04x\n", omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),
+       pr_info("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: 0x%04x\n",
+               omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),
                omap_readw(ARM_CKCTL));
 
        /* We want to be in syncronous scalable mode */
index fa1fa4d..0cc54dd 100644 (file)
 #include <asm/mach/map.h>
 
 #include <plat/tc.h>
-#include <plat/board.h>
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/dma.h>
 #include <plat/mmc.h>
-#include <plat/omap7xx.h>
 
+#include <mach/omap7xx.h>
 #include <mach/camera.h>
 #include <mach/hardware.h>
 
index 3ef7d52..29007fe 100644 (file)
@@ -27,7 +27,8 @@
 
 #include <plat/dma.h>
 #include <plat/tc.h>
-#include <plat/irqs.h>
+
+#include <mach/irqs.h>
 
 #define OMAP1_DMA_BASE                 (0xfffed800)
 #define OMAP1_LOGICAL_DMA_CH_COUNT     17
@@ -330,8 +331,9 @@ static int __init omap1_system_dma_init(void)
        d->chan = kzalloc(sizeof(struct omap_dma_lch) *
                                        (d->lch_count), GFP_KERNEL);
        if (!d->chan) {
-               dev_err(&pdev->dev, "%s: Memory allocation failed"
-                                       "for d->chan!!!\n", __func__);
+               dev_err(&pdev->dev,
+                       "%s: Memory allocation failed for d->chan!\n",
+                       __func__);
                goto exit_release_d;
        }
 
index 401eb3c..73ae616 100644 (file)
@@ -11,7 +11,7 @@
 #include <linux/mtd/map.h>
 
 #include <plat/tc.h>
-#include <plat/flash.h>
+#include <mach/flash.h>
 
 #include <mach/hardware.h>
 
index ebef15e..98e6f39 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #include <linux/gpio.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #define OMAP1_MPUIO_VBASE              OMAP1_MPUIO_BASE
 #define OMAP1510_GPIO_BASE             0xFFFCE000
index 2a48cd2..33f4192 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #include <linux/gpio.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #define OMAP1610_GPIO1_BASE            0xfffbe400
 #define OMAP1610_GPIO2_BASE            0xfffbec00
index acf12b7..958ce9a 100644 (file)
@@ -17,6 +17,7 @@
  */
 
 #include <linux/gpio.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #define OMAP7XX_GPIO1_BASE             0xfffbc000
 #define OMAP7XX_GPIO2_BASE             0xfffbc800
index 5446c99..a0551a6 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 #include <plat/i2c.h>
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/cpu.h>
 
 void __init omap1_i2c_mux_pins(int bus_id)
index 23eed00..adb5e76 100644 (file)
@@ -14,8 +14,6 @@
 #ifndef __AMS_DELTA_FIQ_H
 #define __AMS_DELTA_FIQ_H
 
-#include <plat/irqs.h>
-
 /*
  * Interrupt number used for passing control from FIQ to IRQ.
  * IRQ12, described as reserved, has been selected.
index e737706..ebf86c0 100644 (file)
@@ -1,5 +1,3 @@
 /*
  * arch/arm/mach-omap1/include/mach/gpio.h
  */
-
-#include <plat/gpio.h>
index 01e35fa..84248d2 100644 (file)
@@ -1,11 +1,46 @@
 /*
  * arch/arm/mach-omap1/include/mach/hardware.h
+ *
+ * Hardware definitions for TI OMAP processors and boards
+ *
+ * NOTE: Please put device driver specific defines into a separate header
+ *      file for each driver.
+ *
+ * Copyright (C) 2001 RidgeRun, Inc.
+ * Author: RidgeRun, Inc. Greg Lonnon <glonnon@ridgerun.com>
+ *
+ * Reorganized for Linux-2.6 by Tony Lindgren <tony@atomide.com>
+ *                          and Dirk Behme <dirk.behme@de.bosch.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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * 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_HARDWARE_H
-#define __MACH_HARDWARE_H
+#ifndef __ASM_ARCH_OMAP_HARDWARE_H
+#define __ASM_ARCH_OMAP_HARDWARE_H
 
+#include <asm/sizes.h>
 #ifndef __ASSEMBLER__
+#include <asm/types.h>
+#include <plat/cpu.h>
+
 /*
  * NOTE: Please use ioremap + __raw_read/write where possible instead of these
  */
@@ -35,7 +70,249 @@ static inline u32 omap_cs3_phys(void)
                        ? 0 : OMAP_CS3_PHYS;
 }
 
+#endif /* ifndef __ASSEMBLER__ */
+
+#include <plat/serial.h>
+
+/*
+ * ---------------------------------------------------------------------------
+ * Common definitions for all OMAP processors
+ * NOTE: Put all processor or board specific parts to the special header
+ *      files.
+ * ---------------------------------------------------------------------------
+ */
+
+/*
+ * ----------------------------------------------------------------------------
+ * Timers
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP_MPU_TIMER1_BASE   (0xfffec500)
+#define OMAP_MPU_TIMER2_BASE   (0xfffec600)
+#define OMAP_MPU_TIMER3_BASE   (0xfffec700)
+#define MPU_TIMER_FREE         (1 << 6)
+#define MPU_TIMER_CLOCK_ENABLE (1 << 5)
+#define MPU_TIMER_AR           (1 << 1)
+#define MPU_TIMER_ST           (1 << 0)
+
+/*
+ * ----------------------------------------------------------------------------
+ * Clocks
+ * ----------------------------------------------------------------------------
+ */
+#define CLKGEN_REG_BASE                (0xfffece00)
+#define ARM_CKCTL              (CLKGEN_REG_BASE + 0x0)
+#define ARM_IDLECT1            (CLKGEN_REG_BASE + 0x4)
+#define ARM_IDLECT2            (CLKGEN_REG_BASE + 0x8)
+#define ARM_EWUPCT             (CLKGEN_REG_BASE + 0xC)
+#define ARM_RSTCT1             (CLKGEN_REG_BASE + 0x10)
+#define ARM_RSTCT2             (CLKGEN_REG_BASE + 0x14)
+#define ARM_SYSST              (CLKGEN_REG_BASE + 0x18)
+#define ARM_IDLECT3            (CLKGEN_REG_BASE + 0x24)
+
+#define CK_RATEF               1
+#define CK_IDLEF               2
+#define CK_ENABLEF             4
+#define CK_SELECTF             8
+#define SETARM_IDLE_SHIFT
+
+/* DPLL control registers */
+#define DPLL_CTL               (0xfffecf00)
+
+/* DSP clock control. Must use __raw_readw() and __raw_writew() with these */
+#define DSP_CONFIG_REG_BASE     IOMEM(0xe1008000)
+#define DSP_CKCTL              (DSP_CONFIG_REG_BASE + 0x0)
+#define DSP_IDLECT1            (DSP_CONFIG_REG_BASE + 0x4)
+#define DSP_IDLECT2            (DSP_CONFIG_REG_BASE + 0x8)
+#define DSP_RSTCT2             (DSP_CONFIG_REG_BASE + 0x14)
+
+/*
+ * ---------------------------------------------------------------------------
+ * UPLD
+ * ---------------------------------------------------------------------------
+ */
+#define ULPD_REG_BASE          (0xfffe0800)
+#define ULPD_IT_STATUS         (ULPD_REG_BASE + 0x14)
+#define ULPD_SETUP_ANALOG_CELL_3       (ULPD_REG_BASE + 0x24)
+#define ULPD_CLOCK_CTRL                (ULPD_REG_BASE + 0x30)
+#      define DIS_USB_PVCI_CLK         (1 << 5)        /* no USB/FAC synch */
+#      define USB_MCLK_EN              (1 << 4)        /* enable W4_USB_CLKO */
+#define ULPD_SOFT_REQ          (ULPD_REG_BASE + 0x34)
+#      define SOFT_UDC_REQ             (1 << 4)
+#      define SOFT_USB_CLK_REQ         (1 << 3)
+#      define SOFT_DPLL_REQ            (1 << 0)
+#define ULPD_DPLL_CTRL         (ULPD_REG_BASE + 0x3c)
+#define ULPD_STATUS_REQ                (ULPD_REG_BASE + 0x40)
+#define ULPD_APLL_CTRL         (ULPD_REG_BASE + 0x4c)
+#define ULPD_POWER_CTRL                (ULPD_REG_BASE + 0x50)
+#define ULPD_SOFT_DISABLE_REQ_REG      (ULPD_REG_BASE + 0x68)
+#      define DIS_MMC2_DPLL_REQ        (1 << 11)
+#      define DIS_MMC1_DPLL_REQ        (1 << 10)
+#      define DIS_UART3_DPLL_REQ       (1 << 9)
+#      define DIS_UART2_DPLL_REQ       (1 << 8)
+#      define DIS_UART1_DPLL_REQ       (1 << 7)
+#      define DIS_USB_HOST_DPLL_REQ    (1 << 6)
+#define ULPD_SDW_CLK_DIV_CTRL_SEL      (ULPD_REG_BASE + 0x74)
+#define ULPD_CAM_CLK_CTRL      (ULPD_REG_BASE + 0x7c)
+
+/*
+ * ---------------------------------------------------------------------------
+ * Watchdog timer
+ * ---------------------------------------------------------------------------
+ */
+
+/* Watchdog timer within the OMAP3.2 gigacell */
+#define OMAP_MPU_WATCHDOG_BASE (0xfffec800)
+#define OMAP_WDT_TIMER         (OMAP_MPU_WATCHDOG_BASE + 0x0)
+#define OMAP_WDT_LOAD_TIM      (OMAP_MPU_WATCHDOG_BASE + 0x4)
+#define OMAP_WDT_READ_TIM      (OMAP_MPU_WATCHDOG_BASE + 0x4)
+#define OMAP_WDT_TIMER_MODE    (OMAP_MPU_WATCHDOG_BASE + 0x8)
+
+/*
+ * ---------------------------------------------------------------------------
+ * Interrupts
+ * ---------------------------------------------------------------------------
+ */
+#ifdef CONFIG_ARCH_OMAP1
+
+/*
+ * XXX: These probably want to be moved to arch/arm/mach-omap/omap1/irq.c
+ * or something similar.. -- PFM.
+ */
+
+#define OMAP_IH1_BASE          0xfffecb00
+#define OMAP_IH2_BASE          0xfffe0000
+
+#define OMAP_IH1_ITR           (OMAP_IH1_BASE + 0x00)
+#define OMAP_IH1_MIR           (OMAP_IH1_BASE + 0x04)
+#define OMAP_IH1_SIR_IRQ       (OMAP_IH1_BASE + 0x10)
+#define OMAP_IH1_SIR_FIQ       (OMAP_IH1_BASE + 0x14)
+#define OMAP_IH1_CONTROL       (OMAP_IH1_BASE + 0x18)
+#define OMAP_IH1_ILR0          (OMAP_IH1_BASE + 0x1c)
+#define OMAP_IH1_ISR           (OMAP_IH1_BASE + 0x9c)
+
+#define OMAP_IH2_ITR           (OMAP_IH2_BASE + 0x00)
+#define OMAP_IH2_MIR           (OMAP_IH2_BASE + 0x04)
+#define OMAP_IH2_SIR_IRQ       (OMAP_IH2_BASE + 0x10)
+#define OMAP_IH2_SIR_FIQ       (OMAP_IH2_BASE + 0x14)
+#define OMAP_IH2_CONTROL       (OMAP_IH2_BASE + 0x18)
+#define OMAP_IH2_ILR0          (OMAP_IH2_BASE + 0x1c)
+#define OMAP_IH2_ISR           (OMAP_IH2_BASE + 0x9c)
+
+#define IRQ_ITR_REG_OFFSET     0x00
+#define IRQ_MIR_REG_OFFSET     0x04
+#define IRQ_SIR_IRQ_REG_OFFSET 0x10
+#define IRQ_SIR_FIQ_REG_OFFSET 0x14
+#define IRQ_CONTROL_REG_OFFSET 0x18
+#define IRQ_ISR_REG_OFFSET     0x9c
+#define IRQ_ILR0_REG_OFFSET    0x1c
+#define IRQ_GMR_REG_OFFSET     0xa0
+
 #endif
-#endif
 
-#include <plat/hardware.h>
+/*
+ * ----------------------------------------------------------------------------
+ * System control registers
+ * ----------------------------------------------------------------------------
+ */
+#define MOD_CONF_CTRL_0                0xfffe1080
+#define MOD_CONF_CTRL_1                0xfffe1110
+
+/*
+ * ----------------------------------------------------------------------------
+ * Pin multiplexing registers
+ * ----------------------------------------------------------------------------
+ */
+#define FUNC_MUX_CTRL_0                0xfffe1000
+#define FUNC_MUX_CTRL_1                0xfffe1004
+#define FUNC_MUX_CTRL_2                0xfffe1008
+#define COMP_MODE_CTRL_0       0xfffe100c
+#define FUNC_MUX_CTRL_3                0xfffe1010
+#define FUNC_MUX_CTRL_4                0xfffe1014
+#define FUNC_MUX_CTRL_5                0xfffe1018
+#define FUNC_MUX_CTRL_6                0xfffe101C
+#define FUNC_MUX_CTRL_7                0xfffe1020
+#define FUNC_MUX_CTRL_8                0xfffe1024
+#define FUNC_MUX_CTRL_9                0xfffe1028
+#define FUNC_MUX_CTRL_A                0xfffe102C
+#define FUNC_MUX_CTRL_B                0xfffe1030
+#define FUNC_MUX_CTRL_C                0xfffe1034
+#define FUNC_MUX_CTRL_D                0xfffe1038
+#define PULL_DWN_CTRL_0                0xfffe1040
+#define PULL_DWN_CTRL_1                0xfffe1044
+#define PULL_DWN_CTRL_2                0xfffe1048
+#define PULL_DWN_CTRL_3                0xfffe104c
+#define PULL_DWN_CTRL_4                0xfffe10ac
+
+/* OMAP-1610 specific multiplexing registers */
+#define FUNC_MUX_CTRL_E                0xfffe1090
+#define FUNC_MUX_CTRL_F                0xfffe1094
+#define FUNC_MUX_CTRL_10       0xfffe1098
+#define FUNC_MUX_CTRL_11       0xfffe109c
+#define FUNC_MUX_CTRL_12       0xfffe10a0
+#define PU_PD_SEL_0            0xfffe10b4
+#define PU_PD_SEL_1            0xfffe10b8
+#define PU_PD_SEL_2            0xfffe10bc
+#define PU_PD_SEL_3            0xfffe10c0
+#define PU_PD_SEL_4            0xfffe10c4
+
+/* Timer32K for 1610 and 1710*/
+#define OMAP_TIMER32K_BASE     0xFFFBC400
+
+/*
+ * ---------------------------------------------------------------------------
+ * TIPB bus interface
+ * ---------------------------------------------------------------------------
+ */
+#define TIPB_PUBLIC_CNTL_BASE          0xfffed300
+#define MPU_PUBLIC_TIPB_CNTL           (TIPB_PUBLIC_CNTL_BASE + 0x8)
+#define TIPB_PRIVATE_CNTL_BASE         0xfffeca00
+#define MPU_PRIVATE_TIPB_CNTL          (TIPB_PRIVATE_CNTL_BASE + 0x8)
+
+/*
+ * ----------------------------------------------------------------------------
+ * MPUI interface
+ * ----------------------------------------------------------------------------
+ */
+#define MPUI_BASE                      (0xfffec900)
+#define MPUI_CTRL                      (MPUI_BASE + 0x0)
+#define MPUI_DEBUG_ADDR                        (MPUI_BASE + 0x4)
+#define MPUI_DEBUG_DATA                        (MPUI_BASE + 0x8)
+#define MPUI_DEBUG_FLAG                        (MPUI_BASE + 0xc)
+#define MPUI_STATUS_REG                        (MPUI_BASE + 0x10)
+#define MPUI_DSP_STATUS                        (MPUI_BASE + 0x14)
+#define MPUI_DSP_BOOT_CONFIG           (MPUI_BASE + 0x18)
+#define MPUI_DSP_API_CONFIG            (MPUI_BASE + 0x1c)
+
+/*
+ * ----------------------------------------------------------------------------
+ * LED Pulse Generator
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP_LPG1_BASE                 0xfffbd000
+#define OMAP_LPG2_BASE                 0xfffbd800
+#define OMAP_LPG1_LCR                  (OMAP_LPG1_BASE + 0x00)
+#define OMAP_LPG1_PMR                  (OMAP_LPG1_BASE + 0x04)
+#define OMAP_LPG2_LCR                  (OMAP_LPG2_BASE + 0x00)
+#define OMAP_LPG2_PMR                  (OMAP_LPG2_BASE + 0x04)
+
+/*
+ * ----------------------------------------------------------------------------
+ * Pulse-Width Light
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP_PWL_BASE                  0xfffb5800
+#define OMAP_PWL_ENABLE                        (OMAP_PWL_BASE + 0x00)
+#define OMAP_PWL_CLK_ENABLE            (OMAP_PWL_BASE + 0x04)
+
+/*
+ * ---------------------------------------------------------------------------
+ * Processor specific defines
+ * ---------------------------------------------------------------------------
+ */
+
+#include "omap7xx.h"
+#include "omap1510.h"
+#include "omap16xx.h"
+
+#endif /* __ASM_ARCH_OMAP_HARDWARE_H */
index 9292fdc..729992d 100644 (file)
@@ -1,5 +1,268 @@
 /*
- * arch/arm/mach-omap1/include/mach/irqs.h
+ *  arch/arm/plat-omap/include/mach/irqs.h
+ *
+ *  Copyright (C) Greg Lonnon 2001
+ *  Updated for OMAP-1610 by Tony Lindgren <tony@atomide.com>
+ *
+ * Copyright (C) 2009 Texas Instruments
+ * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.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
+ *
+ * NOTE: The interrupt vectors for the OMAP-1509, OMAP-1510, and OMAP-1610
+ *      are different.
  */
 
-#include <plat/irqs.h>
+#ifndef __ASM_ARCH_OMAP15XX_IRQS_H
+#define __ASM_ARCH_OMAP15XX_IRQS_H
+
+/*
+ * IRQ numbers for interrupt handler 1
+ *
+ * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
+ *
+ */
+#define INT_CAMERA             1
+#define INT_FIQ                        3
+#define INT_RTDX               6
+#define INT_DSP_MMU_ABORT      7
+#define INT_HOST               8
+#define INT_ABORT              9
+#define INT_BRIDGE_PRIV                13
+#define INT_GPIO_BANK1         14
+#define INT_UART3              15
+#define INT_TIMER3             16
+#define INT_DMA_CH0_6          19
+#define INT_DMA_CH1_7          20
+#define INT_DMA_CH2_8          21
+#define INT_DMA_CH3            22
+#define INT_DMA_CH4            23
+#define INT_DMA_CH5            24
+#define INT_TIMER1             26
+#define INT_WD_TIMER           27
+#define INT_BRIDGE_PUB         28
+#define INT_TIMER2             30
+#define INT_LCD_CTRL           31
+
+/*
+ * OMAP-1510 specific IRQ numbers for interrupt handler 1
+ */
+#define INT_1510_IH2_IRQ       0
+#define INT_1510_RES2          2
+#define INT_1510_SPI_TX                4
+#define INT_1510_SPI_RX                5
+#define INT_1510_DSP_MAILBOX1  10
+#define INT_1510_DSP_MAILBOX2  11
+#define INT_1510_RES12         12
+#define INT_1510_LB_MMU                17
+#define INT_1510_RES18         18
+#define INT_1510_LOCAL_BUS     29
+
+/*
+ * OMAP-1610 specific IRQ numbers for interrupt handler 1
+ */
+#define INT_1610_IH2_IRQ       INT_1510_IH2_IRQ
+#define INT_1610_IH2_FIQ       2
+#define INT_1610_McBSP2_TX     4
+#define INT_1610_McBSP2_RX     5
+#define INT_1610_DSP_MAILBOX1  10
+#define INT_1610_DSP_MAILBOX2  11
+#define INT_1610_LCD_LINE      12
+#define INT_1610_GPTIMER1      17
+#define INT_1610_GPTIMER2      18
+#define INT_1610_SSR_FIFO_0    29
+
+/*
+ * OMAP-7xx specific IRQ numbers for interrupt handler 1
+ */
+#define INT_7XX_IH2_FIQ                0
+#define INT_7XX_IH2_IRQ                1
+#define INT_7XX_USB_NON_ISO    2
+#define INT_7XX_USB_ISO                3
+#define INT_7XX_ICR            4
+#define INT_7XX_EAC            5
+#define INT_7XX_GPIO_BANK1     6
+#define INT_7XX_GPIO_BANK2     7
+#define INT_7XX_GPIO_BANK3     8
+#define INT_7XX_McBSP2TX       10
+#define INT_7XX_McBSP2RX       11
+#define INT_7XX_McBSP2RX_OVF   12
+#define INT_7XX_LCD_LINE       14
+#define INT_7XX_GSM_PROTECT    15
+#define INT_7XX_TIMER3         16
+#define INT_7XX_GPIO_BANK5     17
+#define INT_7XX_GPIO_BANK6     18
+#define INT_7XX_SPGIO_WR       29
+
+/*
+ * IRQ numbers for interrupt handler 2
+ *
+ * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
+ */
+#define IH2_BASE               32
+
+#define INT_KEYBOARD           (1 + IH2_BASE)
+#define INT_uWireTX            (2 + IH2_BASE)
+#define INT_uWireRX            (3 + IH2_BASE)
+#define INT_I2C                        (4 + IH2_BASE)
+#define INT_MPUIO              (5 + IH2_BASE)
+#define INT_USB_HHC_1          (6 + IH2_BASE)
+#define INT_McBSP3TX           (10 + IH2_BASE)
+#define INT_McBSP3RX           (11 + IH2_BASE)
+#define INT_McBSP1TX           (12 + IH2_BASE)
+#define INT_McBSP1RX           (13 + IH2_BASE)
+#define INT_UART1              (14 + IH2_BASE)
+#define INT_UART2              (15 + IH2_BASE)
+#define INT_BT_MCSI1TX         (16 + IH2_BASE)
+#define INT_BT_MCSI1RX         (17 + IH2_BASE)
+#define INT_SOSSI_MATCH                (19 + IH2_BASE)
+#define INT_USB_W2FC           (20 + IH2_BASE)
+#define INT_1WIRE              (21 + IH2_BASE)
+#define INT_OS_TIMER           (22 + IH2_BASE)
+#define INT_MMC                        (23 + IH2_BASE)
+#define INT_GAUGE_32K          (24 + IH2_BASE)
+#define INT_RTC_TIMER          (25 + IH2_BASE)
+#define INT_RTC_ALARM          (26 + IH2_BASE)
+#define INT_MEM_STICK          (27 + IH2_BASE)
+
+/*
+ * OMAP-1510 specific IRQ numbers for interrupt handler 2
+ */
+#define INT_1510_DSP_MMU       (28 + IH2_BASE)
+#define INT_1510_COM_SPI_RO    (31 + IH2_BASE)
+
+/*
+ * OMAP-1610 specific IRQ numbers for interrupt handler 2
+ */
+#define INT_1610_FAC           (0 + IH2_BASE)
+#define INT_1610_USB_HHC_2     (7 + IH2_BASE)
+#define INT_1610_USB_OTG       (8 + IH2_BASE)
+#define INT_1610_SoSSI         (9 + IH2_BASE)
+#define INT_1610_SoSSI_MATCH   (19 + IH2_BASE)
+#define INT_1610_DSP_MMU       (28 + IH2_BASE)
+#define INT_1610_McBSP2RX_OF   (31 + IH2_BASE)
+#define INT_1610_STI           (32 + IH2_BASE)
+#define INT_1610_STI_WAKEUP    (33 + IH2_BASE)
+#define INT_1610_GPTIMER3      (34 + IH2_BASE)
+#define INT_1610_GPTIMER4      (35 + IH2_BASE)
+#define INT_1610_GPTIMER5      (36 + IH2_BASE)
+#define INT_1610_GPTIMER6      (37 + IH2_BASE)
+#define INT_1610_GPTIMER7      (38 + IH2_BASE)
+#define INT_1610_GPTIMER8      (39 + IH2_BASE)
+#define INT_1610_GPIO_BANK2    (40 + IH2_BASE)
+#define INT_1610_GPIO_BANK3    (41 + IH2_BASE)
+#define INT_1610_MMC2          (42 + IH2_BASE)
+#define INT_1610_CF            (43 + IH2_BASE)
+#define INT_1610_WAKE_UP_REQ   (46 + IH2_BASE)
+#define INT_1610_GPIO_BANK4    (48 + IH2_BASE)
+#define INT_1610_SPI           (49 + IH2_BASE)
+#define INT_1610_DMA_CH6       (53 + IH2_BASE)
+#define INT_1610_DMA_CH7       (54 + IH2_BASE)
+#define INT_1610_DMA_CH8       (55 + IH2_BASE)
+#define INT_1610_DMA_CH9       (56 + IH2_BASE)
+#define INT_1610_DMA_CH10      (57 + IH2_BASE)
+#define INT_1610_DMA_CH11      (58 + IH2_BASE)
+#define INT_1610_DMA_CH12      (59 + IH2_BASE)
+#define INT_1610_DMA_CH13      (60 + IH2_BASE)
+#define INT_1610_DMA_CH14      (61 + IH2_BASE)
+#define INT_1610_DMA_CH15      (62 + IH2_BASE)
+#define INT_1610_NAND          (63 + IH2_BASE)
+#define INT_1610_SHA1MD5       (91 + IH2_BASE)
+
+/*
+ * OMAP-7xx specific IRQ numbers for interrupt handler 2
+ */
+#define INT_7XX_HW_ERRORS      (0 + IH2_BASE)
+#define INT_7XX_NFIQ_PWR_FAIL  (1 + IH2_BASE)
+#define INT_7XX_CFCD           (2 + IH2_BASE)
+#define INT_7XX_CFIREQ         (3 + IH2_BASE)
+#define INT_7XX_I2C            (4 + IH2_BASE)
+#define INT_7XX_PCC            (5 + IH2_BASE)
+#define INT_7XX_MPU_EXT_NIRQ   (6 + IH2_BASE)
+#define INT_7XX_SPI_100K_1     (7 + IH2_BASE)
+#define INT_7XX_SYREN_SPI      (8 + IH2_BASE)
+#define INT_7XX_VLYNQ          (9 + IH2_BASE)
+#define INT_7XX_GPIO_BANK4     (10 + IH2_BASE)
+#define INT_7XX_McBSP1TX       (11 + IH2_BASE)
+#define INT_7XX_McBSP1RX       (12 + IH2_BASE)
+#define INT_7XX_McBSP1RX_OF    (13 + IH2_BASE)
+#define INT_7XX_UART_MODEM_IRDA_2 (14 + IH2_BASE)
+#define INT_7XX_UART_MODEM_1   (15 + IH2_BASE)
+#define INT_7XX_MCSI           (16 + IH2_BASE)
+#define INT_7XX_uWireTX                (17 + IH2_BASE)
+#define INT_7XX_uWireRX                (18 + IH2_BASE)
+#define INT_7XX_SMC_CD         (19 + IH2_BASE)
+#define INT_7XX_SMC_IREQ       (20 + IH2_BASE)
+#define INT_7XX_HDQ_1WIRE      (21 + IH2_BASE)
+#define INT_7XX_TIMER32K       (22 + IH2_BASE)
+#define INT_7XX_MMC_SDIO       (23 + IH2_BASE)
+#define INT_7XX_UPLD           (24 + IH2_BASE)
+#define INT_7XX_USB_HHC_1      (27 + IH2_BASE)
+#define INT_7XX_USB_HHC_2      (28 + IH2_BASE)
+#define INT_7XX_USB_GENI       (29 + IH2_BASE)
+#define INT_7XX_USB_OTG                (30 + IH2_BASE)
+#define INT_7XX_CAMERA_IF      (31 + IH2_BASE)
+#define INT_7XX_RNG            (32 + IH2_BASE)
+#define INT_7XX_DUAL_MODE_TIMER (33 + IH2_BASE)
+#define INT_7XX_DBB_RF_EN      (34 + IH2_BASE)
+#define INT_7XX_MPUIO_KEYPAD   (35 + IH2_BASE)
+#define INT_7XX_SHA1_MD5       (36 + IH2_BASE)
+#define INT_7XX_SPI_100K_2     (37 + IH2_BASE)
+#define INT_7XX_RNG_IDLE       (38 + IH2_BASE)
+#define INT_7XX_MPUIO          (39 + IH2_BASE)
+#define INT_7XX_LLPC_LCD_CTRL_CAN_BE_OFF       (40 + IH2_BASE)
+#define INT_7XX_LLPC_OE_FALLING (41 + IH2_BASE)
+#define INT_7XX_LLPC_OE_RISING (42 + IH2_BASE)
+#define INT_7XX_LLPC_VSYNC     (43 + IH2_BASE)
+#define INT_7XX_WAKE_UP_REQ    (46 + IH2_BASE)
+#define INT_7XX_DMA_CH6                (53 + IH2_BASE)
+#define INT_7XX_DMA_CH7                (54 + IH2_BASE)
+#define INT_7XX_DMA_CH8                (55 + IH2_BASE)
+#define INT_7XX_DMA_CH9                (56 + IH2_BASE)
+#define INT_7XX_DMA_CH10       (57 + IH2_BASE)
+#define INT_7XX_DMA_CH11       (58 + IH2_BASE)
+#define INT_7XX_DMA_CH12       (59 + IH2_BASE)
+#define INT_7XX_DMA_CH13       (60 + IH2_BASE)
+#define INT_7XX_DMA_CH14       (61 + IH2_BASE)
+#define INT_7XX_DMA_CH15       (62 + IH2_BASE)
+#define INT_7XX_NAND           (63 + IH2_BASE)
+
+/* Max. 128 level 2 IRQs (OMAP1610), 192 GPIOs (OMAP730/850) and
+ * 16 MPUIO lines */
+#define OMAP_MAX_GPIO_LINES    192
+#define IH_GPIO_BASE           (128 + IH2_BASE)
+#define IH_MPUIO_BASE          (OMAP_MAX_GPIO_LINES + IH_GPIO_BASE)
+#define OMAP_IRQ_END           (IH_MPUIO_BASE + 16)
+
+/* External FPGA handles interrupts on Innovator boards */
+#define        OMAP_FPGA_IRQ_BASE      (OMAP_IRQ_END)
+#ifdef CONFIG_MACH_OMAP_INNOVATOR
+#define OMAP_FPGA_NR_IRQS      24
+#else
+#define OMAP_FPGA_NR_IRQS      0
+#endif
+#define OMAP_FPGA_IRQ_END      (OMAP_FPGA_IRQ_BASE + OMAP_FPGA_NR_IRQS)
+
+#define NR_IRQS                        OMAP_FPGA_IRQ_END
+
+#define OMAP_IRQ_BIT(irq)      (1 << ((irq) % 32))
+
+#include <mach/hardware.h>
+
+#ifdef CONFIG_FIQ
+#define FIQ_START              1024
+#endif
+
+#endif
similarity index 97%
rename from arch/arm/plat-omap/include/plat/omap1510.h
rename to arch/arm/mach-omap1/include/mach/omap1510.h
index d240046..8fe05d6 100644 (file)
@@ -1,5 +1,4 @@
-/* arch/arm/plat-omap/include/mach/omap1510.h
- *
+/*
  * Hardware definitions for TI OMAP1510 processor.
  *
  * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
similarity index 99%
rename from arch/arm/plat-omap/include/plat/omap16xx.h
rename to arch/arm/mach-omap1/include/mach/omap16xx.h
index e69e1d8..cd1c724 100644 (file)
@@ -1,5 +1,4 @@
-/* arch/arm/plat-omap/include/mach/omap16xx.h
- *
+/*
  * Hardware definitions for TI OMAP1610/5912/1710 processors.
  *
  * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
similarity index 98%
rename from arch/arm/plat-omap/include/plat/omap7xx.h
rename to arch/arm/mach-omap1/include/mach/omap7xx.h
index 48e4757..63da994 100644 (file)
@@ -1,5 +1,4 @@
-/* arch/arm/plat-omap/include/mach/omap7xx.h
- *
+/*
  * Hardware definitions for TI OMAP7XX processor.
  *
  * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
diff --git a/arch/arm/mach-omap1/include/mach/smp.h b/arch/arm/mach-omap1/include/mach/smp.h
deleted file mode 100644 (file)
index 80a371c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
- * arch/arm/mach-omap1/include/mach/smp.h
- */
-
-#include <plat/smp.h>
index 6c95a59..6a5baab 100644 (file)
@@ -16,7 +16,7 @@
 #include <asm/tlb.h>
 #include <asm/mach/map.h>
 
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/tc.h>
 #include <plat/dma.h>
 
index 5769c71..ed42628 100644 (file)
@@ -113,8 +113,7 @@ EXPORT_SYMBOL(omap_set_lcd_dma_b1_mirror);
 void omap_set_lcd_dma_b1_vxres(unsigned long vxres)
 {
        if (cpu_is_omap15xx()) {
-               printk(KERN_ERR "DMA virtual resolution is not supported "
-                               "in 1510 mode\n");
+               pr_err("DMA virtual resolution is not supported in 1510 mode\n");
                BUG();
        }
        lcd_dma.vxres = vxres;
@@ -437,8 +436,7 @@ static int __init omap_init_lcd_dma(void)
        r = request_irq(INT_DMA_LCD, lcd_dma_irq_handler, 0,
                        "LCD DMA", NULL);
        if (r != 0)
-               printk(KERN_ERR "unable to request IRQ for LCD DMA "
-                              "(error %d)\n", r);
+               pr_err("unable to request IRQ for LCD DMA (error %d)\n", r);
 
        return r;
 }
index f6b14a1..6f958ae 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/kernel_stat.h>
 #include <linux/sched.h>
 #include <linux/io.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <mach/hardware.h>
 #include <asm/leds.h>
@@ -68,11 +69,13 @@ void h2p2_dbg_leds_event(led_event_t evt)
                        gpio_set_value(GPIO_IDLE, 0);
                }
 
-               __raw_writew(~0, &fpga->leds);
                led_state &= ~LED_STATE_ENABLED;
-               if (evt == led_halted) {
-                       iounmap(fpga);
-                       fpga = NULL;
+               if (fpga) {
+                       __raw_writew(~0, &fpga->leds);
+                       if (evt == led_halted) {
+                               iounmap(fpga);
+                               fpga = NULL;
+                       }
                }
 
                goto done;
@@ -158,7 +161,7 @@ void h2p2_dbg_leds_event(led_event_t evt)
        /*
         *  Actually burn the LEDs
         */
-       if (led_state & LED_STATE_ENABLED)
+       if (led_state & LED_STATE_ENABLED && fpga)
                __raw_writew(~hw_led_state, &fpga->leds);
 
 done:
index ae6dd93..4071479 100644 (file)
@@ -6,11 +6,12 @@
 #include <linux/gpio.h>
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <asm/leds.h>
 #include <asm/mach-types.h>
 
-#include <plat/mux.h>
+#include <mach/mux.h>
 
 #include "leds.h"
 
index adf0097..bdc2e75 100644 (file)
@@ -20,9 +20,9 @@
 #include <linux/slab.h>
 
 #include <plat/dma.h>
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/cpu.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include <mach/irqs.h>
 
index e9cc52d..667ce50 100644 (file)
@@ -29,7 +29,7 @@
 
 #include <mach/hardware.h>
 
-#include <plat/mux.h>
+#include <mach/mux.h>
 
 #ifdef CONFIG_OMAP_MUX
 
@@ -451,6 +451,56 @@ static int __init_or_module omap1_cfg_reg(const struct pin_config *cfg)
 #endif
 }
 
+static struct omap_mux_cfg *mux_cfg;
+
+int __init omap_mux_register(struct omap_mux_cfg *arch_mux_cfg)
+{
+       if (!arch_mux_cfg || !arch_mux_cfg->pins || arch_mux_cfg->size == 0
+                       || !arch_mux_cfg->cfg_reg) {
+               printk(KERN_ERR "Invalid pin table\n");
+               return -EINVAL;
+       }
+
+       mux_cfg = arch_mux_cfg;
+
+       return 0;
+}
+
+/*
+ * Sets the Omap MUX and PULL_DWN registers based on the table
+ */
+int __init_or_module omap_cfg_reg(const unsigned long index)
+{
+       struct pin_config *reg;
+
+       if (!cpu_class_is_omap1()) {
+               printk(KERN_ERR "mux: Broken omap_cfg_reg(%lu) entry\n",
+                               index);
+               WARN_ON(1);
+               return -EINVAL;
+       }
+
+       if (mux_cfg == NULL) {
+               printk(KERN_ERR "Pin mux table not initialized\n");
+               return -ENODEV;
+       }
+
+       if (index >= mux_cfg->size) {
+               printk(KERN_ERR "Invalid pin mux index: %lu (%lu)\n",
+                      index, mux_cfg->size);
+               dump_stack();
+               return -ENODEV;
+       }
+
+       reg = &mux_cfg->pins[index];
+
+       if (!mux_cfg->cfg_reg)
+               return -ENODEV;
+
+       return mux_cfg->cfg_reg(reg);
+}
+EXPORT_SYMBOL(omap_cfg_reg);
+
 int __init omap1_mux_init(void)
 {
        if (cpu_is_omap7xx()) {
@@ -468,4 +518,8 @@ int __init omap1_mux_init(void)
        return omap_mux_register(&arch_mux_cfg);
 }
 
-#endif
+#else
+#define omap_mux_init() do {} while(0)
+#define omap_cfg_reg(x)        do {} while(0)
+#endif /* CONFIG_OMAP_MUX */
+
index b2560d3..47ec161 100644 (file)
@@ -53,7 +53,7 @@
 #include <plat/clock.h>
 #include <plat/sram.h>
 #include <plat/tc.h>
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/dma.h>
 #include <plat/dmtimer.h>
 
index 6809c9e..b9d6834 100644 (file)
@@ -22,8 +22,7 @@
 
 #include <asm/mach-types.h>
 
-#include <plat/board.h>
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/fpga.h>
 
 #include "pm.h"
index 65f8817..84267ed 100644 (file)
@@ -26,7 +26,7 @@
 
 #include <asm/irq.h>
 
-#include <plat/mux.h>
+#include <mach/mux.h>
 
 #include <mach/usb.h>
 
index fcd4e85..eef99b7 100644 (file)
@@ -18,6 +18,7 @@ config ARCH_OMAP2PLUS_TYPICAL
        select TWL4030_CORE if ARCH_OMAP3 || ARCH_OMAP4
        select TWL4030_POWER if ARCH_OMAP3 || ARCH_OMAP4
        select HIGHMEM
+       select PINCTRL
        help
          Compile a kernel suitable for booting most boards
 
@@ -232,10 +233,11 @@ config MACH_OMAP3_PANDORA
        select OMAP_PACKAGE_CBB
        select REGULATOR_FIXED_VOLTAGE if REGULATOR
 
-config MACH_OMAP3_TOUCHBOOK
+config MACH_TOUCHBOOK
        bool "OMAP3 Touch Book"
        depends on ARCH_OMAP3
        default y
+       select OMAP_PACKAGE_CBB
 
 config MACH_OMAP_3430SDP
        bool "OMAP 3430 SDP board"
index f6a24b3..8452023 100644 (file)
@@ -4,36 +4,30 @@
 
 # Common support
 obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \
-        common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o
+        common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o
 
-omap-2-3-common                                = irq.o
-hwmod-common                           = omap_hwmod.o \
-                                         omap_hwmod_common_data.o
-clock-common                           = clock.o clock_common_data.o \
-                                         clkt_dpll.o clkt_clksel.o
-secure-common                          = omap-smc.o omap-secure.o
+# INTCPS IP block support - XXX should be moved to drivers/
+obj-$(CONFIG_ARCH_OMAP2)               += irq.o
+obj-$(CONFIG_ARCH_OMAP3)               += irq.o
+obj-$(CONFIG_SOC_AM33XX)               += irq.o
 
-obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(hwmod-common)
-obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(hwmod-common) $(secure-common)
-obj-$(CONFIG_ARCH_OMAP4) += prm44xx.o $(hwmod-common) $(secure-common)
-obj-$(CONFIG_SOC_AM33XX) += irq.o $(hwmod-common)
-obj-$(CONFIG_SOC_OMAP5)         += prm44xx.o $(hwmod-common) $(secure-common)
+# Secure monitor API support
+obj-$(CONFIG_ARCH_OMAP3)               += omap-smc.o omap-secure.o
+obj-$(CONFIG_ARCH_OMAP4)               += omap-smc.o omap-secure.o
+obj-$(CONFIG_SOC_OMAP5)                        += omap-smc.o omap-secure.o
 
 ifneq ($(CONFIG_SND_OMAP_SOC_MCBSP),)
 obj-y += mcbsp.o
 endif
 
-obj-$(CONFIG_TWL4030_CORE) += omap_twl.o
-obj-$(CONFIG_SOC_HAS_OMAP2_SDRC)       += sdrc.o
+obj-$(CONFIG_TWL4030_CORE)             += omap_twl.o
 
 # SMP support ONLY available for OMAP4
 
 obj-$(CONFIG_SMP)                      += omap-smp.o omap-headsmp.o
 obj-$(CONFIG_HOTPLUG_CPU)              += omap-hotplug.o
-omap-4-5-common                                =  omap4-common.o omap-wakeupgen.o \
-                                          sleep44xx.o
-obj-$(CONFIG_ARCH_OMAP4)               += $(omap-4-5-common)
-obj-$(CONFIG_SOC_OMAP5)                        += $(omap-4-5-common)
+obj-$(CONFIG_ARCH_OMAP4)               += omap4-common.o omap-wakeupgen.o
+obj-$(CONFIG_SOC_OMAP5)                        += omap4-common.o omap-wakeupgen.o
 
 plus_sec := $(call as-instr,.arch_extension sec,+sec)
 AFLAGS_omap-headsmp.o                  :=-Wa,-march=armv7-a$(plus_sec)
@@ -58,6 +52,7 @@ obj-$(CONFIG_ARCH_OMAP4)              += mux44xx.o
 # SMS/SDRC
 obj-$(CONFIG_ARCH_OMAP2)               += sdrc2xxx.o
 # obj-$(CONFIG_ARCH_OMAP3)             += sdrc3xxx.o
+obj-$(CONFIG_SOC_HAS_OMAP2_SDRC)       += sdrc.o
 
 # OPP table initialization
 ifeq ($(CONFIG_PM_OPP),y)
@@ -68,15 +63,15 @@ endif
 
 # Power Management
 ifeq ($(CONFIG_PM),y)
-obj-$(CONFIG_ARCH_OMAP2)               += pm24xx.o
-obj-$(CONFIG_ARCH_OMAP2)               += sleep24xx.o
+obj-$(CONFIG_ARCH_OMAP2)               += pm24xx.o sleep24xx.o
 obj-$(CONFIG_ARCH_OMAP3)               += pm34xx.o sleep34xx.o
 obj-$(CONFIG_ARCH_OMAP4)               += pm44xx.o omap-mpuss-lowpower.o
-obj-$(CONFIG_SOC_OMAP5)                        += omap-mpuss-lowpower.o
+obj-$(CONFIG_ARCH_OMAP4)               += sleep44xx.o
+obj-$(CONFIG_SOC_OMAP5)                        += omap-mpuss-lowpower.o sleep44xx.o
 obj-$(CONFIG_PM_DEBUG)                 += pm-debug.o
 
 obj-$(CONFIG_POWER_AVS_OMAP)           += sr_device.o
-obj-$(CONFIG_POWER_AVS_OMAP_CLASS3)    += smartreflex-class3.o
+obj-$(CONFIG_POWER_AVS_OMAP_CLASS3)    += smartreflex-class3.o
 
 AFLAGS_sleep24xx.o                     :=-Wa,-march=armv6
 AFLAGS_sleep34xx.o                     :=-Wa,-march=armv7-a$(plus_sec)
@@ -88,92 +83,76 @@ endif
 endif
 
 ifeq ($(CONFIG_CPU_IDLE),y)
-obj-$(CONFIG_ARCH_OMAP3)                += cpuidle34xx.o
-obj-$(CONFIG_ARCH_OMAP4)                += cpuidle44xx.o
+obj-$(CONFIG_ARCH_OMAP3)               += cpuidle34xx.o
+obj-$(CONFIG_ARCH_OMAP4)               += cpuidle44xx.o
 endif
 
 # PRCM
-omap-prcm-4-5-common                   =  prcm.o cminst44xx.o cm44xx.o \
-                                          prcm_mpu44xx.o prminst44xx.o \
-                                          vc44xx_data.o vp44xx_data.o
-obj-y                                  += prm_common.o
-obj-$(CONFIG_ARCH_OMAP2)               += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o
-obj-$(CONFIG_ARCH_OMAP3)               += prcm.o cm2xxx_3xxx.o prm2xxx_3xxx.o
+obj-y                                  += prcm.o prm_common.o
+obj-$(CONFIG_ARCH_OMAP2)               += cm2xxx_3xxx.o prm2xxx_3xxx.o
+obj-$(CONFIG_ARCH_OMAP3)               += cm2xxx_3xxx.o prm2xxx_3xxx.o
 obj-$(CONFIG_ARCH_OMAP3)               += vc3xxx_data.o vp3xxx_data.o
-obj-$(CONFIG_SOC_AM33XX)               += prcm.o prm33xx.o cm33xx.o
-obj-$(CONFIG_ARCH_OMAP4)               += $(omap-prcm-4-5-common) prm44xx.o
+obj-$(CONFIG_SOC_AM33XX)               += prm33xx.o cm33xx.o
+omap-prcm-4-5-common                   =  cminst44xx.o cm44xx.o prm44xx.o \
+                                          prcm_mpu44xx.o prminst44xx.o \
+                                          vc44xx_data.o vp44xx_data.o \
+                                          prm44xx.o
+obj-$(CONFIG_ARCH_OMAP4)               += $(omap-prcm-4-5-common)
 obj-$(CONFIG_SOC_OMAP5)                        += $(omap-prcm-4-5-common)
 
 # OMAP voltage domains
-voltagedomain-common                   := voltage.o vc.o vp.o
-obj-$(CONFIG_ARCH_OMAP2)               += $(voltagedomain-common)
+obj-y                                  += voltage.o vc.o vp.o
 obj-$(CONFIG_ARCH_OMAP2)               += voltagedomains2xxx_data.o
-obj-$(CONFIG_ARCH_OMAP3)               += $(voltagedomain-common)
 obj-$(CONFIG_ARCH_OMAP3)               += voltagedomains3xxx_data.o
-obj-$(CONFIG_ARCH_OMAP4)               += $(voltagedomain-common)
 obj-$(CONFIG_ARCH_OMAP4)               += voltagedomains44xx_data.o
-obj-$(CONFIG_SOC_AM33XX)               += $(voltagedomain-common)
-obj-$(CONFIG_SOC_AM33XX)                += voltagedomains33xx_data.o
-obj-$(CONFIG_SOC_OMAP5)                        += $(voltagedomain-common)
+obj-$(CONFIG_SOC_AM33XX)               += voltagedomains33xx_data.o
 
 # OMAP powerdomain framework
-powerdomain-common                     += powerdomain.o powerdomain-common.o
-obj-$(CONFIG_ARCH_OMAP2)               += $(powerdomain-common)
+obj-y                                  += powerdomain.o powerdomain-common.o
 obj-$(CONFIG_ARCH_OMAP2)               += powerdomains2xxx_data.o
 obj-$(CONFIG_ARCH_OMAP2)               += powerdomain2xxx_3xxx.o
 obj-$(CONFIG_ARCH_OMAP2)               += powerdomains2xxx_3xxx_data.o
-obj-$(CONFIG_ARCH_OMAP3)               += $(powerdomain-common)
 obj-$(CONFIG_ARCH_OMAP3)               += powerdomain2xxx_3xxx.o
 obj-$(CONFIG_ARCH_OMAP3)               += powerdomains3xxx_data.o
 obj-$(CONFIG_ARCH_OMAP3)               += powerdomains2xxx_3xxx_data.o
-obj-$(CONFIG_ARCH_OMAP4)               += $(powerdomain-common)
 obj-$(CONFIG_ARCH_OMAP4)               += powerdomain44xx.o
 obj-$(CONFIG_ARCH_OMAP4)               += powerdomains44xx_data.o
-obj-$(CONFIG_SOC_AM33XX)               += $(powerdomain-common)
 obj-$(CONFIG_SOC_AM33XX)               += powerdomain33xx.o
 obj-$(CONFIG_SOC_AM33XX)               += powerdomains33xx_data.o
-obj-$(CONFIG_SOC_OMAP5)                        += $(powerdomain-common)
 obj-$(CONFIG_SOC_OMAP5)                        += powerdomain44xx.o
 
 # PRCM clockdomain control
-clockdomain-common                     += clockdomain.o
-obj-$(CONFIG_ARCH_OMAP2)               += $(clockdomain-common)
+obj-y                                  += clockdomain.o
 obj-$(CONFIG_ARCH_OMAP2)               += clockdomain2xxx_3xxx.o
 obj-$(CONFIG_ARCH_OMAP2)               += clockdomains2xxx_3xxx_data.o
 obj-$(CONFIG_SOC_OMAP2420)             += clockdomains2420_data.o
 obj-$(CONFIG_SOC_OMAP2430)             += clockdomains2430_data.o
-obj-$(CONFIG_ARCH_OMAP3)               += $(clockdomain-common)
 obj-$(CONFIG_ARCH_OMAP3)               += clockdomain2xxx_3xxx.o
 obj-$(CONFIG_ARCH_OMAP3)               += clockdomains2xxx_3xxx_data.o
 obj-$(CONFIG_ARCH_OMAP3)               += clockdomains3xxx_data.o
-obj-$(CONFIG_ARCH_OMAP4)               += $(clockdomain-common)
 obj-$(CONFIG_ARCH_OMAP4)               += clockdomain44xx.o
 obj-$(CONFIG_ARCH_OMAP4)               += clockdomains44xx_data.o
-obj-$(CONFIG_SOC_AM33XX)               += $(clockdomain-common)
 obj-$(CONFIG_SOC_AM33XX)               += clockdomain33xx.o
 obj-$(CONFIG_SOC_AM33XX)               += clockdomains33xx_data.o
-obj-$(CONFIG_SOC_OMAP5)                        += $(clockdomain-common)
 obj-$(CONFIG_SOC_OMAP5)                        += clockdomain44xx.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-y                                  += clock.o clock_common_data.o \
+                                          clkt_dpll.o clkt_clksel.o
+obj-$(CONFIG_ARCH_OMAP2)               += clock2xxx.o
+obj-$(CONFIG_ARCH_OMAP2)               += clkt2xxx_dpllcore.o clkt2xxx_sys.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_dpll.o clkt_iclk.o
 obj-$(CONFIG_SOC_OMAP2420)             += clock2420_data.o
 obj-$(CONFIG_SOC_OMAP2430)             += clock2430.o clock2430_data.o
-obj-$(CONFIG_ARCH_OMAP3)               += $(clock-common) clock3xxx.o
+obj-$(CONFIG_ARCH_OMAP3)               += clock3xxx.o
 obj-$(CONFIG_ARCH_OMAP3)               += clock34xx.o clkt34xx_dpll3m2.o
-obj-$(CONFIG_ARCH_OMAP3)               += clock3517.o clock36xx.o
+obj-$(CONFIG_ARCH_OMAP3)               += clock3517.o clock36xx.o clkt_iclk.o
 obj-$(CONFIG_ARCH_OMAP3)               += dpll3xxx.o clock3xxx_data.o
-obj-$(CONFIG_ARCH_OMAP3)               += clkt_iclk.o
-obj-$(CONFIG_ARCH_OMAP4)               += $(clock-common) clock44xx_data.o
+obj-$(CONFIG_ARCH_OMAP4)               += clock44xx_data.o
 obj-$(CONFIG_ARCH_OMAP4)               += dpll3xxx.o dpll44xx.o
-obj-$(CONFIG_SOC_AM33XX)               += $(clock-common) dpll3xxx.o
-obj-$(CONFIG_SOC_AM33XX)               += clock33xx_data.o
-obj-$(CONFIG_SOC_OMAP5)                        += $(clock-common)
+obj-$(CONFIG_SOC_AM33XX)               += dpll3xxx.o clock33xx_data.o
 obj-$(CONFIG_SOC_OMAP5)                        += dpll3xxx.o dpll44xx.o
 
 # OMAP2 clock rate set data (old "OPP" data)
@@ -181,6 +160,7 @@ obj-$(CONFIG_SOC_OMAP2420)          += opp2420_data.o
 obj-$(CONFIG_SOC_OMAP2430)             += opp2430_data.o
 
 # hwmod data
+obj-y                                  += omap_hwmod_common_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
@@ -194,6 +174,7 @@ obj-$(CONFIG_SOC_OMAP2430)          += omap_hwmod_2430_data.o
 obj-$(CONFIG_ARCH_OMAP3)               += omap_hwmod_2xxx_3xxx_ipblock_data.o
 obj-$(CONFIG_ARCH_OMAP3)               += omap_hwmod_2xxx_3xxx_interconnect_data.o
 obj-$(CONFIG_ARCH_OMAP3)               += omap_hwmod_3xxx_data.o
+obj-$(CONFIG_SOC_AM33XX)               += omap_hwmod_33xx_data.o
 obj-$(CONFIG_ARCH_OMAP4)               += omap_hwmod_44xx_data.o
 
 # EMU peripherals
@@ -229,10 +210,10 @@ obj-$(CONFIG_MACH_OMAP_H4)                += board-h4.o
 obj-$(CONFIG_MACH_OMAP_2430SDP)                += board-2430sdp.o
 obj-$(CONFIG_MACH_OMAP_APOLLON)                += board-apollon.o
 obj-$(CONFIG_MACH_OMAP3_BEAGLE)                += board-omap3beagle.o
-obj-$(CONFIG_MACH_DEVKIT8000)          += board-devkit8000.o
+obj-$(CONFIG_MACH_DEVKIT8000)          += board-devkit8000.o
 obj-$(CONFIG_MACH_OMAP_LDP)            += board-ldp.o
-obj-$(CONFIG_MACH_OMAP3530_LV_SOM)      += board-omap3logic.o
-obj-$(CONFIG_MACH_OMAP3_TORPEDO)        += board-omap3logic.o
+obj-$(CONFIG_MACH_OMAP3530_LV_SOM)     += board-omap3logic.o
+obj-$(CONFIG_MACH_OMAP3_TORPEDO)       += board-omap3logic.o
 obj-$(CONFIG_MACH_ENCORE)              += board-omap3encore.o
 obj-$(CONFIG_MACH_OVERO)               += board-overo.o
 obj-$(CONFIG_MACH_OMAP3EVM)            += board-omap3evm.o
@@ -255,7 +236,7 @@ obj-$(CONFIG_MACH_OMAP_3630SDP)             += board-zoom-display.o
 obj-$(CONFIG_MACH_CM_T35)              += board-cm-t35.o
 obj-$(CONFIG_MACH_CM_T3517)            += board-cm-t3517.o
 obj-$(CONFIG_MACH_IGEP0020)            += board-igep0020.o
-obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK)     += board-omap3touchbook.o
+obj-$(CONFIG_MACH_TOUCHBOOK)           += board-omap3touchbook.o
 obj-$(CONFIG_MACH_OMAP_4430SDP)                += board-4430sdp.o
 obj-$(CONFIG_MACH_OMAP4_PANDA)         += board-omap4panda.o
 
index b03e562..be0fe92 100644 (file)
@@ -1,3 +1,9 @@
   zreladdr-y           += 0x80008000
 params_phys-y          := 0x80000100
 initrd_phys-y          := 0x80800000
+
+dtb-$(CONFIG_SOC_OMAP2420)     += omap2420-h4.dtb
+dtb-$(CONFIG_ARCH_OMAP3)       += omap3-beagle-xm.dtb omap3-evm.dtb omap3-tobi.dtb
+dtb-$(CONFIG_ARCH_OMAP4)       += omap4-panda.dtb omap4-pandaES.dtb
+dtb-$(CONFIG_ARCH_OMAP4)       += omap4-var_som.dtb omap4-sdp.dtb
+dtb-$(CONFIG_SOC_OMAP5)                += omap5-evm.dtb
index 2c90ac6..d0c54c5 100644 (file)
@@ -19,7 +19,7 @@
 #include <linux/davinci_emac.h>
 #include <asm/system.h>
 #include <plat/omap_device.h>
-#include <mach/am35xx.h>
+#include "am35xx.h"
 #include "control.h"
 #include "am35xx-emac.h"
 
index 9511584..95b384d 100644 (file)
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/gpmc.h>
 #include <plat/usb.h>
-#include <plat/gpmc-smc91x.h>
+#include "gpmc-smc91x.h"
 
 #include <video/omapdss.h>
 #include <video/omap-panel-generic-dpi.h>
@@ -212,9 +211,6 @@ static struct regulator_init_data sdp2430_vmmc1 = {
 };
 
 static struct twl4030_gpio_platform_data sdp2430_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
 };
 
 static struct twl4030_platform_data sdp2430_twldata = {
@@ -235,7 +231,7 @@ static int __init omap2430_i2c_init(void)
        sdp2430_i2c1_boardinfo[0].irq = gpio_to_irq(78);
        omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo,
                        ARRAY_SIZE(sdp2430_i2c1_boardinfo));
-       omap_pmic_init(2, 100, "twl4030", INT_24XX_SYS_NIRQ,
+       omap_pmic_init(2, 100, "twl4030", 7 + OMAP_INTC_START,
                        &sdp2430_twldata);
        return 0;
 }
index a98c688..96cd369 100644 (file)
 #include <linux/io.h>
 #include <linux/gpio.h>
 #include <linux/mmc/host.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/mcspi.h>
-#include <plat/board.h>
 #include <plat/usb.h>
 #include "common.h"
 #include <plat/dma.h>
@@ -39,7 +37,7 @@
 #include <video/omapdss.h>
 #include <video/omap-panel-tfp410.h>
 
-#include <plat/gpmc-smc91x.h>
+#include "gpmc-smc91x.h"
 
 #include "board-flash.h"
 #include "mux.h"
@@ -191,9 +189,6 @@ static struct omap_dss_board_info sdp3430_dss_data = {
        .default_device = &sdp3430_lcd_device,
 };
 
-static struct omap_board_config_kernel sdp3430_config[] __initdata = {
-};
-
 static struct omap2_hsmmc_info mmc[] = {
        {
                .mmc            = 1,
@@ -233,9 +228,6 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
 }
 
 static struct twl4030_gpio_platform_data sdp3430_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .pulldowns      = BIT(2) | BIT(6) | BIT(8) | BIT(13)
                                | BIT(16) | BIT(17),
        .setup          = sdp3430_twl_gpio_setup,
@@ -576,8 +568,6 @@ static void __init omap_3430sdp_init(void)
        int gpio_pendown;
 
        omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
-       omap_board_config = sdp3430_config;
-       omap_board_config_size = ARRAY_SIZE(sdp3430_config);
        omap_hsmmc_init(mmc);
        omap3430_i2c_init();
        omap_display_init(&sdp3430_dss_data);
index 2dc9ba5..fc224ad 100644 (file)
@@ -17,8 +17,7 @@
 #include <asm/mach/arch.h>
 
 #include "common.h"
-#include <plat/board.h>
-#include <plat/gpmc-smc91x.h>
+#include "gpmc-smc91x.h"
 #include <plat/usb.h>
 
 #include <mach/board-zoom.h>
@@ -67,9 +66,6 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
        .reset_gpio_port[2]  = -EINVAL
 };
 
-static struct omap_board_config_kernel sdp_config[] __initdata = {
-};
-
 #ifdef CONFIG_OMAP_MUX
 static struct omap_board_mux board_mux[] __initdata = {
        { .reg_offset = OMAP_MUX_TERMINATOR },
@@ -197,8 +193,6 @@ static struct flash_partitions sdp_flash_partitions[] = {
 static void __init omap_sdp_init(void)
 {
        omap3_mux_init(board_mux, OMAP_PACKAGE_CBP);
-       omap_board_config = sdp_config;
-       omap_board_config_size = ARRAY_SIZE(sdp_config);
        zoom_peripherals_init();
        omap_sdrc_init(h8mbx00u0mer0em_sdrc_params,
                                  h8mbx00u0mer0em_sdrc_params);
index ad8a7d9..e82098f 100644 (file)
 #include <linux/leds_pwm.h>
 #include <linux/platform_data/omap4-keypad.h>
 
-#include <mach/hardware.h>
 #include <asm/hardware/gic.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/usb.h>
 #include <plat/mmc.h>
-#include <plat/omap4-keypad.h>
+#include "omap4-keypad.h"
 #include <video/omapdss.h>
 #include <video/omap-panel-nokia-dsi.h>
 #include <video/omap-panel-picodlp.h>
 #include <linux/wl12xx.h>
 #include <linux/platform_data/omap-abe-twl6040.h>
 
+#include "soc.h"
 #include "mux.h"
 #include "hsmmc.h"
 #include "control.h"
@@ -544,7 +543,6 @@ static struct twl6040_platform_data twl6040_data = {
        .codec          = &twl6040_codec,
        .vibra          = &twl6040_vibra,
        .audpwron_gpio  = 127,
-       .irq_base       = TWL6040_CODEC_IRQ_BASE,
 };
 
 static struct twl4030_platform_data sdp4430_twldata = {
@@ -581,7 +579,7 @@ static int __init omap4_i2c_init(void)
                        TWL_COMMON_REGULATOR_V1V8 |
                        TWL_COMMON_REGULATOR_V2V1);
        omap4_pmic_init("twl6030", &sdp4430_twldata,
-                       &twl6040_data, OMAP44XX_IRQ_SYS_2N);
+                       &twl6040_data, 119 + OMAP44XX_IRQ_GIC_START);
        omap_register_i2c_bus(2, 400, NULL, 0);
        omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo,
                                ARRAY_SIZE(sdp4430_i2c_3_boardinfo));
index 92432c2..318fead 100644 (file)
 #include <linux/init.h>
 #include <linux/gpio.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/usb.h>
 
 #define GPIO_USB_POWER         35
 #define GPIO_USB_NRESET                38
 
-
-/* Board initialization */
-static struct omap_board_config_kernel am3517_crane_config[] __initdata = {
-};
-
 #ifdef CONFIG_OMAP_MUX
 static struct omap_board_mux board_mux[] __initdata = {
        { .reg_offset = OMAP_MUX_TERMINATOR },
@@ -67,9 +60,6 @@ static void __init am3517_crane_init(void)
        omap_serial_init();
        omap_sdrc_init(NULL, NULL);
 
-       omap_board_config = am3517_crane_config;
-       omap_board_config_size = ARRAY_SIZE(am3517_crane_config);
-
        /* Configure GPIO for EHCI port */
        if (omap_mux_init_gpio(GPIO_USB_NRESET, OMAP_PIN_OUTPUT)) {
                pr_err("Can not configure mux for GPIO_USB_NRESET %d\n",
index 18f6010..0d99c91 100644 (file)
 #include <linux/can/platform/ti_hecc.h>
 #include <linux/davinci_emac.h>
 #include <linux/mmc/host.h>
+#include <linux/platform_data/gpio-omap.h>
 
-#include <mach/hardware.h>
-#include <mach/am35xx.h>
+#include "am35xx.h"
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/usb.h>
 #include <video/omapdss.h>
@@ -296,8 +295,7 @@ static struct resource am3517_hecc_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        {
-               .start  = INT_35XX_HECC0_IRQ,
-               .end    = INT_35XX_HECC0_IRQ,
+               .start  = 24 + OMAP_INTC_START,
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -324,9 +322,6 @@ static void am3517_evm_hecc_init(struct ti_hecc_platform_data *pdata)
        platform_device_register(&am3517_hecc_device);
 }
 
-static struct omap_board_config_kernel am3517_evm_config[] __initdata = {
-};
-
 static struct omap2_hsmmc_info mmc[] = {
        {
                .mmc            = 1,
@@ -346,8 +341,6 @@ static struct omap2_hsmmc_info mmc[] = {
 
 static void __init am3517_evm_init(void)
 {
-       omap_board_config = am3517_evm_config;
-       omap_board_config_size = ARRAY_SIZE(am3517_evm_config);
        omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
 
        am3517_evm_i2c_init();
index e5fa46b..3e2d76f 100644 (file)
 #include <linux/smc91x.h>
 #include <linux/gpio.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/flash.h>
 
 #include <plat/led.h>
-#include <plat/board.h>
 #include "common.h"
 #include <plat/gpmc.h>
 
index 97d7190..8ffd612 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/input/matrix_keypad.h>
 #include <linux/delay.h>
 #include <linux/gpio.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <linux/i2c/at24.h>
 #include <linux/i2c/twl.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include "common.h"
-#include <plat/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 #include <plat/gpmc.h>
 #include <plat/usb.h>
 #include <video/omapdss.h>
 #include <video/omap-panel-generic-dpi.h>
 #include <video/omap-panel-tfp410.h>
-#include <plat/mcspi.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 
 #include <mach/hardware.h>
 
@@ -64,7 +64,7 @@
 
 #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
 #include <linux/smsc911x.h>
-#include <plat/gpmc-smsc911x.h>
+#include "gpmc-smsc911x.h"
 
 static struct omap_smsc911x_platform_data cm_t35_smsc911x_cfg = {
        .id             = 0,
@@ -470,9 +470,6 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
 }
 
 static struct twl4030_gpio_platform_data cm_t35_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .setup          = cm_t35_twl_gpio_setup,
 };
 
@@ -714,13 +711,8 @@ static inline void cm_t35_init_mux(void) {}
 static inline void cm_t3730_init_mux(void) {}
 #endif
 
-static struct omap_board_config_kernel cm_t35_config[] __initdata = {
-};
-
 static void __init cm_t3x_common_init(void)
 {
-       omap_board_config = cm_t35_config;
-       omap_board_config_size = ARRAY_SIZE(cm_t35_config);
        omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
        omap_serial_init();
        omap_sdrc_init(mt46h32m32lf6_sdrc_params,
index a33ad46..59c0a45 100644 (file)
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/usb.h>
-#include <plat/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 #include <plat/gpmc.h>
 
-#include <mach/am35xx.h>
+#include "am35xx.h"
 
 #include "mux.h"
 #include "control.h"
@@ -90,8 +89,7 @@ static struct resource cm_t3517_hecc_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        {
-               .start  = INT_35XX_HECC0_IRQ,
-               .end    = INT_35XX_HECC0_IRQ,
+               .start  = 24 + OMAP_INTC_START,
                .flags  = IORESOURCE_IRQ,
        },
 };
@@ -249,9 +247,6 @@ static void __init cm_t3517_init_nand(void)
 static inline void cm_t3517_init_nand(void) {}
 #endif
 
-static struct omap_board_config_kernel cm_t3517_config[] __initdata = {
-};
-
 #ifdef CONFIG_OMAP_MUX
 static struct omap_board_mux board_mux[] __initdata = {
        /* GPIO186 - Green LED */
@@ -285,8 +280,6 @@ static void __init cm_t3517_init(void)
        omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
        omap_serial_init();
        omap_sdrc_init(NULL, NULL);
-       omap_board_config = cm_t3517_config;
-       omap_board_config_size = ARRAY_SIZE(cm_t3517_config);
        cm_t3517_init_leds();
        cm_t3517_init_nand();
        cm_t3517_init_rtc();
index 6567c1c..7bb8056 100644 (file)
 
 #include <linux/regulator/machine.h>
 #include <linux/i2c/twl.h>
-
-#include <mach/hardware.h>
-#include <mach/id.h>
+#include "id.h"
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/flash.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/gpmc.h>
-#include <plat/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 #include <plat/usb.h>
 #include <video/omapdss.h>
 #include <video/omap-panel-generic-dpi.h>
 #include <video/omap-panel-tfp410.h>
 
-#include <plat/mcspi.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 #include <linux/input/matrix_keypad.h>
 #include <linux/spi/spi.h>
 #include <linux/dm9000.h>
 #include <linux/interrupt.h>
 
 #include "sdram-micron-mt46h32m32lf-6.h"
-
 #include "mux.h"
 #include "hsmmc.h"
 #include "common-board-devices.h"
@@ -236,9 +232,6 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
 }
 
 static struct twl4030_gpio_platform_data devkit8000_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .use_leds       = true,
        .pulldowns      = BIT(1) | BIT(2) | BIT(6) | BIT(8) | BIT(13)
                                | BIT(15) | BIT(16) | BIT(17),
index 53c39d2..0cabe61 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/mtd/physmap.h>
 #include <linux/io.h>
-#include <plat/irqs.h>
 
+#include <plat/cpu.h>
 #include <plat/gpmc.h>
-#include <plat/nand.h>
-#include <plat/onenand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
+#include <linux/platform_data/mtd-onenand-omap2.h>
 #include <plat/tc.h>
 
+#include "common.h"
 #include "board-flash.h"
 
 #define REG_FPGA_REV                   0x10
@@ -140,7 +141,6 @@ __init board_nand_init(struct mtd_partition *nand_parts,
        board_nand_data.devsize         = nand_type;
 
        board_nand_data.ecc_opt = OMAP_ECC_HAMMING_CODE_DEFAULT;
-       board_nand_data.gpmc_irq = OMAP_GPMC_IRQ_BASE + cs;
        gpmc_nand_init(&board_nand_data);
 }
 #endif /* CONFIG_MTD_NAND_OMAP2 || CONFIG_MTD_NAND_OMAP2_MODULE */
index 6f93a20..2ea7c57 100644 (file)
 #include <linux/of_platform.h>
 #include <linux/irqdomain.h>
 
-#include <mach/hardware.h>
 #include <asm/hardware/gic.h>
 #include <asm/mach/arch.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include "common-board-devices.h"
 
index ace2048..f6c48dd 100644 (file)
 #include <linux/io.h>
 #include <linux/input/matrix_keypad.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
-#include "common.h"
 #include <plat/menelaus.h>
 #include <plat/dma.h>
 #include <plat/gpmc.h>
+#include "debug-devices.h"
 
 #include <video/omapdss.h>
 #include <video/omap-panel-generic-dpi.h>
 
+#include "common.h"
 #include "mux.h"
 #include "control.h"
 
index 2821448..fb8bd83 100644 (file)
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/gpmc.h>
 #include <plat/usb.h>
+
 #include <video/omapdss.h>
 #include <video/omap-panel-tfp410.h>
-#include <plat/onenand.h>
+#include <linux/platform_data/mtd-onenand-omap2.h>
 
 #include "mux.h"
 #include "hsmmc.h"
@@ -192,7 +192,7 @@ static void __init igep_flash_init(void) {}
 #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
 
 #include <linux/smsc911x.h>
-#include <plat/gpmc-smsc911x.h>
+#include "gpmc-smsc911x.h"
 
 static struct omap_smsc911x_platform_data smsc911x_cfg = {
        .cs             = IGEP2_SMSC911X_CS,
@@ -425,9 +425,6 @@ static int igep_twl_gpio_setup(struct device *dev,
 };
 
 static struct twl4030_gpio_platform_data igep_twl4030_gpio_pdata = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .use_leds       = true,
        .setup          = igep_twl_gpio_setup,
 };
index ef9e829..ee8c3cf 100644 (file)
 #include <linux/io.h>
 #include <linux/smsc911x.h>
 #include <linux/mmc/host.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/mcspi.h>
-#include <plat/board.h>
 #include "common.h"
 #include <plat/gpmc.h>
 #include <mach/board-zoom.h>
-
-#include <asm/delay.h>
 #include <plat/usb.h>
-#include <plat/gpmc-smsc911x.h>
+#include "gpmc-smsc911x.h"
 
 #include <video/omapdss.h>
 #include <video/omap-panel-generic-dpi.h>
@@ -275,9 +271,6 @@ static int ldp_twl_gpio_setup(struct device *dev, unsigned gpio, unsigned ngpio)
 }
 
 static struct twl4030_gpio_platform_data ldp_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .setup          = ldp_twl_gpio_setup,
 };
 
index 677357f..d95f727 100644 (file)
 #include <linux/i2c.h>
 #include <linux/spi/spi.h>
 #include <linux/usb/musb.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
+#include <linux/platform_data/mtd-onenand-omap2.h>
 #include <sound/tlv320aic3x.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach-types.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/menelaus.h>
-#include <mach/irqs.h>
-#include <plat/mcspi.h>
-#include <plat/onenand.h>
 #include <plat/mmc.h>
-#include <plat/serial.h>
 
 #include "mux.h"
 
@@ -553,8 +550,8 @@ static int n8x0_auto_sleep_regulators(void)
 
        ret = menelaus_set_regulator_sleep(1, val);
        if (ret < 0) {
-               printk(KERN_ERR "Could not set regulators to sleep on "
-                       "menelaus: %u\n", ret);
+               pr_err("Could not set regulators to sleep on menelaus: %u\n",
+                      ret);
                return ret;
        }
        return 0;
@@ -566,8 +563,7 @@ static int n8x0_auto_voltage_scale(void)
 
        ret = menelaus_set_vcore_hw(1400, 1050);
        if (ret < 0) {
-               printk(KERN_ERR "Could not set VCORE voltage on "
-                       "menelaus: %u\n", ret);
+               pr_err("Could not set VCORE voltage on menelaus: %u\n", ret);
                return ret;
        }
        return 0;
@@ -600,7 +596,7 @@ static struct menelaus_platform_data n8x0_menelaus_platform_data __initdata = {
 static struct i2c_board_info __initdata n8x0_i2c_board_info_1[] __initdata = {
        {
                I2C_BOARD_INFO("menelaus", 0x72),
-               .irq = INT_24XX_SYS_NIRQ,
+               .irq = 7 + OMAP_INTC_START,
                .platform_data = &n8x0_menelaus_platform_data,
        },
 };
index 6202fc7..68ff8d5 100644 (file)
 #include <linux/regulator/machine.h>
 #include <linux/i2c/twl.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/flash.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <video/omapdss.h>
 #include <video/omap-panel-tfp410.h>
 #include <plat/gpmc.h>
-#include <plat/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 #include <plat/usb.h>
 #include <plat/omap_device.h>
 
@@ -297,9 +295,6 @@ static int beagle_twl_gpio_setup(struct device *dev,
 }
 
 static struct twl4030_gpio_platform_data beagle_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .use_leds       = true,
        .pullups        = BIT(1),
        .pulldowns      = BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
index 0d362e9..3fe5f0f 100644 (file)
 #include <linux/mmc/host.h>
 #include <linux/export.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include <plat/usb.h>
-#include <plat/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 #include "common.h"
-#include <plat/mcspi.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 #include <video/omapdss.h>
 #include <video/omap-panel-tfp410.h>
 
 #define OMAP3EVM_GEN1_ETHR_GPIO_RST    64
 #define OMAP3EVM_GEN2_ETHR_GPIO_RST    7
 
+/*
+ * OMAP35x EVM revision
+ * Run time detection of EVM revision is done by reading Ethernet
+ * PHY ID -
+ *     GEN_1   = 0x01150000
+ *     GEN_2   = 0x92200000
+ */
+enum {
+       OMAP3EVM_BOARD_GEN_1 = 0,       /* EVM Rev between  A - D */
+       OMAP3EVM_BOARD_GEN_2,           /* EVM Rev >= Rev E */
+};
+
 static u8 omap3_evm_version;
 
 u8 get_omap3_evm_rev(void)
@@ -108,7 +118,7 @@ static void __init omap3_evm_get_revision(void)
 }
 
 #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
-#include <plat/gpmc-smsc911x.h>
+#include "gpmc-smsc911x.h"
 
 static struct omap_smsc911x_platform_data smsc911x_cfg = {
        .cs             = OMAP3EVM_SMSC911X_CS,
@@ -377,9 +387,6 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
 }
 
 static struct twl4030_gpio_platform_data omap3evm_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .use_leds       = true,
        .setup          = omap3evm_twl_gpio_setup,
 };
@@ -526,9 +533,6 @@ static int __init omap3_evm_i2c_init(void)
        return 0;
 }
 
-static struct omap_board_config_kernel omap3_evm_config[] __initdata = {
-};
-
 static struct usbhs_omap_board_data usbhs_bdata __initdata = {
 
        .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
@@ -688,9 +692,6 @@ static void __init omap3_evm_init(void)
        obm = (cpu_is_omap3630()) ? omap36x_board_mux : omap35x_board_mux;
        omap3_mux_init(obm, OMAP_PACKAGE_CBB);
 
-       omap_board_config = omap3_evm_config;
-       omap_board_config_size = ARRAY_SIZE(omap3_evm_config);
-
        omap_mux_init_gpio(63, OMAP_PIN_INPUT);
        omap_hsmmc_init(mmc);
 
index fca93d1..7bd8253 100644 (file)
 #include <linux/i2c/twl.h>
 #include <linux/mmc/host.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
+#include "gpmc-smsc911x.h"
+#include <plat/gpmc.h>
+#include <plat/sdrc.h>
+#include <plat/usb.h>
+
+#include "common.h"
 #include "mux.h"
 #include "hsmmc.h"
 #include "control.h"
 #include "common-board-devices.h"
 
-#include <plat/mux.h>
-#include <plat/board.h>
-#include "common.h"
-#include <plat/gpmc-smsc911x.h>
-#include <plat/gpmc.h>
-#include <plat/sdrc.h>
-#include <plat/usb.h>
-
 #define OMAP3LOGIC_SMSC911X_CS                 1
 
 #define OMAP3530_LV_SOM_MMC_GPIO_CD            110
@@ -78,9 +75,6 @@ static struct regulator_init_data omap3logic_vmmc1 = {
 };
 
 static struct twl4030_gpio_platform_data omap3logic_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .use_leds       = true,
        .pullups        = BIT(1),
        .pulldowns      = BIT(2)  | BIT(6)  | BIT(7)  | BIT(8)
index 57aebee..00a1f4a 100644 (file)
 #include <linux/mmc/host.h>
 #include <linux/mmc/card.h>
 #include <linux/regulator/fixed.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include "common.h"
-#include <mach/hardware.h>
-#include <plat/mcspi.h>
 #include <plat/usb.h>
 #include <video/omapdss.h>
-#include <plat/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 
 #include "mux.h"
 #include "sdram-micron-mt46h32m32lf-6.h"
@@ -321,9 +319,6 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,
 }
 
 static struct twl4030_gpio_platform_data omap3pandora_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .setup          = omap3pandora_twl_gpio_setup,
 };
 
index b318f56..c7f3d02 100644 (file)
 #include <linux/regulator/machine.h>
 #include <linux/i2c/twl.h>
 #include <linux/mmc/host.h>
+#include <linux/input/matrix_keypad.h>
+#include <linux/spi/spi.h>
+#include <linux/interrupt.h>
+#include <linux/smsc911x.h>
+#include <linux/i2c/at24.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/flash.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/gpmc.h>
-#include <plat/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 #include <plat/usb.h>
 #include <video/omapdss.h>
 #include <video/omap-panel-generic-dpi.h>
 #include <video/omap-panel-tfp410.h>
 
-#include <plat/mcspi.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 #include <linux/input/matrix_keypad.h>
 #include <linux/spi/spi.h>
 #include <linux/interrupt.h>
@@ -57,7 +60,7 @@
 #include "common-board-devices.h"
 
 #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
-#include <plat/gpmc-smsc911x.h>
+#include "gpmc-smsc911x.h"
 
 #define OMAP3STALKER_ETHR_START        0x2c000000
 #define OMAP3STALKER_ETHR_SIZE 1024
@@ -279,9 +282,6 @@ omap3stalker_twl_gpio_setup(struct device *dev,
 }
 
 static struct twl4030_gpio_platform_data omap3stalker_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .use_leds       = true,
        .setup          = omap3stalker_twl_gpio_setup,
 };
@@ -362,9 +362,6 @@ static int __init omap3_stalker_i2c_init(void)
 
 #define OMAP3_STALKER_TS_GPIO  175
 
-static struct omap_board_config_kernel omap3_stalker_config[] __initdata = {
-};
-
 static struct platform_device *omap3_stalker_devices[] __initdata = {
        &keys_gpio,
 };
@@ -399,8 +396,6 @@ static void __init omap3_stalker_init(void)
 {
        regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies));
        omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
-       omap_board_config = omap3_stalker_config;
-       omap_board_config_size = ARRAY_SIZE(omap3_stalker_config);
 
        omap_mux_init_gpio(23, OMAP_PIN_INPUT);
        omap_hsmmc_init(mmc);
index 485d14d..944ffc4 100644 (file)
@@ -29,7 +29,7 @@
 #include <linux/mtd/nand.h>
 #include <linux/mmc/host.h>
 
-#include <plat/mcspi.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 #include <linux/spi/spi.h>
 
 #include <linux/spi/ads7846.h>
 #include <linux/regulator/machine.h>
 #include <linux/i2c/twl.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/flash.h>
 #include <asm/system_info.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/gpmc.h>
-#include <plat/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 #include <plat/usb.h>
 
 #include "mux.h"
@@ -139,9 +137,6 @@ static int touchbook_twl_gpio_setup(struct device *dev,
 }
 
 static struct twl4030_gpio_platform_data touchbook_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .use_leds       = true,
        .pullups        = BIT(1),
        .pulldowns      = BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
index 70f6d1d..45fe2d3 100644 (file)
 #include <linux/wl12xx.h>
 #include <linux/platform_data/omap-abe-twl6040.h>
 
-#include <mach/hardware.h>
 #include <asm/hardware/gic.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <video/omapdss.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/usb.h>
 #include <plat/mmc.h>
 #include <video/omap-panel-tfp410.h>
 
+#include "soc.h"
 #include "hsmmc.h"
 #include "control.h"
 #include "mux.h"
@@ -263,7 +262,6 @@ static struct twl6040_codec_data twl6040_codec = {
 static struct twl6040_platform_data twl6040_data = {
        .codec          = &twl6040_codec,
        .audpwron_gpio  = 127,
-       .irq_base       = TWL6040_CODEC_IRQ_BASE,
 };
 
 /* Panda board uses the common PMIC configuration */
@@ -294,7 +292,7 @@ static int __init omap4_panda_i2c_init(void)
                        TWL_COMMON_REGULATOR_V1V8 |
                        TWL_COMMON_REGULATOR_V2V1);
        omap4_pmic_init("twl6030", &omap4_panda_twldata,
-                       &twl6040_data, OMAP44XX_IRQ_SYS_2N);
+                       &twl6040_data, 119 + OMAP44XX_IRQ_GIC_START);
        omap_register_i2c_bus(2, 400, NULL, 0);
        /*
         * Bus 3 is attached to the DVI port where devices like the pico DLP
index 779734d..2e7f240 100644 (file)
 #include <linux/mtd/partitions.h>
 #include <linux/mmc/host.h>
 
+#include <linux/platform_data/mtd-nand-omap2.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
+
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/flash.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <video/omapdss.h>
 #include <video/omap-panel-generic-dpi.h>
 #include <video/omap-panel-tfp410.h>
 #include <plat/gpmc.h>
-#include <mach/hardware.h>
-#include <plat/nand.h>
-#include <plat/mcspi.h>
-#include <plat/mux.h>
 #include <plat/usb.h>
 
 #include "mux.h"
@@ -116,7 +114,7 @@ static inline void __init overo_ads7846_init(void) { return; }
 #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
 
 #include <linux/smsc911x.h>
-#include <plat/gpmc-smsc911x.h>
+#include "gpmc-smsc911x.h"
 
 static struct omap_smsc911x_platform_data smsc911x_cfg = {
        .id             = 0,
@@ -399,9 +397,6 @@ static int overo_twl_gpio_setup(struct device *dev,
 }
 
 static struct twl4030_gpio_platform_data overo_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .use_leds       = true,
        .setup          = overo_twl_gpio_setup,
 };
@@ -522,8 +517,7 @@ static void __init overo_init(void)
                udelay(10);
                gpio_set_value(OVERO_GPIO_W2W_NRESET, 1);
        } else {
-               printk(KERN_ERR "could not obtain gpio for "
-                                       "OVERO_GPIO_W2W_NRESET\n");
+               pr_err("could not obtain gpio for OVERO_GPIO_W2W_NRESET\n");
        }
 
        ret = gpio_request_array(overo_bt_gpios, ARRAY_SIZE(overo_bt_gpios));
@@ -542,8 +536,7 @@ static void __init overo_init(void)
        if (ret == 0)
                gpio_export(OVERO_GPIO_USBH_CPEN, 0);
        else
-               printk(KERN_ERR "could not obtain gpio for "
-                                       "OVERO_GPIO_USBH_CPEN\n");
+               pr_err("could not obtain gpio for OVERO_GPIO_USBH_CPEN\n");
 }
 
 MACHINE_START(OVERO, "Gumstix Overo")
index 0ad1bb3..45997bf 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/regulator/fixed.h>
 #include <linux/regulator/machine.h>
 #include <linux/regulator/consumer.h>
+#include <linux/platform_data/mtd-onenand-omap2.h>
 
 #include <asm/mach/arch.h>
 #include <asm/mach-types.h>
@@ -26,7 +27,7 @@
 #include <plat/usb.h>
 #include <plat/gpmc.h>
 #include "common.h"
-#include <plat/onenand.h>
+#include <plat/serial.h>
 
 #include "mux.h"
 #include "hsmmc.h"
@@ -72,9 +73,6 @@ static struct platform_device *rm680_peripherals_devices[] __initdata = {
 
 /* TWL */
 static struct twl4030_gpio_platform_data rm680_gpio_data = {
-       .gpio_base              = OMAP_MAX_GPIO_LINES,
-       .irq_base               = TWL4030_GPIO_IRQ_BASE,
-       .irq_end                = TWL4030_GPIO_IRQ_END,
        .pullups                = BIT(0),
        .pulldowns              = BIT(1) | BIT(2) | BIT(8) | BIT(15),
 };
@@ -87,7 +85,7 @@ static struct twl4030_platform_data rm680_twl_data = {
 static void __init rm680_i2c_init(void)
 {
        omap3_pmic_get_config(&rm680_twl_data, TWL_COMMON_PDATA_USB, 0);
-       omap_pmic_init(1, 2900, "twl5031", INT_34XX_SYS_NIRQ, &rm680_twl_data);
+       omap_pmic_init(1, 2900, "twl5031", 7 + OMAP_INTC_START, &rm680_twl_data);
        omap_register_i2c_bus(2, 400, NULL, 0);
        omap_register_i2c_bus(3, 400, NULL, 0);
 }
index df2534d..3945c50 100644 (file)
 #include <linux/gpio_keys.h>
 #include <linux/mmc/host.h>
 #include <linux/power/isp1704_charger.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
+#include <linux/platform_data/mtd-onenand-omap2.h>
+
 #include <asm/system_info.h>
 
-#include <plat/mcspi.h>
-#include <plat/board.h>
 #include "common.h"
 #include <plat/dma.h>
 #include <plat/gpmc.h>
-#include <plat/onenand.h>
-#include <plat/gpmc-smc91x.h>
+#include "gpmc-smc91x.h"
 
-#include <mach/board-rx51.h>
+#include "board-rx51.h"
 
 #include <sound/tlv320aic3x.h>
 #include <sound/tpa6130a2-plat.h>
@@ -774,9 +774,6 @@ static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n)
 }
 
 static struct twl4030_gpio_platform_data rx51_gpio_data = {
-       .gpio_base              = OMAP_MAX_GPIO_LINES,
-       .irq_base               = TWL4030_GPIO_IRQ_BASE,
-       .irq_end                = TWL4030_GPIO_IRQ_END,
        .pulldowns              = BIT(0) | BIT(1) | BIT(2) | BIT(3)
                                | BIT(4) | BIT(5)
                                | BIT(8) | BIT(9) | BIT(10) | BIT(11)
@@ -1051,7 +1048,7 @@ static int __init rx51_i2c_init(void)
        rx51_twldata.vdac->constraints.apply_uV = true;
        rx51_twldata.vdac->constraints.name = "VDAC";
 
-       omap_pmic_init(1, 2200, "twl5030", INT_34XX_SYS_NIRQ, &rx51_twldata);
+       omap_pmic_init(1, 2200, "twl5030", 7 + OMAP_INTC_START, &rx51_twldata);
        omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2,
                              ARRAY_SIZE(rx51_peripherals_i2c_board_info_2));
 #if defined(CONFIG_SENSORS_LIS3_I2C) || defined(CONFIG_SENSORS_LIS3_I2C_MODULE)
index 2c1289b..c22e111 100644 (file)
@@ -17,9 +17,9 @@
 #include <asm/mach-types.h>
 #include <video/omapdss.h>
 #include <plat/vram.h>
-#include <plat/mcspi.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 
-#include <mach/board-rx51.h>
+#include "board-rx51.h"
 
 #include "mux.h"
 
index 345dd93..7bbb05d 100644 (file)
 #include <linux/io.h>
 #include <linux/gpio.h>
 #include <linux/leds.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/mcspi.h>
-#include <plat/board.h>
 #include "common.h"
 #include <plat/dma.h>
 #include <plat/gpmc.h>
index d4c8392..c4f8833 100644 (file)
 #include <linux/kernel.h>
 #include <linux/init.h>
 
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/irqs.h>
-#include <plat/board.h>
 #include "common.h"
 #include <plat/usb.h>
 
@@ -32,15 +29,10 @@ static struct omap_musb_board_data musb_board_data = {
        .power          = 500,
 };
 
-static struct omap_board_config_kernel ti81xx_evm_config[] __initdata = {
-};
-
 static void __init ti81xx_evm_init(void)
 {
        omap_serial_init();
        omap_sdrc_init(NULL, NULL);
-       omap_board_config = ti81xx_evm_config;
-       omap_board_config_size = ARRAY_SIZE(ti81xx_evm_config);
        usb_musb_init(&musb_board_data);
 }
 
index f64f441..afb2278 100644 (file)
 #include <linux/regulator/machine.h>
 
 #include <plat/gpmc.h>
-#include <plat/gpmc-smsc911x.h>
+#include "gpmc-smsc911x.h"
 
 #include <mach/board-zoom.h>
 
+#include "soc.h"
+#include "common.h"
+
 #define ZOOM_SMSC911X_CS       7
 #define ZOOM_SMSC911X_GPIO     158
 #define ZOOM_QUADUART_CS       3
@@ -81,8 +84,7 @@ static inline void __init zoom_init_quaduart(void)
        quart_cs = ZOOM_QUADUART_CS;
 
        if (gpmc_cs_request(quart_cs, SZ_1M, &cs_mem_base) < 0) {
-               printk(KERN_ERR "Failed to request GPMC mem"
-                               "for Quad UART(TL16CP754C)\n");
+               pr_err("Failed to request GPMC mem for Quad UART(TL16CP754C)\n");
                return;
        }
 
@@ -104,8 +106,8 @@ static inline int omap_zoom_debugboard_detect(void)
 
        if (gpio_request_one(debug_board_detect, GPIOF_IN,
                             "Zoom debug board detect") < 0) {
-               printk(KERN_ERR "Failed to request GPIO%d for Zoom debug"
-               "board detect\n", debug_board_detect);
+               pr_err("Failed to request GPIO%d for Zoom debug board detect\n",
+                      debug_board_detect);
                return 0;
        }
 
index 28187f1..b940ab2 100644 (file)
 #include <linux/gpio.h>
 #include <linux/i2c/twl.h>
 #include <linux/spi/spi.h>
-#include <plat/mcspi.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 #include <video/omapdss.h>
 #include <mach/board-zoom.h>
 
+#include "common.h"
+
 #define LCD_PANEL_RESET_GPIO_PROD      96
 #define LCD_PANEL_RESET_GPIO_PILOT     55
 #define LCD_PANEL_QVGA_GPIO            56
index b797cb2..6bcc107 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/regulator/fixed.h>
 #include <linux/wl12xx.h>
 #include <linux/mmc/host.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -251,9 +252,6 @@ static void zoom2_set_hs_extmute(int mute)
 }
 
 static struct twl4030_gpio_platform_data zoom_gpio_data = {
-       .gpio_base      = OMAP_MAX_GPIO_LINES,
-       .irq_base       = TWL4030_GPIO_IRQ_BASE,
-       .irq_end        = TWL4030_GPIO_IRQ_END,
        .setup          = zoom_twl_gpio_setup,
 };
 
@@ -281,7 +279,7 @@ static int __init omap_i2c_init(void)
                codec_data->hs_extmute = 1;
                codec_data->set_hs_extmute = zoom2_set_hs_extmute;
        }
-       omap_pmic_init(1, 2400, "twl5030", INT_34XX_SYS_NIRQ, &zoom_twldata);
+       omap_pmic_init(1, 2400, "twl5030", 7 + OMAP_INTC_START, &zoom_twldata);
        omap_register_i2c_bus(2, 400, NULL, 0);
        omap_register_i2c_bus(3, 400, NULL, 0);
        return 0;
index 4e7e561..4994438 100644 (file)
@@ -22,7 +22,6 @@
 #include <asm/mach/arch.h>
 
 #include "common.h"
-#include <plat/board.h>
 #include <plat/usb.h>
 
 #include <mach/board-zoom.h>
index 3d9d746..cabcfdb 100644 (file)
 #include <linux/cpufreq.h>
 #include <linux/slab.h>
 
-#include <plat/cpu.h>
 #include <plat/clock.h>
 #include <plat/sram.h>
 #include <plat/sdrc.h>
 
+#include "soc.h"
 #include "clock.h"
 #include "clock2xxx.h"
 #include "opp2xxx.h"
index d6e34dd..298887b 100644 (file)
@@ -92,15 +92,13 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
 
        pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n", clk->rate,
                 validrate);
-       pr_debug("clock: SDRC CS0 timing params used:"
-                " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
+       pr_debug("clock: SDRC CS0 timing params used: RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
                 sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
                 sdrc_cs0->actim_ctrlb, sdrc_cs0->mr);
        if (sdrc_cs1)
-               pr_debug("clock: SDRC CS1 timing params used: "
-                " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
-                sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
-                sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
+               pr_debug("clock: SDRC CS1 timing params used: RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
+                        sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
+                        sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
 
        if (sdrc_cs1)
                omap3_configure_core_dpll(
index 04d551b..19a9809 100644 (file)
@@ -71,8 +71,8 @@ static const struct clksel *_get_clksel_by_parent(struct clk *clk,
 
        if (!clks->parent) {
                /* This indicates a data problem */
-               WARN(1, "clock: Could not find parent clock %s in clksel array "
-                    "of clock %s\n", src_clk->name, clk->name);
+               WARN(1, "clock: %s: could not find parent clock %s in clksel array\n",
+                    clk->name, src_clk->name);
                return NULL;
        }
 
@@ -126,8 +126,8 @@ static u8 _get_div_and_fieldval(struct clk *src_clk, struct clk *clk,
 
        if (max_div == 0) {
                /* This indicates an error in the clksel data */
-               WARN(1, "clock: Could not find divisor for clock %s parent %s"
-                    "\n", clk->name, src_clk->parent->name);
+               WARN(1, "clock: %s: could not find divisor for parent %s\n",
+                    clk->name, src_clk->parent->name);
                return 0;
        }
 
@@ -191,8 +191,8 @@ static u32 _clksel_to_divisor(struct clk *clk, u32 field_val)
 
        if (!clkr->div) {
                /* This indicates a data error */
-               WARN(1, "clock: Could not find fieldval %d for clock %s parent "
-                    "%s\n", field_val, clk->name, clk->parent->name);
+               WARN(1, "clock: %s: could not find fieldval %d parent %s\n",
+                    clk->name, field_val, clk->parent->name);
                return 0;
        }
 
@@ -230,8 +230,8 @@ static u32 _divisor_to_clksel(struct clk *clk, u32 div)
        }
 
        if (!clkr->div) {
-               pr_err("clock: Could not find divisor %d for clock %s parent "
-                      "%s\n", div, clk->name, clk->parent->name);
+               pr_err("clock: %s: could not find divisor %d parent %s\n",
+                      clk->name, div, clk->parent->name);
                return ~0;
        }
 
@@ -300,8 +300,8 @@ u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
 
                /* Sanity check */
                if (clkr->div <= last_div)
-                       pr_err("clock: clksel_rate table not sorted "
-                              "for clock %s", clk->name);
+                       pr_err("clock: %s: clksel_rate table not sorted",
+                              clk->name);
 
                last_div = clkr->div;
 
@@ -312,9 +312,8 @@ u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
        }
 
        if (!clkr->div) {
-               pr_err("clock: Could not find divisor for target "
-                      "rate %ld for clock %s parent %s\n", target_rate,
-                      clk->name, clk->parent->name);
+               pr_err("clock: %s: could not find divisor for target rate %ld parent %s\n",
+                      clk->name, target_rate, clk->parent->name);
                return ~0;
        }
 
@@ -359,8 +358,7 @@ void omap2_init_clksel_parent(struct clk *clk)
 
                        if (clkr->val == r) {
                                if (clk->parent != clks->parent) {
-                                       pr_debug("clock: inited %s parent "
-                                                "to %s (was %s)\n",
+                                       pr_debug("clock: %s: inited parent to %s (was %s)\n",
                                                 clk->name, clks->parent->name,
                                                 ((clk->parent) ?
                                                  clk->parent->name : "NULL"));
index cd7fd0f..83b658b 100644 (file)
@@ -22,8 +22,8 @@
 #include <asm/div64.h>
 
 #include <plat/clock.h>
-#include <plat/cpu.h>
 
+#include "soc.h"
 #include "clock.h"
 #include "cm-regbits-24xx.h"
 #include "cm-regbits-34xx.h"
@@ -105,13 +105,13 @@ static int _dpll_test_fint(struct clk *clk, u8 n)
        }
 
        if (fint < fint_min) {
-               pr_debug("rejecting n=%d due to Fint failure, "
-                        "lowering max_divider\n", n);
+               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) {
-               pr_debug("rejecting n=%d due to Fint failure, "
-                        "boosting min_divider\n", n);
+               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 &&
@@ -211,7 +211,7 @@ void omap2_init_dpll_parent(struct clk *clk)
                if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
                    v == OMAP3XXX_EN_DPLL_FRBYPASS)
                        clk_reparent(clk, dd->clk_bypass);
-       } else if (cpu_is_omap44xx()) {
+       } else if (soc_is_am33xx() || cpu_is_omap44xx()) {
                if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
                    v == OMAP4XXX_EN_DPLL_FRBYPASS ||
                    v == OMAP4XXX_EN_DPLL_MNBYPASS)
@@ -257,7 +257,7 @@ u32 omap2_get_dpll_rate(struct clk *clk)
                if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
                    v == OMAP3XXX_EN_DPLL_FRBYPASS)
                        return dd->clk_bypass->rate;
-       } else if (cpu_is_omap44xx()) {
+       } else if (soc_is_am33xx() || cpu_is_omap44xx()) {
                if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
                    v == OMAP4XXX_EN_DPLL_FRBYPASS ||
                    v == OMAP4XXX_EN_DPLL_MNBYPASS)
index ea3f565..e97f98f 100644 (file)
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/bitops.h>
-#include <trace/events/power.h>
 
 #include <asm/cpu.h>
+
 #include <plat/clock.h>
-#include "clockdomain.h"
-#include <plat/cpu.h>
 #include <plat/prcm.h>
 
+#include <trace/events/power.h>
+
+#include "soc.h"
+#include "clockdomain.h"
 #include "clock.h"
 #include "cm2xxx_3xxx.h"
 #include "cm-regbits-24xx.h"
@@ -102,8 +104,8 @@ void omap2_init_clk_clkdm(struct clk *clk)
                         clk->name, clk->clkdm_name);
                clk->clkdm = clkdm;
        } else {
-               pr_debug("clock: could not associate clk %s to "
-                        "clkdm %s\n", clk->name, clk->clkdm_name);
+               pr_debug("clock: could not associate clk %s to clkdm %s\n",
+                        clk->name, clk->clkdm_name);
        }
 }
 
@@ -226,8 +228,7 @@ void omap2_dflt_clk_disable(struct clk *clk)
                 * 'Independent' here refers to a clock which is not
                 * controlled by its parent.
                 */
-               printk(KERN_ERR "clock: clk_disable called on independent "
-                      "clock %s which has no enable_reg\n", clk->name);
+               pr_err("clock: clk_disable called on independent clock %s which has no enable_reg\n", clk->name);
                return;
        }
 
@@ -270,8 +271,7 @@ const struct clkops clkops_omap2_dflt = {
 void omap2_clk_disable(struct clk *clk)
 {
        if (clk->usecount == 0) {
-               WARN(1, "clock: %s: omap2_clk_disable() called, but usecount "
-                    "already 0?", clk->name);
+               WARN(1, "clock: %s: omap2_clk_disable() called, but usecount already 0?", clk->name);
                return;
        }
 
@@ -332,8 +332,8 @@ int omap2_clk_enable(struct clk *clk)
        if (clkdm_control && clk->clkdm) {
                ret = clkdm_clk_enable(clk->clkdm, clk);
                if (ret) {
-                       WARN(1, "clock: %s: could not enable clockdomain %s: "
-                            "%d\n", clk->name, clk->clkdm->name, ret);
+                       WARN(1, "clock: %s: could not enable clockdomain %s: %d\n",
+                            clk->name, clk->clkdm->name, ret);
                        goto oce_err2;
                }
        }
@@ -501,10 +501,8 @@ void __init omap2_clk_print_new_rates(const char *hfclkin_ck_name,
 
        hfclkin_rate = clk_get_rate(hfclkin_ck);
 
-       pr_info("Switched to new clocking rate (Crystal/Core/MPU): "
-               "%ld.%01ld/%ld/%ld MHz\n",
-               (hfclkin_rate / 1000000),
-               ((hfclkin_rate / 100000) % 10),
+       pr_info("Switched to new clocking rate (Crystal/Core/MPU): %ld.%01ld/%ld/%ld MHz\n",
+               (hfclkin_rate / 1000000), ((hfclkin_rate / 100000) % 10),
                (clk_get_rate(core_ck) / 1000000),
                (clk_get_rate(mpu_ck) / 1000000));
 }
index 0027451..12c178d 100644 (file)
@@ -18,9 +18,9 @@
 #include <linux/clk.h>
 #include <linux/list.h>
 
-#include <plat/hardware.h>
 #include <plat/clkdev_omap.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "clock.h"
 #include "clock2xxx.h"
index dfda9a3..a8e3261 100644 (file)
@@ -21,9 +21,9 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 
-#include <plat/hardware.h>
 #include <plat/clock.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "clock.h"
 #include "clock2xxx.h"
index cacabb0..7ea9139 100644 (file)
@@ -17,9 +17,9 @@
 #include <linux/clk.h>
 #include <linux/list.h>
 
-#include <plat/hardware.h>
 #include <plat/clkdev_omap.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "clock.h"
 #include "clock2xxx.h"
@@ -1856,6 +1856,7 @@ static struct omap_clk omap2430_clks[] = {
        CLK(NULL,       "func_32k_ck",  &func_32k_ck,   CK_243X),
        CLK(NULL,       "secure_32k_ck", &secure_32k_ck, CK_243X),
        CLK(NULL,       "osc_ck",       &osc_ck,        CK_243X),
+       CLK("twl",      "fck",          &osc_ck,        CK_243X),
        CLK(NULL,       "sys_ck",       &sys_ck,        CK_243X),
        CLK(NULL,       "alt_ck",       &alt_ck,        CK_243X),
        CLK(NULL,       "mcbsp_clks",   &mcbsp_clks,    CK_243X),
index 1250009..e92be1f 100644 (file)
@@ -22,9 +22,9 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 
-#include <plat/cpu.h>
 #include <plat/clock.h>
 
+#include "soc.h"
 #include "clock.h"
 #include "clock2xxx.h"
 #include "cm.h"
index 25bbcc7..2026311 100644 (file)
@@ -18,8 +18,8 @@
 #include <linux/list.h>
 #include <linux/clk.h>
 #include <plat/clkdev_omap.h>
-#include <plat/am33xx.h>
 
+#include "am33xx.h"
 #include "iomap.h"
 #include "control.h"
 #include "clock.h"
@@ -1027,7 +1027,9 @@ static struct omap_clk am33xx_clks[] = {
        CLK(NULL,       "cefuse_fck",           &cefuse_fck,    CK_AM33XX),
        CLK(NULL,       "clkdiv32k_ick",        &clkdiv32k_ick, CK_AM33XX),
        CLK(NULL,       "dcan0_fck",            &dcan0_fck,     CK_AM33XX),
+       CLK("481cc000.d_can",   NULL,           &dcan0_fck,     CK_AM33XX),
        CLK(NULL,       "dcan1_fck",            &dcan1_fck,     CK_AM33XX),
+       CLK("481d0000.d_can",   NULL,           &dcan1_fck,     CK_AM33XX),
        CLK(NULL,       "debugss_ick",          &debugss_ick,   CK_AM33XX),
        CLK(NULL,       "pruss_ocp_gclk",       &pruss_ocp_gclk,        CK_AM33XX),
        CLK("davinci-mcasp.0",  NULL,           &mcasp0_fck,    CK_AM33XX),
@@ -1036,13 +1038,13 @@ static struct omap_clk am33xx_clks[] = {
        CLK(NULL,       "mmu_fck",              &mmu_fck,       CK_AM33XX),
        CLK(NULL,       "smartreflex0_fck",     &smartreflex0_fck,      CK_AM33XX),
        CLK(NULL,       "smartreflex1_fck",     &smartreflex1_fck,      CK_AM33XX),
-       CLK(NULL,       "gpt1_fck",             &timer1_fck,    CK_AM33XX),
-       CLK(NULL,       "gpt2_fck",             &timer2_fck,    CK_AM33XX),
-       CLK(NULL,       "gpt3_fck",             &timer3_fck,    CK_AM33XX),
-       CLK(NULL,       "gpt4_fck",             &timer4_fck,    CK_AM33XX),
-       CLK(NULL,       "gpt5_fck",             &timer5_fck,    CK_AM33XX),
-       CLK(NULL,       "gpt6_fck",             &timer6_fck,    CK_AM33XX),
-       CLK(NULL,       "gpt7_fck",             &timer7_fck,    CK_AM33XX),
+       CLK(NULL,       "timer1_fck",           &timer1_fck,    CK_AM33XX),
+       CLK(NULL,       "timer2_fck",           &timer2_fck,    CK_AM33XX),
+       CLK(NULL,       "timer3_fck",           &timer3_fck,    CK_AM33XX),
+       CLK(NULL,       "timer4_fck",           &timer4_fck,    CK_AM33XX),
+       CLK(NULL,       "timer5_fck",           &timer5_fck,    CK_AM33XX),
+       CLK(NULL,       "timer6_fck",           &timer6_fck,    CK_AM33XX),
+       CLK(NULL,       "timer7_fck",           &timer7_fck,    CK_AM33XX),
        CLK(NULL,       "usbotg_fck",           &usbotg_fck,    CK_AM33XX),
        CLK(NULL,       "ieee5000_fck",         &ieee5000_fck,  CK_AM33XX),
        CLK(NULL,       "wdt1_fck",             &wdt1_fck,      CK_AM33XX),
index 794d827..15cdc64 100644 (file)
@@ -21,9 +21,9 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 
-#include <plat/hardware.h>
 #include <plat/clock.h>
 
+#include "soc.h"
 #include "clock.h"
 #include "clock3xxx.h"
 #include "prm2xxx_3xxx.h"
@@ -49,8 +49,7 @@ int omap3_dpll4_set_rate(struct clk *clk, unsigned long rate)
         * on DPLL4.
         */
        if (omap_rev() == OMAP3430_REV_ES1_0) {
-               pr_err("clock: DPLL4 cannot change rate due to "
-                      "silicon 'Limitation 2.5' on 3430ES1.\n");
+               pr_err("clock: DPLL4 cannot change rate due to silicon 'Limitation 2.5' on 3430ES1.\n");
                return -EINVAL;
        }
 
index 83bed9a..700317a 100644 (file)
@@ -21,9 +21,9 @@
 #include <linux/list.h>
 #include <linux/io.h>
 
-#include <plat/hardware.h>
 #include <plat/clkdev_omap.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "clock.h"
 #include "clock3xxx.h"
@@ -3226,6 +3226,7 @@ static struct omap_clk omap3xxx_clks[] = {
        CLK(NULL,       "virt_26000000_ck",     &virt_26000000_ck,      CK_3XXX),
        CLK(NULL,       "virt_38_4m_ck", &virt_38_4m_ck, CK_3XXX),
        CLK(NULL,       "osc_sys_ck",   &osc_sys_ck,    CK_3XXX),
+       CLK("twl",      "fck",          &osc_sys_ck,    CK_3XXX),
        CLK(NULL,       "sys_ck",       &sys_ck,        CK_3XXX),
        CLK(NULL,       "sys_altclk",   &sys_altclk,    CK_3XXX),
        CLK(NULL,       "mcbsp_clks",   &mcbsp_clks,    CK_3XXX),
index d7f55e4..500682c 100644 (file)
@@ -28,9 +28,9 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 
-#include <plat/hardware.h>
 #include <plat/clkdev_omap.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "clock.h"
 #include "clock44xx.h"
index 8664f5a..a155562 100644 (file)
@@ -174,9 +174,8 @@ void _clkdm_add_autodeps(struct clockdomain *clkdm)
                if (IS_ERR(autodep->clkdm.ptr))
                        continue;
 
-               pr_debug("clockdomain: adding %s sleepdep/wkdep for "
-                        "clkdm %s\n", autodep->clkdm.ptr->name,
-                        clkdm->name);
+               pr_debug("clockdomain: %s: adding %s sleepdep/wkdep\n",
+                        clkdm->name, autodep->clkdm.ptr->name);
 
                clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr);
                clkdm_add_wkdep(clkdm, autodep->clkdm.ptr);
@@ -205,9 +204,8 @@ void _clkdm_del_autodeps(struct clockdomain *clkdm)
                if (IS_ERR(autodep->clkdm.ptr))
                        continue;
 
-               pr_debug("clockdomain: removing %s sleepdep/wkdep for "
-                        "clkdm %s\n", autodep->clkdm.ptr->name,
-                        clkdm->name);
+               pr_debug("clockdomain: %s: removing %s sleepdep/wkdep\n",
+                        clkdm->name, autodep->clkdm.ptr->name);
 
                clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr);
                clkdm_del_wkdep(clkdm, autodep->clkdm.ptr);
@@ -469,14 +467,14 @@ int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
                ret = -EINVAL;
 
        if (ret) {
-               pr_debug("clockdomain: hardware cannot set/clear wake up of "
-                        "%s when %s wakes up\n", clkdm1->name, clkdm2->name);
+               pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n",
+                        clkdm1->name, clkdm2->name);
                return ret;
        }
 
        if (atomic_inc_return(&cd->wkdep_usecount) == 1) {
-               pr_debug("clockdomain: hardware will wake up %s when %s wakes "
-                        "up\n", clkdm1->name, clkdm2->name);
+               pr_debug("clockdomain: hardware will wake up %s when %s wakes up\n",
+                        clkdm1->name, clkdm2->name);
 
                ret = arch_clkdm->clkdm_add_wkdep(clkdm1, clkdm2);
        }
@@ -510,14 +508,14 @@ int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
                ret = -EINVAL;
 
        if (ret) {
-               pr_debug("clockdomain: hardware cannot set/clear wake up of "
-                        "%s when %s wakes up\n", clkdm1->name, clkdm2->name);
+               pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n",
+                        clkdm1->name, clkdm2->name);
                return ret;
        }
 
        if (atomic_dec_return(&cd->wkdep_usecount) == 0) {
-               pr_debug("clockdomain: hardware will no longer wake up %s "
-                        "after %s wakes up\n", clkdm1->name, clkdm2->name);
+               pr_debug("clockdomain: hardware will no longer wake up %s after %s wakes up\n",
+                        clkdm1->name, clkdm2->name);
 
                ret = arch_clkdm->clkdm_del_wkdep(clkdm1, clkdm2);
        }
@@ -555,8 +553,8 @@ int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
                ret = -EINVAL;
 
        if (ret) {
-               pr_debug("clockdomain: hardware cannot set/clear wake up of "
-                        "%s when %s wakes up\n", clkdm1->name, clkdm2->name);
+               pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n",
+                        clkdm1->name, clkdm2->name);
                return ret;
        }
 
@@ -613,15 +611,14 @@ int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
                ret = -EINVAL;
 
        if (ret) {
-               pr_debug("clockdomain: hardware cannot set/clear sleep "
-                        "dependency affecting %s from %s\n", clkdm1->name,
-                        clkdm2->name);
+               pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n",
+                        clkdm1->name, clkdm2->name);
                return ret;
        }
 
        if (atomic_inc_return(&cd->sleepdep_usecount) == 1) {
-               pr_debug("clockdomain: will prevent %s from sleeping if %s "
-                        "is active\n", clkdm1->name, clkdm2->name);
+               pr_debug("clockdomain: will prevent %s from sleeping if %s is active\n",
+                        clkdm1->name, clkdm2->name);
 
                ret = arch_clkdm->clkdm_add_sleepdep(clkdm1, clkdm2);
        }
@@ -657,16 +654,14 @@ int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
                ret = -EINVAL;
 
        if (ret) {
-               pr_debug("clockdomain: hardware cannot set/clear sleep "
-                        "dependency affecting %s from %s\n", clkdm1->name,
-                        clkdm2->name);
+               pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n",
+                        clkdm1->name, clkdm2->name);
                return ret;
        }
 
        if (atomic_dec_return(&cd->sleepdep_usecount) == 0) {
-               pr_debug("clockdomain: will no longer prevent %s from "
-                        "sleeping if %s is active\n", clkdm1->name,
-                        clkdm2->name);
+               pr_debug("clockdomain: will no longer prevent %s from sleeping if %s is active\n",
+                        clkdm1->name, clkdm2->name);
 
                ret = arch_clkdm->clkdm_del_sleepdep(clkdm1, clkdm2);
        }
@@ -706,9 +701,8 @@ int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
                ret = -EINVAL;
 
        if (ret) {
-               pr_debug("clockdomain: hardware cannot set/clear sleep "
-                        "dependency affecting %s from %s\n", clkdm1->name,
-                        clkdm2->name);
+               pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n",
+                        clkdm1->name, clkdm2->name);
                return ret;
        }
 
@@ -755,8 +749,8 @@ int clkdm_sleep(struct clockdomain *clkdm)
                return -EINVAL;
 
        if (!(clkdm->flags & CLKDM_CAN_FORCE_SLEEP)) {
-               pr_debug("clockdomain: %s does not support forcing "
-                        "sleep via software\n", clkdm->name);
+               pr_debug("clockdomain: %s does not support forcing sleep via software\n",
+                        clkdm->name);
                return -EINVAL;
        }
 
@@ -790,8 +784,8 @@ int clkdm_wakeup(struct clockdomain *clkdm)
                return -EINVAL;
 
        if (!(clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)) {
-               pr_debug("clockdomain: %s does not support forcing "
-                        "wakeup via software\n", clkdm->name);
+               pr_debug("clockdomain: %s does not support forcing wakeup via software\n",
+                        clkdm->name);
                return -EINVAL;
        }
 
@@ -826,8 +820,8 @@ void clkdm_allow_idle(struct clockdomain *clkdm)
                return;
 
        if (!(clkdm->flags & CLKDM_CAN_ENABLE_AUTO)) {
-               pr_debug("clock: automatic idle transitions cannot be enabled "
-                        "on clockdomain %s\n", clkdm->name);
+               pr_debug("clock: %s: automatic idle transitions cannot be enabled\n",
+                        clkdm->name);
                return;
        }
 
@@ -861,8 +855,8 @@ void clkdm_deny_idle(struct clockdomain *clkdm)
                return;
 
        if (!(clkdm->flags & CLKDM_CAN_DISABLE_AUTO)) {
-               pr_debug("clockdomain: automatic idle transitions cannot be "
-                        "disabled on %s\n", clkdm->name);
+               pr_debug("clockdomain: %s: automatic idle transitions cannot be disabled\n",
+                        clkdm->name);
                return;
        }
 
@@ -927,7 +921,7 @@ static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm)
        pwrdm_state_switch(clkdm->pwrdm.ptr);
        spin_unlock_irqrestore(&clkdm->lock, flags);
 
-       pr_debug("clockdomain: clkdm %s: enabled\n", clkdm->name);
+       pr_debug("clockdomain: %s: enabled\n", clkdm->name);
 
        return 0;
 }
@@ -952,7 +946,7 @@ static int _clkdm_clk_hwmod_disable(struct clockdomain *clkdm)
        pwrdm_state_switch(clkdm->pwrdm.ptr);
        spin_unlock_irqrestore(&clkdm->lock, flags);
 
-       pr_debug("clockdomain: clkdm %s: disabled\n", clkdm->name);
+       pr_debug("clockdomain: %s: disabled\n", clkdm->name);
 
        return 0;
 }
index a0d68db..f99e65c 100644 (file)
@@ -241,6 +241,52 @@ static void omap3_clkdm_deny_idle(struct clockdomain *clkdm)
                _clkdm_del_autodeps(clkdm);
 }
 
+static int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm)
+{
+       bool hwsup = false;
+
+       if (!clkdm->clktrctrl_mask)
+               return 0;
+
+       hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs,
+                               clkdm->clktrctrl_mask);
+
+       if (hwsup) {
+               /* Disable HW transitions when we are changing deps */
+               _disable_hwsup(clkdm);
+               _clkdm_add_autodeps(clkdm);
+               _enable_hwsup(clkdm);
+       } else {
+               if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)
+                       omap3_clkdm_wakeup(clkdm);
+       }
+
+       return 0;
+}
+
+static int omap3xxx_clkdm_clk_disable(struct clockdomain *clkdm)
+{
+       bool hwsup = false;
+
+       if (!clkdm->clktrctrl_mask)
+               return 0;
+
+       hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs,
+                               clkdm->clktrctrl_mask);
+
+       if (hwsup) {
+               /* Disable HW transitions when we are changing deps */
+               _disable_hwsup(clkdm);
+               _clkdm_del_autodeps(clkdm);
+               _enable_hwsup(clkdm);
+       } else {
+               if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP)
+                       omap3_clkdm_sleep(clkdm);
+       }
+
+       return 0;
+}
+
 struct clkdm_ops omap2_clkdm_operations = {
        .clkdm_add_wkdep        = omap2_clkdm_add_wkdep,
        .clkdm_del_wkdep        = omap2_clkdm_del_wkdep,
@@ -267,6 +313,6 @@ struct clkdm_ops omap3_clkdm_operations = {
        .clkdm_wakeup           = omap3_clkdm_wakeup,
        .clkdm_allow_idle       = omap3_clkdm_allow_idle,
        .clkdm_deny_idle        = omap3_clkdm_deny_idle,
-       .clkdm_clk_enable       = omap2_clkdm_clk_enable,
-       .clkdm_clk_disable      = omap2_clkdm_clk_disable,
+       .clkdm_clk_enable       = omap3xxx_clkdm_clk_enable,
+       .clkdm_clk_disable      = omap3xxx_clkdm_clk_disable,
 };
index 766338f..975f6bd 100644 (file)
@@ -67,6 +67,7 @@
 #define OMAP3430_EN_IVA2_DPLL_MASK                     (0x7 << 0)
 
 /* CM_IDLEST_IVA2 */
+#define OMAP3430_ST_IVA2_SHIFT                         0
 #define OMAP3430_ST_IVA2_MASK                          (1 << 0)
 
 /* CM_IDLEST_PLL_IVA2 */
index 389f9f8..a911e76 100644 (file)
@@ -18,8 +18,7 @@
 #include <linux/err.h>
 #include <linux/io.h>
 
-#include <plat/hardware.h>
-
+#include "soc.h"
 #include "iomap.h"
 #include "common.h"
 #include "cm.h"
index c187586..48daac2 100644 (file)
 #include <linux/spi/spi.h>
 #include <linux/spi/ads7846.h>
 
-#include <plat/mcspi.h>
-#include <plat/nand.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 
+#include "common.h"
 #include "common-board-devices.h"
 
 #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
@@ -119,8 +120,7 @@ void __init omap_nand_flash_init(int options, struct mtd_partition *parts,
        }
 
        if (nandcs > GPMC_CS_NUM) {
-               printk(KERN_INFO "NAND: Unable to find configuration "
-                                "in GPMC\n ");
+               pr_info("NAND: Unable to find configuration in GPMC\n");
                return;
        }
 
index 069f972..17950c6 100644 (file)
 #include <linux/clk.h>
 #include <linux/io.h>
 
-#include <plat/hardware.h>
-#include <plat/board.h>
-#include <plat/mux.h>
 #include <plat/clock.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "common.h"
 #include "sdrc.h"
index 1f65b18..da0f5c1 100644 (file)
 #define __ARCH_ARM_MACH_OMAP2PLUS_COMMON_H
 #ifndef __ASSEMBLER__
 
+#include <linux/irq.h>
 #include <linux/delay.h>
 #include <linux/i2c/twl.h>
-#include <plat/common.h>
+
 #include <asm/proc-fns.h>
 
+#include <plat/cpu.h>
+#include <plat/serial.h>
+#include <plat/common.h>
+
+#define OMAP_INTC_START                NR_IRQS
+
 #ifdef CONFIG_SOC_OMAP2420
 extern void omap242x_map_common_io(void);
 #else
index 3223b81..d1ff839 100644 (file)
@@ -15,9 +15,9 @@
 #include <linux/kernel.h>
 #include <linux/io.h>
 
-#include <plat/hardware.h>
 #include <plat/sdrc.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "common.h"
 #include "cm-regbits-34xx.h"
index b8cdc85..123186a 100644 (file)
 #ifndef __ARCH_ARM_MACH_OMAP2_CONTROL_H
 #define __ARCH_ARM_MACH_OMAP2_CONTROL_H
 
-#include <mach/ctrl_module_core_44xx.h>
-#include <mach/ctrl_module_wkup_44xx.h>
-#include <mach/ctrl_module_pad_core_44xx.h>
-#include <mach/ctrl_module_pad_wkup_44xx.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 <plat/am33xx.h>
+#include "am33xx.h"
 
 #ifndef __ASSEMBLY__
 #define OMAP242X_CTRL_REGADDR(reg)                                     \
index f2a49a4..bc27569 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/cpu_pm.h>
 
 #include <plat/prcm.h>
-#include <plat/irqs.h>
 #include "powerdomain.h"
 #include "clockdomain.h"
 
diff --git a/arch/arm/mach-omap2/debug-devices.h b/arch/arm/mach-omap2/debug-devices.h
new file mode 100644 (file)
index 0000000..a4edbd2
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef _OMAP_DEBUG_DEVICES_H
+#define _OMAP_DEBUG_DEVICES_H
+
+#include <linux/types.h>
+
+/* for TI reference platforms sharing the same debug card */
+extern int debug_card_init(u32 addr, unsigned gpio);
+
+#endif
index c00c689..d092d2a 100644 (file)
 #include <linux/err.h>
 #include <linux/slab.h>
 #include <linux/of.h>
+#include <linux/pinctrl/machine.h>
 #include <linux/platform_data/omap4-keypad.h>
 
-#include <mach/hardware.h>
-#include <mach/irqs.h>
 #include <asm/mach-types.h>
 #include <asm/mach/map.h>
-#include <asm/pmu.h>
 
 #include "iomap.h"
-#include <plat/board.h>
 #include <plat/dma.h>
 #include <plat/omap_hwmod.h>
 #include <plat/omap_device.h>
-#include <plat/omap4-keypad.h>
+#include "omap4-keypad.h"
 
+#include "soc.h"
+#include "common.h"
 #include "mux.h"
 #include "control.h"
 #include "devices.h"
@@ -112,7 +111,7 @@ static struct resource omap2cam_resources[] = {
                .flags          = IORESOURCE_MEM,
        },
        {
-               .start          = INT_24XX_CAM_IRQ,
+               .start          = 24 + OMAP_INTC_START,
                .flags          = IORESOURCE_IRQ,
        }
 };
@@ -201,7 +200,7 @@ static struct resource omap3isp_resources[] = {
                .flags          = IORESOURCE_MEM,
        },
        {
-               .start          = INT_34XX_CAM_IRQ,
+               .start          = 24 + OMAP_INTC_START,
                .flags          = IORESOURCE_IRQ,
        }
 };
@@ -385,7 +384,7 @@ static inline void omap_init_hdmi_audio(void) {}
 
 #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE)
 
-#include <plat/mcspi.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 
 static int __init omap_mcspi_init(struct omap_hwmod *oh, void *unused)
 {
@@ -435,20 +434,18 @@ static inline void omap_init_mcspi(void) {}
 #endif
 
 static struct resource omap2_pmu_resource = {
-       .start  = 3,
-       .end    = 3,
+       .start  = 3 + OMAP_INTC_START,
        .flags  = IORESOURCE_IRQ,
 };
 
 static struct resource omap3_pmu_resource = {
-       .start  = INT_34XX_BENCH_MPU_EMUL,
-       .end    = INT_34XX_BENCH_MPU_EMUL,
+       .start  = 3 + OMAP_INTC_START,
        .flags  = IORESOURCE_IRQ,
 };
 
 static struct platform_device omap_pmu_device = {
        .name           = "arm-pmu",
-       .id             = ARM_PMU_DEVICE_CPU,
+       .id             = -1,
        .num_resources  = 1,
 };
 
@@ -475,7 +472,7 @@ static struct resource omap2_sham_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        {
-               .start  = INT_24XX_SHA1MD5,
+               .start  = 51 + OMAP_INTC_START,
                .flags  = IORESOURCE_IRQ,
        }
 };
@@ -493,7 +490,7 @@ static struct resource omap3_sham_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        {
-               .start  = INT_34XX_SHA1MD52_IRQ,
+               .start  = 49 + OMAP_INTC_START,
                .flags  = IORESOURCE_IRQ,
        },
        {
@@ -631,6 +628,10 @@ static inline void omap_init_vout(void) {}
 
 static int __init omap2_init_devices(void)
 {
+       /* Enable dummy states for those platforms without pinctrl support */
+       if (!of_have_populated_dt())
+               pinctrl_provide_dummies();
+
        /*
         * please keep these calls, and their implementations above,
         * in alphabetical order so they're easier to sort through.
index b9c8d2f..27d79de 100644 (file)
@@ -28,9 +28,9 @@
 #include <linux/bitops.h>
 #include <linux/clkdev.h>
 
-#include <plat/cpu.h>
 #include <plat/clock.h>
 
+#include "soc.h"
 #include "clock.h"
 #include "cm2xxx_3xxx.h"
 #include "cm-regbits-34xx.h"
@@ -311,7 +311,7 @@ static int omap3_noncore_dpll_program(struct clk *clk, u16 m, u8 n, u16 freqsel)
         * Set jitter correction. No jitter correction for OMAP4 and 3630
         * since freqsel field is no longer present
         */
-       if (!cpu_is_omap44xx() && !cpu_is_omap3630()) {
+       if (!soc_is_am33xx() && !cpu_is_omap44xx() && !cpu_is_omap3630()) {
                v = __raw_readl(dd->control_reg);
                v &= ~dd->freqsel_mask;
                v |= freqsel << __ffs(dd->freqsel_mask);
@@ -471,7 +471,7 @@ int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate)
                        return -EINVAL;
 
                /* No freqsel on OMAP4 and OMAP3630 */
-               if (!cpu_is_omap44xx() && !cpu_is_omap3630()) {
+               if (!soc_is_am33xx() && !cpu_is_omap44xx() && !cpu_is_omap3630()) {
                        freqsel = _omap3_dpll_compute_freqsel(clk,
                                                dd->last_rounded_n);
                        if (!freqsel)
@@ -623,8 +623,11 @@ unsigned long omap3_clkoutx2_recalc(struct clk *clk)
        while (pclk && !pclk->dpll_data)
                pclk = pclk->parent;
 
-       /* clk does not have a DPLL as a parent? */
-       WARN_ON(!pclk);
+       /* clk does not have a DPLL as a parent?  error in the clock data */
+       if (!pclk) {
+               WARN_ON(1);
+               return 0;
+       }
 
        dd = pclk->dpll_data;
 
index 9c6a296..09d0ccc 100644 (file)
@@ -15,9 +15,9 @@
 #include <linux/io.h>
 #include <linux/bitops.h>
 
-#include <plat/cpu.h>
 #include <plat/clock.h>
 
+#include "soc.h"
 #include "clock.h"
 #include "clock44xx.h"
 #include "cm-regbits-44xx.h"
index a636ebc..9838810 100644 (file)
@@ -30,7 +30,7 @@
 #include <plat/omap-pm.h>
 #endif
 
-#include <plat/dsp.h>
+#include <linux/platform_data/dsp-omap.h>
 
 static struct platform_device *omap_dsp_pdev;
 
index e28e761..b3566f6 100644 (file)
@@ -21,8 +21,7 @@
 #include <linux/clk.h>
 #include <linux/err.h>
 
-#include <mach/hardware.h>
-
+#include "soc.h"
 #include "iomap.h"
 
 MODULE_LICENSE("GPL");
index 9ad7d48..e7b246d 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/slab.h>
 #include <linux/interrupt.h>
 #include <linux/of.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <plat/omap_hwmod.h>
 #include <plat/omap_device.h>
@@ -60,6 +61,7 @@ static int __init omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused)
        pdata->regs = kzalloc(sizeof(struct omap_gpio_reg_offs), GFP_KERNEL);
        if (!pdata->regs) {
                pr_err("gpio%d: Memory allocation failed\n", id);
+               kfree(pdata);
                return -ENOMEM;
        }
 
index 386dec8..4acf497 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/mtd/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 
 #include <asm/mach/flash.h>
 
-#include <plat/cpu.h>
-#include <plat/nand.h>
-#include <plat/board.h>
 #include <plat/gpmc.h>
 
-static struct resource gpmc_nand_resource = {
-       .flags          = IORESOURCE_MEM,
+#include "soc.h"
+
+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  = 1,
-       .resource       = &gpmc_nand_resource,
+       .num_resources  = ARRAY_SIZE(gpmc_nand_resource),
+       .resource       = gpmc_nand_resource,
 };
 
 static int omap2_nand_gpmc_retime(struct omap_nand_platform_data *gpmc_nand_data)
@@ -75,6 +83,7 @@ static int omap2_nand_gpmc_retime(struct omap_nand_platform_data *gpmc_nand_data
                gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_DEV_SIZE, 0);
        gpmc_cs_configure(gpmc_nand_data->cs,
                        GPMC_CONFIG_DEV_TYPE, GPMC_DEVICETYPE_NAND);
+       gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_WP, 0);
        err = gpmc_cs_set_timings(gpmc_nand_data->cs, &t);
        if (err)
                return err;
@@ -90,12 +99,19 @@ int __init gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data)
        gpmc_nand_device.dev.platform_data = gpmc_nand_data;
 
        err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE,
-                               &gpmc_nand_data->phys_base);
+                               (unsigned long *)&gpmc_nand_resource[0].start);
        if (err < 0) {
                dev_err(dev, "Cannot request GPMC CS\n");
                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);
         /* Set timings in GPMC */
        err = omap2_nand_gpmc_retime(gpmc_nand_data);
        if (err < 0) {
@@ -108,6 +124,8 @@ int __init gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data)
                gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_RDY_BSY, 1);
        }
 
+       gpmc_update_nand_reg(&gpmc_nand_data->reg, gpmc_nand_data->cs);
+
        err = platform_device_register(&gpmc_nand_device);
        if (err < 0) {
                dev_err(dev, "Unable to register NAND device\n");
index a0fa9bb..916716e 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/mtd/onenand_regs.h>
 #include <linux/io.h>
+#include <linux/platform_data/mtd-onenand-omap2.h>
 
 #include <asm/mach/flash.h>
 
-#include <plat/cpu.h>
-#include <plat/onenand.h>
-#include <plat/board.h>
 #include <plat/gpmc.h>
 
+#include "soc.h"
+
+#define        ONENAND_IO_SIZE SZ_128K
+
 static struct omap_onenand_platform_data *gpmc_onenand_data;
 
+static struct resource gpmc_onenand_resource = {
+       .flags          = IORESOURCE_MEM,
+};
+
 static struct platform_device gpmc_onenand_device = {
        .name           = "omap2-onenand",
        .id             = -1,
+       .num_resources  = 1,
+       .resource       = &gpmc_onenand_resource,
 };
 
 static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base)
@@ -390,6 +398,8 @@ static int gpmc_onenand_setup(void __iomem *onenand_base, int *freq_ptr)
 
 void __init gpmc_onenand_init(struct omap_onenand_platform_data *_onenand_data)
 {
+       int err;
+
        gpmc_onenand_data = _onenand_data;
        gpmc_onenand_data->onenand_setup = gpmc_onenand_setup;
        gpmc_onenand_device.dev.platform_data = gpmc_onenand_data;
@@ -401,8 +411,19 @@ void __init gpmc_onenand_init(struct omap_onenand_platform_data *_onenand_data)
                gpmc_onenand_data->flags |= ONENAND_SYNC_READ;
        }
 
+       err = gpmc_cs_request(gpmc_onenand_data->cs, ONENAND_IO_SIZE,
+                               (unsigned long *)&gpmc_onenand_resource.start);
+       if (err < 0) {
+               pr_err("%s: Cannot request GPMC CS\n", __func__);
+               return;
+       }
+
+       gpmc_onenand_resource.end = gpmc_onenand_resource.start +
+                                                       ONENAND_IO_SIZE - 1;
+
        if (platform_device_register(&gpmc_onenand_device) < 0) {
-               printk(KERN_ERR "Unable to register OneNAND device\n");
+               pr_err("%s: Unable to register OneNAND device\n", __func__);
+               gpmc_cs_free(gpmc_onenand_data->cs);
                return;
        }
 }
index ba10c24..5654753 100644 (file)
 #include <linux/io.h>
 #include <linux/smc91x.h>
 
-#include <plat/board.h>
 #include <plat/gpmc.h>
-#include <plat/gpmc-smc91x.h>
+#include "gpmc-smc91x.h"
+
+#include "soc.h"
 
 static struct omap_smc91x_platform_data *gpmc_cfg;
 
index b6c77be..249a0b4 100644 (file)
@@ -20,9 +20,8 @@
 #include <linux/io.h>
 #include <linux/smsc911x.h>
 
-#include <plat/board.h>
 #include <plat/gpmc.h>
-#include <plat/gpmc-smsc911x.h>
+#include "gpmc-smsc911x.h"
 
 static struct resource gpmc_smsc911x_resources[] = {
        [0] = {
index b2b5759..72428bd 100644 (file)
 #include <asm/mach-types.h>
 #include <plat/gpmc.h>
 
+#include <plat/cpu.h>
+#include <plat/gpmc.h>
 #include <plat/sdrc.h>
 
+#include "soc.h"
+#include "common.h"
+
 /* GPMC register offsets */
 #define GPMC_REVISION          0x00
 #define GPMC_SYSCONFIG         0x10
 #define ENABLE_PREFETCH                (0x1 << 7)
 #define DMA_MPU_MODE           2
 
+/* XXX: Only NAND irq has been considered,currently these are the only ones used
+ */
+#define        GPMC_NR_IRQ             2
+
+struct gpmc_client_irq {
+       unsigned                irq;
+       u32                     bitmask;
+};
+
 /* Structure to save gpmc cs context */
 struct gpmc_cs_config {
        u32 config1;
@@ -105,6 +119,10 @@ struct omap3_gpmc_regs {
        struct gpmc_cs_config cs_context[GPMC_CS_NUM];
 };
 
+static struct gpmc_client_irq gpmc_client_irq[GPMC_NR_IRQ];
+static struct irq_chip gpmc_irq_chip;
+static unsigned gpmc_irq_start;
+
 static struct resource gpmc_mem_root;
 static struct resource gpmc_cs_mem[GPMC_CS_NUM];
 static DEFINE_SPINLOCK(gpmc_mem_lock);
@@ -279,7 +297,7 @@ int gpmc_cs_set_timings(int cs, const struct gpmc_timings *t)
 
        div = gpmc_cs_calc_divider(cs, t->sync_clk);
        if (div < 0)
-               return -1;
+               return div;
 
        GPMC_SET_ONE(GPMC_CS_CONFIG2,  0,  3, cs_on);
        GPMC_SET_ONE(GPMC_CS_CONFIG2,  8, 12, cs_rd_off);
@@ -682,6 +700,117 @@ int gpmc_prefetch_reset(int cs)
 }
 EXPORT_SYMBOL(gpmc_prefetch_reset);
 
+void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs)
+{
+       reg->gpmc_status = gpmc_base + GPMC_STATUS;
+       reg->gpmc_nand_command = gpmc_base + GPMC_CS0_OFFSET +
+                               GPMC_CS_NAND_COMMAND + GPMC_CS_SIZE * cs;
+       reg->gpmc_nand_address = gpmc_base + GPMC_CS0_OFFSET +
+                               GPMC_CS_NAND_ADDRESS + GPMC_CS_SIZE * cs;
+       reg->gpmc_nand_data = gpmc_base + GPMC_CS0_OFFSET +
+                               GPMC_CS_NAND_DATA + GPMC_CS_SIZE * cs;
+       reg->gpmc_prefetch_config1 = gpmc_base + GPMC_PREFETCH_CONFIG1;
+       reg->gpmc_prefetch_config2 = gpmc_base + GPMC_PREFETCH_CONFIG2;
+       reg->gpmc_prefetch_control = gpmc_base + GPMC_PREFETCH_CONTROL;
+       reg->gpmc_prefetch_status = gpmc_base + GPMC_PREFETCH_STATUS;
+       reg->gpmc_ecc_config = gpmc_base + GPMC_ECC_CONFIG;
+       reg->gpmc_ecc_control = gpmc_base + GPMC_ECC_CONTROL;
+       reg->gpmc_ecc_size_config = gpmc_base + GPMC_ECC_SIZE_CONFIG;
+       reg->gpmc_ecc1_result = gpmc_base + GPMC_ECC1_RESULT;
+       reg->gpmc_bch_result0 = gpmc_base + GPMC_ECC_BCH_RESULT_0;
+}
+
+int gpmc_get_client_irq(unsigned irq_config)
+{
+       int i;
+
+       if (hweight32(irq_config) > 1)
+               return 0;
+
+       for (i = 0; i < GPMC_NR_IRQ; i++)
+               if (gpmc_client_irq[i].bitmask & irq_config)
+                       return gpmc_client_irq[i].irq;
+
+       return 0;
+}
+
+static int gpmc_irq_endis(unsigned irq, bool endis)
+{
+       int i;
+       u32 regval;
+
+       for (i = 0; i < GPMC_NR_IRQ; i++)
+               if (irq == gpmc_client_irq[i].irq) {
+                       regval = gpmc_read_reg(GPMC_IRQENABLE);
+                       if (endis)
+                               regval |= gpmc_client_irq[i].bitmask;
+                       else
+                               regval &= ~gpmc_client_irq[i].bitmask;
+                       gpmc_write_reg(GPMC_IRQENABLE, regval);
+                       break;
+               }
+
+       return 0;
+}
+
+static void gpmc_irq_disable(struct irq_data *p)
+{
+       gpmc_irq_endis(p->irq, false);
+}
+
+static void gpmc_irq_enable(struct irq_data *p)
+{
+       gpmc_irq_endis(p->irq, true);
+}
+
+static void gpmc_irq_noop(struct irq_data *data) { }
+
+static unsigned int gpmc_irq_noop_ret(struct irq_data *data) { return 0; }
+
+static int gpmc_setup_irq(int gpmc_irq)
+{
+       int i;
+       u32 regval;
+
+       if (!gpmc_irq)
+               return -EINVAL;
+
+       gpmc_irq_start = irq_alloc_descs(-1, 0, GPMC_NR_IRQ, 0);
+       if (IS_ERR_VALUE(gpmc_irq_start)) {
+               pr_err("irq_alloc_descs failed\n");
+               return gpmc_irq_start;
+       }
+
+       gpmc_irq_chip.name = "gpmc";
+       gpmc_irq_chip.irq_startup = gpmc_irq_noop_ret;
+       gpmc_irq_chip.irq_enable = gpmc_irq_enable;
+       gpmc_irq_chip.irq_disable = gpmc_irq_disable;
+       gpmc_irq_chip.irq_shutdown = gpmc_irq_noop;
+       gpmc_irq_chip.irq_ack = gpmc_irq_noop;
+       gpmc_irq_chip.irq_mask = gpmc_irq_noop;
+       gpmc_irq_chip.irq_unmask = gpmc_irq_noop;
+
+       gpmc_client_irq[0].bitmask = GPMC_IRQ_FIFOEVENTENABLE;
+       gpmc_client_irq[1].bitmask = GPMC_IRQ_COUNT_EVENT;
+
+       for (i = 0; i < GPMC_NR_IRQ; i++) {
+               gpmc_client_irq[i].irq = gpmc_irq_start + i;
+               irq_set_chip_and_handler(gpmc_client_irq[i].irq,
+                                       &gpmc_irq_chip, handle_simple_irq);
+               set_irq_flags(gpmc_client_irq[i].irq,
+                               IRQF_VALID | IRQF_NOAUTOEN);
+       }
+
+       /* Disable interrupts */
+       gpmc_write_reg(GPMC_IRQENABLE, 0);
+
+       /* clear interrupts */
+       regval = gpmc_read_reg(GPMC_IRQSTATUS);
+       gpmc_write_reg(GPMC_IRQSTATUS, regval);
+
+       return request_irq(gpmc_irq, gpmc_handle_irq, 0, "gpmc", NULL);
+}
+
 static void __init gpmc_mem_init(void)
 {
        int cs;
@@ -711,8 +840,8 @@ static void __init gpmc_mem_init(void)
 
 static int __init gpmc_init(void)
 {
-       u32 l, irq;
-       int cs, ret = -EINVAL;
+       u32 l;
+       int ret = -EINVAL;
        int gpmc_irq;
        char *ck = NULL;
 
@@ -722,16 +851,16 @@ static int __init gpmc_init(void)
                        l = OMAP2420_GPMC_BASE;
                else
                        l = OMAP34XX_GPMC_BASE;
-               gpmc_irq = INT_34XX_GPMC_IRQ;
+               gpmc_irq = 20 + OMAP_INTC_START;
        } else if (cpu_is_omap34xx()) {
                ck = "gpmc_fck";
                l = OMAP34XX_GPMC_BASE;
-               gpmc_irq = INT_34XX_GPMC_IRQ;
+               gpmc_irq = 20 + OMAP_INTC_START;
        } else if (cpu_is_omap44xx() || soc_is_omap54xx()) {
                /* Base address and irq number are same for OMAP4/5 */
                ck = "gpmc_ck";
                l = OMAP44XX_GPMC_BASE;
-               gpmc_irq = OMAP44XX_IRQ_GPMC;
+               gpmc_irq = 20 + OMAP44XX_IRQ_GIC_START;
        }
 
        if (WARN_ON(!ck))
@@ -761,16 +890,7 @@ static int __init gpmc_init(void)
        gpmc_write_reg(GPMC_SYSCONFIG, l);
        gpmc_mem_init();
 
-       /* initalize the irq_chained */
-       irq = OMAP_GPMC_IRQ_BASE;
-       for (cs = 0; cs < GPMC_CS_NUM; cs++) {
-               irq_set_chip_and_handler(irq, &dummy_irq_chip,
-                                               handle_simple_irq);
-               set_irq_flags(irq, IRQF_VALID);
-               irq++;
-       }
-
-       ret = request_irq(gpmc_irq, gpmc_handle_irq, IRQF_SHARED, "gpmc", NULL);
+       ret = gpmc_setup_irq(gpmc_irq);
        if (ret)
                pr_err("gpmc: irq-%d could not claim: err %d\n",
                                                gpmc_irq, ret);
@@ -780,12 +900,19 @@ postcore_initcall(gpmc_init);
 
 static irqreturn_t gpmc_handle_irq(int irq, void *dev)
 {
-       u8 cs;
+       int i;
+       u32 regval;
+
+       regval = gpmc_read_reg(GPMC_IRQSTATUS);
+
+       if (!regval)
+               return IRQ_NONE;
+
+       for (i = 0; i < GPMC_NR_IRQ; i++)
+               if (regval & gpmc_client_irq[i].bitmask)
+                       generic_handle_irq(gpmc_client_irq[i].irq);
 
-       /* check cs to invoke the irq */
-       cs = ((gpmc_read_reg(GPMC_PREFETCH_CONFIG1)) >> CS_NUM_SHIFT) & 0x7;
-       if (OMAP_GPMC_IRQ_BASE+cs <= OMAP_GPMC_IRQ_END)
-               generic_handle_irq(OMAP_GPMC_IRQ_BASE+cs);
+       gpmc_write_reg(GPMC_IRQSTATUS, regval);
 
        return IRQ_HANDLED;
 }
index cdd6dda..e003f2b 100644 (file)
@@ -29,7 +29,7 @@
 
 #include <plat/omap_hwmod.h>
 #include <plat/omap_device.h>
-#include <plat/hdq1w.h>
+#include "hdq1w.h"
 
 #include "common.h"
 
index a9675d8..03ebf47 100644 (file)
 #include <linux/delay.h>
 #include <linux/gpio.h>
 #include <mach/hardware.h>
+#include <linux/platform_data/gpio-omap.h>
+
 #include <plat/mmc.h>
 #include <plat/omap-pm.h>
-#include <plat/mux.h>
 #include <plat/omap_device.h>
 
 #include "mux.h"
index a12e224..fc57e67 100644 (file)
@@ -19,7 +19,6 @@
  *
  */
 
-#include <plat/cpu.h>
 #include <plat/i2c.h>
 #include "common.h"
 #include <plat/omap_hwmod.h>
index 40373db..cf2362c 100644 (file)
 #include <asm/cputype.h>
 
 #include "common.h"
-#include <plat/cpu.h>
 
-#include <mach/id.h>
+#include "id.h"
 
+#include "soc.h"
 #include "control.h"
 
 static unsigned int omap_revision;
@@ -161,9 +161,8 @@ void __init omap2xxx_check_revision(void)
        }
 
        if (j == ARRAY_SIZE(omap_ids)) {
-               printk(KERN_ERR "Unknown OMAP device type. "
-                               "Handling it as OMAP%04x\n",
-                               omap_ids[i].type >> 16);
+               pr_err("Unknown OMAP device type. Handling it as OMAP%04x\n",
+                      omap_ids[i].type >> 16);
                j = i;
        }
 
index be4d290..5621cc5 100644 (file)
@@ -1,5 +1,3 @@
 /*
  * arch/arm/mach-omap2/include/mach/gpio.h
  */
-
-#include <plat/gpio.h>
index 78edf9d..54492db 100644 (file)
@@ -1,5 +1,3 @@
 /*
  * arch/arm/mach-omap2/include/mach/hardware.h
  */
-
-#include <plat/hardware.h>
index 44dab77..ba5282c 100644 (file)
@@ -1,5 +1,3 @@
 /*
  * arch/arm/mach-omap2/include/mach/irqs.h
  */
-
-#include <plat/irqs.h>
diff --git a/arch/arm/mach-omap2/include/mach/smp.h b/arch/arm/mach-omap2/include/mach/smp.h
deleted file mode 100644 (file)
index 323675f..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
- * arch/arm/mach-omap2/include/mach/smp.h
- */
-
-#include <plat/smp.h>
index 4d2d981..4234d28 100644 (file)
@@ -33,6 +33,7 @@
 #include <plat/multi.h>
 #include <plat/dma.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "voltage.h"
 #include "powerdomain.h"
@@ -523,6 +524,8 @@ void __init am33xx_init_early(void)
        am33xx_voltagedomains_init();
        am33xx_powerdomains_init();
        am33xx_clockdomains_init();
+       am33xx_hwmod_init();
+       omap_hwmod_init_postsetup();
        am33xx_clk_init();
 }
 #endif
index bcd83db..3926f37 100644 (file)
@@ -23,8 +23,7 @@
 #include <linux/of_address.h>
 #include <linux/of_irq.h>
 
-#include <mach/hardware.h>
-
+#include "soc.h"
 #include "iomap.h"
 #include "common.h"
 
@@ -49,6 +48,8 @@
 #define OMAP3_IRQ_BASE         OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE)
 #define INTCPS_SIR_IRQ_OFFSET  0x0040  /* omap2/3 active interrupt offset */
 #define ACTIVEIRQ_MASK         0x7f    /* omap2/3 active interrupt bits */
+#define INTCPS_NR_MIR_REGS     3
+#define INTCPS_NR_IRQS         96
 
 /*
  * OMAP2 has a number of different interrupt controllers, each interrupt
@@ -107,9 +108,8 @@ static void __init omap_irq_bank_init_one(struct omap_irq_bank *bank)
        unsigned long tmp;
 
        tmp = intc_bank_read_reg(bank, INTC_REVISION) & 0xff;
-       printk(KERN_INFO "IRQ: Found an INTC at 0x%p "
-                        "(revision %ld.%ld) with %d interrupts\n",
-                        bank->base_reg, tmp >> 4, tmp & 0xf, bank->nr_irqs);
+       pr_info("IRQ: Found an INTC at 0x%p (revision %ld.%ld) with %d interrupts\n",
+               bank->base_reg, tmp >> 4, tmp & 0xf, bank->nr_irqs);
 
        tmp = intc_bank_read_reg(bank, INTC_SYSCONFIG);
        tmp |= 1 << 1;  /* soft reset */
index 6875be8..0d97456 100644 (file)
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/pm_runtime.h>
+
 #include <plat/mailbox.h>
-#include <mach/irqs.h>
+
+#include "soc.h"
 
 #define MAILBOX_REVISION               0x000
 #define MAILBOX_MESSAGE(m)             (0x040 + 4 * (m))
index 577cb77..7d47407 100644 (file)
 #include <linux/io.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
-#include <mach/irqs.h>
 #include <plat/dma.h>
-#include <plat/cpu.h>
-#include <plat/mcbsp.h>
 #include <plat/omap_device.h>
 #include <linux/pm_runtime.h>
 
index fb5bc6c..9e57b4a 100644 (file)
@@ -23,6 +23,7 @@
 
 #include <linux/kernel.h>
 #include <linux/err.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <plat/omap_hwmod.h>
 #include <plat/omap_device.h>
index 414083b..765a2ac 100644 (file)
@@ -20,7 +20,7 @@
 #include <linux/io.h>
 
 #include <asm/cacheflush.h>
-#include <mach/omap-wakeupgen.h>
+#include "omap-wakeupgen.h"
 
 #include "common.h"
 
index 1be8bcb..df298d4 100644 (file)
@@ -14,7 +14,9 @@
 #include <linux/platform_device.h>
 
 #include <plat/iommu.h>
-#include <plat/irqs.h>
+
+#include "soc.h"
+#include "common.h"
 
 struct iommu_device {
        resource_size_t base;
@@ -29,7 +31,7 @@ static int num_iommu_devices;
 static struct iommu_device omap3_devices[] = {
        {
                .base = 0x480bd400,
-               .irq = 24,
+               .irq = 24 + OMAP_INTC_START,
                .pdata = {
                        .name = "isp",
                        .nr_tlb_entries = 8,
@@ -41,7 +43,7 @@ static struct iommu_device omap3_devices[] = {
 #if defined(CONFIG_OMAP_IOMMU_IVA2)
        {
                .base = 0x5d000000,
-               .irq = 28,
+               .irq = 28 + OMAP_INTC_START,
                .pdata = {
                        .name = "iva2",
                        .nr_tlb_entries = 32,
@@ -64,7 +66,7 @@ static struct platform_device *omap3_iommu_pdev[NR_OMAP3_IOMMU_DEVICES];
 static struct iommu_device omap4_devices[] = {
        {
                .base = OMAP4_MMU1_BASE,
-               .irq = OMAP44XX_IRQ_DUCATI_MMU,
+               .irq = 100 + OMAP44XX_IRQ_GIC_START,
                .pdata = {
                        .name = "ducati",
                        .nr_tlb_entries = 32,
@@ -75,7 +77,7 @@ static struct iommu_device omap4_devices[] = {
        },
        {
                .base = OMAP4_MMU2_BASE,
-               .irq = OMAP44XX_IRQ_TESLA_MMU,
+               .irq = 28 + OMAP44XX_IRQ_GIC_START,
                .pdata = {
                        .name = "tesla",
                        .nr_tlb_entries = 32,
index 637a1bd..ff4e6a0 100644 (file)
@@ -50,9 +50,8 @@
 #include <asm/suspend.h>
 #include <asm/hardware/cache-l2x0.h>
 
-#include <plat/omap44xx.h>
-
 #include "common.h"
+#include "omap44xx.h"
 #include "omap4-sar-layout.h"
 #include "pm.h"
 #include "prcm_mpu44xx.h"
index d9ae4a5..a004cb9 100644 (file)
@@ -19,7 +19,7 @@
 #include <asm/memblock.h>
 
 #include <plat/omap-secure.h>
-#include <mach/omap-secure.h>
+#include "omap-secure.h"
 
 static phys_addr_t omap_secure_memblock_base;
 
index 9a35adf..06d8bc3 100644 (file)
 #include <asm/hardware/gic.h>
 #include <asm/smp_scu.h>
 
-#include <mach/hardware.h>
-#include <mach/omap-secure.h>
-#include <mach/omap-wakeupgen.h>
+#include "omap-secure.h"
+#include "omap-wakeupgen.h"
 #include <asm/cputype.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "common.h"
 #include "clockdomain.h"
index 05fdebf..b3275ba 100644 (file)
 
 #include <asm/hardware/gic.h>
 
-#include <mach/omap-wakeupgen.h>
-#include <mach/omap-secure.h>
+#include "omap-wakeupgen.h"
+#include "omap-secure.h"
 
+#include "soc.h"
 #include "omap4-sar-layout.h"
 #include "common.h"
 
@@ -46,7 +47,7 @@
 static void __iomem *wakeupgen_base;
 static void __iomem *sar_base;
 static DEFINE_SPINLOCK(wakeupgen_lock);
-static unsigned int irq_target_cpu[NR_IRQS];
+static unsigned int irq_target_cpu[MAX_IRQS];
 static unsigned int irq_banks = MAX_NR_REG_BANKS;
 static unsigned int max_irqs = MAX_IRQS;
 static unsigned int omap_secure_apis;
similarity index 98%
rename from arch/arm/plat-omap/include/plat/omap24xx.h
rename to arch/arm/mach-omap2/omap24xx.h
index 92df9e2..641a2c8 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/arm/plat-omap/include/mach/omap24xx.h
- *
  * This file contains the processor specific definitions
  * of the TI OMAP24XX.
  *
similarity index 98%
rename from arch/arm/plat-omap/include/plat/omap34xx.h
rename to arch/arm/mach-omap2/omap34xx.h
index 0d818ac..c0d1b4b 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/arm/plat-omap/include/mach/omap34xx.h
- *
  * This file contains the processor specific definitions of the TI OMAP34XX.
  *
  * Copyright (C) 2007 Texas Instruments.
index c29dee9..e1f2897 100644 (file)
 #include <linux/io.h>
 #include <linux/platform_device.h>
 #include <linux/memblock.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/export.h>
 
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/mach/map.h>
 #include <asm/memblock.h>
-#include <linux/of_irq.h>
-#include <linux/of_platform.h>
 
-#include <plat/irqs.h>
 #include <plat/sram.h>
 #include <plat/omap-secure.h>
 #include <plat/mmc.h>
 
-#include <mach/hardware.h>
-#include <mach/omap-wakeupgen.h>
+#include "omap-wakeupgen.h"
 
+#include "soc.h"
 #include "common.h"
 #include "hsmmc.h"
 #include "omap4-sar-layout.h"
-#include <linux/export.h>
 
 #ifdef CONFIG_CACHE_L2X0
 static void __iomem *l2cache_base;
@@ -171,7 +170,10 @@ static int __init omap_l2_cache_init(void)
        /* Enable PL310 L2 Cache controller */
        omap_smc1(0x102, 0x1);
 
-       l2x0_init(l2cache_base, aux_ctrl, L2X0_AUX_CTRL_MASK);
+       if (of_have_populated_dt())
+               l2x0_of_init(aux_ctrl, L2X0_AUX_CTRL_MASK);
+       else
+               l2x0_init(l2cache_base, aux_ctrl, L2X0_AUX_CTRL_MASK);
 
        /*
         * Override default outer_cache.disable with a OMAP4
similarity index 87%
rename from arch/arm/plat-omap/include/plat/omap4-keypad.h
rename to arch/arm/mach-omap2/omap4-keypad.h
index 8ad0a37..20de0d5 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef ARCH_ARM_PLAT_OMAP4_KEYPAD_H
 #define ARCH_ARM_PLAT_OMAP4_KEYPAD_H
 
+struct omap_board_data;
+
 extern int omap4_keyboard_init(struct omap4_keypad_platform_data *,
                                struct omap_board_data *);
 #endif
similarity index 97%
rename from arch/arm/plat-omap/include/plat/omap44xx.h
rename to arch/arm/mach-omap2/omap44xx.h
index c0d478e..43b927b 100644 (file)
 #define IRQ_SIR_IRQ                    0x0040
 #define OMAP44XX_GIC_DIST_BASE         0x48241000
 #define OMAP44XX_GIC_CPU_BASE          0x48240100
+#define OMAP44XX_IRQ_GIC_START         32
 #define OMAP44XX_SCU_BASE              0x48240000
 #define OMAP44XX_LOCAL_TWD_BASE                0x48240600
 #define OMAP44XX_L2CACHE_BASE          0x48242000
 #define OMAP44XX_WKUPGEN_BASE          0x48281000
 #define OMAP44XX_MCPDM_BASE            0x40132000
-#define OMAP44XX_MCPDM_L3_BASE         0x49032000
 #define OMAP44XX_SAR_RAM_BASE          0x4a326000
 
 #define OMAP44XX_MAILBOX_BASE          (L4_44XX_BASE + 0xF4000)
index 6ca8e51..00c0066 100644 (file)
 #include <linux/slab.h>
 #include <linux/bootmem.h>
 
-#include "common.h"
-#include <plat/cpu.h>
-#include "clockdomain.h"
-#include "powerdomain.h"
 #include <plat/clock.h>
 #include <plat/omap_hwmod.h>
 #include <plat/prcm.h>
 
+#include "soc.h"
+#include "common.h"
+#include "clockdomain.h"
+#include "powerdomain.h"
 #include "cm2xxx_3xxx.h"
 #include "cminst44xx.h"
+#include "cm33xx.h"
 #include "prm2xxx_3xxx.h"
 #include "prm44xx.h"
+#include "prm33xx.h"
 #include "prminst44xx.h"
 #include "mux.h"
 #include "pm.h"
@@ -868,6 +870,26 @@ static void _omap4_enable_module(struct omap_hwmod *oh)
 }
 
 /**
+ * _am33xx_enable_module - enable CLKCTRL modulemode on AM33XX
+ * @oh: struct omap_hwmod *
+ *
+ * Enables the PRCM module mode related to the hwmod @oh.
+ * No return value.
+ */
+static void _am33xx_enable_module(struct omap_hwmod *oh)
+{
+       if (!oh->clkdm || !oh->prcm.omap4.modulemode)
+               return;
+
+       pr_debug("omap_hwmod: %s: %s: %d\n",
+                oh->name, __func__, oh->prcm.omap4.modulemode);
+
+       am33xx_cm_module_enable(oh->prcm.omap4.modulemode, oh->clkdm->cm_inst,
+                               oh->clkdm->clkdm_offs,
+                               oh->prcm.omap4.clkctrl_offs);
+}
+
+/**
  * _omap4_wait_target_disable - wait for a module to be disabled on OMAP4
  * @oh: struct omap_hwmod *
  *
@@ -894,6 +916,31 @@ static int _omap4_wait_target_disable(struct omap_hwmod *oh)
 }
 
 /**
+ * _am33xx_wait_target_disable - wait for a module to be disabled on AM33XX
+ * @oh: struct omap_hwmod *
+ *
+ * Wait for a module @oh to enter slave idle.  Returns 0 if the module
+ * does not have an IDLEST bit or if the module successfully enters
+ * slave idle; otherwise, pass along the return value of the
+ * appropriate *_cm*_wait_module_idle() function.
+ */
+static int _am33xx_wait_target_disable(struct omap_hwmod *oh)
+{
+       if (!oh)
+               return -EINVAL;
+
+       if (oh->_int_flags & _HWMOD_NO_MPU_PORT)
+               return 0;
+
+       if (oh->flags & HWMOD_NO_IDLEST)
+               return 0;
+
+       return am33xx_cm_wait_module_idle(oh->clkdm->cm_inst,
+                                            oh->clkdm->clkdm_offs,
+                                            oh->prcm.omap4.clkctrl_offs);
+}
+
+/**
  * _count_mpu_irqs - count the number of MPU IRQ lines associated with @oh
  * @oh: struct omap_hwmod *oh
  *
@@ -1438,8 +1485,8 @@ static int _init_clocks(struct omap_hwmod *oh, void *data)
  * Return the bit position of the reset line that match the
  * input name. Return -ENOENT if not found.
  */
-static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name,
-                           struct omap_hwmod_rst_info *ohri)
+static int _lookup_hardreset(struct omap_hwmod *oh, const char *name,
+                            struct omap_hwmod_rst_info *ohri)
 {
        int i;
 
@@ -1475,7 +1522,7 @@ static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name,
 static int _assert_hardreset(struct omap_hwmod *oh, const char *name)
 {
        struct omap_hwmod_rst_info ohri;
-       u8 ret = -EINVAL;
+       int ret = -EINVAL;
 
        if (!oh)
                return -EINVAL;
@@ -1484,7 +1531,7 @@ static int _assert_hardreset(struct omap_hwmod *oh, const char *name)
                return -ENOSYS;
 
        ret = _lookup_hardreset(oh, name, &ohri);
-       if (IS_ERR_VALUE(ret))
+       if (ret < 0)
                return ret;
 
        ret = soc_ops.assert_hardreset(oh, &ohri);
@@ -1542,7 +1589,7 @@ static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)
 static int _read_hardreset(struct omap_hwmod *oh, const char *name)
 {
        struct omap_hwmod_rst_info ohri;
-       u8 ret = -EINVAL;
+       int ret = -EINVAL;
 
        if (!oh)
                return -EINVAL;
@@ -1551,7 +1598,7 @@ static int _read_hardreset(struct omap_hwmod *oh, const char *name)
                return -ENOSYS;
 
        ret = _lookup_hardreset(oh, name, &ohri);
-       if (IS_ERR_VALUE(ret))
+       if (ret < 0)
                return ret;
 
        return soc_ops.is_hardreset_asserted(oh, &ohri);
@@ -1614,6 +1661,36 @@ static int _omap4_disable_module(struct omap_hwmod *oh)
 }
 
 /**
+ * _am33xx_disable_module - enable CLKCTRL modulemode on AM33XX
+ * @oh: struct omap_hwmod *
+ *
+ * Disable the PRCM module mode related to the hwmod @oh.
+ * Return EINVAL if the modulemode is not supported and 0 in case of success.
+ */
+static int _am33xx_disable_module(struct omap_hwmod *oh)
+{
+       int v;
+
+       if (!oh->clkdm || !oh->prcm.omap4.modulemode)
+               return -EINVAL;
+
+       pr_debug("omap_hwmod: %s: %s\n", oh->name, __func__);
+
+       am33xx_cm_module_disable(oh->clkdm->cm_inst, oh->clkdm->clkdm_offs,
+                                oh->prcm.omap4.clkctrl_offs);
+
+       if (_are_any_hardreset_lines_asserted(oh))
+               return 0;
+
+       v = _am33xx_wait_target_disable(oh);
+       if (v)
+               pr_warn("omap_hwmod: %s: _wait_target_disable failed\n",
+                       oh->name);
+
+       return 0;
+}
+
+/**
  * _ocp_softreset - reset an omap_hwmod via the OCP_SYSCONFIG bit
  * @oh: struct omap_hwmod *
  *
@@ -1641,8 +1718,8 @@ static int _ocp_softreset(struct omap_hwmod *oh)
 
        /* clocks must be on for this operation */
        if (oh->_state != _HWMOD_STATE_ENABLED) {
-               pr_warning("omap_hwmod: %s: reset can only be entered from "
-                          "enabled state\n", oh->name);
+               pr_warn("omap_hwmod: %s: reset can only be entered from enabled state\n",
+                       oh->name);
                return -EINVAL;
        }
 
@@ -1889,6 +1966,7 @@ static int _enable(struct omap_hwmod *oh)
                        _enable_sysc(oh);
                }
        } else {
+               _omap4_disable_module(oh);
                _disable_clocks(oh);
                pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n",
                         oh->name, r);
@@ -2548,6 +2626,33 @@ static int _omap4_wait_target_ready(struct omap_hwmod *oh)
 }
 
 /**
+ * _am33xx_wait_target_ready - wait for a module to leave slave idle
+ * @oh: struct omap_hwmod *
+ *
+ * Wait for a module @oh to leave slave idle.  Returns 0 if the module
+ * does not have an IDLEST bit or if the module successfully leaves
+ * slave idle; otherwise, pass along the return value of the
+ * appropriate *_cm*_wait_module_ready() function.
+ */
+static int _am33xx_wait_target_ready(struct omap_hwmod *oh)
+{
+       if (!oh || !oh->clkdm)
+               return -EINVAL;
+
+       if (oh->flags & HWMOD_NO_IDLEST)
+               return 0;
+
+       if (!_find_mpu_rt_port(oh))
+               return 0;
+
+       /* XXX check module SIDLEMODE, hardreset status */
+
+       return am33xx_cm_wait_module_ready(oh->clkdm->cm_inst,
+                                             oh->clkdm->clkdm_offs,
+                                             oh->prcm.omap4.clkctrl_offs);
+}
+
+/**
  * _omap2_assert_hardreset - call OMAP2 PRM hardreset fn with hwmod args
  * @oh: struct omap_hwmod * to assert hardreset
  * @ohri: hardreset line data
@@ -2678,6 +2783,72 @@ static int _omap4_is_hardreset_asserted(struct omap_hwmod *oh,
                                oh->prcm.omap4.rstctrl_offs);
 }
 
+/**
+ * _am33xx_assert_hardreset - call AM33XX PRM hardreset fn with hwmod args
+ * @oh: struct omap_hwmod * to assert hardreset
+ * @ohri: hardreset line data
+ *
+ * Call am33xx_prminst_assert_hardreset() with parameters extracted
+ * from the hwmod @oh and the hardreset line data @ohri.  Only
+ * intended for use as an soc_ops function pointer.  Passes along the
+ * return value from am33xx_prminst_assert_hardreset().  XXX This
+ * function is scheduled for removal when the PRM code is moved into
+ * drivers/.
+ */
+static int _am33xx_assert_hardreset(struct omap_hwmod *oh,
+                                  struct omap_hwmod_rst_info *ohri)
+
+{
+       return am33xx_prm_assert_hardreset(ohri->rst_shift,
+                               oh->clkdm->pwrdm.ptr->prcm_offs,
+                               oh->prcm.omap4.rstctrl_offs);
+}
+
+/**
+ * _am33xx_deassert_hardreset - call AM33XX PRM hardreset fn with hwmod args
+ * @oh: struct omap_hwmod * to deassert hardreset
+ * @ohri: hardreset line data
+ *
+ * Call am33xx_prminst_deassert_hardreset() with parameters extracted
+ * from the hwmod @oh and the hardreset line data @ohri.  Only
+ * intended for use as an soc_ops function pointer.  Passes along the
+ * return value from am33xx_prminst_deassert_hardreset().  XXX This
+ * function is scheduled for removal when the PRM code is moved into
+ * drivers/.
+ */
+static int _am33xx_deassert_hardreset(struct omap_hwmod *oh,
+                                    struct omap_hwmod_rst_info *ohri)
+{
+       if (ohri->st_shift)
+               pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n",
+                      oh->name, ohri->name);
+
+       return am33xx_prm_deassert_hardreset(ohri->rst_shift,
+                               oh->clkdm->pwrdm.ptr->prcm_offs,
+                               oh->prcm.omap4.rstctrl_offs,
+                               oh->prcm.omap4.rstst_offs);
+}
+
+/**
+ * _am33xx_is_hardreset_asserted - call AM33XX PRM hardreset fn with hwmod args
+ * @oh: struct omap_hwmod * to test hardreset
+ * @ohri: hardreset line data
+ *
+ * Call am33xx_prminst_is_hardreset_asserted() with parameters
+ * extracted from the hwmod @oh and the hardreset line data @ohri.
+ * Only intended for use as an soc_ops function pointer.  Passes along
+ * the return value from am33xx_prminst_is_hardreset_asserted().  XXX
+ * This function is scheduled for removal when the PRM code is moved
+ * into drivers/.
+ */
+static int _am33xx_is_hardreset_asserted(struct omap_hwmod *oh,
+                                       struct omap_hwmod_rst_info *ohri)
+{
+       return am33xx_prm_is_hardreset_asserted(ohri->rst_shift,
+                               oh->clkdm->pwrdm.ptr->prcm_offs,
+                               oh->prcm.omap4.rstctrl_offs);
+}
+
 /* Public functions */
 
 u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs)
@@ -3158,6 +3329,33 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
 }
 
 /**
+ * omap_hwmod_fill_dma_resources - fill struct resource array with dma data
+ * @oh: struct omap_hwmod *
+ * @res: pointer to the array of struct resource to fill
+ *
+ * Fill the struct resource array @res with dma resource data from the
+ * omap_hwmod @oh.  Intended to be called by code that registers
+ * omap_devices.  See also omap_hwmod_count_resources().  Returns the
+ * number of array elements filled.
+ */
+int omap_hwmod_fill_dma_resources(struct omap_hwmod *oh, struct resource *res)
+{
+       int i, sdma_reqs_cnt;
+       int r = 0;
+
+       sdma_reqs_cnt = _count_sdma_reqs(oh);
+       for (i = 0; i < sdma_reqs_cnt; i++) {
+               (res + r)->name = (oh->sdma_reqs + i)->name;
+               (res + r)->start = (oh->sdma_reqs + i)->dma_req;
+               (res + r)->end = (oh->sdma_reqs + i)->dma_req;
+               (res + r)->flags = IORESOURCE_DMA;
+               r++;
+       }
+
+       return r;
+}
+
+/**
  * omap_hwmod_get_resource_byname - fetch IP block integration data by name
  * @oh: struct omap_hwmod * to operate on
  * @type: one of the IORESOURCE_* constants from include/linux/ioport.h
@@ -3677,6 +3875,14 @@ void __init omap_hwmod_init(void)
                soc_ops.deassert_hardreset = _omap4_deassert_hardreset;
                soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted;
                soc_ops.init_clkdm = _init_clkdm;
+       } else if (soc_is_am33xx()) {
+               soc_ops.enable_module = _am33xx_enable_module;
+               soc_ops.disable_module = _am33xx_disable_module;
+               soc_ops.wait_target_ready = _am33xx_wait_target_ready;
+               soc_ops.assert_hardreset = _am33xx_assert_hardreset;
+               soc_ops.deassert_hardreset = _am33xx_deassert_hardreset;
+               soc_ops.is_hardreset_asserted = _am33xx_is_hardreset_asserted;
+               soc_ops.init_clkdm = _init_clkdm;
        } else {
                WARN(1, "omap_hwmod: unknown SoC type\n");
        }
index 50cfab6..10575a1 100644 (file)
  * XXX handle crossbar/shared link difference for L3?
  * XXX these should be marked initdata for multi-OMAP kernels
  */
+#include <linux/platform_data/spi-omap2-mcspi.h>
+
 #include <plat/omap_hwmod.h>
-#include <mach/irqs.h>
-#include <plat/cpu.h>
 #include <plat/dma.h>
 #include <plat/serial.h>
 #include <plat/i2c.h>
-#include <plat/gpio.h>
-#include <plat/mcspi.h>
 #include <plat/dmtimer.h>
-#include <plat/l3_2xxx.h>
-#include <plat/l4_2xxx.h>
+#include "l3_2xxx.h"
+#include "l4_2xxx.h"
 #include <plat/mmc.h>
 
 #include "omap_hwmod_common_data.h"
@@ -162,9 +160,9 @@ static struct omap_hwmod omap2420_dma_system_hwmod = {
 
 /* mailbox */
 static struct omap_hwmod_irq_info omap2420_mailbox_irqs[] = {
-       { .name = "dsp", .irq = 26 },
-       { .name = "iva", .irq = 34 },
-       { .irq = -1 }
+       { .name = "dsp", .irq = 26 + OMAP_INTC_START, },
+       { .name = "iva", .irq = 34 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap2420_mailbox_hwmod = {
@@ -199,9 +197,9 @@ static struct omap_hwmod_opt_clk mcbsp_opt_clks[] = {
 
 /* mcbsp1 */
 static struct omap_hwmod_irq_info omap2420_mcbsp1_irqs[] = {
-       { .name = "tx", .irq = 59 },
-       { .name = "rx", .irq = 60 },
-       { .irq = -1 }
+       { .name = "tx", .irq = 59 + OMAP_INTC_START, },
+       { .name = "rx", .irq = 60 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap2420_mcbsp1_hwmod = {
@@ -225,9 +223,9 @@ static struct omap_hwmod omap2420_mcbsp1_hwmod = {
 
 /* mcbsp2 */
 static struct omap_hwmod_irq_info omap2420_mcbsp2_irqs[] = {
-       { .name = "tx", .irq = 62 },
-       { .name = "rx", .irq = 63 },
-       { .irq = -1 }
+       { .name = "tx", .irq = 62 + OMAP_INTC_START, },
+       { .name = "rx", .irq = 63 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap2420_mcbsp2_hwmod = {
@@ -265,8 +263,8 @@ static struct omap_hwmod_class omap2420_msdi_hwmod_class = {
 
 /* msdi1 */
 static struct omap_hwmod_irq_info omap2420_msdi1_irqs[] = {
-       { .irq = 83 },
-       { .irq = -1 }
+       { .irq = 83 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap2420_msdi1_sdma_reqs[] = {
index 58b5bc1..60de70f 100644 (file)
  * XXX handle crossbar/shared link difference for L3?
  * XXX these should be marked initdata for multi-OMAP kernels
  */
+#include <linux/platform_data/asoc-ti-mcbsp.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
+
 #include <plat/omap_hwmod.h>
-#include <mach/irqs.h>
-#include <plat/cpu.h>
 #include <plat/dma.h>
 #include <plat/serial.h>
 #include <plat/i2c.h>
-#include <plat/gpio.h>
-#include <plat/mcbsp.h>
-#include <plat/mcspi.h>
 #include <plat/dmtimer.h>
 #include <plat/mmc.h>
-#include <plat/l3_2xxx.h>
+#include "l3_2xxx.h"
 
+#include "soc.h"
 #include "omap_hwmod_common_data.h"
-
 #include "prm-regbits-24xx.h"
 #include "cm-regbits-24xx.h"
 #include "wd_timer.h"
@@ -133,8 +131,8 @@ static struct omap_hwmod omap2430_i2c2_hwmod = {
 
 /* gpio5 */
 static struct omap_hwmod_irq_info omap243x_gpio5_irqs[] = {
-       { .irq = 33 }, /* INT_24XX_GPIO_BANK5 */
-       { .irq = -1 }
+       { .irq = 33 + OMAP_INTC_START, }, /* INT_24XX_GPIO_BANK5 */
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap2430_gpio5_hwmod = {
@@ -173,8 +171,8 @@ static struct omap_hwmod omap2430_dma_system_hwmod = {
 
 /* mailbox */
 static struct omap_hwmod_irq_info omap2430_mailbox_irqs[] = {
-       { .irq = 26 },
-       { .irq = -1 }
+       { .irq = 26 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap2430_mailbox_hwmod = {
@@ -195,8 +193,8 @@ static struct omap_hwmod omap2430_mailbox_hwmod = {
 
 /* mcspi3 */
 static struct omap_hwmod_irq_info omap2430_mcspi3_mpu_irqs[] = {
-       { .irq = 91 },
-       { .irq = -1 }
+       { .irq = 91 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap2430_mcspi3_sdma_reqs[] = {
@@ -250,9 +248,9 @@ static struct omap_hwmod_class usbotg_class = {
 /* usb_otg_hs */
 static struct omap_hwmod_irq_info omap2430_usbhsotg_mpu_irqs[] = {
 
-       { .name = "mc", .irq = 92 },
-       { .name = "dma", .irq = 93 },
-       { .irq = -1 }
+       { .name = "mc", .irq = 92 + OMAP_INTC_START, },
+       { .name = "dma", .irq = 93 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap2430_usbhsotg_hwmod = {
@@ -303,11 +301,11 @@ static struct omap_hwmod_opt_clk mcbsp_opt_clks[] = {
 
 /* mcbsp1 */
 static struct omap_hwmod_irq_info omap2430_mcbsp1_irqs[] = {
-       { .name = "tx",         .irq = 59 },
-       { .name = "rx",         .irq = 60 },
-       { .name = "ovr",        .irq = 61 },
-       { .name = "common",     .irq = 64 },
-       { .irq = -1 }
+       { .name = "tx",         .irq = 59 + OMAP_INTC_START, },
+       { .name = "rx",         .irq = 60 + OMAP_INTC_START, },
+       { .name = "ovr",        .irq = 61 + OMAP_INTC_START, },
+       { .name = "common",     .irq = 64 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap2430_mcbsp1_hwmod = {
@@ -331,10 +329,10 @@ static struct omap_hwmod omap2430_mcbsp1_hwmod = {
 
 /* mcbsp2 */
 static struct omap_hwmod_irq_info omap2430_mcbsp2_irqs[] = {
-       { .name = "tx",         .irq = 62 },
-       { .name = "rx",         .irq = 63 },
-       { .name = "common",     .irq = 16 },
-       { .irq = -1 }
+       { .name = "tx",         .irq = 62 + OMAP_INTC_START, },
+       { .name = "rx",         .irq = 63 + OMAP_INTC_START, },
+       { .name = "common",     .irq = 16 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap2430_mcbsp2_hwmod = {
@@ -358,10 +356,10 @@ static struct omap_hwmod omap2430_mcbsp2_hwmod = {
 
 /* mcbsp3 */
 static struct omap_hwmod_irq_info omap2430_mcbsp3_irqs[] = {
-       { .name = "tx",         .irq = 89 },
-       { .name = "rx",         .irq = 90 },
-       { .name = "common",     .irq = 17 },
-       { .irq = -1 }
+       { .name = "tx",         .irq = 89 + OMAP_INTC_START, },
+       { .name = "rx",         .irq = 90 + OMAP_INTC_START, },
+       { .name = "common",     .irq = 17 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap2430_mcbsp3_hwmod = {
@@ -385,10 +383,10 @@ static struct omap_hwmod omap2430_mcbsp3_hwmod = {
 
 /* mcbsp4 */
 static struct omap_hwmod_irq_info omap2430_mcbsp4_irqs[] = {
-       { .name = "tx",         .irq = 54 },
-       { .name = "rx",         .irq = 55 },
-       { .name = "common",     .irq = 18 },
-       { .irq = -1 }
+       { .name = "tx",         .irq = 54 + OMAP_INTC_START, },
+       { .name = "rx",         .irq = 55 + OMAP_INTC_START, },
+       { .name = "common",     .irq = 18 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap2430_mcbsp4_sdma_chs[] = {
@@ -418,10 +416,10 @@ static struct omap_hwmod omap2430_mcbsp4_hwmod = {
 
 /* mcbsp5 */
 static struct omap_hwmod_irq_info omap2430_mcbsp5_irqs[] = {
-       { .name = "tx",         .irq = 81 },
-       { .name = "rx",         .irq = 82 },
-       { .name = "common",     .irq = 19 },
-       { .irq = -1 }
+       { .name = "tx",         .irq = 81 + OMAP_INTC_START, },
+       { .name = "rx",         .irq = 82 + OMAP_INTC_START, },
+       { .name = "common",     .irq = 19 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap2430_mcbsp5_sdma_chs[] = {
@@ -468,8 +466,8 @@ static struct omap_hwmod_class omap2430_mmc_class = {
 
 /* MMC/SD/SDIO1 */
 static struct omap_hwmod_irq_info omap2430_mmc1_mpu_irqs[] = {
-       { .irq = 83 },
-       { .irq = -1 }
+       { .irq = 83 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap2430_mmc1_sdma_reqs[] = {
@@ -509,8 +507,8 @@ static struct omap_hwmod omap2430_mmc1_hwmod = {
 
 /* MMC/SD/SDIO2 */
 static struct omap_hwmod_irq_info omap2430_mmc2_mpu_irqs[] = {
-       { .irq = 86 },
-       { .irq = -1 }
+       { .irq = 86 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap2430_mmc2_sdma_reqs[] = {
index 102d76e..8851bbb 100644 (file)
@@ -13,9 +13,7 @@
 #include <plat/serial.h>
 #include <plat/dma.h>
 #include <plat/common.h>
-#include <plat/hdq1w.h>
-
-#include <mach/irqs.h>
+#include "hdq1w.h"
 
 #include "omap_hwmod_common_data.h"
 
@@ -182,126 +180,126 @@ struct omap_hwmod_class iva_hwmod_class = {
 /* Common MPU IRQ line data */
 
 struct omap_hwmod_irq_info omap2_timer1_mpu_irqs[] = {
-       { .irq = 37, },
-       { .irq = -1 }
+       { .irq = 37 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer2_mpu_irqs[] = {
-       { .irq = 38, },
-       { .irq = -1 }
+       { .irq = 38 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer3_mpu_irqs[] = {
-       { .irq = 39, },
-       { .irq = -1 }
+       { .irq = 39 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer4_mpu_irqs[] = {
-       { .irq = 40, },
-       { .irq = -1 }
+       { .irq = 40 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer5_mpu_irqs[] = {
-       { .irq = 41, },
-       { .irq = -1 }
+       { .irq = 41 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer6_mpu_irqs[] = {
-       { .irq = 42, },
-       { .irq = -1 }
+       { .irq = 42 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer7_mpu_irqs[] = {
-       { .irq = 43, },
-       { .irq = -1 }
+       { .irq = 43 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer8_mpu_irqs[] = {
-       { .irq = 44, },
-       { .irq = -1 }
+       { .irq = 44 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer9_mpu_irqs[] = {
-       { .irq = 45, },
-       { .irq = -1 }
+       { .irq = 45 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer10_mpu_irqs[] = {
-       { .irq = 46, },
-       { .irq = -1 }
+       { .irq = 46 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_timer11_mpu_irqs[] = {
-       { .irq = 47, },
-       { .irq = -1 }
+       { .irq = 47 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_uart1_mpu_irqs[] = {
-       { .irq = INT_24XX_UART1_IRQ, },
-       { .irq = -1 }
+       { .irq = 72 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_uart2_mpu_irqs[] = {
-       { .irq = INT_24XX_UART2_IRQ, },
-       { .irq = -1 }
+       { .irq = 73 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_uart3_mpu_irqs[] = {
-       { .irq = INT_24XX_UART3_IRQ, },
-       { .irq = -1 }
+       { .irq = 74 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_dispc_irqs[] = {
-       { .irq = 25 },
-       { .irq = -1 }
+       { .irq = 25 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_i2c1_mpu_irqs[] = {
-       { .irq = INT_24XX_I2C1_IRQ, },
-       { .irq = -1 }
+       { .irq = 56 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_i2c2_mpu_irqs[] = {
-       { .irq = INT_24XX_I2C2_IRQ, },
-       { .irq = -1 }
+       { .irq = 57 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_gpio1_irqs[] = {
-       { .irq = 29 }, /* INT_24XX_GPIO_BANK1 */
-       { .irq = -1 }
+       { .irq = 29 + OMAP_INTC_START, }, /* INT_24XX_GPIO_BANK1 */
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_gpio2_irqs[] = {
-       { .irq = 30 }, /* INT_24XX_GPIO_BANK2 */
-       { .irq = -1 }
+       { .irq = 30 + OMAP_INTC_START, }, /* INT_24XX_GPIO_BANK2 */
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_gpio3_irqs[] = {
-       { .irq = 31 }, /* INT_24XX_GPIO_BANK3 */
-       { .irq = -1 }
+       { .irq = 31 + OMAP_INTC_START, }, /* INT_24XX_GPIO_BANK3 */
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_gpio4_irqs[] = {
-       { .irq = 32 }, /* INT_24XX_GPIO_BANK4 */
-       { .irq = -1 }
+       { .irq = 32 + OMAP_INTC_START, }, /* INT_24XX_GPIO_BANK4 */
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_dma_system_irqs[] = {
-       { .name = "0", .irq = 12 }, /* INT_24XX_SDMA_IRQ0 */
-       { .name = "1", .irq = 13 }, /* INT_24XX_SDMA_IRQ1 */
-       { .name = "2", .irq = 14 }, /* INT_24XX_SDMA_IRQ2 */
-       { .name = "3", .irq = 15 }, /* INT_24XX_SDMA_IRQ3 */
-       { .irq = -1 }
+       { .name = "0", .irq = 12 + OMAP_INTC_START, }, /* INT_24XX_SDMA_IRQ0 */
+       { .name = "1", .irq = 13 + OMAP_INTC_START, }, /* INT_24XX_SDMA_IRQ1 */
+       { .name = "2", .irq = 14 + OMAP_INTC_START, }, /* INT_24XX_SDMA_IRQ2 */
+       { .name = "3", .irq = 15 + OMAP_INTC_START, }, /* INT_24XX_SDMA_IRQ3 */
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_mcspi1_mpu_irqs[] = {
-       { .irq = 65 },
-       { .irq = -1 }
+       { .irq = 65 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_irq_info omap2_mcspi2_mpu_irqs[] = {
-       { .irq = 66 },
-       { .irq = -1 }
+       { .irq = 66 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_class_sysconfig omap2_hdq1w_sysc = {
@@ -320,7 +318,7 @@ struct omap_hwmod_class omap2_hdq1w_class = {
 };
 
 struct omap_hwmod_irq_info omap2_hdq1w_mpu_irqs[] = {
-       { .irq = 58, },
-       { .irq = -1 }
+       { .irq = 58 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
index 5178e40..f853a0b 100644 (file)
@@ -15,8 +15,8 @@
 
 #include <plat/omap_hwmod.h>
 #include <plat/serial.h>
-#include <plat/l3_2xxx.h>
-#include <plat/l4_2xxx.h>
+#include "l3_2xxx.h"
+#include "l4_2xxx.h"
 
 #include "omap_hwmod_common_data.h"
 
index afad69c..feeb401 100644 (file)
  */
 #include <plat/omap_hwmod.h>
 #include <plat/serial.h>
-#include <plat/gpio.h>
+#include <linux/platform_data/gpio-omap.h>
 #include <plat/dma.h>
 #include <plat/dmtimer.h>
-#include <plat/mcspi.h>
-
-#include <mach/irqs.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 
 #include "omap_hwmod_common_data.h"
 #include "cm-regbits-24xx.h"
@@ -23,8 +21,8 @@
 #include "wd_timer.h"
 
 struct omap_hwmod_irq_info omap2xxx_timer12_mpu_irqs[] = {
-       { .irq = 48, },
-       { .irq = -1 }
+       { .irq = 48 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 struct omap_hwmod_dma_info omap2xxx_dss_sdma_chs[] = {
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c
new file mode 100644 (file)
index 0000000..59d5c1c
--- /dev/null
@@ -0,0 +1,3381 @@
+/*
+ * omap_hwmod_33xx_data.c: Hardware modules present on the AM33XX chips
+ *
+ * Copyright (C) {2012} Texas Instruments Incorporated - http://www.ti.com/
+ *
+ * This file is automatically generated from the AM33XX hardware databases.
+ * 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 <plat/omap_hwmod.h>
+#include <plat/cpu.h>
+#include <linux/platform_data/gpio-omap.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
+#include <plat/dma.h>
+#include <plat/mmc.h>
+#include <plat/i2c.h>
+
+#include "omap_hwmod_common_data.h"
+
+#include "control.h"
+#include "cm33xx.h"
+#include "prm33xx.h"
+#include "prm-regbits-33xx.h"
+
+/*
+ * IP blocks
+ */
+
+/*
+ * 'emif_fw' class
+ * instance(s): emif_fw
+ */
+static struct omap_hwmod_class am33xx_emif_fw_hwmod_class = {
+       .name           = "emif_fw",
+};
+
+/* emif_fw */
+static struct omap_hwmod am33xx_emif_fw_hwmod = {
+       .name           = "emif_fw",
+       .class          = &am33xx_emif_fw_hwmod_class,
+       .clkdm_name     = "l4fw_clkdm",
+       .main_clk       = "l4fw_gclk",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_EMIF_FW_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'emif' class
+ * instance(s): emif
+ */
+static struct omap_hwmod_class_sysconfig am33xx_emif_sysc = {
+       .rev_offs       = 0x0000,
+};
+
+static struct omap_hwmod_class am33xx_emif_hwmod_class = {
+       .name           = "emif",
+       .sysc           = &am33xx_emif_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_emif_irqs[] = {
+       { .name = "ddrerr0", .irq = 101 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+/* emif */
+static struct omap_hwmod am33xx_emif_hwmod = {
+       .name           = "emif",
+       .class          = &am33xx_emif_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .mpu_irqs       = am33xx_emif_irqs,
+       .main_clk       = "dpll_ddr_m2_div2_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_EMIF_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'l3' class
+ * instance(s): l3_main, l3_s, l3_instr
+ */
+static struct omap_hwmod_class am33xx_l3_hwmod_class = {
+       .name           = "l3",
+};
+
+/* l3_main (l3_fast) */
+static struct omap_hwmod_irq_info am33xx_l3_main_irqs[] = {
+       { .name = "l3debug", .irq = 9 + OMAP_INTC_START, },
+       { .name = "l3appint", .irq = 10 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_l3_main_hwmod = {
+       .name           = "l3_main",
+       .class          = &am33xx_l3_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .mpu_irqs       = am33xx_l3_main_irqs,
+       .main_clk       = "l3_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_L3_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* l3_s */
+static struct omap_hwmod am33xx_l3_s_hwmod = {
+       .name           = "l3_s",
+       .class          = &am33xx_l3_hwmod_class,
+       .clkdm_name     = "l3s_clkdm",
+};
+
+/* l3_instr */
+static struct omap_hwmod am33xx_l3_instr_hwmod = {
+       .name           = "l3_instr",
+       .class          = &am33xx_l3_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .main_clk       = "l3_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_L3_INSTR_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'l4' class
+ * instance(s): l4_ls, l4_hs, l4_wkup, l4_fw
+ */
+static struct omap_hwmod_class am33xx_l4_hwmod_class = {
+       .name           = "l4",
+};
+
+/* l4_ls */
+static struct omap_hwmod am33xx_l4_ls_hwmod = {
+       .name           = "l4_ls",
+       .class          = &am33xx_l4_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_L4LS_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* l4_hs */
+static struct omap_hwmod am33xx_l4_hs_hwmod = {
+       .name           = "l4_hs",
+       .class          = &am33xx_l4_hwmod_class,
+       .clkdm_name     = "l4hs_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .main_clk       = "l4hs_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_L4HS_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+
+/* l4_wkup */
+static struct omap_hwmod am33xx_l4_wkup_hwmod = {
+       .name           = "l4_wkup",
+       .class          = &am33xx_l4_hwmod_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_L4WKUP_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* l4_fw */
+static struct omap_hwmod am33xx_l4_fw_hwmod = {
+       .name           = "l4_fw",
+       .class          = &am33xx_l4_hwmod_class,
+       .clkdm_name     = "l4fw_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_L4FW_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'mpu' class
+ */
+static struct omap_hwmod_class am33xx_mpu_hwmod_class = {
+       .name   = "mpu",
+};
+
+/* mpu */
+static struct omap_hwmod_irq_info am33xx_mpu_irqs[] = {
+       { .name = "emuint", .irq = 0 + OMAP_INTC_START, },
+       { .name = "commtx", .irq = 1 + OMAP_INTC_START, },
+       { .name = "commrx", .irq = 2 + OMAP_INTC_START, },
+       { .name = "bench", .irq = 3 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_mpu_hwmod = {
+       .name           = "mpu",
+       .class          = &am33xx_mpu_hwmod_class,
+       .clkdm_name     = "mpu_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .mpu_irqs       = am33xx_mpu_irqs,
+       .main_clk       = "dpll_mpu_m2_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_MPU_MPU_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'wakeup m3' class
+ * Wakeup controller sub-system under wakeup domain
+ */
+static struct omap_hwmod_class am33xx_wkup_m3_hwmod_class = {
+       .name           = "wkup_m3",
+};
+
+static struct omap_hwmod_rst_info am33xx_wkup_m3_resets[] = {
+       { .name = "wkup_m3", .rst_shift = 3, .st_shift = 5 },
+};
+
+static struct omap_hwmod_irq_info am33xx_wkup_m3_irqs[] = {
+       { .name = "txev", .irq = 78 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+/* wkup_m3  */
+static struct omap_hwmod am33xx_wkup_m3_hwmod = {
+       .name           = "wkup_m3",
+       .class          = &am33xx_wkup_m3_hwmod_class,
+       .clkdm_name     = "l4_wkup_aon_clkdm",
+       .flags          = HWMOD_INIT_NO_RESET,  /* Keep hardreset asserted */
+       .mpu_irqs       = am33xx_wkup_m3_irqs,
+       .main_clk       = "dpll_core_m4_div2_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_WKUP_M3_CLKCTRL_OFFSET,
+                       .rstctrl_offs   = AM33XX_RM_WKUP_RSTCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .rst_lines      = am33xx_wkup_m3_resets,
+       .rst_lines_cnt  = ARRAY_SIZE(am33xx_wkup_m3_resets),
+};
+
+/*
+ * 'pru-icss' class
+ * Programmable Real-Time Unit and Industrial Communication Subsystem
+ */
+static struct omap_hwmod_class am33xx_pruss_hwmod_class = {
+       .name   = "pruss",
+};
+
+static struct omap_hwmod_rst_info am33xx_pruss_resets[] = {
+       { .name = "pruss", .rst_shift = 1 },
+};
+
+static struct omap_hwmod_irq_info am33xx_pruss_irqs[] = {
+       { .name = "evtout0", .irq = 20 + OMAP_INTC_START, },
+       { .name = "evtout1", .irq = 21 + OMAP_INTC_START, },
+       { .name = "evtout2", .irq = 22 + OMAP_INTC_START, },
+       { .name = "evtout3", .irq = 23 + OMAP_INTC_START, },
+       { .name = "evtout4", .irq = 24 + OMAP_INTC_START, },
+       { .name = "evtout5", .irq = 25 + OMAP_INTC_START, },
+       { .name = "evtout6", .irq = 26 + OMAP_INTC_START, },
+       { .name = "evtout7", .irq = 27 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+/* pru-icss */
+/* Pseudo hwmod for reset control purpose only */
+static struct omap_hwmod am33xx_pruss_hwmod = {
+       .name           = "pruss",
+       .class          = &am33xx_pruss_hwmod_class,
+       .clkdm_name     = "pruss_ocp_clkdm",
+       .mpu_irqs       = am33xx_pruss_irqs,
+       .main_clk       = "pruss_ocp_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_PRUSS_CLKCTRL_OFFSET,
+                       .rstctrl_offs   = AM33XX_RM_PER_RSTCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .rst_lines      = am33xx_pruss_resets,
+       .rst_lines_cnt  = ARRAY_SIZE(am33xx_pruss_resets),
+};
+
+/* gfx */
+/* Pseudo hwmod for reset control purpose only */
+static struct omap_hwmod_class am33xx_gfx_hwmod_class = {
+       .name   = "gfx",
+};
+
+static struct omap_hwmod_rst_info am33xx_gfx_resets[] = {
+       { .name = "gfx", .rst_shift = 0 },
+};
+
+static struct omap_hwmod_irq_info am33xx_gfx_irqs[] = {
+       { .name = "gfxint", .irq = 37 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_gfx_hwmod = {
+       .name           = "gfx",
+       .class          = &am33xx_gfx_hwmod_class,
+       .clkdm_name     = "gfx_l3_clkdm",
+       .mpu_irqs       = am33xx_gfx_irqs,
+       .main_clk       = "gfx_fck_div_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_GFX_GFX_CLKCTRL_OFFSET,
+                       .rstctrl_offs   = AM33XX_RM_GFX_RSTCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .rst_lines      = am33xx_gfx_resets,
+       .rst_lines_cnt  = ARRAY_SIZE(am33xx_gfx_resets),
+};
+
+/*
+ * 'prcm' class
+ * power and reset manager (whole prcm infrastructure)
+ */
+static struct omap_hwmod_class am33xx_prcm_hwmod_class = {
+       .name   = "prcm",
+};
+
+/* prcm */
+static struct omap_hwmod am33xx_prcm_hwmod = {
+       .name           = "prcm",
+       .class          = &am33xx_prcm_hwmod_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+};
+
+/*
+ * 'adc/tsc' class
+ * TouchScreen Controller (Anolog-To-Digital Converter)
+ */
+static struct omap_hwmod_class_sysconfig am33xx_adc_tsc_sysc = {
+       .rev_offs       = 0x00,
+       .sysc_offs      = 0x10,
+       .sysc_flags     = SYSC_HAS_SIDLEMODE,
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                       SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class am33xx_adc_tsc_hwmod_class = {
+       .name           = "adc_tsc",
+       .sysc           = &am33xx_adc_tsc_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_adc_tsc_irqs[] = {
+       { .irq = 16 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_adc_tsc_hwmod = {
+       .name           = "adc_tsc",
+       .class          = &am33xx_adc_tsc_hwmod_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .mpu_irqs       = am33xx_adc_tsc_irqs,
+       .main_clk       = "adc_tsc_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_ADC_TSC_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * Modules omap_hwmod structures
+ *
+ * The following IPs are excluded for the moment because:
+ * - They do not need an explicit SW control using omap_hwmod API.
+ * - They still need to be validated with the driver
+ *   properly adapted to omap_hwmod / omap_device
+ *
+ *    - cEFUSE (doesn't fall under any ocp_if)
+ *    - clkdiv32k
+ *    - debugss
+ *    - ocmc ram
+ *    - ocp watch point
+ *    - aes0
+ *    - sha0
+ */
+#if 0
+/*
+ * 'cefuse' class
+ */
+static struct omap_hwmod_class am33xx_cefuse_hwmod_class = {
+       .name           = "cefuse",
+};
+
+static struct omap_hwmod am33xx_cefuse_hwmod = {
+       .name           = "cefuse",
+       .class          = &am33xx_cefuse_hwmod_class,
+       .clkdm_name     = "l4_cefuse_clkdm",
+       .main_clk       = "cefuse_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_CEFUSE_CEFUSE_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'clkdiv32k' class
+ */
+static struct omap_hwmod_class am33xx_clkdiv32k_hwmod_class = {
+       .name           = "clkdiv32k",
+};
+
+static struct omap_hwmod am33xx_clkdiv32k_hwmod = {
+       .name           = "clkdiv32k",
+       .class          = &am33xx_clkdiv32k_hwmod_class,
+       .clkdm_name     = "clk_24mhz_clkdm",
+       .main_clk       = "clkdiv32k_ick",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_CLKDIV32K_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'debugss' class
+ * debug sub system
+ */
+static struct omap_hwmod_class am33xx_debugss_hwmod_class = {
+       .name           = "debugss",
+};
+
+static struct omap_hwmod am33xx_debugss_hwmod = {
+       .name           = "debugss",
+       .class          = &am33xx_debugss_hwmod_class,
+       .clkdm_name     = "l3_aon_clkdm",
+       .main_clk       = "debugss_ick",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_DEBUGSS_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* ocmcram */
+static struct omap_hwmod_class am33xx_ocmcram_hwmod_class = {
+       .name = "ocmcram",
+};
+
+static struct omap_hwmod am33xx_ocmcram_hwmod = {
+       .name           = "ocmcram",
+       .class          = &am33xx_ocmcram_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .main_clk       = "l3_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_OCMCRAM_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* ocpwp */
+static struct omap_hwmod_class am33xx_ocpwp_hwmod_class = {
+       .name           = "ocpwp",
+};
+
+static struct omap_hwmod am33xx_ocpwp_hwmod = {
+       .name           = "ocpwp",
+       .class          = &am33xx_ocpwp_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_OCPWP_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'aes' class
+ */
+static struct omap_hwmod_class am33xx_aes_hwmod_class = {
+       .name           = "aes",
+};
+
+static struct omap_hwmod_irq_info am33xx_aes0_irqs[] = {
+       { .irq = 102 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_aes0_hwmod = {
+       .name           = "aes0",
+       .class          = &am33xx_aes_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .mpu_irqs       = am33xx_aes0_irqs,
+       .main_clk       = "l3_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_AES0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* sha0 */
+static struct omap_hwmod_class am33xx_sha0_hwmod_class = {
+       .name           = "sha0",
+};
+
+static struct omap_hwmod_irq_info am33xx_sha0_irqs[] = {
+       { .irq = 108 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_sha0_hwmod = {
+       .name           = "sha0",
+       .class          = &am33xx_sha0_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .mpu_irqs       = am33xx_sha0_irqs,
+       .main_clk       = "l3_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_SHA0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+#endif
+
+/* 'smartreflex' class */
+static struct omap_hwmod_class am33xx_smartreflex_hwmod_class = {
+       .name           = "smartreflex",
+};
+
+/* smartreflex0 */
+static struct omap_hwmod_irq_info am33xx_smartreflex0_irqs[] = {
+       { .irq = 120 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_smartreflex0_hwmod = {
+       .name           = "smartreflex0",
+       .class          = &am33xx_smartreflex_hwmod_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .mpu_irqs       = am33xx_smartreflex0_irqs,
+       .main_clk       = "smartreflex0_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_SMARTREFLEX0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* smartreflex1 */
+static struct omap_hwmod_irq_info am33xx_smartreflex1_irqs[] = {
+       { .irq = 121 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_smartreflex1_hwmod = {
+       .name           = "smartreflex1",
+       .class          = &am33xx_smartreflex_hwmod_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .mpu_irqs       = am33xx_smartreflex1_irqs,
+       .main_clk       = "smartreflex1_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_SMARTREFLEX1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'control' module class
+ */
+static struct omap_hwmod_class am33xx_control_hwmod_class = {
+       .name           = "control",
+};
+
+static struct omap_hwmod_irq_info am33xx_control_irqs[] = {
+       { .irq = 8 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_control_hwmod = {
+       .name           = "control",
+       .class          = &am33xx_control_hwmod_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .mpu_irqs       = am33xx_control_irqs,
+       .main_clk       = "dpll_core_m4_div2_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_CONTROL_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'cpgmac' class
+ * cpsw/cpgmac sub system
+ */
+static struct omap_hwmod_class_sysconfig am33xx_cpgmac_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 am33xx_cpgmac0_hwmod_class = {
+       .name           = "cpgmac0",
+       .sysc           = &am33xx_cpgmac_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_cpgmac0_irqs[] = {
+       { .name = "c0_rx_thresh_pend", .irq = 40 + OMAP_INTC_START, },
+       { .name = "c0_rx_pend", .irq = 41 + OMAP_INTC_START, },
+       { .name = "c0_tx_pend", .irq = 42 + OMAP_INTC_START, },
+       { .name = "c0_misc_pend", .irq = 43 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_cpgmac0_hwmod = {
+       .name           = "cpgmac0",
+       .class          = &am33xx_cpgmac0_hwmod_class,
+       .clkdm_name     = "cpsw_125mhz_clkdm",
+       .mpu_irqs       = am33xx_cpgmac0_irqs,
+       .main_clk       = "cpsw_125mhz_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_CPGMAC0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * dcan class
+ */
+static struct omap_hwmod_class am33xx_dcan_hwmod_class = {
+       .name = "d_can",
+};
+
+/* dcan0 */
+static struct omap_hwmod_irq_info am33xx_dcan0_irqs[] = {
+       { .name = "d_can_ms", .irq = 52 + OMAP_INTC_START, },
+       { .name = "d_can_mo", .irq = 53 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_dcan0_hwmod = {
+       .name           = "d_can0",
+       .class          = &am33xx_dcan_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_dcan0_irqs,
+       .main_clk       = "dcan0_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_DCAN0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* dcan1 */
+static struct omap_hwmod_irq_info am33xx_dcan1_irqs[] = {
+       { .name = "d_can_ms", .irq = 55 + OMAP_INTC_START, },
+       { .name = "d_can_mo", .irq = 56 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+static struct omap_hwmod am33xx_dcan1_hwmod = {
+       .name           = "d_can1",
+       .class          = &am33xx_dcan_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_dcan1_irqs,
+       .main_clk       = "dcan1_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_DCAN1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* elm */
+static struct omap_hwmod_class_sysconfig am33xx_elm_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0014,
+       .sysc_flags     = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
+                       SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
+                       SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class am33xx_elm_hwmod_class = {
+       .name           = "elm",
+       .sysc           = &am33xx_elm_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_elm_irqs[] = {
+       { .irq = 4 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_elm_hwmod = {
+       .name           = "elm",
+       .class          = &am33xx_elm_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_elm_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_ELM_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'epwmss' class: ecap0,1,2,  ehrpwm0,1,2
+ */
+static struct omap_hwmod_class_sysconfig am33xx_epwmss_sysc = {
+       .rev_offs       = 0x0,
+       .sysc_offs      = 0x4,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                       SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
+                       MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class am33xx_epwmss_hwmod_class = {
+       .name           = "epwmss",
+       .sysc           = &am33xx_epwmss_sysc,
+};
+
+/* ehrpwm0 */
+static struct omap_hwmod_irq_info am33xx_ehrpwm0_irqs[] = {
+       { .name = "int", .irq = 86 + OMAP_INTC_START, },
+       { .name = "tzint", .irq = 58 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_ehrpwm0_hwmod = {
+       .name           = "ehrpwm0",
+       .class          = &am33xx_epwmss_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_ehrpwm0_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_EPWMSS0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* ehrpwm1 */
+static struct omap_hwmod_irq_info am33xx_ehrpwm1_irqs[] = {
+       { .name = "int", .irq = 87 + OMAP_INTC_START, },
+       { .name = "tzint", .irq = 59 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_ehrpwm1_hwmod = {
+       .name           = "ehrpwm1",
+       .class          = &am33xx_epwmss_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_ehrpwm1_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_EPWMSS1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* ehrpwm2 */
+static struct omap_hwmod_irq_info am33xx_ehrpwm2_irqs[] = {
+       { .name = "int", .irq = 39 + OMAP_INTC_START, },
+       { .name = "tzint", .irq = 60 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_ehrpwm2_hwmod = {
+       .name           = "ehrpwm2",
+       .class          = &am33xx_epwmss_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_ehrpwm2_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_EPWMSS2_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* ecap0 */
+static struct omap_hwmod_irq_info am33xx_ecap0_irqs[] = {
+       { .irq = 31 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_ecap0_hwmod = {
+       .name           = "ecap0",
+       .class          = &am33xx_epwmss_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_ecap0_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_EPWMSS0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* ecap1 */
+static struct omap_hwmod_irq_info am33xx_ecap1_irqs[] = {
+       { .irq = 47 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_ecap1_hwmod = {
+       .name           = "ecap1",
+       .class          = &am33xx_epwmss_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_ecap1_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_EPWMSS1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* ecap2 */
+static struct omap_hwmod_irq_info am33xx_ecap2_irqs[] = {
+       { .irq = 61 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_ecap2_hwmod = {
+       .name           = "ecap2",
+       .mpu_irqs       = am33xx_ecap2_irqs,
+       .class          = &am33xx_epwmss_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_EPWMSS2_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'gpio' class: for gpio 0,1,2,3
+ */
+static struct omap_hwmod_class_sysconfig am33xx_gpio_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0114,
+       .sysc_flags     = (SYSC_HAS_AUTOIDLE | SYSC_HAS_ENAWAKEUP |
+                         SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
+                         SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                         SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class am33xx_gpio_hwmod_class = {
+       .name           = "gpio",
+       .sysc           = &am33xx_gpio_sysc,
+       .rev            = 2,
+};
+
+static struct omap_gpio_dev_attr gpio_dev_attr = {
+       .bank_width     = 32,
+       .dbck_flag      = true,
+};
+
+/* gpio0 */
+static struct omap_hwmod_opt_clk gpio0_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio0_dbclk" },
+};
+
+static struct omap_hwmod_irq_info am33xx_gpio0_irqs[] = {
+       { .irq = 96 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_gpio0_hwmod = {
+       .name           = "gpio1",
+       .class          = &am33xx_gpio_hwmod_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .mpu_irqs       = am33xx_gpio0_irqs,
+       .main_clk       = "dpll_core_m4_div2_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_GPIO0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .opt_clks       = gpio0_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio0_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio1 */
+static struct omap_hwmod_irq_info am33xx_gpio1_irqs[] = {
+       { .irq = 98 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio1_dbclk" },
+};
+
+static struct omap_hwmod am33xx_gpio1_hwmod = {
+       .name           = "gpio2",
+       .class          = &am33xx_gpio_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .mpu_irqs       = am33xx_gpio1_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_GPIO1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .opt_clks       = gpio1_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio1_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio2 */
+static struct omap_hwmod_irq_info am33xx_gpio2_irqs[] = {
+       { .irq = 32 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio2_dbclk" },
+};
+
+static struct omap_hwmod am33xx_gpio2_hwmod = {
+       .name           = "gpio3",
+       .class          = &am33xx_gpio_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .mpu_irqs       = am33xx_gpio2_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_GPIO2_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .opt_clks       = gpio2_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio2_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpio3 */
+static struct omap_hwmod_irq_info am33xx_gpio3_irqs[] = {
+       { .irq = 62 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_opt_clk gpio3_opt_clks[] = {
+       { .role = "dbclk", .clk = "gpio3_dbclk" },
+};
+
+static struct omap_hwmod am33xx_gpio3_hwmod = {
+       .name           = "gpio4",
+       .class          = &am33xx_gpio_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .flags          = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
+       .mpu_irqs       = am33xx_gpio3_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_GPIO3_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .opt_clks       = gpio3_opt_clks,
+       .opt_clks_cnt   = ARRAY_SIZE(gpio3_opt_clks),
+       .dev_attr       = &gpio_dev_attr,
+};
+
+/* gpmc */
+static struct omap_hwmod_class_sysconfig gpmc_sysc = {
+       .rev_offs       = 0x0,
+       .sysc_offs      = 0x10,
+       .syss_offs      = 0x14,
+       .sysc_flags     = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE |
+                       SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class am33xx_gpmc_hwmod_class = {
+       .name           = "gpmc",
+       .sysc           = &gpmc_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_gpmc_irqs[] = {
+       { .irq = 100 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_gpmc_hwmod = {
+       .name           = "gpmc",
+       .class          = &am33xx_gpmc_hwmod_class,
+       .clkdm_name     = "l3s_clkdm",
+       .flags          = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
+       .mpu_irqs       = am33xx_gpmc_irqs,
+       .main_clk       = "l3s_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_GPMC_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* 'i2c' class */
+static struct omap_hwmod_class_sysconfig am33xx_i2c_sysc = {
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0090,
+       .sysc_flags     = (SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY |
+                         SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
+                         SYSC_HAS_SOFTRESET | SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                         SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class i2c_class = {
+       .name           = "i2c",
+       .sysc           = &am33xx_i2c_sysc,
+       .rev            = OMAP_I2C_IP_VERSION_2,
+       .reset          = &omap_i2c_reset,
+};
+
+static struct omap_i2c_dev_attr i2c_dev_attr = {
+       .flags = OMAP_I2C_FLAG_BUS_SHIFT_NONE |
+                 OMAP_I2C_FLAG_RESET_REGS_POSTIDLE,
+};
+
+/* i2c1 */
+static struct omap_hwmod_irq_info i2c1_mpu_irqs[] = {
+       { .irq = 70 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_dma_info i2c1_edma_reqs[] = {
+       { .name = "tx", .dma_req = 0, },
+       { .name = "rx", .dma_req = 0, },
+       { .dma_req = -1 }
+};
+
+static struct omap_hwmod am33xx_i2c1_hwmod = {
+       .name           = "i2c1",
+       .class          = &i2c_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .mpu_irqs       = i2c1_mpu_irqs,
+       .sdma_reqs      = i2c1_edma_reqs,
+       .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
+       .main_clk       = "dpll_per_m2_div4_wkupdm_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_I2C0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &i2c_dev_attr,
+};
+
+/* i2c1 */
+static struct omap_hwmod_irq_info i2c2_mpu_irqs[] = {
+       { .irq = 71 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_dma_info i2c2_edma_reqs[] = {
+       { .name = "tx", .dma_req = 0, },
+       { .name = "rx", .dma_req = 0, },
+       { .dma_req = -1 }
+};
+
+static struct omap_hwmod am33xx_i2c2_hwmod = {
+       .name           = "i2c2",
+       .class          = &i2c_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = i2c2_mpu_irqs,
+       .sdma_reqs      = i2c2_edma_reqs,
+       .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
+       .main_clk       = "dpll_per_m2_div4_ck",
+       .prcm           = {
+               .omap4 = {
+                       .clkctrl_offs   = AM33XX_CM_PER_I2C1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &i2c_dev_attr,
+};
+
+/* i2c3 */
+static struct omap_hwmod_dma_info i2c3_edma_reqs[] = {
+       { .name = "tx", .dma_req = 0, },
+       { .name = "rx", .dma_req = 0, },
+       { .dma_req = -1 }
+};
+
+static struct omap_hwmod_irq_info i2c3_mpu_irqs[] = {
+       { .irq = 30 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_i2c3_hwmod = {
+       .name           = "i2c3",
+       .class          = &i2c_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = i2c3_mpu_irqs,
+       .sdma_reqs      = i2c3_edma_reqs,
+       .flags          = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT,
+       .main_clk       = "dpll_per_m2_div4_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_I2C2_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &i2c_dev_attr,
+};
+
+
+/* lcdc */
+static struct omap_hwmod_class_sysconfig lcdc_sysc = {
+       .rev_offs       = 0x0,
+       .sysc_offs      = 0x54,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class am33xx_lcdc_hwmod_class = {
+       .name           = "lcdc",
+       .sysc           = &lcdc_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_lcdc_irqs[] = {
+       { .irq = 36 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_lcdc_hwmod = {
+       .name           = "lcdc",
+       .class          = &am33xx_lcdc_hwmod_class,
+       .clkdm_name     = "lcdc_clkdm",
+       .mpu_irqs       = am33xx_lcdc_irqs,
+       .flags          = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
+       .main_clk       = "lcd_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_LCDC_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'mailbox' class
+ * mailbox module allowing communication between the on-chip processors using a
+ * queued mailbox-interrupt mechanism.
+ */
+static struct omap_hwmod_class_sysconfig am33xx_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 am33xx_mailbox_hwmod_class = {
+       .name   = "mailbox",
+       .sysc   = &am33xx_mailbox_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_mailbox_irqs[] = {
+       { .irq = 77 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_mailbox_hwmod = {
+       .name           = "mailbox",
+       .class          = &am33xx_mailbox_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_mailbox_irqs,
+       .main_clk       = "l4ls_gclk",
+       .prcm = {
+               .omap4 = {
+                       .clkctrl_offs   = AM33XX_CM_PER_MAILBOX0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'mcasp' class
+ */
+static struct omap_hwmod_class_sysconfig am33xx_mcasp_sysc = {
+       .rev_offs       = 0x0,
+       .sysc_offs      = 0x4,
+       .sysc_flags     = SYSC_HAS_SIDLEMODE,
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type3,
+};
+
+static struct omap_hwmod_class am33xx_mcasp_hwmod_class = {
+       .name           = "mcasp",
+       .sysc           = &am33xx_mcasp_sysc,
+};
+
+/* mcasp0 */
+static struct omap_hwmod_irq_info am33xx_mcasp0_irqs[] = {
+       { .name = "ax", .irq = 80 + OMAP_INTC_START, },
+       { .name = "ar", .irq = 81 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_dma_info am33xx_mcasp0_edma_reqs[] = {
+       { .name = "tx", .dma_req = 8, },
+       { .name = "rx", .dma_req = 9, },
+       { .dma_req = -1 }
+};
+
+static struct omap_hwmod am33xx_mcasp0_hwmod = {
+       .name           = "mcasp0",
+       .class          = &am33xx_mcasp_hwmod_class,
+       .clkdm_name     = "l3s_clkdm",
+       .mpu_irqs       = am33xx_mcasp0_irqs,
+       .sdma_reqs      = am33xx_mcasp0_edma_reqs,
+       .main_clk       = "mcasp0_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_MCASP0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* mcasp1 */
+static struct omap_hwmod_irq_info am33xx_mcasp1_irqs[] = {
+       { .name = "ax", .irq = 82 + OMAP_INTC_START, },
+       { .name = "ar", .irq = 83 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_dma_info am33xx_mcasp1_edma_reqs[] = {
+       { .name = "tx", .dma_req = 10, },
+       { .name = "rx", .dma_req = 11, },
+       { .dma_req = -1 }
+};
+
+static struct omap_hwmod am33xx_mcasp1_hwmod = {
+       .name           = "mcasp1",
+       .class          = &am33xx_mcasp_hwmod_class,
+       .clkdm_name     = "l3s_clkdm",
+       .mpu_irqs       = am33xx_mcasp1_irqs,
+       .sdma_reqs      = am33xx_mcasp1_edma_reqs,
+       .main_clk       = "mcasp1_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_MCASP1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* 'mmc' class */
+static struct omap_hwmod_class_sysconfig am33xx_mmc_sysc = {
+       .rev_offs       = 0x1fc,
+       .sysc_offs      = 0x10,
+       .syss_offs      = 0x14,
+       .sysc_flags     = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
+                         SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
+                         SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class am33xx_mmc_hwmod_class = {
+       .name           = "mmc",
+       .sysc           = &am33xx_mmc_sysc,
+};
+
+/* mmc0 */
+static struct omap_hwmod_irq_info am33xx_mmc0_irqs[] = {
+       { .irq = 64 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_dma_info am33xx_mmc0_edma_reqs[] = {
+       { .name = "tx", .dma_req = 24, },
+       { .name = "rx", .dma_req = 25, },
+       { .dma_req = -1 }
+};
+
+static struct omap_mmc_dev_attr am33xx_mmc0_dev_attr = {
+       .flags          = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
+};
+
+static struct omap_hwmod am33xx_mmc0_hwmod = {
+       .name           = "mmc1",
+       .class          = &am33xx_mmc_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_mmc0_irqs,
+       .sdma_reqs      = am33xx_mmc0_edma_reqs,
+       .main_clk       = "mmc_clk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_MMC0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &am33xx_mmc0_dev_attr,
+};
+
+/* mmc1 */
+static struct omap_hwmod_irq_info am33xx_mmc1_irqs[] = {
+       { .irq = 28 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_dma_info am33xx_mmc1_edma_reqs[] = {
+       { .name = "tx", .dma_req = 2, },
+       { .name = "rx", .dma_req = 3, },
+       { .dma_req = -1 }
+};
+
+static struct omap_mmc_dev_attr am33xx_mmc1_dev_attr = {
+       .flags          = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
+};
+
+static struct omap_hwmod am33xx_mmc1_hwmod = {
+       .name           = "mmc2",
+       .class          = &am33xx_mmc_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_mmc1_irqs,
+       .sdma_reqs      = am33xx_mmc1_edma_reqs,
+       .main_clk       = "mmc_clk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_MMC1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &am33xx_mmc1_dev_attr,
+};
+
+/* mmc2 */
+static struct omap_hwmod_irq_info am33xx_mmc2_irqs[] = {
+       { .irq = 29 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_dma_info am33xx_mmc2_edma_reqs[] = {
+       { .name = "tx", .dma_req = 64, },
+       { .name = "rx", .dma_req = 65, },
+       { .dma_req = -1 }
+};
+
+static struct omap_mmc_dev_attr am33xx_mmc2_dev_attr = {
+       .flags          = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
+};
+static struct omap_hwmod am33xx_mmc2_hwmod = {
+       .name           = "mmc3",
+       .class          = &am33xx_mmc_hwmod_class,
+       .clkdm_name     = "l3s_clkdm",
+       .mpu_irqs       = am33xx_mmc2_irqs,
+       .sdma_reqs      = am33xx_mmc2_edma_reqs,
+       .main_clk       = "mmc_clk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_MMC2_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &am33xx_mmc2_dev_attr,
+};
+
+/*
+ * 'rtc' class
+ * rtc subsystem
+ */
+static struct omap_hwmod_class_sysconfig am33xx_rtc_sysc = {
+       .rev_offs       = 0x0074,
+       .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 am33xx_rtc_hwmod_class = {
+       .name           = "rtc",
+       .sysc           = &am33xx_rtc_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_rtc_irqs[] = {
+       { .name = "rtcint", .irq = 75 + OMAP_INTC_START, },
+       { .name = "rtcalarmint", .irq = 76 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_rtc_hwmod = {
+       .name           = "rtc",
+       .class          = &am33xx_rtc_hwmod_class,
+       .clkdm_name     = "l4_rtc_clkdm",
+       .mpu_irqs       = am33xx_rtc_irqs,
+       .main_clk       = "clk_32768_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_RTC_RTC_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* 'spi' class */
+static struct omap_hwmod_class_sysconfig am33xx_mcspi_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0110,
+       .syss_offs      = 0x0114,
+       .sysc_flags     = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
+                         SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
+                         SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class am33xx_spi_hwmod_class = {
+       .name           = "mcspi",
+       .sysc           = &am33xx_mcspi_sysc,
+       .rev            = OMAP4_MCSPI_REV,
+};
+
+/* spi0 */
+static struct omap_hwmod_irq_info am33xx_spi0_irqs[] = {
+       { .irq = 65 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_dma_info am33xx_mcspi0_edma_reqs[] = {
+       { .name = "rx0", .dma_req = 17 },
+       { .name = "tx0", .dma_req = 16 },
+       { .name = "rx1", .dma_req = 19 },
+       { .name = "tx1", .dma_req = 18 },
+       { .dma_req = -1 }
+};
+
+static struct omap2_mcspi_dev_attr mcspi_attrib = {
+       .num_chipselect = 2,
+};
+static struct omap_hwmod am33xx_spi0_hwmod = {
+       .name           = "spi0",
+       .class          = &am33xx_spi_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_spi0_irqs,
+       .sdma_reqs      = am33xx_mcspi0_edma_reqs,
+       .main_clk       = "dpll_per_m2_div4_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_SPI0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &mcspi_attrib,
+};
+
+/* spi1 */
+static struct omap_hwmod_irq_info am33xx_spi1_irqs[] = {
+       { .irq = 125 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod_dma_info am33xx_mcspi1_edma_reqs[] = {
+       { .name = "rx0", .dma_req = 43 },
+       { .name = "tx0", .dma_req = 42 },
+       { .name = "rx1", .dma_req = 45 },
+       { .name = "tx1", .dma_req = 44 },
+       { .dma_req = -1 }
+};
+
+static struct omap_hwmod am33xx_spi1_hwmod = {
+       .name           = "spi1",
+       .class          = &am33xx_spi_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_spi1_irqs,
+       .sdma_reqs      = am33xx_mcspi1_edma_reqs,
+       .main_clk       = "dpll_per_m2_div4_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_SPI1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+       .dev_attr       = &mcspi_attrib,
+};
+
+/*
+ * 'spinlock' class
+ * spinlock provides hardware assistance for synchronizing the
+ * processes running on multiple processors
+ */
+static struct omap_hwmod_class am33xx_spinlock_hwmod_class = {
+       .name           = "spinlock",
+};
+
+static struct omap_hwmod am33xx_spinlock_hwmod = {
+       .name           = "spinlock",
+       .class          = &am33xx_spinlock_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .main_clk       = "l4ls_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_SPINLOCK_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* 'timer 2-7' class */
+static struct omap_hwmod_class_sysconfig am33xx_timer_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0014,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                         SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class am33xx_timer_hwmod_class = {
+       .name           = "timer",
+       .sysc           = &am33xx_timer_sysc,
+};
+
+/* timer1 1ms */
+static struct omap_hwmod_class_sysconfig am33xx_timer1ms_sysc = {
+       .rev_offs       = 0x0000,
+       .sysc_offs      = 0x0010,
+       .syss_offs      = 0x0014,
+       .sysc_flags     = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
+                       SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
+                       SYSS_HAS_RESET_STATUS),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class am33xx_timer1ms_hwmod_class = {
+       .name           = "timer",
+       .sysc           = &am33xx_timer1ms_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_timer1_irqs[] = {
+       { .irq = 67 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_timer1_hwmod = {
+       .name           = "timer1",
+       .class          = &am33xx_timer1ms_hwmod_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .mpu_irqs       = am33xx_timer1_irqs,
+       .main_clk       = "timer1_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_TIMER1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_timer2_irqs[] = {
+       { .irq = 68 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_timer2_hwmod = {
+       .name           = "timer2",
+       .class          = &am33xx_timer_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_timer2_irqs,
+       .main_clk       = "timer2_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TIMER2_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_timer3_irqs[] = {
+       { .irq = 69 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_timer3_hwmod = {
+       .name           = "timer3",
+       .class          = &am33xx_timer_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_timer3_irqs,
+       .main_clk       = "timer3_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TIMER3_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_timer4_irqs[] = {
+       { .irq = 92 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_timer4_hwmod = {
+       .name           = "timer4",
+       .class          = &am33xx_timer_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_timer4_irqs,
+       .main_clk       = "timer4_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TIMER4_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_timer5_irqs[] = {
+       { .irq = 93 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_timer5_hwmod = {
+       .name           = "timer5",
+       .class          = &am33xx_timer_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_timer5_irqs,
+       .main_clk       = "timer5_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TIMER5_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_timer6_irqs[] = {
+       { .irq = 94 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_timer6_hwmod = {
+       .name           = "timer6",
+       .class          = &am33xx_timer_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_timer6_irqs,
+       .main_clk       = "timer6_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TIMER6_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_timer7_irqs[] = {
+       { .irq = 95 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_timer7_hwmod = {
+       .name           = "timer7",
+       .class          = &am33xx_timer_hwmod_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_timer7_irqs,
+       .main_clk       = "timer7_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TIMER7_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* tpcc */
+static struct omap_hwmod_class am33xx_tpcc_hwmod_class = {
+       .name           = "tpcc",
+};
+
+static struct omap_hwmod_irq_info am33xx_tpcc_irqs[] = {
+       { .name = "edma0", .irq = 12 + OMAP_INTC_START, },
+       { .name = "edma0_mperr", .irq = 13 + OMAP_INTC_START, },
+       { .name = "edma0_err", .irq = 14 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_tpcc_hwmod = {
+       .name           = "tpcc",
+       .class          = &am33xx_tpcc_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .mpu_irqs       = am33xx_tpcc_irqs,
+       .main_clk       = "l3_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TPCC_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_class_sysconfig am33xx_tptc_sysc = {
+       .rev_offs       = 0x0,
+       .sysc_offs      = 0x10,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
+                         SYSC_HAS_MIDLEMODE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_SMART | MSTANDBY_FORCE),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+/* 'tptc' class */
+static struct omap_hwmod_class am33xx_tptc_hwmod_class = {
+       .name           = "tptc",
+       .sysc           = &am33xx_tptc_sysc,
+};
+
+/* tptc0 */
+static struct omap_hwmod_irq_info am33xx_tptc0_irqs[] = {
+       { .irq = 112 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_tptc0_hwmod = {
+       .name           = "tptc0",
+       .class          = &am33xx_tptc_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .mpu_irqs       = am33xx_tptc0_irqs,
+       .main_clk       = "l3_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TPTC0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* tptc1 */
+static struct omap_hwmod_irq_info am33xx_tptc1_irqs[] = {
+       { .irq = 113 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_tptc1_hwmod = {
+       .name           = "tptc1",
+       .class          = &am33xx_tptc_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .mpu_irqs       = am33xx_tptc1_irqs,
+       .flags          = (HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY),
+       .main_clk       = "l3_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TPTC1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* tptc2 */
+static struct omap_hwmod_irq_info am33xx_tptc2_irqs[] = {
+       { .irq = 114 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_tptc2_hwmod = {
+       .name           = "tptc2",
+       .class          = &am33xx_tptc_hwmod_class,
+       .clkdm_name     = "l3_clkdm",
+       .mpu_irqs       = am33xx_tptc2_irqs,
+       .flags          = (HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY),
+       .main_clk       = "l3_gclk",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_TPTC2_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* 'uart' class */
+static struct omap_hwmod_class_sysconfig uart_sysc = {
+       .rev_offs       = 0x50,
+       .sysc_offs      = 0x54,
+       .syss_offs      = 0x58,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP |
+                         SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                         SIDLE_SMART_WKUP),
+       .sysc_fields    = &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class uart_class = {
+       .name           = "uart",
+       .sysc           = &uart_sysc,
+};
+
+/* uart1 */
+static struct omap_hwmod_dma_info uart1_edma_reqs[] = {
+       { .name = "tx", .dma_req = 26, },
+       { .name = "rx", .dma_req = 27, },
+       { .dma_req = -1 }
+};
+
+static struct omap_hwmod_irq_info am33xx_uart1_irqs[] = {
+       { .irq = 72 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_uart1_hwmod = {
+       .name           = "uart1",
+       .class          = &uart_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .mpu_irqs       = am33xx_uart1_irqs,
+       .sdma_reqs      = uart1_edma_reqs,
+       .main_clk       = "dpll_per_m2_div4_wkupdm_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_UART0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_uart2_irqs[] = {
+       { .irq = 73 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_uart2_hwmod = {
+       .name           = "uart2",
+       .class          = &uart_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_uart2_irqs,
+       .sdma_reqs      = uart1_edma_reqs,
+       .main_clk       = "dpll_per_m2_div4_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_UART1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* uart3 */
+static struct omap_hwmod_dma_info uart3_edma_reqs[] = {
+       { .name = "tx", .dma_req = 30, },
+       { .name = "rx", .dma_req = 31, },
+       { .dma_req = -1 }
+};
+
+static struct omap_hwmod_irq_info am33xx_uart3_irqs[] = {
+       { .irq = 74 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_uart3_hwmod = {
+       .name           = "uart3",
+       .class          = &uart_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_uart3_irqs,
+       .sdma_reqs      = uart3_edma_reqs,
+       .main_clk       = "dpll_per_m2_div4_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_UART2_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_uart4_irqs[] = {
+       { .irq = 44 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_uart4_hwmod = {
+       .name           = "uart4",
+       .class          = &uart_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_uart4_irqs,
+       .sdma_reqs      = uart1_edma_reqs,
+       .main_clk       = "dpll_per_m2_div4_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_UART3_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_uart5_irqs[] = {
+       { .irq = 45 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_uart5_hwmod = {
+       .name           = "uart5",
+       .class          = &uart_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_uart5_irqs,
+       .sdma_reqs      = uart1_edma_reqs,
+       .main_clk       = "dpll_per_m2_div4_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_UART4_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+static struct omap_hwmod_irq_info am33xx_uart6_irqs[] = {
+       { .irq = 46 + OMAP_INTC_START, },
+       { .irq = -1 },
+};
+
+static struct omap_hwmod am33xx_uart6_hwmod = {
+       .name           = "uart6",
+       .class          = &uart_class,
+       .clkdm_name     = "l4ls_clkdm",
+       .mpu_irqs       = am33xx_uart6_irqs,
+       .sdma_reqs      = uart1_edma_reqs,
+       .main_clk       = "dpll_per_m2_div4_ck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_UART5_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/* 'wd_timer' class */
+static struct omap_hwmod_class am33xx_wd_timer_hwmod_class = {
+       .name           = "wd_timer",
+};
+
+/*
+ * XXX: device.c file uses hardcoded name for watchdog timer
+ * driver "wd_timer2, so we are also using same name as of now...
+ */
+static struct omap_hwmod am33xx_wd_timer1_hwmod = {
+       .name           = "wd_timer2",
+       .class          = &am33xx_wd_timer_hwmod_class,
+       .clkdm_name     = "l4_wkup_clkdm",
+       .main_clk       = "wdt1_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_WKUP_WDT1_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+/*
+ * 'usb_otg' class
+ * high-speed on-the-go universal serial bus (usb_otg) controller
+ */
+static struct omap_hwmod_class_sysconfig am33xx_usbhsotg_sysc = {
+       .rev_offs       = 0x0,
+       .sysc_offs      = 0x10,
+       .sysc_flags     = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE),
+       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+                         MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
+       .sysc_fields    = &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class am33xx_usbotg_class = {
+       .name           = "usbotg",
+       .sysc           = &am33xx_usbhsotg_sysc,
+};
+
+static struct omap_hwmod_irq_info am33xx_usbss_mpu_irqs[] = {
+       { .name = "usbss-irq", .irq = 17 + OMAP_INTC_START, },
+       { .name = "musb0-irq", .irq = 18 + OMAP_INTC_START, },
+       { .name = "musb1-irq", .irq = 19 + OMAP_INTC_START, },
+       { .irq = -1 + OMAP_INTC_START, },
+};
+
+static struct omap_hwmod am33xx_usbss_hwmod = {
+       .name           = "usb_otg_hs",
+       .class          = &am33xx_usbotg_class,
+       .clkdm_name     = "l3s_clkdm",
+       .mpu_irqs       = am33xx_usbss_mpu_irqs,
+       .flags          = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
+       .main_clk       = "usbotg_fck",
+       .prcm           = {
+               .omap4  = {
+                       .clkctrl_offs   = AM33XX_CM_PER_USB0_CLKCTRL_OFFSET,
+                       .modulemode     = MODULEMODE_SWCTRL,
+               },
+       },
+};
+
+
+/*
+ * Interfaces
+ */
+
+/* l4 fw -> emif fw */
+static struct omap_hwmod_ocp_if am33xx_l4_fw__emif_fw = {
+       .master         = &am33xx_l4_fw_hwmod,
+       .slave          = &am33xx_emif_fw_hwmod,
+       .clk            = "l4fw_gclk",
+       .user           = OCP_USER_MPU,
+};
+
+static struct omap_hwmod_addr_space am33xx_emif_addrs[] = {
+       {
+               .pa_start       = 0x4c000000,
+               .pa_end         = 0x4c000fff,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+/* l3 main -> emif */
+static struct omap_hwmod_ocp_if am33xx_l3_main__emif = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_emif_hwmod,
+       .clk            = "dpll_core_m4_ck",
+       .addr           = am33xx_emif_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* mpu -> l3 main */
+static struct omap_hwmod_ocp_if am33xx_mpu__l3_main = {
+       .master         = &am33xx_mpu_hwmod,
+       .slave          = &am33xx_l3_main_hwmod,
+       .clk            = "dpll_mpu_m2_ck",
+       .user           = OCP_USER_MPU,
+};
+
+/* l3 main -> l4 hs */
+static struct omap_hwmod_ocp_if am33xx_l3_main__l4_hs = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_l4_hs_hwmod,
+       .clk            = "l3s_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3 main -> l3 s */
+static struct omap_hwmod_ocp_if am33xx_l3_main__l3_s = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_l3_s_hwmod,
+       .clk            = "l3s_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3 s -> l4 per/ls */
+static struct omap_hwmod_ocp_if am33xx_l3_s__l4_ls = {
+       .master         = &am33xx_l3_s_hwmod,
+       .slave          = &am33xx_l4_ls_hwmod,
+       .clk            = "l3s_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3 s -> l4 wkup */
+static struct omap_hwmod_ocp_if am33xx_l3_s__l4_wkup = {
+       .master         = &am33xx_l3_s_hwmod,
+       .slave          = &am33xx_l4_wkup_hwmod,
+       .clk            = "l3s_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3 s -> l4 fw */
+static struct omap_hwmod_ocp_if am33xx_l3_s__l4_fw = {
+       .master         = &am33xx_l3_s_hwmod,
+       .slave          = &am33xx_l4_fw_hwmod,
+       .clk            = "l3s_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3 main -> l3 instr */
+static struct omap_hwmod_ocp_if am33xx_l3_main__l3_instr = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_l3_instr_hwmod,
+       .clk            = "l3s_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* mpu -> prcm */
+static struct omap_hwmod_ocp_if am33xx_mpu__prcm = {
+       .master         = &am33xx_mpu_hwmod,
+       .slave          = &am33xx_prcm_hwmod,
+       .clk            = "dpll_mpu_m2_ck",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3 s -> l3 main*/
+static struct omap_hwmod_ocp_if am33xx_l3_s__l3_main = {
+       .master         = &am33xx_l3_s_hwmod,
+       .slave          = &am33xx_l3_main_hwmod,
+       .clk            = "l3s_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* pru-icss -> l3 main */
+static struct omap_hwmod_ocp_if am33xx_pruss__l3_main = {
+       .master         = &am33xx_pruss_hwmod,
+       .slave          = &am33xx_l3_main_hwmod,
+       .clk            = "l3_gclk",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* wkup m3 -> l4 wkup */
+static struct omap_hwmod_ocp_if am33xx_wkup_m3__l4_wkup = {
+       .master         = &am33xx_wkup_m3_hwmod,
+       .slave          = &am33xx_l4_wkup_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* gfx -> l3 main */
+static struct omap_hwmod_ocp_if am33xx_gfx__l3_main = {
+       .master         = &am33xx_gfx_hwmod,
+       .slave          = &am33xx_l3_main_hwmod,
+       .clk            = "dpll_core_m4_ck",
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4 wkup -> wkup m3 */
+static struct omap_hwmod_addr_space am33xx_wkup_m3_addrs[] = {
+       {
+               .name           = "umem",
+               .pa_start       = 0x44d00000,
+               .pa_end         = 0x44d00000 + SZ_16K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       {
+               .name           = "dmem",
+               .pa_start       = 0x44d80000,
+               .pa_end         = 0x44d80000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__wkup_m3 = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_wkup_m3_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_wkup_m3_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4 hs -> pru-icss */
+static struct omap_hwmod_addr_space am33xx_pruss_addrs[] = {
+       {
+               .pa_start       = 0x4a300000,
+               .pa_end         = 0x4a300000 + SZ_512K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_hs__pruss = {
+       .master         = &am33xx_l4_hs_hwmod,
+       .slave          = &am33xx_pruss_hwmod,
+       .clk            = "dpll_core_m4_ck",
+       .addr           = am33xx_pruss_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l3 main -> gfx */
+static struct omap_hwmod_addr_space am33xx_gfx_addrs[] = {
+       {
+               .pa_start       = 0x56000000,
+               .pa_end         = 0x56000000 + SZ_16M - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_main__gfx = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_gfx_hwmod,
+       .clk            = "dpll_core_m4_ck",
+       .addr           = am33xx_gfx_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4 wkup -> smartreflex0 */
+static struct omap_hwmod_addr_space am33xx_smartreflex0_addrs[] = {
+       {
+               .pa_start       = 0x44e37000,
+               .pa_end         = 0x44e37000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__smartreflex0 = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_smartreflex0_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_smartreflex0_addrs,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 wkup -> smartreflex1 */
+static struct omap_hwmod_addr_space am33xx_smartreflex1_addrs[] = {
+       {
+               .pa_start       = 0x44e39000,
+               .pa_end         = 0x44e39000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__smartreflex1 = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_smartreflex1_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_smartreflex1_addrs,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 wkup -> control */
+static struct omap_hwmod_addr_space am33xx_control_addrs[] = {
+       {
+               .pa_start       = 0x44e10000,
+               .pa_end         = 0x44e10000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__control = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_control_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_control_addrs,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 wkup -> rtc */
+static struct omap_hwmod_addr_space am33xx_rtc_addrs[] = {
+       {
+               .pa_start       = 0x44e3e000,
+               .pa_end         = 0x44e3e000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__rtc = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_rtc_hwmod,
+       .clk            = "clkdiv32k_ick",
+       .addr           = am33xx_rtc_addrs,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 per/ls -> DCAN0 */
+static struct omap_hwmod_addr_space am33xx_dcan0_addrs[] = {
+       {
+               .pa_start       = 0x481CC000,
+               .pa_end         = 0x481CC000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_per__dcan0 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_dcan0_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_dcan0_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4 per/ls -> DCAN1 */
+static struct omap_hwmod_addr_space am33xx_dcan1_addrs[] = {
+       {
+               .pa_start       = 0x481D0000,
+               .pa_end         = 0x481D0000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_per__dcan1 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_dcan1_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_dcan1_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4 per/ls -> GPIO2 */
+static struct omap_hwmod_addr_space am33xx_gpio1_addrs[] = {
+       {
+               .pa_start       = 0x4804C000,
+               .pa_end         = 0x4804C000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_per__gpio1 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_gpio1_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_gpio1_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4 per/ls -> gpio3 */
+static struct omap_hwmod_addr_space am33xx_gpio2_addrs[] = {
+       {
+               .pa_start       = 0x481AC000,
+               .pa_end         = 0x481AC000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_per__gpio2 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_gpio2_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_gpio2_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* l4 per/ls -> gpio4 */
+static struct omap_hwmod_addr_space am33xx_gpio3_addrs[] = {
+       {
+               .pa_start       = 0x481AE000,
+               .pa_end         = 0x481AE000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_per__gpio3 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_gpio3_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_gpio3_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* L4 WKUP -> I2C1 */
+static struct omap_hwmod_addr_space am33xx_i2c1_addr_space[] = {
+       {
+               .pa_start       = 0x44E0B000,
+               .pa_end         = 0x44E0B000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__i2c1 = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_i2c1_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_i2c1_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* L4 WKUP -> GPIO1 */
+static struct omap_hwmod_addr_space am33xx_gpio0_addrs[] = {
+       {
+               .pa_start       = 0x44E07000,
+               .pa_end         = 0x44E07000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__gpio0 = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_gpio0_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_gpio0_addrs,
+       .user           = OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+/* L4 WKUP -> ADC_TSC */
+static struct omap_hwmod_addr_space am33xx_adc_tsc_addrs[] = {
+       {
+               .pa_start       = 0x44E0D000,
+               .pa_end         = 0x44E0D000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__adc_tsc = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_adc_tsc_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_adc_tsc_addrs,
+       .user           = OCP_USER_MPU,
+};
+
+static struct omap_hwmod_addr_space am33xx_cpgmac0_addr_space[] = {
+       /* cpsw ss */
+       {
+               .pa_start       = 0x4a100000,
+               .pa_end         = 0x4a100000 + SZ_2K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       /* cpsw wr */
+       {
+               .pa_start       = 0x4a101200,
+               .pa_end         = 0x4a101200 + SZ_256 - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_hs__cpgmac0 = {
+       .master         = &am33xx_l4_hs_hwmod,
+       .slave          = &am33xx_cpgmac0_hwmod,
+       .clk            = "cpsw_125mhz_gclk",
+       .addr           = am33xx_cpgmac0_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+static struct omap_hwmod_addr_space am33xx_elm_addr_space[] = {
+       {
+               .pa_start       = 0x48080000,
+               .pa_end         = 0x48080000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__elm = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_elm_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_elm_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/*
+ * Splitting the resources to handle access of PWMSS config space
+ * and module specific part independently
+ */
+static struct omap_hwmod_addr_space am33xx_ehrpwm0_addr_space[] = {
+       {
+               .pa_start       = 0x48300000,
+               .pa_end         = 0x48300000 + SZ_16 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       {
+               .pa_start       = 0x48300200,
+               .pa_end         = 0x48300200 + SZ_256 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__ehrpwm0 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_ehrpwm0_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_ehrpwm0_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/*
+ * Splitting the resources to handle access of PWMSS config space
+ * and module specific part independently
+ */
+static struct omap_hwmod_addr_space am33xx_ehrpwm1_addr_space[] = {
+       {
+               .pa_start       = 0x48302000,
+               .pa_end         = 0x48302000 + SZ_16 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       {
+               .pa_start       = 0x48302200,
+               .pa_end         = 0x48302200 + SZ_256 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__ehrpwm1 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_ehrpwm1_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_ehrpwm1_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/*
+ * Splitting the resources to handle access of PWMSS config space
+ * and module specific part independently
+ */
+static struct omap_hwmod_addr_space am33xx_ehrpwm2_addr_space[] = {
+       {
+               .pa_start       = 0x48304000,
+               .pa_end         = 0x48304000 + SZ_16 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       {
+               .pa_start       = 0x48304200,
+               .pa_end         = 0x48304200 + SZ_256 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__ehrpwm2 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_ehrpwm2_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_ehrpwm2_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/*
+ * Splitting the resources to handle access of PWMSS config space
+ * and module specific part independently
+ */
+static struct omap_hwmod_addr_space am33xx_ecap0_addr_space[] = {
+       {
+               .pa_start       = 0x48300000,
+               .pa_end         = 0x48300000 + SZ_16 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       {
+               .pa_start       = 0x48300100,
+               .pa_end         = 0x48300100 + SZ_256 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__ecap0 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_ecap0_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_ecap0_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/*
+ * Splitting the resources to handle access of PWMSS config space
+ * and module specific part independently
+ */
+static struct omap_hwmod_addr_space am33xx_ecap1_addr_space[] = {
+       {
+               .pa_start       = 0x48302000,
+               .pa_end         = 0x48302000 + SZ_16 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       {
+               .pa_start       = 0x48302100,
+               .pa_end         = 0x48302100 + SZ_256 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__ecap1 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_ecap1_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_ecap1_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/*
+ * Splitting the resources to handle access of PWMSS config space
+ * and module specific part independently
+ */
+static struct omap_hwmod_addr_space am33xx_ecap2_addr_space[] = {
+       {
+               .pa_start       = 0x48304000,
+               .pa_end         = 0x48304000 + SZ_16 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       {
+               .pa_start       = 0x48304100,
+               .pa_end         = 0x48304100 + SZ_256 - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__ecap2 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_ecap2_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_ecap2_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l3s cfg -> gpmc */
+static struct omap_hwmod_addr_space am33xx_gpmc_addr_space[] = {
+       {
+               .pa_start       = 0x50000000,
+               .pa_end         = 0x50000000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_s__gpmc = {
+       .master         = &am33xx_l3_s_hwmod,
+       .slave          = &am33xx_gpmc_hwmod,
+       .clk            = "l3s_gclk",
+       .addr           = am33xx_gpmc_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* i2c2 */
+static struct omap_hwmod_addr_space am33xx_i2c2_addr_space[] = {
+       {
+               .pa_start       = 0x4802A000,
+               .pa_end         = 0x4802A000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_per__i2c2 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_i2c2_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_i2c2_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+static struct omap_hwmod_addr_space am33xx_i2c3_addr_space[] = {
+       {
+               .pa_start       = 0x4819C000,
+               .pa_end         = 0x4819C000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_per__i2c3 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_i2c3_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_i2c3_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+static struct omap_hwmod_addr_space am33xx_lcdc_addr_space[] = {
+       {
+               .pa_start       = 0x4830E000,
+               .pa_end         = 0x4830E000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_main__lcdc = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_lcdc_hwmod,
+       .clk            = "dpll_core_m4_ck",
+       .addr           = am33xx_lcdc_addr_space,
+       .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 */
+static 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,
+};
+
+/* l4 ls -> spinlock */
+static struct omap_hwmod_addr_space am33xx_spinlock_addrs[] = {
+       {
+               .pa_start       = 0x480Ca000,
+               .pa_end         = 0x480Ca000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__spinlock = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_spinlock_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_spinlock_addrs,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 ls -> mcasp0 */
+static struct omap_hwmod_addr_space am33xx_mcasp0_addr_space[] = {
+       {
+               .pa_start       = 0x48038000,
+               .pa_end         = 0x48038000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__mcasp0 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_mcasp0_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_mcasp0_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l3 s -> mcasp0 data */
+static struct omap_hwmod_addr_space am33xx_mcasp0_data_addr_space[] = {
+       {
+               .pa_start       = 0x46000000,
+               .pa_end         = 0x46000000 + SZ_4M - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_s__mcasp0_data = {
+       .master         = &am33xx_l3_s_hwmod,
+       .slave          = &am33xx_mcasp0_hwmod,
+       .clk            = "l3s_gclk",
+       .addr           = am33xx_mcasp0_data_addr_space,
+       .user           = OCP_USER_SDMA,
+};
+
+/* l4 ls -> mcasp1 */
+static struct omap_hwmod_addr_space am33xx_mcasp1_addr_space[] = {
+       {
+               .pa_start       = 0x4803C000,
+               .pa_end         = 0x4803C000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__mcasp1 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_mcasp1_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_mcasp1_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l3 s -> mcasp1 data */
+static struct omap_hwmod_addr_space am33xx_mcasp1_data_addr_space[] = {
+       {
+               .pa_start       = 0x46400000,
+               .pa_end         = 0x46400000 + SZ_4M - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_s__mcasp1_data = {
+       .master         = &am33xx_l3_s_hwmod,
+       .slave          = &am33xx_mcasp1_hwmod,
+       .clk            = "l3s_gclk",
+       .addr           = am33xx_mcasp1_data_addr_space,
+       .user           = OCP_USER_SDMA,
+};
+
+/* l4 ls -> mmc0 */
+static struct omap_hwmod_addr_space am33xx_mmc0_addr_space[] = {
+       {
+               .pa_start       = 0x48060100,
+               .pa_end         = 0x48060100 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__mmc0 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_mmc0_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_mmc0_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 ls -> mmc1 */
+static struct omap_hwmod_addr_space am33xx_mmc1_addr_space[] = {
+       {
+               .pa_start       = 0x481d8100,
+               .pa_end         = 0x481d8100 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__mmc1 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_mmc1_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_mmc1_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l3 s -> mmc2 */
+static struct omap_hwmod_addr_space am33xx_mmc2_addr_space[] = {
+       {
+               .pa_start       = 0x47810100,
+               .pa_end         = 0x47810100 + SZ_64K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_s__mmc2 = {
+       .master         = &am33xx_l3_s_hwmod,
+       .slave          = &am33xx_mmc2_hwmod,
+       .clk            = "l3s_gclk",
+       .addr           = am33xx_mmc2_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 ls -> mcspi0 */
+static struct omap_hwmod_addr_space am33xx_mcspi0_addr_space[] = {
+       {
+               .pa_start       = 0x48030000,
+               .pa_end         = 0x48030000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__mcspi0 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_spi0_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_mcspi0_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 ls -> mcspi1 */
+static struct omap_hwmod_addr_space am33xx_mcspi1_addr_space[] = {
+       {
+               .pa_start       = 0x481A0000,
+               .pa_end         = 0x481A0000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__mcspi1 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_spi1_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_mcspi1_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 wkup -> timer1 */
+static struct omap_hwmod_addr_space am33xx_timer1_addr_space[] = {
+       {
+               .pa_start       = 0x44E31000,
+               .pa_end         = 0x44E31000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__timer1 = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_timer1_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_timer1_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 per -> timer2 */
+static struct omap_hwmod_addr_space am33xx_timer2_addr_space[] = {
+       {
+               .pa_start       = 0x48040000,
+               .pa_end         = 0x48040000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__timer2 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_timer2_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_timer2_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 per -> timer3 */
+static struct omap_hwmod_addr_space am33xx_timer3_addr_space[] = {
+       {
+               .pa_start       = 0x48042000,
+               .pa_end         = 0x48042000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__timer3 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_timer3_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_timer3_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 per -> timer4 */
+static struct omap_hwmod_addr_space am33xx_timer4_addr_space[] = {
+       {
+               .pa_start       = 0x48044000,
+               .pa_end         = 0x48044000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__timer4 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_timer4_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_timer4_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 per -> timer5 */
+static struct omap_hwmod_addr_space am33xx_timer5_addr_space[] = {
+       {
+               .pa_start       = 0x48046000,
+               .pa_end         = 0x48046000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__timer5 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_timer5_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_timer5_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 per -> timer6 */
+static struct omap_hwmod_addr_space am33xx_timer6_addr_space[] = {
+       {
+               .pa_start       = 0x48048000,
+               .pa_end         = 0x48048000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__timer6 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_timer6_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_timer6_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 per -> timer7 */
+static struct omap_hwmod_addr_space am33xx_timer7_addr_space[] = {
+       {
+               .pa_start       = 0x4804A000,
+               .pa_end         = 0x4804A000 + SZ_1K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__timer7 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_timer7_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_timer7_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l3 main -> tpcc */
+static struct omap_hwmod_addr_space am33xx_tpcc_addr_space[] = {
+       {
+               .pa_start       = 0x49000000,
+               .pa_end         = 0x49000000 + SZ_32K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_main__tpcc = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_tpcc_hwmod,
+       .clk            = "l3_gclk",
+       .addr           = am33xx_tpcc_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l3 main -> tpcc0 */
+static struct omap_hwmod_addr_space am33xx_tptc0_addr_space[] = {
+       {
+               .pa_start       = 0x49800000,
+               .pa_end         = 0x49800000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_main__tptc0 = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_tptc0_hwmod,
+       .clk            = "l3_gclk",
+       .addr           = am33xx_tptc0_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l3 main -> tpcc1 */
+static struct omap_hwmod_addr_space am33xx_tptc1_addr_space[] = {
+       {
+               .pa_start       = 0x49900000,
+               .pa_end         = 0x49900000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_main__tptc1 = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_tptc1_hwmod,
+       .clk            = "l3_gclk",
+       .addr           = am33xx_tptc1_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l3 main -> tpcc2 */
+static struct omap_hwmod_addr_space am33xx_tptc2_addr_space[] = {
+       {
+               .pa_start       = 0x49a00000,
+               .pa_end         = 0x49a00000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_main__tptc2 = {
+       .master         = &am33xx_l3_main_hwmod,
+       .slave          = &am33xx_tptc2_hwmod,
+       .clk            = "l3_gclk",
+       .addr           = am33xx_tptc2_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 wkup -> uart1 */
+static struct omap_hwmod_addr_space am33xx_uart1_addr_space[] = {
+       {
+               .pa_start       = 0x44E09000,
+               .pa_end         = 0x44E09000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__uart1 = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_uart1_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_uart1_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 ls -> uart2 */
+static struct omap_hwmod_addr_space am33xx_uart2_addr_space[] = {
+       {
+               .pa_start       = 0x48022000,
+               .pa_end         = 0x48022000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__uart2 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_uart2_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_uart2_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 ls -> uart3 */
+static struct omap_hwmod_addr_space am33xx_uart3_addr_space[] = {
+       {
+               .pa_start       = 0x48024000,
+               .pa_end         = 0x48024000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__uart3 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_uart3_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_uart3_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 ls -> uart4 */
+static struct omap_hwmod_addr_space am33xx_uart4_addr_space[] = {
+       {
+               .pa_start       = 0x481A6000,
+               .pa_end         = 0x481A6000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__uart4 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_uart4_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_uart4_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 ls -> uart5 */
+static struct omap_hwmod_addr_space am33xx_uart5_addr_space[] = {
+       {
+               .pa_start       = 0x481A8000,
+               .pa_end         = 0x481A8000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__uart5 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_uart5_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_uart5_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 ls -> uart6 */
+static struct omap_hwmod_addr_space am33xx_uart6_addr_space[] = {
+       {
+               .pa_start       = 0x481aa000,
+               .pa_end         = 0x481aa000 + SZ_8K - 1,
+               .flags          = ADDR_TYPE_RT,
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_ls__uart6 = {
+       .master         = &am33xx_l4_ls_hwmod,
+       .slave          = &am33xx_uart6_hwmod,
+       .clk            = "l4ls_gclk",
+       .addr           = am33xx_uart6_addr_space,
+       .user           = OCP_USER_MPU,
+};
+
+/* l4 wkup -> wd_timer1 */
+static struct omap_hwmod_addr_space am33xx_wd_timer1_addrs[] = {
+       {
+               .pa_start       = 0x44e35000,
+               .pa_end         = 0x44e35000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l4_wkup__wd_timer1 = {
+       .master         = &am33xx_l4_wkup_hwmod,
+       .slave          = &am33xx_wd_timer1_hwmod,
+       .clk            = "dpll_core_m4_div2_ck",
+       .addr           = am33xx_wd_timer1_addrs,
+       .user           = OCP_USER_MPU,
+};
+
+/* usbss */
+/* l3 s -> USBSS interface */
+static struct omap_hwmod_addr_space am33xx_usbss_addr_space[] = {
+       {
+               .name           = "usbss",
+               .pa_start       = 0x47400000,
+               .pa_end         = 0x47400000 + SZ_4K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       {
+               .name           = "musb0",
+               .pa_start       = 0x47401000,
+               .pa_end         = 0x47401000 + SZ_2K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       {
+               .name           = "musb1",
+               .pa_start       = 0x47401800,
+               .pa_end         = 0x47401800 + SZ_2K - 1,
+               .flags          = ADDR_TYPE_RT
+       },
+       { }
+};
+
+static struct omap_hwmod_ocp_if am33xx_l3_s__usbss = {
+       .master         = &am33xx_l3_s_hwmod,
+       .slave          = &am33xx_usbss_hwmod,
+       .clk            = "l3s_gclk",
+       .addr           = am33xx_usbss_addr_space,
+       .user           = OCP_USER_MPU,
+       .flags          = OCPIF_SWSUP_IDLE,
+};
+
+static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = {
+       &am33xx_l4_fw__emif_fw,
+       &am33xx_l3_main__emif,
+       &am33xx_mpu__l3_main,
+       &am33xx_mpu__prcm,
+       &am33xx_l3_s__l4_ls,
+       &am33xx_l3_s__l4_wkup,
+       &am33xx_l3_s__l4_fw,
+       &am33xx_l3_main__l4_hs,
+       &am33xx_l3_main__l3_s,
+       &am33xx_l3_main__l3_instr,
+       &am33xx_l3_main__gfx,
+       &am33xx_l3_s__l3_main,
+       &am33xx_pruss__l3_main,
+       &am33xx_wkup_m3__l4_wkup,
+       &am33xx_gfx__l3_main,
+       &am33xx_l4_wkup__wkup_m3,
+       &am33xx_l4_wkup__control,
+       &am33xx_l4_wkup__smartreflex0,
+       &am33xx_l4_wkup__smartreflex1,
+       &am33xx_l4_wkup__uart1,
+       &am33xx_l4_wkup__timer1,
+       &am33xx_l4_wkup__rtc,
+       &am33xx_l4_wkup__i2c1,
+       &am33xx_l4_wkup__gpio0,
+       &am33xx_l4_wkup__adc_tsc,
+       &am33xx_l4_wkup__wd_timer1,
+       &am33xx_l4_hs__pruss,
+       &am33xx_l4_per__dcan0,
+       &am33xx_l4_per__dcan1,
+       &am33xx_l4_per__gpio1,
+       &am33xx_l4_per__gpio2,
+       &am33xx_l4_per__gpio3,
+       &am33xx_l4_per__i2c2,
+       &am33xx_l4_per__i2c3,
+       &am33xx_l4_per__mailbox,
+       &am33xx_l4_ls__mcasp0,
+       &am33xx_l3_s__mcasp0_data,
+       &am33xx_l4_ls__mcasp1,
+       &am33xx_l3_s__mcasp1_data,
+       &am33xx_l4_ls__mmc0,
+       &am33xx_l4_ls__mmc1,
+       &am33xx_l3_s__mmc2,
+       &am33xx_l4_ls__timer2,
+       &am33xx_l4_ls__timer3,
+       &am33xx_l4_ls__timer4,
+       &am33xx_l4_ls__timer5,
+       &am33xx_l4_ls__timer6,
+       &am33xx_l4_ls__timer7,
+       &am33xx_l3_main__tpcc,
+       &am33xx_l4_ls__uart2,
+       &am33xx_l4_ls__uart3,
+       &am33xx_l4_ls__uart4,
+       &am33xx_l4_ls__uart5,
+       &am33xx_l4_ls__uart6,
+       &am33xx_l4_ls__spinlock,
+       &am33xx_l4_ls__elm,
+       &am33xx_l4_ls__ehrpwm0,
+       &am33xx_l4_ls__ehrpwm1,
+       &am33xx_l4_ls__ehrpwm2,
+       &am33xx_l4_ls__ecap0,
+       &am33xx_l4_ls__ecap1,
+       &am33xx_l4_ls__ecap2,
+       &am33xx_l3_s__gpmc,
+       &am33xx_l3_main__lcdc,
+       &am33xx_l4_ls__mcspi0,
+       &am33xx_l4_ls__mcspi1,
+       &am33xx_l3_main__tptc0,
+       &am33xx_l3_main__tptc1,
+       &am33xx_l3_main__tptc2,
+       &am33xx_l3_s__usbss,
+       &am33xx_l4_hs__cpgmac0,
+       NULL,
+};
+
+int __init am33xx_hwmod_init(void)
+{
+       omap_hwmod_init();
+       return omap_hwmod_register_links(am33xx_hwmod_ocp_ifs);
+}
index c9e3820..94b38af 100644 (file)
  * XXX these should be marked initdata for multi-OMAP kernels
  */
 #include <linux/power/smartreflex.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <plat/omap_hwmod.h>
-#include <mach/irqs.h>
-#include <plat/cpu.h>
 #include <plat/dma.h>
 #include <plat/serial.h>
-#include <plat/l3_3xxx.h>
-#include <plat/l4_3xxx.h>
+#include "l3_3xxx.h"
+#include "l4_3xxx.h"
 #include <plat/i2c.h>
-#include <plat/gpio.h>
 #include <plat/mmc.h>
-#include <plat/mcbsp.h>
-#include <plat/mcspi.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 #include <plat/dmtimer.h>
 
+#include "am35xx.h"
+
+#include "soc.h"
 #include "omap_hwmod_common_data.h"
 #include "prm-regbits-34xx.h"
 #include "cm-regbits-34xx.h"
 #include "wd_timer.h"
-#include <mach/am35xx.h>
 
 /*
  * OMAP3xxx hardware module integration data
@@ -51,9 +51,9 @@
 
 /* L3 */
 static struct omap_hwmod_irq_info omap3xxx_l3_main_irqs[] = {
-       { .irq = INT_34XX_L3_DBG_IRQ },
-       { .irq = INT_34XX_L3_APP_IRQ },
-       { .irq = -1 }
+       { .irq = 9 + OMAP_INTC_START, },
+       { .irq = 10 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap3xxx_l3_main_hwmod = {
@@ -100,9 +100,9 @@ static struct omap_hwmod omap3xxx_mpu_hwmod = {
 
 /* IVA2 (IVA2) */
 static struct omap_hwmod_rst_info omap3xxx_iva_resets[] = {
-       { .name = "logic", .rst_shift = 0 },
-       { .name = "seq0", .rst_shift = 1 },
-       { .name = "seq1", .rst_shift = 2 },
+       { .name = "logic", .rst_shift = 0, .st_shift = 8 },
+       { .name = "seq0", .rst_shift = 1, .st_shift = 9 },
+       { .name = "seq1", .rst_shift = 2, .st_shift = 10 },
 };
 
 static struct omap_hwmod omap3xxx_iva_hwmod = {
@@ -112,6 +112,15 @@ static struct omap_hwmod omap3xxx_iva_hwmod = {
        .rst_lines      = omap3xxx_iva_resets,
        .rst_lines_cnt  = ARRAY_SIZE(omap3xxx_iva_resets),
        .main_clk       = "iva2_ck",
+       .prcm = {
+               .omap2 = {
+                       .module_offs = OMAP3430_IVA2_MOD,
+                       .prcm_reg_id = 1,
+                       .module_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT,
+                       .idlest_reg_id = 1,
+                       .idlest_idle_bit = OMAP3430_ST_IVA2_SHIFT,
+               }
+       },
 };
 
 /* timer class */
@@ -355,8 +364,8 @@ static struct omap_hwmod omap3xxx_timer11_hwmod = {
 
 /* timer12 */
 static struct omap_hwmod_irq_info omap3xxx_timer12_mpu_irqs[] = {
-       { .irq = 95, },
-       { .irq = -1 }
+       { .irq = 95 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap3xxx_timer12_hwmod = {
@@ -490,8 +499,8 @@ static struct omap_hwmod omap3xxx_uart3_hwmod = {
 
 /* UART4 */
 static struct omap_hwmod_irq_info uart4_mpu_irqs[] = {
-       { .irq = INT_36XX_UART4_IRQ, },
-       { .irq = -1 }
+       { .irq = 80 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info uart4_sdma_reqs[] = {
@@ -518,8 +527,8 @@ static struct omap_hwmod omap36xx_uart4_hwmod = {
 };
 
 static struct omap_hwmod_irq_info am35xx_uart4_mpu_irqs[] = {
-       { .irq = INT_35XX_UART4_IRQ, },
-       { .irq = -1 }
+       { .irq = 84 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info am35xx_uart4_sdma_reqs[] = {
@@ -674,8 +683,8 @@ static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = {
 };
 
 static struct omap_hwmod_irq_info omap3xxx_dsi1_irqs[] = {
-       { .irq = 25 },
-       { .irq = -1 }
+       { .irq = 25 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 /* dss_dsi1 */
@@ -804,8 +813,8 @@ static struct omap_i2c_dev_attr i2c3_dev_attr = {
 };
 
 static struct omap_hwmod_irq_info i2c3_mpu_irqs[] = {
-       { .irq = INT_34XX_I2C3_IRQ, },
-       { .irq = -1 }
+       { .irq = 61 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info i2c3_sdma_reqs[] = {
@@ -963,8 +972,8 @@ static struct omap_hwmod omap3xxx_gpio4_hwmod = {
 
 /* gpio5 */
 static struct omap_hwmod_irq_info omap3xxx_gpio5_irqs[] = {
-       { .irq = 33 }, /* INT_34XX_GPIO_BANK5 */
-       { .irq = -1 }
+       { .irq = 33 + OMAP_INTC_START, }, /* INT_34XX_GPIO_BANK5 */
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_opt_clk gpio5_opt_clks[] = {
@@ -993,8 +1002,8 @@ static struct omap_hwmod omap3xxx_gpio5_hwmod = {
 
 /* gpio6 */
 static struct omap_hwmod_irq_info omap3xxx_gpio6_irqs[] = {
-       { .irq = 34 }, /* INT_34XX_GPIO_BANK6 */
-       { .irq = -1 }
+       { .irq = 34 + OMAP_INTC_START, }, /* INT_34XX_GPIO_BANK6 */
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_opt_clk gpio6_opt_clks[] = {
@@ -1098,10 +1107,10 @@ static struct omap_hwmod_opt_clk mcbsp234_opt_clks[] = {
 
 /* mcbsp1 */
 static struct omap_hwmod_irq_info omap3xxx_mcbsp1_irqs[] = {
-       { .name = "common", .irq = 16 },
-       { .name = "tx", .irq = 59 },
-       { .name = "rx", .irq = 60 },
-       { .irq = -1 }
+       { .name = "common", .irq = 16 + OMAP_INTC_START, },
+       { .name = "tx", .irq = 59 + OMAP_INTC_START, },
+       { .name = "rx", .irq = 60 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap3xxx_mcbsp1_hwmod = {
@@ -1125,10 +1134,10 @@ static struct omap_hwmod omap3xxx_mcbsp1_hwmod = {
 
 /* mcbsp2 */
 static struct omap_hwmod_irq_info omap3xxx_mcbsp2_irqs[] = {
-       { .name = "common", .irq = 17 },
-       { .name = "tx", .irq = 62 },
-       { .name = "rx", .irq = 63 },
-       { .irq = -1 }
+       { .name = "common", .irq = 17 + OMAP_INTC_START, },
+       { .name = "tx", .irq = 62 + OMAP_INTC_START, },
+       { .name = "rx", .irq = 63 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_mcbsp_dev_attr omap34xx_mcbsp2_dev_attr = {
@@ -1157,10 +1166,10 @@ static struct omap_hwmod omap3xxx_mcbsp2_hwmod = {
 
 /* mcbsp3 */
 static struct omap_hwmod_irq_info omap3xxx_mcbsp3_irqs[] = {
-       { .name = "common", .irq = 22 },
-       { .name = "tx", .irq = 89 },
-       { .name = "rx", .irq = 90 },
-       { .irq = -1 }
+       { .name = "common", .irq = 22 + OMAP_INTC_START, },
+       { .name = "tx", .irq = 89 + OMAP_INTC_START, },
+       { .name = "rx", .irq = 90 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_mcbsp_dev_attr omap34xx_mcbsp3_dev_attr = {
@@ -1189,10 +1198,10 @@ static struct omap_hwmod omap3xxx_mcbsp3_hwmod = {
 
 /* mcbsp4 */
 static struct omap_hwmod_irq_info omap3xxx_mcbsp4_irqs[] = {
-       { .name = "common", .irq = 23 },
-       { .name = "tx", .irq = 54 },
-       { .name = "rx", .irq = 55 },
-       { .irq = -1 }
+       { .name = "common", .irq = 23 + OMAP_INTC_START, },
+       { .name = "tx", .irq = 54 + OMAP_INTC_START, },
+       { .name = "rx", .irq = 55 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap3xxx_mcbsp4_sdma_chs[] = {
@@ -1222,10 +1231,10 @@ static struct omap_hwmod omap3xxx_mcbsp4_hwmod = {
 
 /* mcbsp5 */
 static struct omap_hwmod_irq_info omap3xxx_mcbsp5_irqs[] = {
-       { .name = "common", .irq = 27 },
-       { .name = "tx", .irq = 81 },
-       { .name = "rx", .irq = 82 },
-       { .irq = -1 }
+       { .name = "common", .irq = 27 + OMAP_INTC_START, },
+       { .name = "tx", .irq = 81 + OMAP_INTC_START, },
+       { .name = "rx", .irq = 82 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap3xxx_mcbsp5_sdma_chs[] = {
@@ -1267,8 +1276,8 @@ static struct omap_hwmod_class omap3xxx_mcbsp_sidetone_hwmod_class = {
 
 /* mcbsp2_sidetone */
 static struct omap_hwmod_irq_info omap3xxx_mcbsp2_sidetone_irqs[] = {
-       { .name = "irq", .irq = 4 },
-       { .irq = -1 }
+       { .name = "irq", .irq = 4 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod = {
@@ -1289,8 +1298,8 @@ static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod = {
 
 /* mcbsp3_sidetone */
 static struct omap_hwmod_irq_info omap3xxx_mcbsp3_sidetone_irqs[] = {
-       { .name = "irq", .irq = 5 },
-       { .irq = -1 }
+       { .name = "irq", .irq = 5 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod = {
@@ -1352,8 +1361,8 @@ static struct omap_smartreflex_dev_attr sr1_dev_attr = {
 };
 
 static struct omap_hwmod_irq_info omap3_smartreflex_mpu_irqs[] = {
-       { .irq = 18 },
-       { .irq = -1 }
+       { .irq = 18 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap34xx_sr1_hwmod = {
@@ -1397,8 +1406,8 @@ static struct omap_smartreflex_dev_attr sr2_dev_attr = {
 };
 
 static struct omap_hwmod_irq_info omap3_smartreflex_core_irqs[] = {
-       { .irq = 19 },
-       { .irq = -1 }
+       { .irq = 19 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap34xx_sr2_hwmod = {
@@ -1458,8 +1467,8 @@ static struct omap_hwmod_class omap3xxx_mailbox_hwmod_class = {
 };
 
 static struct omap_hwmod_irq_info omap3xxx_mailbox_irqs[] = {
-       { .irq = 26 },
-       { .irq = -1 }
+       { .irq = 26 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap3xxx_mailbox_hwmod = {
@@ -1549,8 +1558,8 @@ static struct omap_hwmod omap34xx_mcspi2 = {
 
 /* mcspi3 */
 static struct omap_hwmod_irq_info omap34xx_mcspi3_mpu_irqs[] = {
-       { .name = "irq", .irq = 91 }, /* 91 */
-       { .irq = -1 }
+       { .name = "irq", .irq = 91 + OMAP_INTC_START, }, /* 91 */
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap34xx_mcspi3_sdma_reqs[] = {
@@ -1585,8 +1594,8 @@ static struct omap_hwmod omap34xx_mcspi3 = {
 
 /* mcspi4 */
 static struct omap_hwmod_irq_info omap34xx_mcspi4_mpu_irqs[] = {
-       { .name = "irq", .irq = INT_34XX_SPI4_IRQ }, /* 48 */
-       { .irq = -1 }
+       { .name = "irq", .irq = 48 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap34xx_mcspi4_sdma_reqs[] = {
@@ -1638,9 +1647,9 @@ static struct omap_hwmod_class usbotg_class = {
 /* usb_otg_hs */
 static struct omap_hwmod_irq_info omap3xxx_usbhsotg_mpu_irqs[] = {
 
-       { .name = "mc", .irq = 92 },
-       { .name = "dma", .irq = 93 },
-       { .irq = -1 }
+       { .name = "mc", .irq = 92 + OMAP_INTC_START, },
+       { .name = "dma", .irq = 93 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap3xxx_usbhsotg_hwmod = {
@@ -1670,8 +1679,8 @@ static struct omap_hwmod omap3xxx_usbhsotg_hwmod = {
 
 /* usb_otg_hs */
 static struct omap_hwmod_irq_info am35xx_usbhsotg_mpu_irqs[] = {
-       { .name = "mc", .irq = 71 },
-       { .irq = -1 }
+       { .name = "mc", .irq = 71 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_class am35xx_usbotg_class = {
@@ -1706,8 +1715,8 @@ static struct omap_hwmod_class omap34xx_mmc_class = {
 /* MMC/SD/SDIO1 */
 
 static struct omap_hwmod_irq_info omap34xx_mmc1_mpu_irqs[] = {
-       { .irq = 83, },
-       { .irq = -1 }
+       { .irq = 83 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap34xx_mmc1_sdma_reqs[] = {
@@ -1773,8 +1782,8 @@ static struct omap_hwmod omap3xxx_es3plus_mmc1_hwmod = {
 /* MMC/SD/SDIO2 */
 
 static struct omap_hwmod_irq_info omap34xx_mmc2_mpu_irqs[] = {
-       { .irq = INT_24XX_MMC2_IRQ, },
-       { .irq = -1 }
+       { .irq = 86 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap34xx_mmc2_sdma_reqs[] = {
@@ -1834,8 +1843,8 @@ static struct omap_hwmod omap3xxx_es3plus_mmc2_hwmod = {
 /* MMC/SD/SDIO3 */
 
 static struct omap_hwmod_irq_info omap34xx_mmc3_mpu_irqs[] = {
-       { .irq = 94, },
-       { .irq = -1 }
+       { .irq = 94 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_dma_info omap34xx_mmc3_sdma_reqs[] = {
@@ -1893,9 +1902,9 @@ static struct omap_hwmod_opt_clk omap3xxx_usb_host_hs_opt_clks[] = {
 };
 
 static struct omap_hwmod_irq_info omap3xxx_usb_host_hs_irqs[] = {
-       { .name = "ohci-irq", .irq = 76 },
-       { .name = "ehci-irq", .irq = 77 },
-       { .irq = -1 }
+       { .name = "ohci-irq", .irq = 76 + OMAP_INTC_START, },
+       { .name = "ehci-irq", .irq = 77 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = {
@@ -1987,8 +1996,8 @@ static struct omap_hwmod_class omap3xxx_usb_tll_hs_hwmod_class = {
 };
 
 static struct omap_hwmod_irq_info omap3xxx_usb_tll_hs_irqs[] = {
-       { .name = "tll-irq", .irq = 78 },
-       { .irq = -1 }
+       { .name = "tll-irq", .irq = 78 + OMAP_INTC_START, },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = {
@@ -3214,11 +3223,11 @@ static struct omap_hwmod_ocp_if am35xx_l4_core__mdio = {
 };
 
 static struct omap_hwmod_irq_info am35xx_emac_mpu_irqs[] = {
-       { .name = "rxthresh",   .irq = INT_35XX_EMAC_C0_RXTHRESH_IRQ },
-       { .name = "rx_pulse",   .irq = INT_35XX_EMAC_C0_RX_PULSE_IRQ },
-       { .name = "tx_pulse",   .irq = INT_35XX_EMAC_C0_TX_PULSE_IRQ },
-       { .name = "misc_pulse", .irq = INT_35XX_EMAC_C0_MISC_PULSE_IRQ },
-       { .irq = -1 }
+       { .name = "rxthresh",   .irq = 67 + OMAP_INTC_START, },
+       { .name = "rx_pulse",   .irq = 68 + OMAP_INTC_START, },
+       { .name = "tx_pulse",   .irq = 69 + OMAP_INTC_START },
+       { .name = "misc_pulse", .irq = 70 + OMAP_INTC_START },
+       { .irq = -1 },
 };
 
 static struct omap_hwmod_class am35xx_emac_class = {
index 242aee4..f9bcb24 100644 (file)
  */
 
 #include <linux/io.h>
+#include <linux/platform_data/gpio-omap.h>
 #include <linux/power/smartreflex.h>
 
 #include <plat/omap_hwmod.h>
-#include <plat/cpu.h>
 #include <plat/i2c.h>
-#include <plat/gpio.h>
 #include <plat/dma.h>
-#include <plat/mcspi.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 #include <plat/mmc.h>
 #include <plat/dmtimer.h>
 #include <plat/common.h>
@@ -4210,7 +4209,7 @@ static struct omap_hwmod_ocp_if omap44xx_dsp__iva = {
 };
 
 /* dsp -> sl2if */
-static struct omap_hwmod_ocp_if omap44xx_dsp__sl2if = {
+static struct omap_hwmod_ocp_if __maybe_unused omap44xx_dsp__sl2if = {
        .master         = &omap44xx_dsp_hwmod,
        .slave          = &omap44xx_sl2if_hwmod,
        .clk            = "dpll_iva_m5x2_ck",
@@ -4828,7 +4827,7 @@ static struct omap_hwmod_ocp_if omap44xx_l3_main_2__iss = {
 };
 
 /* iva -> sl2if */
-static struct omap_hwmod_ocp_if omap44xx_iva__sl2if = {
+static struct omap_hwmod_ocp_if __maybe_unused omap44xx_iva__sl2if = {
        .master         = &omap44xx_iva_hwmod,
        .slave          = &omap44xx_sl2if_hwmod,
        .clk            = "dpll_iva_m5x2_ck",
@@ -5362,7 +5361,7 @@ static struct omap_hwmod_ocp_if omap44xx_l4_wkup__scrm = {
 };
 
 /* l3_main_2 -> sl2if */
-static struct omap_hwmod_ocp_if omap44xx_l3_main_2__sl2if = {
+static struct omap_hwmod_ocp_if __maybe_unused omap44xx_l3_main_2__sl2if = {
        .master         = &omap44xx_l3_main_2_hwmod,
        .slave          = &omap44xx_sl2if_hwmod,
        .clk            = "l3_div_ck",
@@ -6032,7 +6031,7 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = {
        &omap44xx_l4_abe__dmic,
        &omap44xx_l4_abe__dmic_dma,
        &omap44xx_dsp__iva,
-       &omap44xx_dsp__sl2if,
+       /* &omap44xx_dsp__sl2if, */
        &omap44xx_l4_cfg__dsp,
        &omap44xx_l3_main_2__dss,
        &omap44xx_l4_per__dss,
@@ -6068,7 +6067,7 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = {
        &omap44xx_l4_per__i2c4,
        &omap44xx_l3_main_2__ipu,
        &omap44xx_l3_main_2__iss,
-       &omap44xx_iva__sl2if,
+       /* &omap44xx_iva__sl2if, */
        &omap44xx_l3_main_2__iva,
        &omap44xx_l4_wkup__kbd,
        &omap44xx_l4_cfg__mailbox,
@@ -6099,7 +6098,7 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = {
        &omap44xx_l4_cfg__cm_core,
        &omap44xx_l4_wkup__prm,
        &omap44xx_l4_wkup__scrm,
-       &omap44xx_l3_main_2__sl2if,
+       /* &omap44xx_l3_main_2__sl2if, */
        &omap44xx_l4_abe__slimbus1,
        &omap44xx_l4_abe__slimbus1_dma,
        &omap44xx_l4_per__slimbus2,
index e7e8eea..dddb677 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <plat/omap_hwmod.h>
 
+#include "common.h"
 #include "display.h"
 
 /* Common address space across OMAP2xxx */
index d15225f..f447e02 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/kernel.h>
 #include <linux/slab.h>
 
+#include "soc.h"
 #include "omap_l3_noc.h"
 
 /*
@@ -190,7 +191,7 @@ static int __devinit omap4_l3_probe(struct platform_device *pdev)
                        IRQF_DISABLED, "l3-dbg-irq", l3);
        if (ret) {
                pr_crit("L3: request_irq failed to register for 0x%x\n",
-                                               OMAP44XX_IRQ_L3_DBG);
+                                               9 + OMAP44XX_IRQ_GIC_START);
                goto err3;
        }
 
@@ -200,7 +201,7 @@ static int __devinit omap4_l3_probe(struct platform_device *pdev)
                        IRQF_DISABLED, "l3-app-irq", l3);
        if (ret) {
                pr_crit("L3: request_irq failed to register for 0x%x\n",
-                                               OMAP44XX_IRQ_L3_APP);
+                                               10 + OMAP44XX_IRQ_GIC_START);
                goto err4;
        }
 
index d52651a..593eaea 100644 (file)
@@ -29,6 +29,8 @@
 #include <linux/usb.h>
 
 #include <plat/usb.h>
+
+#include "soc.h"
 #include "control.h"
 
 /* OMAP control module register for UTMI PHY */
index d8f6dbf..45ad7f7 100644 (file)
@@ -64,25 +64,22 @@ int __init omap_init_opp_table(struct omap_opp_def *opp_def,
                }
                oh = omap_hwmod_lookup(opp_def->hwmod_name);
                if (!oh || !oh->od) {
-                       pr_debug("%s: no hwmod or odev for %s, [%d] "
-                               "cannot add OPPs.\n", __func__,
-                               opp_def->hwmod_name, i);
+                       pr_debug("%s: no hwmod or odev for %s, [%d] cannot add OPPs.\n",
+                                __func__, opp_def->hwmod_name, i);
                        continue;
                }
                dev = &oh->od->pdev->dev;
 
                r = opp_add(dev, opp_def->freq, opp_def->u_volt);
                if (r) {
-                       dev_err(dev, "%s: add OPP %ld failed for %s [%d] "
-                               "result=%d\n",
-                              __func__, opp_def->freq,
-                              opp_def->hwmod_name, i, r);
+                       dev_err(dev, "%s: add OPP %ld failed for %s [%d] result=%d\n",
+                               __func__, opp_def->freq,
+                               opp_def->hwmod_name, i, r);
                } else {
                        if (!opp_def->default_available)
                                r = opp_disable(dev, opp_def->freq);
                        if (r)
-                               dev_err(dev, "%s: disable %ld failed for %s "
-                                       "[%d] result=%d\n",
+                               dev_err(dev, "%s: disable %ld failed for %s [%d] result=%d\n",
                                        __func__, opp_def->freq,
                                        opp_def->hwmod_name, i, r);
                }
index 5037e76..a9e8cf2 100644 (file)
@@ -28,7 +28,7 @@
  *     http://repository.maemo.org/pool/diablo/free/k/kernel-source-diablo/
  */
 
-#include <plat/hardware.h>
+#include <linux/kernel.h>
 
 #include "opp2xxx.h"
 #include "sdrc.h"
index 750805c..0e75ec3 100644 (file)
@@ -26,7 +26,7 @@
  * This is technically part of the OMAP2xxx clock code.
  */
 
-#include <plat/hardware.h>
+#include <linux/kernel.h>
 
 #include "opp2xxx.h"
 #include "sdrc.h"
index d95f3f9..75cef5f 100644 (file)
@@ -19,8 +19,6 @@
  */
 #include <linux/module.h>
 
-#include <plat/cpu.h>
-
 #include "control.h"
 #include "omap_opp_data.h"
 #include "pm.h"
index c95415d..a9fd6d5 100644 (file)
@@ -20,8 +20,7 @@
  */
 #include <linux/module.h>
 
-#include <plat/cpu.h>
-
+#include "soc.h"
 #include "control.h"
 #include "omap_opp_data.h"
 #include "pm.h"
index 814bcd9..3e1345f 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/slab.h>
 
 #include <plat/clock.h>
-#include <plat/board.h>
 #include "powerdomain.h"
 #include "clockdomain.h"
 #include <plat/dmtimer.h>
index 9cb5ced..939bd6f 100644 (file)
@@ -203,8 +203,8 @@ static int __init omap2_set_init_voltage(char *vdd_name, char *clk_name,
        bootup_volt = opp_get_voltage(opp);
        rcu_read_unlock();
        if (!bootup_volt) {
-               pr_err("%s: unable to find voltage corresponding "
-                       "to the bootup OPP for vdd_%s\n", __func__, vdd_name);
+               pr_err("%s: unable to find voltage corresponding to the bootup OPP for vdd_%s\n",
+                      __func__, vdd_name);
                goto exit;
        }
 
index 2edeffc..8af6cd6 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/irq.h>
 #include <linux/time.h>
 #include <linux/gpio.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <asm/mach/time.h>
 #include <asm/mach/irq.h>
@@ -38,9 +39,6 @@
 #include <plat/clock.h>
 #include <plat/sram.h>
 #include <plat/dma.h>
-#include <plat/board.h>
-
-#include <mach/irqs.h>
 
 #include "common.h"
 #include "prm2xxx_3xxx.h"
@@ -352,16 +350,6 @@ int __init omap2_pm_init(void)
 
        prcm_setup_regs();
 
-       /* Hack to prevent MPU retention when STI console is enabled. */
-       {
-               const struct omap_sti_console_config *sti;
-
-               sti = omap_get_config(OMAP_TAG_STI_CONSOLE,
-                                     struct omap_sti_console_config);
-               if (sti != NULL && sti->enable)
-                       sti_console_enabled = 1;
-       }
-
        /*
         * We copy the assembler sleep/wakeup routines to SRAM.
         * These routines need to be in SRAM as that's the only
index 05bd8f0..ba670db 100644 (file)
@@ -28,6 +28,8 @@
 #include <linux/clk.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
+#include <linux/platform_data/gpio-omap.h>
+
 #include <trace/events/power.h>
 
 #include <asm/suspend.h>
@@ -389,9 +391,8 @@ restore:
        list_for_each_entry(pwrst, &pwrst_list, node) {
                state = pwrdm_read_prev_pwrst(pwrst->pwrdm);
                if (state > pwrst->next_state) {
-                       pr_info("Powerdomain (%s) didn't enter "
-                               "target state %d\n",
-                              pwrst->pwrdm->name, pwrst->next_state);
+                       pr_info("Powerdomain (%s) didn't enter target state %d\n",
+                               pwrst->pwrdm->name, pwrst->next_state);
                        ret = -1;
                }
                omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state);
@@ -731,8 +732,7 @@ int __init omap3_pm_init(void)
                omap3_secure_ram_storage =
                        kmalloc(0x803F, GFP_KERNEL);
                if (!omap3_secure_ram_storage)
-                       pr_err("Memory allocation failed when "
-                              "allocating for secure sram context\n");
+                       pr_err("Memory allocation failed when allocating for secure sram context\n");
 
                local_irq_disable();
                local_fiq_disable();
index ea24174..04922d1 100644 (file)
@@ -69,9 +69,8 @@ static int omap4_pm_suspend(void)
        list_for_each_entry(pwrst, &pwrst_list, node) {
                state = pwrdm_read_prev_pwrst(pwrst->pwrdm);
                if (state > pwrst->next_state) {
-                       pr_info("Powerdomain (%s) didn't enter "
-                              "target state %d\n",
-                              pwrst->pwrdm->name, pwrst->next_state);
+                       pr_info("Powerdomain (%s) didn't enter target state %d\n",
+                               pwrst->pwrdm->name, pwrst->next_state);
                        ret = -1;
                }
                omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state);
@@ -189,8 +188,7 @@ int __init omap4_pm_init(void)
        ret |= clkdm_add_wkdep(ducati_clkdm, l3_1_clkdm);
        ret |= clkdm_add_wkdep(ducati_clkdm, l3_2_clkdm);
        if (ret) {
-               pr_err("Failed to add MPUSS -> L3/EMIF/L4PER, DUCATI -> L3 "
-                               "wakeup dependency\n");
+               pr_err("Failed to add MPUSS -> L3/EMIF/L4PER, DUCATI -> L3 wakeup dependency\n");
                goto err2;
        }
 
index 69b36e1..1678a32 100644 (file)
 #include "prm44xx.h"
 
 #include <asm/cpu.h>
-#include <plat/cpu.h>
+
+#include <plat/prcm.h>
+
 #include "powerdomain.h"
 #include "clockdomain.h"
-#include <plat/prcm.h>
 
+#include "soc.h"
 #include "pm.h"
 
 #define PWRDM_TRACE_STATES_FLAG        (1<<31)
@@ -339,8 +341,8 @@ int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm)
        if (!pwrdm || !clkdm)
                return -EINVAL;
 
-       pr_debug("powerdomain: associating clockdomain %s with powerdomain "
-                "%s\n", clkdm->name, pwrdm->name);
+       pr_debug("powerdomain: %s: associating clockdomain %s\n",
+                pwrdm->name, clkdm->name);
 
        for (i = 0; i < PWRDM_MAX_CLKDMS; i++) {
                if (!pwrdm->pwrdm_clkdms[i])
@@ -354,8 +356,8 @@ int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm)
        }
 
        if (i == PWRDM_MAX_CLKDMS) {
-               pr_debug("powerdomain: increase PWRDM_MAX_CLKDMS for "
-                        "pwrdm %s clkdm %s\n", pwrdm->name, clkdm->name);
+               pr_debug("powerdomain: %s: increase PWRDM_MAX_CLKDMS for clkdm %s\n",
+                        pwrdm->name, clkdm->name);
                WARN_ON(1);
                ret = -ENOMEM;
                goto pac_exit;
@@ -387,16 +389,16 @@ int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm)
        if (!pwrdm || !clkdm)
                return -EINVAL;
 
-       pr_debug("powerdomain: dissociating clockdomain %s from powerdomain "
-                "%s\n", clkdm->name, pwrdm->name);
+       pr_debug("powerdomain: %s: dissociating clockdomain %s\n",
+                pwrdm->name, clkdm->name);
 
        for (i = 0; i < PWRDM_MAX_CLKDMS; i++)
                if (pwrdm->pwrdm_clkdms[i] == clkdm)
                        break;
 
        if (i == PWRDM_MAX_CLKDMS) {
-               pr_debug("powerdomain: clkdm %s not associated with pwrdm "
-                        "%s ?!\n", clkdm->name, pwrdm->name);
+               pr_debug("powerdomain: %s: clkdm %s not associated?!\n",
+                        pwrdm->name, clkdm->name);
                ret = -ENOENT;
                goto pdc_exit;
        }
@@ -485,7 +487,7 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
        if (!(pwrdm->pwrsts & (1 << pwrst)))
                return -EINVAL;
 
-       pr_debug("powerdomain: setting next powerstate for %s to %0x\n",
+       pr_debug("powerdomain: %s: setting next powerstate to %0x\n",
                 pwrdm->name, pwrst);
 
        if (arch_pwrdm && arch_pwrdm->pwrdm_set_next_pwrst) {
@@ -587,7 +589,7 @@ int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
        if (!(pwrdm->pwrsts_logic_ret & (1 << pwrst)))
                return -EINVAL;
 
-       pr_debug("powerdomain: setting next logic powerstate for %s to %0x\n",
+       pr_debug("powerdomain: %s: setting next logic powerstate to %0x\n",
                 pwrdm->name, pwrst);
 
        if (arch_pwrdm && arch_pwrdm->pwrdm_set_logic_retst)
@@ -624,8 +626,8 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
        if (!(pwrdm->pwrsts_mem_on[bank] & (1 << pwrst)))
                return -EINVAL;
 
-       pr_debug("powerdomain: setting next memory powerstate for domain %s "
-                "bank %0x while pwrdm-ON to %0x\n", pwrdm->name, bank, pwrst);
+       pr_debug("powerdomain: %s: setting next memory powerstate for bank %0x while pwrdm-ON to %0x\n",
+                pwrdm->name, bank, pwrst);
 
        if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_onst)
                ret = arch_pwrdm->pwrdm_set_mem_onst(pwrdm, bank, pwrst);
@@ -662,8 +664,8 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
        if (!(pwrdm->pwrsts_mem_ret[bank] & (1 << pwrst)))
                return -EINVAL;
 
-       pr_debug("powerdomain: setting next memory powerstate for domain %s "
-                "bank %0x while pwrdm-RET to %0x\n", pwrdm->name, bank, pwrst);
+       pr_debug("powerdomain: %s: setting next memory powerstate for bank %0x while pwrdm-RET to %0x\n",
+                pwrdm->name, bank, pwrst);
 
        if (arch_pwrdm && arch_pwrdm->pwrdm_set_mem_retst)
                ret = arch_pwrdm->pwrdm_set_mem_retst(pwrdm, bank, pwrst);
@@ -841,7 +843,7 @@ int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
         * warn & fail if it is not ON.
         */
 
-       pr_debug("powerdomain: clearing previous power state reg for %s\n",
+       pr_debug("powerdomain: %s: clearing previous power state reg\n",
                 pwrdm->name);
 
        if (arch_pwrdm && arch_pwrdm->pwrdm_clear_all_prev_pwrst)
@@ -871,8 +873,7 @@ int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
        if (!(pwrdm->flags & PWRDM_HAS_HDWR_SAR))
                return ret;
 
-       pr_debug("powerdomain: %s: setting SAVEANDRESTORE bit\n",
-                pwrdm->name);
+       pr_debug("powerdomain: %s: setting SAVEANDRESTORE bit\n", pwrdm->name);
 
        if (arch_pwrdm && arch_pwrdm->pwrdm_enable_hdwr_sar)
                ret = arch_pwrdm->pwrdm_enable_hdwr_sar(pwrdm);
@@ -901,8 +902,7 @@ int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)
        if (!(pwrdm->flags & PWRDM_HAS_HDWR_SAR))
                return ret;
 
-       pr_debug("powerdomain: %s: clearing SAVEANDRESTORE bit\n",
-                pwrdm->name);
+       pr_debug("powerdomain: %s: clearing SAVEANDRESTORE bit\n", pwrdm->name);
 
        if (arch_pwrdm && arch_pwrdm->pwrdm_disable_hdwr_sar)
                ret = arch_pwrdm->pwrdm_disable_hdwr_sar(pwrdm);
index 0f0a9f1..3950ccf 100644 (file)
@@ -122,8 +122,8 @@ static int omap2_pwrdm_wait_transition(struct powerdomain *pwrdm)
                        udelay(1);
 
        if (c > PWRDM_TRANSITION_BAILOUT) {
-               printk(KERN_ERR "powerdomain: waited too long for "
-                       "powerdomain %s to complete transition\n", pwrdm->name);
+               pr_err("powerdomain: %s: waited too long to complete transition\n",
+                      pwrdm->name);
                return -EAGAIN;
        }
 
index 601325b..aeac6f3 100644 (file)
@@ -198,8 +198,8 @@ static int omap4_pwrdm_wait_transition(struct powerdomain *pwrdm)
                udelay(1);
 
        if (c > PWRDM_TRANSITION_BAILOUT) {
-               printk(KERN_ERR "powerdomain: waited too long for "
-                      "powerdomain %s to complete transition\n", pwrdm->name);
+               pr_err("powerdomain: %s: waited too long to complete transition\n",
+                      pwrdm->name);
                return -EAGAIN;
        }
 
index bb883e4..8b23d23 100644 (file)
 #include <linux/init.h>
 #include <linux/bug.h>
 
-#include <plat/cpu.h>
-
+#include "soc.h"
 #include "powerdomain.h"
 #include "powerdomains2xxx_3xxx_data.h"
-
 #include "prcm-common.h"
 #include "prm2xxx_3xxx.h"
 #include "prm-regbits-34xx.h"
index 053e24e..0f51e03 100644 (file)
@@ -27,7 +27,6 @@
 
 #include "common.h"
 #include <plat/prcm.h>
-#include <plat/irqs.h>
 
 #include "clock.h"
 #include "clock2xxx.h"
@@ -140,11 +139,11 @@ int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest,
                          MAX_MODULE_ENABLE_WAIT, i);
 
        if (i < MAX_MODULE_ENABLE_WAIT)
-               pr_debug("cm: Module associated with clock %s ready after %d "
-                        "loops\n", name, i);
+               pr_debug("cm: Module associated with clock %s ready after %d loops\n",
+                        name, i);
        else
-               pr_err("cm: Module associated with clock %s didn't enable in "
-                      "%d tries\n", name, MAX_MODULE_ENABLE_WAIT);
+               pr_err("cm: Module associated with clock %s didn't enable in %d tries\n",
+                      name, MAX_MODULE_ENABLE_WAIT);
 
        return (i < MAX_MODULE_ENABLE_WAIT) ? 1 : 0;
 };
index a0309de..9529984 100644 (file)
 #include <linux/io.h>
 #include <linux/irq.h>
 
-#include "common.h"
-#include <plat/cpu.h>
 #include <plat/prcm.h>
-#include <plat/irqs.h>
 
+#include "soc.h"
+#include "common.h"
 #include "vp.h"
 
 #include "prm2xxx_3xxx.h"
@@ -40,7 +39,7 @@ static struct omap_prcm_irq_setup omap3_prcm_irq_setup = {
        .nr_regs                = 1,
        .irqs                   = omap3_prcm_irqs,
        .nr_irqs                = ARRAY_SIZE(omap3_prcm_irqs),
-       .irq                    = INT_34XX_PRCM_MPU_IRQ,
+       .irq                    = 11 + OMAP_INTC_START,
        .read_pending_irqs      = &omap3xxx_prm_read_pending_irqs,
        .ocp_barrier            = &omap3xxx_prm_ocp_barrier,
        .save_and_clear_irqen   = &omap3xxx_prm_save_and_clear_irqen,
index bb727c2..f0c4d5f 100644 (file)
 #include <linux/err.h>
 #include <linux/io.h>
 
-#include <plat/cpu.h>
-#include <plat/irqs.h>
 #include <plat/prcm.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "common.h"
 #include "vp.h"
@@ -40,7 +39,7 @@ static struct omap_prcm_irq_setup omap4_prcm_irq_setup = {
        .nr_regs                = 2,
        .irqs                   = omap4_prcm_irqs,
        .nr_irqs                = ARRAY_SIZE(omap4_prcm_irqs),
-       .irq                    = OMAP44XX_IRQ_PRCM,
+       .irq                    = 11 + OMAP44XX_IRQ_GIC_START,
        .read_pending_irqs      = &omap44xx_prm_read_pending_irqs,
        .ocp_barrier            = &omap44xx_prm_ocp_barrier,
        .save_and_clear_irqen   = &omap44xx_prm_save_and_clear_irqen,
index 03b126d..6b4d332 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <plat/common.h>
 #include <plat/prcm.h>
-#include <plat/irqs.h>
 
 #include "prm2xxx_3xxx.h"
 #include "prm44xx.h"
index 1133bb2..73e55e4 100644 (file)
 #include <linux/clk.h>
 #include <linux/io.h>
 
-#include <plat/hardware.h>
 #include <plat/clock.h>
 #include <plat/sram.h>
 #include <plat/sdrc.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "common.h"
 #include "prm2xxx_3xxx.h"
index c1b93c7..0405c81 100644 (file)
 
 #include <plat/omap-serial.h>
 #include "common.h"
-#include <plat/board.h>
 #include <plat/dma.h>
 #include <plat/omap_hwmod.h>
 #include <plat/omap_device.h>
 #include <plat/omap-pm.h>
+#include <plat/serial.h>
 
 #include "prm2xxx_3xxx.h"
 #include "pm.h"
@@ -81,8 +81,9 @@ static struct omap_uart_port_info omap_serial_default_info[] __initdata = {
 };
 
 #ifdef CONFIG_PM
-static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
+static void omap_uart_enable_wakeup(struct device *dev, bool enable)
 {
+       struct platform_device *pdev = to_platform_device(dev);
        struct omap_device *od = to_omap_device(pdev);
 
        if (!od)
@@ -99,15 +100,17 @@ static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
  * in Smartidle Mode When Configured for DMA Operations.
  * WA: configure uart in force idle mode.
  */
-static void omap_uart_set_noidle(struct platform_device *pdev)
+static void omap_uart_set_noidle(struct device *dev)
 {
+       struct platform_device *pdev = to_platform_device(dev);
        struct omap_device *od = to_omap_device(pdev);
 
        omap_hwmod_set_slave_idlemode(od->hwmods[0], HWMOD_IDLEMODE_NO);
 }
 
-static void omap_uart_set_smartidle(struct platform_device *pdev)
+static void omap_uart_set_smartidle(struct device *dev)
 {
+       struct platform_device *pdev = to_platform_device(dev);
        struct omap_device *od = to_omap_device(pdev);
        u8 idlemode;
 
@@ -120,10 +123,10 @@ static void omap_uart_set_smartidle(struct platform_device *pdev)
 }
 
 #else
-static void omap_uart_enable_wakeup(struct platform_device *pdev, bool enable)
+static void omap_uart_enable_wakeup(struct device *dev, bool enable)
 {}
-static void omap_uart_set_noidle(struct platform_device *pdev) {}
-static void omap_uart_set_smartidle(struct platform_device *pdev) {}
+static void omap_uart_set_noidle(struct device *dev) {}
+static void omap_uart_set_smartidle(struct device *dev) {}
 #endif /* CONFIG_PM */
 
 #ifdef CONFIG_OMAP_MUX
@@ -229,9 +232,8 @@ static int __init omap_serial_early_init(void)
 
                        if (console_loglevel >= 10) {
                                uart_debug = true;
-                               pr_info("%s used as console in debug mode"
-                                               " uart%d clocks will not be"
-                                               " gated", uart_name, uart->num);
+                               pr_info("%s used as console in debug mode: uart%d clocks will not be gated",
+                                       uart_name, uart->num);
                        }
 
                        if (cmdline_find_option("no_console_suspend"))
@@ -304,6 +306,9 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
        omap_up.dma_rx_timeout = info->dma_rx_timeout;
        omap_up.dma_rx_poll_rate = info->dma_rx_poll_rate;
        omap_up.autosuspend_timeout = info->autosuspend_timeout;
+       omap_up.DTR_gpio = info->DTR_gpio;
+       omap_up.DTR_inverted = info->DTR_inverted;
+       omap_up.DTR_present = info->DTR_present;
 
        pdata = &omap_up;
        pdata_size = sizeof(struct omap_uart_port_info);
@@ -313,8 +318,11 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,
 
        pdev = omap_device_build(name, uart->num, oh, pdata, pdata_size,
                                 NULL, 0, false);
-       WARN(IS_ERR(pdev), "Could not build omap_device for %s: %s.\n",
-            name, oh->name);
+       if (IS_ERR(pdev)) {
+               WARN(1, "Could not build omap_device for %s: %s.\n", name,
+                    oh->name);
+               return;
+       }
 
        if ((console_uart_id == bdata->id) && no_console_suspend)
                omap_device_disable_idle_on_suspend(pdev);
index d4bf904..ce0ccd2 100644 (file)
@@ -28,8 +28,7 @@
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 
-#include <plat/omap24xx.h>
-
+#include "omap24xx.h"
 #include "sdrc.h"
 
 /* First address of reserved address space?  apparently valid for OMAP2 & 3 */
index 1f62f23..5069879 100644 (file)
@@ -26,9 +26,9 @@
 
 #include <asm/assembler.h>
 
-#include <plat/hardware.h>
 #include <plat/sram.h>
 
+#include "omap34xx.h"
 #include "iomap.h"
 #include "cm2xxx_3xxx.h"
 #include "prm2xxx_3xxx.h"
index 91e71d8..88ff83a 100644 (file)
 #include <asm/memory.h>
 #include <asm/hardware/cache-l2x0.h>
 
-#include <plat/omap44xx.h>
-#include <mach/omap-secure.h>
+#include "omap-secure.h"
 
 #include "common.h"
+#include "omap44xx.h"
 #include "omap4-sar-layout.h"
 
 #if defined(CONFIG_SMP) && defined(CONFIG_PM)
diff --git a/arch/arm/mach-omap2/soc.h b/arch/arm/mach-omap2/soc.h
new file mode 100644 (file)
index 0000000..fc9b96d
--- /dev/null
@@ -0,0 +1,7 @@
+#include <plat/cpu.h>
+#include "omap24xx.h"
+#include "omap34xx.h"
+#include "omap44xx.h"
+#include "ti81xx.h"
+#include "am33xx.h"
+#include "omap54xx.h"
index d033a65..cbeae56 100644 (file)
@@ -104,16 +104,15 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
 
        sr_data = kzalloc(sizeof(struct omap_sr_data), GFP_KERNEL);
        if (!sr_data) {
-               pr_err("%s: Unable to allocate memory for %s sr_data.Error!\n",
-                       __func__, oh->name);
+               pr_err("%s: Unable to allocate memory for %s sr_data\n",
+                      __func__, oh->name);
                return -ENOMEM;
        }
 
        sr_dev_attr = (struct omap_smartreflex_dev_attr *)oh->dev_attr;
        if (!sr_dev_attr || !sr_dev_attr->sensor_voltdm_name) {
-               pr_err("%s: No voltage domain specified for %s."
-                               "Cannot initialize\n", __func__,
-                                       oh->name);
+               pr_err("%s: No voltage domain specified for %s. Cannot initialize\n",
+                      __func__, oh->name);
                goto exit;
        }
 
@@ -131,8 +130,8 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user)
 
        omap_voltage_get_volttable(sr_data->voltdm, &volt_data);
        if (!volt_data) {
-               pr_warning("%s: No Voltage table registered fo VDD%d."
-                       "Something really wrong\n\n", __func__, i + 1);
+               pr_err("%s: No Voltage table registered for VDD%d\n",
+                      __func__, i + 1);
                goto exit;
        }
 
index ee0bfcc..8f7326c 100644 (file)
@@ -32,8 +32,7 @@
 
 #include <asm/assembler.h>
 
-#include <mach/hardware.h>
-
+#include "soc.h"
 #include "iomap.h"
 #include "prm2xxx_3xxx.h"
 #include "cm2xxx_3xxx.h"
index d4d39ef..b140d65 100644 (file)
@@ -32,8 +32,7 @@
 
 #include <asm/assembler.h>
 
-#include <mach/hardware.h>
-
+#include "soc.h"
 #include "iomap.h"
 #include "prm2xxx_3xxx.h"
 #include "cm2xxx_3xxx.h"
index df5a213..2d0ceaa 100644 (file)
@@ -29,8 +29,7 @@
 
 #include <asm/assembler.h>
 
-#include <mach/hardware.h>
-
+#include "soc.h"
 #include "iomap.h"
 #include "sdrc.h"
 #include "cm2xxx_3xxx.h"
index 2ff6d41..810aa1a 100644 (file)
 #include <linux/clocksource.h>
 #include <linux/clockchips.h>
 #include <linux/slab.h>
+#include <linux/of.h>
 
 #include <asm/mach/time.h>
-#include <plat/dmtimer.h>
 #include <asm/smp_twd.h>
 #include <asm/sched_clock.h>
-#include "common.h"
+
 #include <plat/omap_hwmod.h>
 #include <plat/omap_device.h>
+#include <plat/dmtimer.h>
 #include <plat/omap-pm.h>
 
+#include "soc.h"
+#include "common.h"
 #include "powerdomain.h"
 
 /* Parent clocks, eventually these will come from the clock framework */
@@ -211,7 +214,7 @@ static void __init omap2_gp_clockevent_init(int gptimer_id,
        res = omap_dm_timer_init_one(&clkev, gptimer_id, fck_source);
        BUG_ON(res);
 
-       omap2_gp_timer_irq.dev_id = (void *)&clkev;
+       omap2_gp_timer_irq.dev_id = &clkev;
        setup_irq(clkev.irq, &omap2_gp_timer_irq);
 
        __omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW);
@@ -260,6 +263,7 @@ static u32 notrace dmtimer_read_sched_clock(void)
        return 0;
 }
 
+#ifdef CONFIG_OMAP_32K_TIMER
 /* Setup free-running counter for clocksource */
 static int __init omap2_sync32k_clocksource_init(void)
 {
@@ -299,6 +303,12 @@ static int __init omap2_sync32k_clocksource_init(void)
 
        return ret;
 }
+#else
+static inline int omap2_sync32k_clocksource_init(void)
+{
+       return -ENODEV;
+}
+#endif
 
 static void __init omap2_gptimer_clocksource_init(int gptimer_id,
                                                const char *fck_source)
@@ -373,8 +383,7 @@ OMAP_SYS_TIMER(3_am33xx)
 #ifdef CONFIG_ARCH_OMAP4
 #ifdef CONFIG_LOCAL_TIMERS
 static DEFINE_TWD_LOCAL_TIMER(twd_local_timer,
-                             OMAP44XX_LOCAL_TWD_BASE,
-                             OMAP44XX_IRQ_LOCALTIMER);
+                             OMAP44XX_LOCAL_TWD_BASE, 29 + OMAP_INTC_START);
 #endif
 
 static void __init omap4_timer_init(void)
@@ -386,6 +395,11 @@ static void __init omap4_timer_init(void)
        if (omap_rev() != OMAP4430_REV_ES1_0) {
                int err;
 
+               if (of_have_populated_dt()) {
+                       twd_local_timer_of_register();
+                       return;
+               }
+
                err = twd_local_timer_register(&twd_local_timer);
                if (err)
                        pr_err("twd_local_timer_register failed %d\n", err);
index db5ff66..99be94e 100644 (file)
@@ -29,6 +29,7 @@
 #include <plat/i2c.h>
 #include <plat/usb.h>
 
+#include "soc.h"
 #include "twl-common.h"
 #include "pm.h"
 #include "voltage.h"
@@ -84,7 +85,7 @@ void __init omap4_pmic_init(const char *pmic_type,
        omap_mux_init_signal("sys_nirq1", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE);
        strncpy(omap4_i2c1_board_info[0].type, pmic_type,
                sizeof(omap4_i2c1_board_info[0].type));
-       omap4_i2c1_board_info[0].irq = OMAP44XX_IRQ_SYS_1N;
+       omap4_i2c1_board_info[0].irq = 7 + OMAP44XX_IRQ_GIC_START;
        omap4_i2c1_board_info[0].platform_data = pmic_data;
 
        /* TWL6040 audio IC part */
index 8fe71cf..d109c09 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __OMAP_PMIC_COMMON__
 #define __OMAP_PMIC_COMMON__
 
-#include <plat/irqs.h>
+#include "common.h"
 
 #define TWL_COMMON_PDATA_USB           (1 << 0)
 #define TWL_COMMON_PDATA_BCI           (1 << 1)
@@ -40,13 +40,13 @@ void omap_pmic_late_init(void);
 static inline void omap2_pmic_init(const char *pmic_type,
                                   struct twl4030_platform_data *pmic_data)
 {
-       omap_pmic_init(2, 2600, pmic_type, INT_24XX_SYS_NIRQ, pmic_data);
+       omap_pmic_init(2, 2600, pmic_type, 7 + OMAP_INTC_START, pmic_data);
 }
 
 static inline void omap3_pmic_init(const char *pmic_type,
                                   struct twl4030_platform_data *pmic_data)
 {
-       omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data);
+       omap_pmic_init(1, 2600, pmic_type, 7 + OMAP_INTC_START, pmic_data);
 }
 
 void omap4_pmic_init(const char *pmic_type,
index dde8a11..ac95daa 100644 (file)
@@ -25,8 +25,6 @@
 
 #include <asm/io.h>
 
-#include <mach/hardware.h>
-#include <mach/irqs.h>
 #include <plat/usb.h>
 #include <plat/omap_device.h>
 
index c4a5768..136c64b 100644 (file)
 #include <linux/clk.h>
 #include <linux/dma-mapping.h>
 #include <linux/io.h>
-
 #include <linux/usb/musb.h>
 
-#include <mach/hardware.h>
-#include <mach/irqs.h>
-#include <mach/am35xx.h>
 #include <plat/usb.h>
 #include <plat/omap_device.h>
+
+#include "am35xx.h"
+
 #include "mux.h"
 
 static struct musb_hdrc_config musb_config = {
index 84da34f..880249b 100644 (file)
@@ -12,8 +12,7 @@
 #include <linux/init.h>
 #include <linux/bug.h>
 
-#include <plat/cpu.h>
-
+#include "soc.h"
 #include "voltage.h"
 #include "vc.h"
 #include "prm-regbits-34xx.h"
@@ -116,9 +115,8 @@ int omap_vc_pre_scale(struct voltagedomain *voltdm,
        }
 
        if (!voltdm->pmic->uv_to_vsel) {
-               pr_err("%s: PMIC function to convert voltage in uV to"
-                       "vsel not registered. Hence unable to scale voltage"
-                       "for vdd_%s\n", __func__, voltdm->name);
+               pr_err("%s: PMIC function to convert voltage in uV to vsel not registered. Hence unable to scale voltage for vdd_%s\n",
+                      __func__, voltdm->name);
                return -ENODATA;
        }
 
index 4dc60e8..3ac8fe1 100644 (file)
@@ -195,8 +195,8 @@ struct omap_volt_data *omap_voltage_get_voltdata(struct voltagedomain *voltdm,
                        return &voltdm->volt_data[i];
        }
 
-       pr_notice("%s: Unable to match the current voltage with the voltage"
-               "table for vdd_%s\n", __func__, voltdm->name);
+       pr_notice("%s: Unable to match the current voltage with the voltage table for vdd_%s\n",
+                 __func__, voltdm->name);
 
        return ERR_PTR(-ENODATA);
 }
@@ -249,8 +249,8 @@ void omap_change_voltscale_method(struct voltagedomain *voltdm,
                voltdm->scale = omap_vc_bypass_scale;
                return;
        default:
-               pr_warning("%s: Trying to change the method of voltage scaling"
-                       "to an unsupported one!\n", __func__);
+               pr_warn("%s: Trying to change the method of voltage scaling to an unsupported one!\n",
+                       __func__);
        }
 }
 
@@ -331,8 +331,8 @@ int voltdm_add_pwrdm(struct voltagedomain *voltdm, struct powerdomain *pwrdm)
        if (!voltdm || !pwrdm)
                return -EINVAL;
 
-       pr_debug("voltagedomain: associating powerdomain %s with voltagedomain "
-                "%s\n", pwrdm->name, voltdm->name);
+       pr_debug("voltagedomain: %s: associating powerdomain %s\n",
+                voltdm->name, pwrdm->name);
 
        list_add(&pwrdm->voltdm_node, &voltdm->pwrdm_list);
 
index 0ac2caf..7283b7e 100644 (file)
@@ -16,7 +16,7 @@
 
 #include <linux/err.h>
 
-#include <plat/voltage.h>
+#include <linux/platform_data/voltage-omap.h>
 
 #include "vc.h"
 #include "vp.h"
index d0103c8..63afbfe 100644 (file)
@@ -18,9 +18,8 @@
 #include <linux/err.h>
 #include <linux/init.h>
 
+#include "soc.h"
 #include "common.h"
-#include <plat/cpu.h>
-
 #include "prm-regbits-34xx.h"
 #include "omap_opp_data.h"
 #include "voltage.h"
index f95c1ba..85241b8 100644 (file)
@@ -138,8 +138,8 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
                udelay(1);
        }
        if (timeout >= VP_TRANXDONE_TIMEOUT) {
-               pr_warning("%s: vdd_%s TRANXDONE timeout exceeded."
-                       "Voltage change aborted", __func__, voltdm->name);
+               pr_warn("%s: vdd_%s TRANXDONE timeout exceeded. Voltage change aborted",
+                       __func__, voltdm->name);
                return -ETIMEDOUT;
        }
 
@@ -157,9 +157,8 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
        omap_test_timeout(vp->common->ops->check_txdone(vp->id),
                          VP_TRANXDONE_TIMEOUT, timeout);
        if (timeout >= VP_TRANXDONE_TIMEOUT)
-               pr_err("%s: vdd_%s TRANXDONE timeout exceeded."
-                       "TRANXDONE never got set after the voltage update\n",
-                       __func__, voltdm->name);
+               pr_err("%s: vdd_%s TRANXDONE timeout exceeded. TRANXDONE never got set after the voltage update\n",
+                      __func__, voltdm->name);
 
        omap_vc_post_scale(voltdm, target_volt, target_vsel, current_vsel);
 
@@ -176,8 +175,7 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
        }
 
        if (timeout >= VP_TRANXDONE_TIMEOUT)
-               pr_warning("%s: vdd_%s TRANXDONE timeout exceeded while trying"
-                       "to clear the TRANXDONE status\n",
+               pr_warn("%s: vdd_%s TRANXDONE timeout exceeded while trying to clear the TRANXDONE status\n",
                        __func__, voltdm->name);
 
        /* Clear force bit */
@@ -257,8 +255,8 @@ void omap_vp_disable(struct voltagedomain *voltdm)
 
        /* If VP is already disabled, do nothing. Return */
        if (!vp->enabled) {
-               pr_warning("%s: Trying to disable VP for vdd_%s when"
-                       "it is already disabled\n", __func__, voltdm->name);
+               pr_warn("%s: Trying to disable VP for vdd_%s when it is already disabled\n",
+                       __func__, voltdm->name);
                return;
        }
 
index 410291c..87a6cda 100644 (file)
@@ -47,16 +47,6 @@ static struct map_desc orion5x_io_desc[] __initdata = {
                .length         = ORION5X_REGS_SIZE,
                .type           = MT_DEVICE,
        }, {
-               .virtual        = ORION5X_PCIE_IO_VIRT_BASE,
-               .pfn            = __phys_to_pfn(ORION5X_PCIE_IO_PHYS_BASE),
-               .length         = ORION5X_PCIE_IO_SIZE,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = ORION5X_PCI_IO_VIRT_BASE,
-               .pfn            = __phys_to_pfn(ORION5X_PCI_IO_PHYS_BASE),
-               .length         = ORION5X_PCI_IO_SIZE,
-               .type           = MT_DEVICE,
-       }, {
                .virtual        = ORION5X_PCIE_WA_VIRT_BASE,
                .pfn            = __phys_to_pfn(ORION5X_PCIE_WA_PHYS_BASE),
                .length         = ORION5X_PCIE_WA_SIZE,
diff --git a/arch/arm/mach-orion5x/include/mach/io.h b/arch/arm/mach-orion5x/include/mach/io.h
deleted file mode 100644 (file)
index 1aa5d0a..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * arch/arm/mach-orion5x/include/mach/io.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 __ASM_ARCH_IO_H
-#define __ASM_ARCH_IO_H
-
-#include <mach/orion5x.h>
-#include <asm/sizes.h>
-
-#define IO_SPACE_LIMIT         SZ_2M
-static inline void __iomem *__io(unsigned long addr)
-{
-       return (void __iomem *)(addr + ORION5X_PCIE_IO_VIRT_BASE);
-}
-
-#define __io(a)                         __io(a)
-#endif
index 683e085..1b60131 100644 (file)
  * fc000000    device bus mappings (cs0/cs1)
  *
  * virt                phys            size
- * fdd00000    f1000000        1M      on-chip peripheral registers
- * fde00000    f2000000        1M      PCIe I/O space
- * fdf00000    f2100000        1M      PCI I/O space
- * fe000000    f0000000        16M     PCIe WA space (Orion-1/Orion-NAS only)
+ * fe000000    f1000000        1M      on-chip peripheral registers
+ * fee00000    f2000000        64K     PCIe I/O space
+ * fee10000    f2100000        64K     PCI I/O space
+ * fd000000    f0000000        16M     PCIe WA space (Orion-1/Orion-NAS only)
  ****************************************************************************/
 #define ORION5X_REGS_PHYS_BASE         0xf1000000
-#define ORION5X_REGS_VIRT_BASE         0xfdd00000
+#define ORION5X_REGS_VIRT_BASE         0xfe000000
 #define ORION5X_REGS_SIZE              SZ_1M
 
 #define ORION5X_PCIE_IO_PHYS_BASE      0xf2000000
-#define ORION5X_PCIE_IO_VIRT_BASE      0xfde00000
 #define ORION5X_PCIE_IO_BUS_BASE       0x00000000
-#define ORION5X_PCIE_IO_SIZE           SZ_1M
+#define ORION5X_PCIE_IO_SIZE           SZ_64K
 
 #define ORION5X_PCI_IO_PHYS_BASE       0xf2100000
-#define ORION5X_PCI_IO_VIRT_BASE       0xfdf00000
-#define ORION5X_PCI_IO_BUS_BASE                0x00100000
-#define ORION5X_PCI_IO_SIZE            SZ_1M
+#define ORION5X_PCI_IO_BUS_BASE                0x00010000
+#define ORION5X_PCI_IO_SIZE            SZ_64K
 
 #define ORION5X_SRAM_PHYS_BASE         (0xf2200000)
 #define ORION5X_SRAM_SIZE              SZ_8K
 
 /* Relevant only for Orion-1/Orion-NAS */
 #define ORION5X_PCIE_WA_PHYS_BASE      0xf0000000
-#define ORION5X_PCIE_WA_VIRT_BASE      0xfe000000
+#define ORION5X_PCIE_WA_VIRT_BASE      0xfd000000
 #define ORION5X_PCIE_WA_SIZE           SZ_16M
 
 #define ORION5X_PCIE_MEM_PHYS_BASE     0xe0000000
index cb19e16..6921d49 100644 (file)
@@ -162,35 +162,25 @@ static int __init pcie_setup(struct pci_sys_data *sys)
                pcie_ops.read = pcie_rd_conf_wa;
        }
 
+       pci_ioremap_io(sys->busnr * SZ_64K, ORION5X_PCIE_IO_PHYS_BASE);
+
        /*
         * Request resources.
         */
-       res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL);
+       res = kzalloc(sizeof(struct resource), GFP_KERNEL);
        if (!res)
                panic("pcie_setup unable to alloc resources");
 
        /*
-        * IORESOURCE_IO
-        */
-       sys->io_offset = 0;
-       res[0].name = "PCIe I/O Space";
-       res[0].flags = IORESOURCE_IO;
-       res[0].start = ORION5X_PCIE_IO_BUS_BASE;
-       res[0].end = res[0].start + ORION5X_PCIE_IO_SIZE - 1;
-       if (request_resource(&ioport_resource, &res[0]))
-               panic("Request PCIe IO resource failed\n");
-       pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset);
-
-       /*
         * IORESOURCE_MEM
         */
-       res[1].name = "PCIe Memory Space";
-       res[1].flags = IORESOURCE_MEM;
-       res[1].start = ORION5X_PCIE_MEM_PHYS_BASE;
-       res[1].end = res[1].start + ORION5X_PCIE_MEM_SIZE - 1;
-       if (request_resource(&iomem_resource, &res[1]))
+       res->name = "PCIe Memory Space";
+       res->flags = IORESOURCE_MEM;
+       res->start = ORION5X_PCIE_MEM_PHYS_BASE;
+       res->end = res->start + ORION5X_PCIE_MEM_SIZE - 1;
+       if (request_resource(&iomem_resource, res))
                panic("Request PCIe Memory resource failed\n");
-       pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset);
+       pci_add_resource_offset(&sys->resources, res, sys->mem_offset);
 
        return 1;
 }
@@ -489,35 +479,25 @@ static int __init pci_setup(struct pci_sys_data *sys)
         */
        orion5x_setbits(PCI_CMD, PCI_CMD_HOST_REORDER);
 
+       pci_ioremap_io(sys->busnr * SZ_64K, ORION5X_PCI_IO_PHYS_BASE);
+
        /*
         * Request resources
         */
-       res = kzalloc(sizeof(struct resource) * 2, GFP_KERNEL);
+       res = kzalloc(sizeof(struct resource), GFP_KERNEL);
        if (!res)
                panic("pci_setup unable to alloc resources");
 
        /*
-        * IORESOURCE_IO
-        */
-       sys->io_offset = 0;
-       res[0].name = "PCI I/O Space";
-       res[0].flags = IORESOURCE_IO;
-       res[0].start = ORION5X_PCI_IO_BUS_BASE;
-       res[0].end = res[0].start + ORION5X_PCI_IO_SIZE - 1;
-       if (request_resource(&ioport_resource, &res[0]))
-               panic("Request PCI IO resource failed\n");
-       pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset);
-
-       /*
         * IORESOURCE_MEM
         */
-       res[1].name = "PCI Memory Space";
-       res[1].flags = IORESOURCE_MEM;
-       res[1].start = ORION5X_PCI_MEM_PHYS_BASE;
-       res[1].end = res[1].start + ORION5X_PCI_MEM_SIZE - 1;
-       if (request_resource(&iomem_resource, &res[1]))
+       res->name = "PCI Memory Space";
+       res->flags = IORESOURCE_MEM;
+       res->start = ORION5X_PCI_MEM_PHYS_BASE;
+       res->end = res->start + ORION5X_PCI_MEM_SIZE - 1;
+       if (request_resource(&iomem_resource, res))
                panic("Request PCI Memory resource failed\n");
-       pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset);
+       pci_add_resource_offset(&sys->resources, res, sys->mem_offset);
 
        return 1;
 }
diff --git a/arch/arm/mach-pnx4008/Makefile b/arch/arm/mach-pnx4008/Makefile
deleted file mode 100644 (file)
index 777564c..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-
-obj-y                  := core.o irq.o time.o clock.o gpio.o serial.o dma.o i2c.o
-obj-m                  :=
-obj-n                  :=
-obj-                   :=
-
-# Power Management
-obj-$(CONFIG_PM) += pm.o sleep.o
-
diff --git a/arch/arm/mach-pnx4008/Makefile.boot b/arch/arm/mach-pnx4008/Makefile.boot
deleted file mode 100644 (file)
index 9fa19ba..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-   zreladdr-y          += 0x80008000
-params_phys-y          := 0x80000100
-initrd_phys-y          := 0x80800000
-
diff --git a/arch/arm/mach-pnx4008/clock.c b/arch/arm/mach-pnx4008/clock.c
deleted file mode 100644 (file)
index a4a3819..0000000
+++ /dev/null
@@ -1,1001 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/clock.c
- *
- * Clock control driver for PNX4008
- *
- * Authors: Vitaly Wool, Dmitry Chigirev <source@mvista.com>
- * Generic clock management functions are partially based on:
- *  linux/arch/arm/mach-omap/clock.c
- *
- * 2005-2006 (c) MontaVista Software, Inc. 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/kernel.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/device.h>
-#include <linux/err.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/clkdev.h>
-
-#include <mach/hardware.h>
-#include <mach/clock.h>
-#include "clock.h"
-
-/*forward declaration*/
-static struct clk per_ck;
-static struct clk hclk_ck;
-static struct clk ck_1MHz;
-static struct clk ck_13MHz;
-static struct clk ck_pll1;
-static int local_set_rate(struct clk *clk, u32 rate);
-
-static inline void clock_lock(void)
-{
-       local_irq_disable();
-}
-
-static inline void clock_unlock(void)
-{
-       local_irq_enable();
-}
-
-static void propagate_rate(struct clk *clk)
-{
-       struct clk *tmp_clk;
-
-       tmp_clk = clk;
-       while (tmp_clk->propagate_next) {
-               tmp_clk = tmp_clk->propagate_next;
-               local_set_rate(tmp_clk, tmp_clk->user_rate);
-       }
-}
-
-static void clk_reg_disable(struct clk *clk)
-{
-       if (clk->enable_reg)
-               __raw_writel(__raw_readl(clk->enable_reg) &
-                            ~(1 << clk->enable_shift), clk->enable_reg);
-}
-
-static int clk_reg_enable(struct clk *clk)
-{
-       if (clk->enable_reg)
-               __raw_writel(__raw_readl(clk->enable_reg) |
-                            (1 << clk->enable_shift), clk->enable_reg);
-       return 0;
-}
-
-static inline void clk_reg_disable1(struct clk *clk)
-{
-       if (clk->enable_reg1)
-               __raw_writel(__raw_readl(clk->enable_reg1) &
-                            ~(1 << clk->enable_shift1), clk->enable_reg1);
-}
-
-static inline void clk_reg_enable1(struct clk *clk)
-{
-       if (clk->enable_reg1)
-               __raw_writel(__raw_readl(clk->enable_reg1) |
-                            (1 << clk->enable_shift1), clk->enable_reg1);
-}
-
-static int clk_wait_for_pll_lock(struct clk *clk)
-{
-       int i;
-       i = 0;
-       while (i++ < 0xFFF && !(__raw_readl(clk->scale_reg) & 1)) ;     /*wait for PLL to lock */
-
-       if (!(__raw_readl(clk->scale_reg) & 1)) {
-               printk(KERN_ERR
-                      "%s ERROR: failed to lock, scale reg data: %x\n",
-                      clk->name, __raw_readl(clk->scale_reg));
-               return -1;
-       }
-       return 0;
-}
-
-static int switch_to_dirty_13mhz(struct clk *clk)
-{
-       int i;
-       int ret;
-       u32 tmp_reg;
-
-       ret = 0;
-
-       if (!clk->rate)
-               clk_reg_enable1(clk);
-
-       tmp_reg = __raw_readl(clk->parent_switch_reg);
-       /*if 13Mhz clock selected, select 13'MHz (dirty) source from OSC */
-       if (!(tmp_reg & 1)) {
-               tmp_reg |= (1 << 1);    /* Trigger switch to 13'MHz (dirty) clock */
-               __raw_writel(tmp_reg, clk->parent_switch_reg);
-               i = 0;
-               while (i++ < 0xFFF && !(__raw_readl(clk->parent_switch_reg) & 1)) ;     /*wait for 13'MHz selection status */
-
-               if (!(__raw_readl(clk->parent_switch_reg) & 1)) {
-                       printk(KERN_ERR
-                              "%s ERROR: failed to select 13'MHz, parent sw reg data: %x\n",
-                              clk->name, __raw_readl(clk->parent_switch_reg));
-                       ret = -1;
-               }
-       }
-
-       if (!clk->rate)
-               clk_reg_disable1(clk);
-
-       return ret;
-}
-
-static int switch_to_clean_13mhz(struct clk *clk)
-{
-       int i;
-       int ret;
-       u32 tmp_reg;
-
-       ret = 0;
-
-       if (!clk->rate)
-               clk_reg_enable1(clk);
-
-       tmp_reg = __raw_readl(clk->parent_switch_reg);
-       /*if 13'Mhz clock selected, select 13MHz (clean) source from OSC */
-       if (tmp_reg & 1) {
-               tmp_reg &= ~(1 << 1);   /* Trigger switch to 13MHz (clean) clock */
-               __raw_writel(tmp_reg, clk->parent_switch_reg);
-               i = 0;
-               while (i++ < 0xFFF && (__raw_readl(clk->parent_switch_reg) & 1)) ;      /*wait for 13MHz selection status */
-
-               if (__raw_readl(clk->parent_switch_reg) & 1) {
-                       printk(KERN_ERR
-                              "%s ERROR: failed to select 13MHz, parent sw reg data: %x\n",
-                              clk->name, __raw_readl(clk->parent_switch_reg));
-                       ret = -1;
-               }
-       }
-
-       if (!clk->rate)
-               clk_reg_disable1(clk);
-
-       return ret;
-}
-
-static int set_13MHz_parent(struct clk *clk, struct clk *parent)
-{
-       int ret = -EINVAL;
-
-       if (parent == &ck_13MHz)
-               ret = switch_to_clean_13mhz(clk);
-       else if (parent == &ck_pll1)
-               ret = switch_to_dirty_13mhz(clk);
-
-       return ret;
-}
-
-#define PLL160_MIN_FCCO 156000
-#define PLL160_MAX_FCCO 320000
-
-/*
- * Calculate pll160 settings.
- * Possible input: up to 320MHz with step of clk->parent->rate.
- * In PNX4008 parent rate for pll160s may be either 1 or 13MHz.
- * Ignored paths: "feedback" (bit 13 set), "div-by-N".
- * Setting ARM PLL4 rate to 0 will put CPU into direct run mode.
- * Setting PLL5 and PLL3 rate to 0 will disable USB and DSP clock input.
- * Please refer to PNX4008 IC manual for details.
- */
-
-static int pll160_set_rate(struct clk *clk, u32 rate)
-{
-       u32 tmp_reg, tmp_m, tmp_2p, i;
-       u32 parent_rate;
-       int ret = -EINVAL;
-
-       parent_rate = clk->parent->rate;
-
-       if (!parent_rate)
-               goto out;
-
-       /* set direct run for ARM or disable output for others  */
-       clk_reg_disable(clk);
-
-       /* disable source input as well (ignored for ARM) */
-       clk_reg_disable1(clk);
-
-       tmp_reg = __raw_readl(clk->scale_reg);
-       tmp_reg &= ~0x1ffff;    /*clear all settings, power down */
-       __raw_writel(tmp_reg, clk->scale_reg);
-
-       rate -= rate % parent_rate;     /*round down the input */
-
-       if (rate > PLL160_MAX_FCCO)
-               rate = PLL160_MAX_FCCO;
-
-       if (!rate) {
-               clk->rate = 0;
-               ret = 0;
-               goto out;
-       }
-
-       clk_reg_enable1(clk);
-       tmp_reg = __raw_readl(clk->scale_reg);
-
-       if (rate == parent_rate) {
-               /*enter direct bypass mode */
-               tmp_reg |= ((1 << 14) | (1 << 15));
-               __raw_writel(tmp_reg, clk->scale_reg);
-               clk->rate = parent_rate;
-               clk_reg_enable(clk);
-               ret = 0;
-               goto out;
-       }
-
-       i = 0;
-       for (tmp_2p = 1; tmp_2p < 16; tmp_2p <<= 1) {
-               if (rate * tmp_2p >= PLL160_MIN_FCCO)
-                       break;
-               i++;
-       }
-
-       if (tmp_2p > 1)
-               tmp_reg |= ((i - 1) << 11);
-       else
-               tmp_reg |= (1 << 14);   /*direct mode, no divide */
-
-       tmp_m = rate * tmp_2p;
-       tmp_m /= parent_rate;
-
-       tmp_reg |= (tmp_m - 1) << 1;    /*calculate M */
-       tmp_reg |= (1 << 16);   /*power up PLL */
-       __raw_writel(tmp_reg, clk->scale_reg);
-
-       if (clk_wait_for_pll_lock(clk) < 0) {
-               clk_reg_disable(clk);
-               clk_reg_disable1(clk);
-
-               tmp_reg = __raw_readl(clk->scale_reg);
-               tmp_reg &= ~0x1ffff;    /*clear all settings, power down */
-               __raw_writel(tmp_reg, clk->scale_reg);
-               clk->rate = 0;
-               ret = -EFAULT;
-               goto out;
-       }
-
-       clk->rate = (tmp_m * parent_rate) / tmp_2p;
-
-       if (clk->flags & RATE_PROPAGATES)
-               propagate_rate(clk);
-
-       clk_reg_enable(clk);
-       ret = 0;
-
-out:
-       return ret;
-}
-
-/*configure PER_CLK*/
-static int per_clk_set_rate(struct clk *clk, u32 rate)
-{
-       u32 tmp;
-
-       tmp = __raw_readl(clk->scale_reg);
-       tmp &= ~(0x1f << 2);
-       tmp |= ((clk->parent->rate / clk->rate) - 1) << 2;
-       __raw_writel(tmp, clk->scale_reg);
-       clk->rate = rate;
-       return 0;
-}
-
-/*configure HCLK*/
-static int hclk_set_rate(struct clk *clk, u32 rate)
-{
-       u32 tmp;
-       tmp = __raw_readl(clk->scale_reg);
-       tmp = tmp & ~0x3;
-       switch (rate) {
-       case 1:
-               break;
-       case 2:
-               tmp |= 1;
-               break;
-       case 4:
-               tmp |= 2;
-               break;
-       }
-
-       __raw_writel(tmp, clk->scale_reg);
-       clk->rate = rate;
-       return 0;
-}
-
-static u32 hclk_round_rate(struct clk *clk, u32 rate)
-{
-       switch (rate) {
-       case 1:
-       case 4:
-               return rate;
-       }
-       return 2;
-}
-
-static u32 per_clk_round_rate(struct clk *clk, u32 rate)
-{
-       return CLK_RATE_13MHZ;
-}
-
-static int on_off_set_rate(struct clk *clk, u32 rate)
-{
-       if (rate) {
-               clk_reg_enable(clk);
-               clk->rate = 1;
-       } else {
-               clk_reg_disable(clk);
-               clk->rate = 0;
-       }
-       return 0;
-}
-
-static int on_off_inv_set_rate(struct clk *clk, u32 rate)
-{
-       if (rate) {
-               clk_reg_disable(clk);   /*enable bit is inverted */
-               clk->rate = 1;
-       } else {
-               clk_reg_enable(clk);
-               clk->rate = 0;
-       }
-       return 0;
-}
-
-static u32 on_off_round_rate(struct clk *clk, u32 rate)
-{
-       return (rate ? 1 : 0);
-}
-
-static u32 pll4_round_rate(struct clk *clk, u32 rate)
-{
-       if (rate > CLK_RATE_208MHZ)
-               rate = CLK_RATE_208MHZ;
-       if (rate == CLK_RATE_208MHZ && hclk_ck.user_rate == 1)
-               rate = CLK_RATE_208MHZ - CLK_RATE_13MHZ;
-       return (rate - (rate % (hclk_ck.user_rate * CLK_RATE_13MHZ)));
-}
-
-static u32 pll3_round_rate(struct clk *clk, u32 rate)
-{
-       if (rate > CLK_RATE_208MHZ)
-               rate = CLK_RATE_208MHZ;
-       return (rate - rate % CLK_RATE_13MHZ);
-}
-
-static u32 pll5_round_rate(struct clk *clk, u32 rate)
-{
-       return (rate ? CLK_RATE_48MHZ : 0);
-}
-
-static u32 ck_13MHz_round_rate(struct clk *clk, u32 rate)
-{
-       return (rate ? CLK_RATE_13MHZ : 0);
-}
-
-static int ck_13MHz_set_rate(struct clk *clk, u32 rate)
-{
-       if (rate) {
-               clk_reg_disable(clk);   /*enable bit is inverted */
-               udelay(500);
-               clk->rate = CLK_RATE_13MHZ;
-               ck_1MHz.rate = CLK_RATE_1MHZ;
-       } else {
-               clk_reg_enable(clk);
-               clk->rate = 0;
-               ck_1MHz.rate = 0;
-       }
-       return 0;
-}
-
-static int pll1_set_rate(struct clk *clk, u32 rate)
-{
-#if 0 /* doesn't work on some boards, probably a HW BUG */
-       if (rate) {
-               clk_reg_disable(clk);   /*enable bit is inverted */
-               if (!clk_wait_for_pll_lock(clk)) {
-                       clk->rate = CLK_RATE_13MHZ;
-               } else {
-                       clk_reg_enable(clk);
-                       clk->rate = 0;
-               }
-
-       } else {
-               clk_reg_enable(clk);
-               clk->rate = 0;
-       }
-#endif
-       return 0;
-}
-
-/* Clock sources */
-
-static struct clk osc_13MHz = {
-       .name = "osc_13MHz",
-       .flags = FIXED_RATE,
-       .rate = CLK_RATE_13MHZ,
-};
-
-static struct clk ck_13MHz = {
-       .name = "ck_13MHz",
-       .parent = &osc_13MHz,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &ck_13MHz_round_rate,
-       .set_rate = &ck_13MHz_set_rate,
-       .enable_reg = OSC13CTRL_REG,
-       .enable_shift = 0,
-       .rate = CLK_RATE_13MHZ,
-};
-
-static struct clk osc_32KHz = {
-       .name = "osc_32KHz",
-       .flags = FIXED_RATE,
-       .rate = CLK_RATE_32KHZ,
-};
-
-/*attached to PLL5*/
-static struct clk ck_1MHz = {
-       .name = "ck_1MHz",
-       .flags = FIXED_RATE | PARENT_SET_RATE,
-       .parent = &ck_13MHz,
-};
-
-/* PLL1 (397) - provides 13' MHz clock */
-static struct clk ck_pll1 = {
-       .name = "ck_pll1",
-       .parent = &osc_32KHz,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &ck_13MHz_round_rate,
-       .set_rate = &pll1_set_rate,
-       .enable_reg = PLLCTRL_REG,
-       .enable_shift = 1,
-       .scale_reg = PLLCTRL_REG,
-       .rate = CLK_RATE_13MHZ,
-};
-
-/* CPU/Bus PLL */
-static struct clk ck_pll4 = {
-       .name = "ck_pll4",
-       .parent = &ck_pll1,
-       .flags = RATE_PROPAGATES | NEEDS_INITIALIZATION,
-       .propagate_next = &per_ck,
-       .round_rate = &pll4_round_rate,
-       .set_rate = &pll160_set_rate,
-       .rate = CLK_RATE_208MHZ,
-       .scale_reg = HCLKPLLCTRL_REG,
-       .enable_reg = PWRCTRL_REG,
-       .enable_shift = 2,
-       .parent_switch_reg = SYSCLKCTRL_REG,
-       .set_parent = &set_13MHz_parent,
-};
-
-/* USB PLL */
-static struct clk ck_pll5 = {
-       .name = "ck_pll5",
-       .parent = &ck_1MHz,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &pll5_round_rate,
-       .set_rate = &pll160_set_rate,
-       .scale_reg = USBCTRL_REG,
-       .enable_reg = USBCTRL_REG,
-       .enable_shift = 18,
-       .enable_reg1 = USBCTRL_REG,
-       .enable_shift1 = 17,
-};
-
-/* XPERTTeak DSP PLL */
-static struct clk ck_pll3 = {
-       .name = "ck_pll3",
-       .parent = &ck_pll1,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &pll3_round_rate,
-       .set_rate = &pll160_set_rate,
-       .scale_reg = DSPPLLCTRL_REG,
-       .enable_reg = DSPCLKCTRL_REG,
-       .enable_shift = 3,
-       .enable_reg1 = DSPCLKCTRL_REG,
-       .enable_shift1 = 2,
-       .parent_switch_reg = DSPCLKCTRL_REG,
-       .set_parent = &set_13MHz_parent,
-};
-
-static struct clk hclk_ck = {
-       .name = "hclk_ck",
-       .parent = &ck_pll4,
-       .flags = PARENT_SET_RATE,
-       .set_rate = &hclk_set_rate,
-       .round_rate = &hclk_round_rate,
-       .scale_reg = HCLKDIVCTRL_REG,
-       .rate = 2,
-       .user_rate = 2,
-};
-
-static struct clk per_ck = {
-       .name = "per_ck",
-       .parent = &ck_pll4,
-       .flags = FIXED_RATE,
-       .propagate_next = &hclk_ck,
-       .set_rate = &per_clk_set_rate,
-       .round_rate = &per_clk_round_rate,
-       .scale_reg = HCLKDIVCTRL_REG,
-       .rate = CLK_RATE_13MHZ,
-       .user_rate = CLK_RATE_13MHZ,
-};
-
-static struct clk m2hclk_ck = {
-       .name = "m2hclk_ck",
-       .parent = &hclk_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_inv_set_rate,
-       .rate = 1,
-       .enable_shift = 6,
-       .enable_reg = PWRCTRL_REG,
-};
-
-static struct clk vfp9_ck = {
-       .name = "vfp9_ck",
-       .parent = &ck_pll4,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .rate = 1,
-       .enable_shift = 4,
-       .enable_reg = VFP9CLKCTRL_REG,
-};
-
-static struct clk keyscan_ck = {
-       .name = "keyscan_ck",
-       .parent = &osc_32KHz,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 0,
-       .enable_reg = KEYCLKCTRL_REG,
-};
-
-static struct clk touch_ck = {
-       .name = "touch_ck",
-       .parent = &osc_32KHz,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 0,
-       .enable_reg = TSCLKCTRL_REG,
-};
-
-static struct clk pwm1_ck = {
-       .name = "pwm1_ck",
-       .parent = &osc_32KHz,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 0,
-       .enable_reg = PWMCLKCTRL_REG,
-};
-
-static struct clk pwm2_ck = {
-       .name = "pwm2_ck",
-       .parent = &osc_32KHz,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 2,
-       .enable_reg = PWMCLKCTRL_REG,
-};
-
-static struct clk jpeg_ck = {
-       .name = "jpeg_ck",
-       .parent = &hclk_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 0,
-       .enable_reg = JPEGCLKCTRL_REG,
-};
-
-static struct clk ms_ck = {
-       .name = "ms_ck",
-       .parent = &ck_pll4,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 5,
-       .enable_reg = MSCTRL_REG,
-};
-
-static struct clk dum_ck = {
-       .name = "dum_ck",
-       .parent = &hclk_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 0,
-       .enable_reg = DUMCLKCTRL_REG,
-};
-
-static struct clk flash_ck = {
-       .name = "flash_ck",
-       .parent = &hclk_ck,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 1,      /* Only MLC clock supported */
-       .enable_reg = FLASHCLKCTRL_REG,
-};
-
-static struct clk i2c0_ck = {
-       .name = "i2c0_ck",
-       .parent = &per_ck,
-       .flags = NEEDS_INITIALIZATION | FIXED_RATE,
-       .enable_shift = 0,
-       .enable_reg = I2CCLKCTRL_REG,
-       .rate = 13000000,
-       .enable = clk_reg_enable,
-       .disable = clk_reg_disable,
-};
-
-static struct clk i2c1_ck = {
-       .name = "i2c1_ck",
-       .parent = &per_ck,
-       .flags = NEEDS_INITIALIZATION | FIXED_RATE,
-       .enable_shift = 1,
-       .enable_reg = I2CCLKCTRL_REG,
-       .rate = 13000000,
-       .enable = clk_reg_enable,
-       .disable = clk_reg_disable,
-};
-
-static struct clk i2c2_ck = {
-       .name = "i2c2_ck",
-       .parent = &per_ck,
-       .flags = NEEDS_INITIALIZATION | FIXED_RATE,
-       .enable_shift = 2,
-       .enable_reg = USB_OTG_CLKCTRL_REG,
-       .rate = 13000000,
-       .enable = clk_reg_enable,
-       .disable = clk_reg_disable,
-};
-
-static struct clk spi0_ck = {
-       .name = "spi0_ck",
-       .parent = &hclk_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 0,
-       .enable_reg = SPICTRL_REG,
-};
-
-static struct clk spi1_ck = {
-       .name = "spi1_ck",
-       .parent = &hclk_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 4,
-       .enable_reg = SPICTRL_REG,
-};
-
-static struct clk dma_ck = {
-       .name = "dma_ck",
-       .parent = &hclk_ck,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 0,
-       .enable_reg = DMACLKCTRL_REG,
-};
-
-static struct clk uart3_ck = {
-       .name = "uart3_ck",
-       .parent = &per_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .rate = 1,
-       .enable_shift = 0,
-       .enable_reg = UARTCLKCTRL_REG,
-};
-
-static struct clk uart4_ck = {
-       .name = "uart4_ck",
-       .parent = &per_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 1,
-       .enable_reg = UARTCLKCTRL_REG,
-};
-
-static struct clk uart5_ck = {
-       .name = "uart5_ck",
-       .parent = &per_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .rate = 1,
-       .enable_shift = 2,
-       .enable_reg = UARTCLKCTRL_REG,
-};
-
-static struct clk uart6_ck = {
-       .name = "uart6_ck",
-       .parent = &per_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .round_rate = &on_off_round_rate,
-       .set_rate = &on_off_set_rate,
-       .enable_shift = 3,
-       .enable_reg = UARTCLKCTRL_REG,
-};
-
-static struct clk wdt_ck = {
-       .name = "wdt_ck",
-       .parent = &per_ck,
-       .flags = NEEDS_INITIALIZATION,
-       .enable_shift = 0,
-       .enable_reg = TIMCLKCTRL_REG,
-       .enable = clk_reg_enable,
-       .disable = clk_reg_disable,
-};
-
-/* These clocks are visible outside this module
- * and can be initialized
- */
-static struct clk *onchip_clks[] __initdata = {
-       &ck_13MHz,
-       &ck_pll1,
-       &ck_pll4,
-       &ck_pll5,
-       &ck_pll3,
-       &vfp9_ck,
-       &m2hclk_ck,
-       &hclk_ck,
-       &dma_ck,
-       &flash_ck,
-       &dum_ck,
-       &keyscan_ck,
-       &pwm1_ck,
-       &pwm2_ck,
-       &jpeg_ck,
-       &ms_ck,
-       &touch_ck,
-       &i2c0_ck,
-       &i2c1_ck,
-       &i2c2_ck,
-       &spi0_ck,
-       &spi1_ck,
-       &uart3_ck,
-       &uart4_ck,
-       &uart5_ck,
-       &uart6_ck,
-       &wdt_ck,
-};
-
-static struct clk_lookup onchip_clkreg[] = {
-       { .clk = &ck_13MHz,     .con_id = "ck_13MHz"    },
-       { .clk = &ck_pll1,      .con_id = "ck_pll1"     },
-       { .clk = &ck_pll4,      .con_id = "ck_pll4"     },
-       { .clk = &ck_pll5,      .con_id = "ck_pll5"     },
-       { .clk = &ck_pll3,      .con_id = "ck_pll3"     },
-       { .clk = &vfp9_ck,      .con_id = "vfp9_ck"     },
-       { .clk = &m2hclk_ck,    .con_id = "m2hclk_ck"   },
-       { .clk = &hclk_ck,      .con_id = "hclk_ck"     },
-       { .clk = &dma_ck,       .con_id = "dma_ck"      },
-       { .clk = &flash_ck,     .con_id = "flash_ck"    },
-       { .clk = &dum_ck,       .con_id = "dum_ck"      },
-       { .clk = &keyscan_ck,   .con_id = "keyscan_ck"  },
-       { .clk = &pwm1_ck,      .con_id = "pwm1_ck"     },
-       { .clk = &pwm2_ck,      .con_id = "pwm2_ck"     },
-       { .clk = &jpeg_ck,      .con_id = "jpeg_ck"     },
-       { .clk = &ms_ck,        .con_id = "ms_ck"       },
-       { .clk = &touch_ck,     .con_id = "touch_ck"    },
-       { .clk = &i2c0_ck,      .dev_id = "pnx-i2c.0"   },
-       { .clk = &i2c1_ck,      .dev_id = "pnx-i2c.1"   },
-       { .clk = &i2c2_ck,      .dev_id = "pnx-i2c.2"   },
-       { .clk = &spi0_ck,      .con_id = "spi0_ck"     },
-       { .clk = &spi1_ck,      .con_id = "spi1_ck"     },
-       { .clk = &uart3_ck,     .con_id = "uart3_ck"    },
-       { .clk = &uart4_ck,     .con_id = "uart4_ck"    },
-       { .clk = &uart5_ck,     .con_id = "uart5_ck"    },
-       { .clk = &uart6_ck,     .con_id = "uart6_ck"    },
-       { .clk = &wdt_ck,       .dev_id = "pnx4008-watchdog" },
-};
-
-static void local_clk_disable(struct clk *clk)
-{
-       if (WARN_ON(clk->usecount == 0))
-               return;
-
-       if (!(--clk->usecount)) {
-               if (clk->disable)
-                       clk->disable(clk);
-               else if (!(clk->flags & FIXED_RATE) && clk->rate && clk->set_rate)
-                       clk->set_rate(clk, 0);
-               if (clk->parent)
-                       local_clk_disable(clk->parent);
-       }
-}
-
-static int local_clk_enable(struct clk *clk)
-{
-       int ret = 0;
-
-       if (clk->usecount == 0) {
-               if (clk->parent) {
-                       ret = local_clk_enable(clk->parent);
-                       if (ret != 0)
-                               goto out;
-               }
-
-               if (clk->enable)
-                       ret = clk->enable(clk);
-               else if (!(clk->flags & FIXED_RATE) && !clk->rate && clk->set_rate
-                           && clk->user_rate)
-                       ret = clk->set_rate(clk, clk->user_rate);
-
-               if (ret != 0 && clk->parent) {
-                       local_clk_disable(clk->parent);
-                       goto out;
-               }
-
-               clk->usecount++;
-       }
-out:
-       return ret;
-}
-
-static int local_set_rate(struct clk *clk, u32 rate)
-{
-       int ret = -EINVAL;
-       if (clk->set_rate) {
-
-               if (clk->user_rate == clk->rate && clk->parent->rate) {
-                       /* if clock enabled or rate not set */
-                       clk->user_rate = clk->round_rate(clk, rate);
-                       ret = clk->set_rate(clk, clk->user_rate);
-               } else
-                       clk->user_rate = clk->round_rate(clk, rate);
-               ret = 0;
-       }
-       return ret;
-}
-
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
-       int ret = -EINVAL;
-
-       if (clk->flags & FIXED_RATE)
-               goto out;
-
-       clock_lock();
-       if ((clk->flags & PARENT_SET_RATE) && clk->parent) {
-
-               clk->user_rate = clk->round_rate(clk, rate);
-               /* parent clock needs to be refreshed
-                  for the setting to take effect */
-       } else {
-               ret = local_set_rate(clk, rate);
-       }
-       ret = 0;
-       clock_unlock();
-
-out:
-       return ret;
-}
-
-EXPORT_SYMBOL(clk_set_rate);
-
-unsigned long clk_get_rate(struct clk *clk)
-{
-       unsigned long ret;
-       clock_lock();
-       ret = clk->rate;
-       clock_unlock();
-       return ret;
-}
-EXPORT_SYMBOL(clk_get_rate);
-
-int clk_enable(struct clk *clk)
-{
-       int ret;
-
-       clock_lock();
-       ret = local_clk_enable(clk);
-       clock_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(clk_enable);
-
-void clk_disable(struct clk *clk)
-{
-       clock_lock();
-       local_clk_disable(clk);
-       clock_unlock();
-}
-
-EXPORT_SYMBOL(clk_disable);
-
-long clk_round_rate(struct clk *clk, unsigned long rate)
-{
-       long ret;
-       clock_lock();
-       if (clk->round_rate)
-               ret = clk->round_rate(clk, rate);
-       else
-               ret = clk->rate;
-       clock_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(clk_round_rate);
-
-int clk_set_parent(struct clk *clk, struct clk *parent)
-{
-       int ret = -ENODEV;
-       if (!clk->set_parent)
-               goto out;
-
-       clock_lock();
-       ret = clk->set_parent(clk, parent);
-       if (!ret)
-               clk->parent = parent;
-       clock_unlock();
-
-out:
-       return ret;
-}
-
-EXPORT_SYMBOL(clk_set_parent);
-
-static int __init clk_init(void)
-{
-       struct clk **clkp;
-
-       /* Disable autoclocking, as it doesn't seem to work */
-       __raw_writel(0xff, AUTOCLK_CTRL);
-
-       for (clkp = onchip_clks; clkp < onchip_clks + ARRAY_SIZE(onchip_clks);
-            clkp++) {
-               struct clk *clk = *clkp;
-               if (clk->flags & NEEDS_INITIALIZATION) {
-                       if (clk->set_rate) {
-                               clk->user_rate = clk->rate;
-                               local_set_rate(clk, clk->user_rate);
-                               if (clk->set_parent)
-                                       clk->set_parent(clk, clk->parent);
-                       }
-                       if (clk->enable && clk->usecount)
-                               clk->enable(clk);
-                       if (clk->disable && !clk->usecount)
-                               clk->disable(clk);
-               }
-               pr_debug("%s: clock %s, rate %ld\n",
-                       __func__, clk->name, clk->rate);
-       }
-
-       local_clk_enable(&ck_pll4);
-
-       /* if ck_13MHz is not used, disable it. */
-       if (ck_13MHz.usecount == 0)
-               local_clk_disable(&ck_13MHz);
-
-       /* Disable autoclocking */
-       __raw_writeb(0xff, AUTOCLK_CTRL);
-
-       clkdev_add_table(onchip_clkreg, ARRAY_SIZE(onchip_clkreg));
-
-       return 0;
-}
-
-arch_initcall(clk_init);
diff --git a/arch/arm/mach-pnx4008/clock.h b/arch/arm/mach-pnx4008/clock.h
deleted file mode 100644 (file)
index 39720d6..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/clock.h
- *
- * Clock control driver for PNX4008 - internal header file
- *
- * Author: Vitaly Wool <source@mvista.com>
- *
- * 2006 (c) MontaVista Software, Inc. 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_ARM_PNX4008_CLOCK_H__
-#define __ARCH_ARM_PNX4008_CLOCK_H__
-
-struct clk {
-       const char *name;
-       struct clk *parent;
-       struct clk *propagate_next;
-       u32 rate;
-       u32 user_rate;
-       s8 usecount;
-       u32 flags;
-       u32 scale_reg;
-       u8 enable_shift;
-       u32 enable_reg;
-       u8 enable_shift1;
-       u32 enable_reg1;
-       u32 parent_switch_reg;
-       u32(*round_rate) (struct clk *, u32);
-       int (*set_rate) (struct clk *, u32);
-       int (*set_parent) (struct clk * clk, struct clk * parent);
-       int (*enable)(struct clk *);
-       void (*disable)(struct clk *);
-};
-
-/* Flags */
-#define RATE_PROPAGATES      (1<<0)
-#define NEEDS_INITIALIZATION (1<<1)
-#define PARENT_SET_RATE      (1<<2)
-#define FIXED_RATE           (1<<3)
-
-#endif
diff --git a/arch/arm/mach-pnx4008/core.c b/arch/arm/mach-pnx4008/core.c
deleted file mode 100644 (file)
index a00d2f1..0000000
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/core.c
- *
- * PNX4008 core startup code
- *
- * Authors: Vitaly Wool, Dmitry Chigirev,
- * Grigory Tolstolytkin, Dmitry Pervushin <source@mvista.com>
- *
- * Based on reference code received from Philips:
- * Copyright (C) 2003 Philips Semiconductors
- *
- * 2005 (c) MontaVista Software, Inc. 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/types.h>
-#include <linux/mm.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <linux/serial_8250.h>
-#include <linux/device.h>
-#include <linux/spi/spi.h>
-#include <linux/io.h>
-
-#include <mach/hardware.h>
-#include <asm/setup.h>
-#include <asm/mach-types.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/system_misc.h>
-
-#include <asm/mach/arch.h>
-#include <asm/mach/map.h>
-#include <asm/mach/time.h>
-
-#include <mach/irq.h>
-#include <mach/clock.h>
-#include <mach/dma.h>
-
-struct resource spipnx_0_resources[] = {
-       {
-               .start = PNX4008_SPI1_BASE,
-               .end = PNX4008_SPI1_BASE + SZ_4K,
-               .flags = IORESOURCE_MEM,
-       }, {
-               .start = PER_SPI1_REC_XMIT,
-               .flags = IORESOURCE_DMA,
-       }, {
-               .start = SPI1_INT,
-               .flags = IORESOURCE_IRQ,
-       }, {
-               .flags = 0,
-       },
-};
-
-struct resource spipnx_1_resources[] = {
-       {
-               .start = PNX4008_SPI2_BASE,
-               .end = PNX4008_SPI2_BASE + SZ_4K,
-               .flags = IORESOURCE_MEM,
-       }, {
-               .start = PER_SPI2_REC_XMIT,
-               .flags = IORESOURCE_DMA,
-       }, {
-               .start = SPI2_INT,
-               .flags = IORESOURCE_IRQ,
-       }, {
-               .flags = 0,
-       }
-};
-
-static struct spi_board_info spi_board_info[] __initdata = {
-       {
-               .modalias       = "m25p80",
-               .max_speed_hz   = 1000000,
-               .bus_num        = 1,
-               .chip_select    = 0,
-       },
-};
-
-static struct platform_device spipnx_1 = {
-       .name = "spipnx",
-       .id = 1,
-       .num_resources = ARRAY_SIZE(spipnx_0_resources),
-       .resource = spipnx_0_resources,
-       .dev = {
-               .coherent_dma_mask = 0xFFFFFFFF,
-               },
-};
-
-static struct platform_device spipnx_2 = {
-       .name = "spipnx",
-       .id = 2,
-       .num_resources = ARRAY_SIZE(spipnx_1_resources),
-       .resource = spipnx_1_resources,
-       .dev = {
-               .coherent_dma_mask = 0xFFFFFFFF,
-               },
-};
-
-static struct plat_serial8250_port platform_serial_ports[] = {
-       {
-               .membase = (void *)__iomem(IO_ADDRESS(PNX4008_UART5_BASE)),
-               .mapbase = (unsigned long)PNX4008_UART5_BASE,
-               .irq = IIR5_INT,
-               .uartclk = PNX4008_UART_CLK,
-               .regshift = 2,
-               .iotype = UPIO_MEM,
-               .flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | UPF_SKIP_TEST,
-       },
-       {
-               .membase = (void *)__iomem(IO_ADDRESS(PNX4008_UART3_BASE)),
-               .mapbase = (unsigned long)PNX4008_UART3_BASE,
-               .irq = IIR3_INT,
-               .uartclk = PNX4008_UART_CLK,
-               .regshift = 2,
-               .iotype = UPIO_MEM,
-               .flags = UPF_BOOT_AUTOCONF | UPF_BUGGY_UART | UPF_SKIP_TEST,
-        },
-       {}
-};
-
-static struct platform_device serial_device = {
-       .name = "serial8250",
-       .id = PLAT8250_DEV_PLATFORM,
-       .dev = {
-               .platform_data = &platform_serial_ports,
-       },
-};
-
-static struct platform_device nand_flash_device = {
-       .name = "pnx4008-flash",
-       .id = -1,
-       .dev = {
-               .coherent_dma_mask = 0xFFFFFFFF,
-       },
-};
-
-/* The dmamask must be set for OHCI to work */
-static u64 ohci_dmamask = ~(u32) 0;
-
-static struct resource ohci_resources[] = {
-       {
-               .start = IO_ADDRESS(PNX4008_USB_CONFIG_BASE),
-               .end = IO_ADDRESS(PNX4008_USB_CONFIG_BASE + 0x100),
-               .flags = IORESOURCE_MEM,
-       }, {
-               .start = USB_HOST_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device ohci_device = {
-       .name = "pnx4008-usb-ohci",
-       .id = -1,
-       .dev = {
-               .dma_mask = &ohci_dmamask,
-               .coherent_dma_mask = 0xffffffff,
-               },
-       .num_resources = ARRAY_SIZE(ohci_resources),
-       .resource = ohci_resources,
-};
-
-static struct platform_device sdum_device = {
-       .name = "pnx4008-sdum",
-       .id = 0,
-       .dev = {
-               .coherent_dma_mask = 0xffffffff,
-       },
-};
-
-static struct platform_device rgbfb_device = {
-       .name = "pnx4008-rgbfb",
-       .id = 0,
-       .dev = {
-               .coherent_dma_mask = 0xffffffff,
-       }
-};
-
-struct resource watchdog_resources[] = {
-       {
-               .start = PNX4008_WDOG_BASE,
-               .end = PNX4008_WDOG_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       },
-};
-
-static struct platform_device watchdog_device = {
-       .name = "pnx4008-watchdog",
-       .id = -1,
-       .num_resources = ARRAY_SIZE(watchdog_resources),
-       .resource = watchdog_resources,
-};
-
-static struct platform_device *devices[] __initdata = {
-       &spipnx_1,
-       &spipnx_2,
-       &serial_device,
-       &ohci_device,
-       &nand_flash_device,
-       &sdum_device,
-       &rgbfb_device,
-       &watchdog_device,
-};
-
-
-extern void pnx4008_uart_init(void);
-
-static void __init pnx4008_init(void)
-{
-       /*disable all START interrupt sources,
-          and clear all START interrupt flags */
-       __raw_writel(0, START_INT_ER_REG(SE_PIN_BASE_INT));
-       __raw_writel(0, START_INT_ER_REG(SE_INT_BASE_INT));
-       __raw_writel(0xffffffff, START_INT_RSR_REG(SE_PIN_BASE_INT));
-       __raw_writel(0xffffffff, START_INT_RSR_REG(SE_INT_BASE_INT));
-
-       platform_add_devices(devices, ARRAY_SIZE(devices));
-       spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
-       /* Switch on the UART clocks */
-       pnx4008_uart_init();
-}
-
-static struct map_desc pnx4008_io_desc[] __initdata = {
-       {
-               .virtual        = IO_ADDRESS(PNX4008_IRAM_BASE),
-               .pfn            = __phys_to_pfn(PNX4008_IRAM_BASE),
-               .length         = SZ_64K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = IO_ADDRESS(PNX4008_NDF_FLASH_BASE),
-               .pfn            = __phys_to_pfn(PNX4008_NDF_FLASH_BASE),
-               .length         = SZ_1M - SZ_128K,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = IO_ADDRESS(PNX4008_JPEG_CONFIG_BASE),
-               .pfn            = __phys_to_pfn(PNX4008_JPEG_CONFIG_BASE),
-               .length         = SZ_128K * 3,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = IO_ADDRESS(PNX4008_DMA_CONFIG_BASE),
-               .pfn            = __phys_to_pfn(PNX4008_DMA_CONFIG_BASE),
-               .length         = SZ_1M,
-               .type           = MT_DEVICE,
-       }, {
-               .virtual        = IO_ADDRESS(PNX4008_AHB2FAB_BASE),
-               .pfn            = __phys_to_pfn(PNX4008_AHB2FAB_BASE),
-               .length         = SZ_1M,
-               .type           = MT_DEVICE,
-       },
-};
-
-void __init pnx4008_map_io(void)
-{
-       iotable_init(pnx4008_io_desc, ARRAY_SIZE(pnx4008_io_desc));
-}
-
-static void pnx4008_restart(char mode, const char *cmd)
-{
-       soft_restart(0);
-}
-
-#ifdef CONFIG_PM
-extern int pnx4008_pm_init(void);
-#else
-static inline int pnx4008_pm_init(void) { return 0; }
-#endif
-
-void __init pnx4008_init_late(void)
-{
-       pnx4008_pm_init();
-}
-
-extern struct sys_timer pnx4008_timer;
-
-MACHINE_START(PNX4008, "Philips PNX4008")
-       /* Maintainer: MontaVista Software Inc. */
-       .atag_offset            = 0x100,
-       .map_io                 = pnx4008_map_io,
-       .init_irq               = pnx4008_init_irq,
-       .init_machine           = pnx4008_init,
-       .init_late              = pnx4008_init_late,
-       .timer                  = &pnx4008_timer,
-       .restart                = pnx4008_restart,
-MACHINE_END
diff --git a/arch/arm/mach-pnx4008/dma.c b/arch/arm/mach-pnx4008/dma.c
deleted file mode 100644 (file)
index a4739e9..0000000
+++ /dev/null
@@ -1,1105 +0,0 @@
-/*
- *  linux/arch/arm/mach-pnx4008/dma.c
- *
- *  PNX4008 DMA registration and IRQ dispatching
- *
- *  Author:    Vitaly Wool
- *  Copyright: MontaVista Software Inc. (c) 2005
- *
- *  Based on the code from Nicolas Pitre
- *
- *  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/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/dma-mapping.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/gfp.h>
-
-#include <mach/hardware.h>
-#include <mach/dma.h>
-#include <asm/dma-mapping.h>
-#include <mach/clock.h>
-
-static struct dma_channel {
-       char *name;
-       void (*irq_handler) (int, int, void *);
-       void *data;
-       struct pnx4008_dma_ll *ll;
-       u32 ll_dma;
-       void *target_addr;
-       int target_id;
-} dma_channels[MAX_DMA_CHANNELS];
-
-static struct ll_pool {
-       void *vaddr;
-       void *cur;
-       dma_addr_t dma_addr;
-       int count;
-} ll_pool;
-
-static DEFINE_SPINLOCK(ll_lock);
-
-struct pnx4008_dma_ll *pnx4008_alloc_ll_entry(dma_addr_t * ll_dma)
-{
-       struct pnx4008_dma_ll *ll = NULL;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ll_lock, flags);
-       if (ll_pool.count > 4) { /* can give one more */
-               ll = *(struct pnx4008_dma_ll **) ll_pool.cur;
-               *ll_dma = ll_pool.dma_addr + ((void *)ll - ll_pool.vaddr);
-               *(void **)ll_pool.cur = **(void ***)ll_pool.cur;
-               memset(ll, 0, sizeof(*ll));
-               ll_pool.count--;
-       }
-       spin_unlock_irqrestore(&ll_lock, flags);
-
-       return ll;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_alloc_ll_entry);
-
-void pnx4008_free_ll_entry(struct pnx4008_dma_ll * ll, dma_addr_t ll_dma)
-{
-       unsigned long flags;
-
-       if (ll) {
-               if ((unsigned long)((long)ll - (long)ll_pool.vaddr) > 0x4000) {
-                       printk(KERN_ERR "Trying to free entry not allocated by DMA\n");
-                       BUG();
-               }
-
-               if (ll->flags & DMA_BUFFER_ALLOCATED)
-                       ll->free(ll->alloc_data);
-
-               spin_lock_irqsave(&ll_lock, flags);
-               *(long *)ll = *(long *)ll_pool.cur;
-               *(long *)ll_pool.cur = (long)ll;
-               ll_pool.count++;
-               spin_unlock_irqrestore(&ll_lock, flags);
-       }
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_free_ll_entry);
-
-void pnx4008_free_ll(u32 ll_dma, struct pnx4008_dma_ll * ll)
-{
-       struct pnx4008_dma_ll *ptr;
-       u32 dma;
-
-       while (ll) {
-               dma = ll->next_dma;
-               ptr = ll->next;
-               pnx4008_free_ll_entry(ll, ll_dma);
-
-               ll_dma = dma;
-               ll = ptr;
-       }
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_free_ll);
-
-static int dma_channels_requested = 0;
-
-static inline void dma_increment_usage(void)
-{
-       if (!dma_channels_requested++) {
-               struct clk *clk = clk_get(0, "dma_ck");
-               if (!IS_ERR(clk)) {
-                       clk_set_rate(clk, 1);
-                       clk_put(clk);
-               }
-               pnx4008_config_dma(-1, -1, 1);
-       }
-}
-static inline void dma_decrement_usage(void)
-{
-       if (!--dma_channels_requested) {
-               struct clk *clk = clk_get(0, "dma_ck");
-               if (!IS_ERR(clk)) {
-                       clk_set_rate(clk, 0);
-                       clk_put(clk);
-               }
-               pnx4008_config_dma(-1, -1, 0);
-
-       }
-}
-
-static DEFINE_SPINLOCK(dma_lock);
-
-static inline void pnx4008_dma_lock(void)
-{
-       spin_lock_irq(&dma_lock);
-}
-
-static inline void pnx4008_dma_unlock(void)
-{
-       spin_unlock_irq(&dma_lock);
-}
-
-#define VALID_CHANNEL(c)       (((c) >= 0) && ((c) < MAX_DMA_CHANNELS))
-
-int pnx4008_request_channel(char *name, int ch,
-                           void (*irq_handler) (int, int, void *), void *data)
-{
-       int i, found = 0;
-
-       /* basic sanity checks */
-       if (!name || (ch != -1 && !VALID_CHANNEL(ch)))
-               return -EINVAL;
-
-       pnx4008_dma_lock();
-
-       /* try grabbing a DMA channel with the requested priority */
-       for (i = MAX_DMA_CHANNELS - 1; i >= 0; i--) {
-               if (!dma_channels[i].name && (ch == -1 || ch == i)) {
-                       found = 1;
-                       break;
-               }
-       }
-
-       if (found) {
-               dma_increment_usage();
-               dma_channels[i].name = name;
-               dma_channels[i].irq_handler = irq_handler;
-               dma_channels[i].data = data;
-               dma_channels[i].ll = NULL;
-               dma_channels[i].ll_dma = 0;
-       } else {
-               printk(KERN_WARNING "No more available DMA channels for %s\n",
-                      name);
-               i = -ENODEV;
-       }
-
-       pnx4008_dma_unlock();
-       return i;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_request_channel);
-
-void pnx4008_free_channel(int ch)
-{
-       if (!dma_channels[ch].name) {
-               printk(KERN_CRIT
-                      "%s: trying to free channel %d which is already freed\n",
-                      __func__, ch);
-               return;
-       }
-
-       pnx4008_dma_lock();
-       pnx4008_free_ll(dma_channels[ch].ll_dma, dma_channels[ch].ll);
-       dma_channels[ch].ll = NULL;
-       dma_decrement_usage();
-
-       dma_channels[ch].name = NULL;
-       pnx4008_dma_unlock();
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_free_channel);
-
-int pnx4008_config_dma(int ahb_m1_be, int ahb_m2_be, int enable)
-{
-       unsigned long dma_cfg = __raw_readl(DMAC_CONFIG);
-
-       switch (ahb_m1_be) {
-       case 0:
-               dma_cfg &= ~(1 << 1);
-               break;
-       case 1:
-               dma_cfg |= (1 << 1);
-               break;
-       default:
-               break;
-       }
-
-       switch (ahb_m2_be) {
-       case 0:
-               dma_cfg &= ~(1 << 2);
-               break;
-       case 1:
-               dma_cfg |= (1 << 2);
-               break;
-       default:
-               break;
-       }
-
-       switch (enable) {
-       case 0:
-               dma_cfg &= ~(1 << 0);
-               break;
-       case 1:
-               dma_cfg |= (1 << 0);
-               break;
-       default:
-               break;
-       }
-
-       pnx4008_dma_lock();
-       __raw_writel(dma_cfg, DMAC_CONFIG);
-       pnx4008_dma_unlock();
-
-       return 0;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_config_dma);
-
-int pnx4008_dma_pack_control(const struct pnx4008_dma_ch_ctrl * ch_ctrl,
-                            unsigned long *ctrl)
-{
-       int i = 0, dbsize, sbsize, err = 0;
-
-       if (!ctrl || !ch_ctrl) {
-               err = -EINVAL;
-               goto out;
-       }
-
-       *ctrl = 0;
-
-       switch (ch_ctrl->tc_mask) {
-       case 0:
-               break;
-       case 1:
-               *ctrl |= (1 << 31);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-
-       switch (ch_ctrl->cacheable) {
-       case 0:
-               break;
-       case 1:
-               *ctrl |= (1 << 30);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_ctrl->bufferable) {
-       case 0:
-               break;
-       case 1:
-               *ctrl |= (1 << 29);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_ctrl->priv_mode) {
-       case 0:
-               break;
-       case 1:
-               *ctrl |= (1 << 28);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_ctrl->di) {
-       case 0:
-               break;
-       case 1:
-               *ctrl |= (1 << 27);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_ctrl->si) {
-       case 0:
-               break;
-       case 1:
-               *ctrl |= (1 << 26);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_ctrl->dest_ahb1) {
-       case 0:
-               break;
-       case 1:
-               *ctrl |= (1 << 25);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_ctrl->src_ahb1) {
-       case 0:
-               break;
-       case 1:
-               *ctrl |= (1 << 24);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_ctrl->dwidth) {
-       case WIDTH_BYTE:
-               *ctrl &= ~(7 << 21);
-               break;
-       case WIDTH_HWORD:
-               *ctrl &= ~(7 << 21);
-               *ctrl |= (1 << 21);
-               break;
-       case WIDTH_WORD:
-               *ctrl &= ~(7 << 21);
-               *ctrl |= (2 << 21);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_ctrl->swidth) {
-       case WIDTH_BYTE:
-               *ctrl &= ~(7 << 18);
-               break;
-       case WIDTH_HWORD:
-               *ctrl &= ~(7 << 18);
-               *ctrl |= (1 << 18);
-               break;
-       case WIDTH_WORD:
-               *ctrl &= ~(7 << 18);
-               *ctrl |= (2 << 18);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       dbsize = ch_ctrl->dbsize;
-       while (!(dbsize & 1)) {
-               i++;
-               dbsize >>= 1;
-       }
-       if (ch_ctrl->dbsize != 1 || i > 8 || i == 1) {
-               err = -EINVAL;
-               goto out;
-       } else if (i > 1)
-               i--;
-       *ctrl &= ~(7 << 15);
-       *ctrl |= (i << 15);
-
-       sbsize = ch_ctrl->sbsize;
-       while (!(sbsize & 1)) {
-               i++;
-               sbsize >>= 1;
-       }
-       if (ch_ctrl->sbsize != 1 || i > 8 || i == 1) {
-               err = -EINVAL;
-               goto out;
-       } else if (i > 1)
-               i--;
-       *ctrl &= ~(7 << 12);
-       *ctrl |= (i << 12);
-
-       if (ch_ctrl->tr_size > 0x7ff) {
-               err = -E2BIG;
-               goto out;
-       }
-       *ctrl &= ~0x7ff;
-       *ctrl |= ch_ctrl->tr_size & 0x7ff;
-
-out:
-       return err;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_dma_pack_control);
-
-int pnx4008_dma_parse_control(unsigned long ctrl,
-                             struct pnx4008_dma_ch_ctrl * ch_ctrl)
-{
-       int err = 0;
-
-       if (!ch_ctrl) {
-               err = -EINVAL;
-               goto out;
-       }
-
-       ch_ctrl->tr_size = ctrl & 0x7ff;
-       ctrl >>= 12;
-
-       ch_ctrl->sbsize = 1 << (ctrl & 7);
-       if (ch_ctrl->sbsize > 1)
-               ch_ctrl->sbsize <<= 1;
-       ctrl >>= 3;
-
-       ch_ctrl->dbsize = 1 << (ctrl & 7);
-       if (ch_ctrl->dbsize > 1)
-               ch_ctrl->dbsize <<= 1;
-       ctrl >>= 3;
-
-       switch (ctrl & 7) {
-       case 0:
-               ch_ctrl->swidth = WIDTH_BYTE;
-               break;
-       case 1:
-               ch_ctrl->swidth = WIDTH_HWORD;
-               break;
-       case 2:
-               ch_ctrl->swidth = WIDTH_WORD;
-               break;
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       ctrl >>= 3;
-
-       switch (ctrl & 7) {
-       case 0:
-               ch_ctrl->dwidth = WIDTH_BYTE;
-               break;
-       case 1:
-               ch_ctrl->dwidth = WIDTH_HWORD;
-               break;
-       case 2:
-               ch_ctrl->dwidth = WIDTH_WORD;
-               break;
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       ctrl >>= 3;
-
-       ch_ctrl->src_ahb1 = ctrl & 1;
-       ctrl >>= 1;
-
-       ch_ctrl->dest_ahb1 = ctrl & 1;
-       ctrl >>= 1;
-
-       ch_ctrl->si = ctrl & 1;
-       ctrl >>= 1;
-
-       ch_ctrl->di = ctrl & 1;
-       ctrl >>= 1;
-
-       ch_ctrl->priv_mode = ctrl & 1;
-       ctrl >>= 1;
-
-       ch_ctrl->bufferable = ctrl & 1;
-       ctrl >>= 1;
-
-       ch_ctrl->cacheable = ctrl & 1;
-       ctrl >>= 1;
-
-       ch_ctrl->tc_mask = ctrl & 1;
-
-out:
-       return err;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_dma_parse_control);
-
-int pnx4008_dma_pack_config(const struct pnx4008_dma_ch_config * ch_cfg,
-                           unsigned long *cfg)
-{
-       int err = 0;
-
-       if (!cfg || !ch_cfg) {
-               err = -EINVAL;
-               goto out;
-       }
-
-       *cfg = 0;
-
-       switch (ch_cfg->halt) {
-       case 0:
-               break;
-       case 1:
-               *cfg |= (1 << 18);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_cfg->active) {
-       case 0:
-               break;
-       case 1:
-               *cfg |= (1 << 17);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_cfg->lock) {
-       case 0:
-               break;
-       case 1:
-               *cfg |= (1 << 16);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_cfg->itc) {
-       case 0:
-               break;
-       case 1:
-               *cfg |= (1 << 15);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_cfg->ie) {
-       case 0:
-               break;
-       case 1:
-               *cfg |= (1 << 14);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       switch (ch_cfg->flow_cntrl) {
-       case FC_MEM2MEM_DMA:
-               *cfg &= ~(7 << 11);
-               break;
-       case FC_MEM2PER_DMA:
-               *cfg &= ~(7 << 11);
-               *cfg |= (1 << 11);
-               break;
-       case FC_PER2MEM_DMA:
-               *cfg &= ~(7 << 11);
-               *cfg |= (2 << 11);
-               break;
-       case FC_PER2PER_DMA:
-               *cfg &= ~(7 << 11);
-               *cfg |= (3 << 11);
-               break;
-       case FC_PER2PER_DPER:
-               *cfg &= ~(7 << 11);
-               *cfg |= (4 << 11);
-               break;
-       case FC_MEM2PER_PER:
-               *cfg &= ~(7 << 11);
-               *cfg |= (5 << 11);
-               break;
-       case FC_PER2MEM_PER:
-               *cfg &= ~(7 << 11);
-               *cfg |= (6 << 11);
-               break;
-       case FC_PER2PER_SPER:
-               *cfg |= (7 << 11);
-               break;
-
-       default:
-               err = -EINVAL;
-               goto out;
-       }
-       *cfg &= ~(0x1f << 6);
-       *cfg |= ((ch_cfg->dest_per & 0x1f) << 6);
-
-       *cfg &= ~(0x1f << 1);
-       *cfg |= ((ch_cfg->src_per & 0x1f) << 1);
-
-out:
-       return err;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_dma_pack_config);
-
-int pnx4008_dma_parse_config(unsigned long cfg,
-                            struct pnx4008_dma_ch_config * ch_cfg)
-{
-       int err = 0;
-
-       if (!ch_cfg) {
-               err = -EINVAL;
-               goto out;
-       }
-
-       cfg >>= 1;
-
-       ch_cfg->src_per = cfg & 0x1f;
-       cfg >>= 5;
-
-       ch_cfg->dest_per = cfg & 0x1f;
-       cfg >>= 5;
-
-       switch (cfg & 7) {
-       case 0:
-               ch_cfg->flow_cntrl = FC_MEM2MEM_DMA;
-               break;
-       case 1:
-               ch_cfg->flow_cntrl = FC_MEM2PER_DMA;
-               break;
-       case 2:
-               ch_cfg->flow_cntrl = FC_PER2MEM_DMA;
-               break;
-       case 3:
-               ch_cfg->flow_cntrl = FC_PER2PER_DMA;
-               break;
-       case 4:
-               ch_cfg->flow_cntrl = FC_PER2PER_DPER;
-               break;
-       case 5:
-               ch_cfg->flow_cntrl = FC_MEM2PER_PER;
-               break;
-       case 6:
-               ch_cfg->flow_cntrl = FC_PER2MEM_PER;
-               break;
-       case 7:
-               ch_cfg->flow_cntrl = FC_PER2PER_SPER;
-       }
-       cfg >>= 3;
-
-       ch_cfg->ie = cfg & 1;
-       cfg >>= 1;
-
-       ch_cfg->itc = cfg & 1;
-       cfg >>= 1;
-
-       ch_cfg->lock = cfg & 1;
-       cfg >>= 1;
-
-       ch_cfg->active = cfg & 1;
-       cfg >>= 1;
-
-       ch_cfg->halt = cfg & 1;
-
-out:
-       return err;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_dma_parse_config);
-
-void pnx4008_dma_split_head_entry(struct pnx4008_dma_config * config,
-                                 struct pnx4008_dma_ch_ctrl * ctrl)
-{
-       int new_len = ctrl->tr_size, num_entries = 0;
-       int old_len = new_len;
-       int src_width, dest_width, count = 1;
-
-       switch (ctrl->swidth) {
-       case WIDTH_BYTE:
-               src_width = 1;
-               break;
-       case WIDTH_HWORD:
-               src_width = 2;
-               break;
-       case WIDTH_WORD:
-               src_width = 4;
-               break;
-       default:
-               return;
-       }
-
-       switch (ctrl->dwidth) {
-       case WIDTH_BYTE:
-               dest_width = 1;
-               break;
-       case WIDTH_HWORD:
-               dest_width = 2;
-               break;
-       case WIDTH_WORD:
-               dest_width = 4;
-               break;
-       default:
-               return;
-       }
-
-       while (new_len > 0x7FF) {
-               num_entries++;
-               new_len = (ctrl->tr_size + num_entries) / (num_entries + 1);
-       }
-       if (num_entries != 0) {
-               struct pnx4008_dma_ll *ll = NULL;
-               config->ch_ctrl &= ~0x7ff;
-               config->ch_ctrl |= new_len;
-               if (!config->is_ll) {
-                       config->is_ll = 1;
-                       while (num_entries) {
-                               if (!ll) {
-                                       config->ll =
-                                           pnx4008_alloc_ll_entry(&config->
-                                                                  ll_dma);
-                                       ll = config->ll;
-                               } else {
-                                       ll->next =
-                                           pnx4008_alloc_ll_entry(&ll->
-                                                                  next_dma);
-                                       ll = ll->next;
-                               }
-
-                               if (ctrl->si)
-                                       ll->src_addr =
-                                           config->src_addr +
-                                           src_width * new_len * count;
-                               else
-                                       ll->src_addr = config->src_addr;
-                               if (ctrl->di)
-                                       ll->dest_addr =
-                                           config->dest_addr +
-                                           dest_width * new_len * count;
-                               else
-                                       ll->dest_addr = config->dest_addr;
-                               ll->ch_ctrl = config->ch_ctrl & 0x7fffffff;
-                               ll->next_dma = 0;
-                               ll->next = NULL;
-                               num_entries--;
-                               count++;
-                       }
-               } else {
-                       struct pnx4008_dma_ll *ll_old = config->ll;
-                       unsigned long ll_dma_old = config->ll_dma;
-                       while (num_entries) {
-                               if (!ll) {
-                                       config->ll =
-                                           pnx4008_alloc_ll_entry(&config->
-                                                                  ll_dma);
-                                       ll = config->ll;
-                               } else {
-                                       ll->next =
-                                           pnx4008_alloc_ll_entry(&ll->
-                                                                  next_dma);
-                                       ll = ll->next;
-                               }
-
-                               if (ctrl->si)
-                                       ll->src_addr =
-                                           config->src_addr +
-                                           src_width * new_len * count;
-                               else
-                                       ll->src_addr = config->src_addr;
-                               if (ctrl->di)
-                                       ll->dest_addr =
-                                           config->dest_addr +
-                                           dest_width * new_len * count;
-                               else
-                                       ll->dest_addr = config->dest_addr;
-                               ll->ch_ctrl = config->ch_ctrl & 0x7fffffff;
-                               ll->next_dma = 0;
-                               ll->next = NULL;
-                               num_entries--;
-                               count++;
-                       }
-                       ll->next_dma = ll_dma_old;
-                       ll->next = ll_old;
-               }
-               /* adjust last length/tc */
-               ll->ch_ctrl = config->ch_ctrl & (~0x7ff);
-               ll->ch_ctrl |= old_len - new_len * (count - 1);
-               config->ch_ctrl &= 0x7fffffff;
-       }
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_dma_split_head_entry);
-
-void pnx4008_dma_split_ll_entry(struct pnx4008_dma_ll * cur_ll,
-                               struct pnx4008_dma_ch_ctrl * ctrl)
-{
-       int new_len = ctrl->tr_size, num_entries = 0;
-       int old_len = new_len;
-       int src_width, dest_width, count = 1;
-
-       switch (ctrl->swidth) {
-       case WIDTH_BYTE:
-               src_width = 1;
-               break;
-       case WIDTH_HWORD:
-               src_width = 2;
-               break;
-       case WIDTH_WORD:
-               src_width = 4;
-               break;
-       default:
-               return;
-       }
-
-       switch (ctrl->dwidth) {
-       case WIDTH_BYTE:
-               dest_width = 1;
-               break;
-       case WIDTH_HWORD:
-               dest_width = 2;
-               break;
-       case WIDTH_WORD:
-               dest_width = 4;
-               break;
-       default:
-               return;
-       }
-
-       while (new_len > 0x7FF) {
-               num_entries++;
-               new_len = (ctrl->tr_size + num_entries) / (num_entries + 1);
-       }
-       if (num_entries != 0) {
-               struct pnx4008_dma_ll *ll = NULL;
-               cur_ll->ch_ctrl &= ~0x7ff;
-               cur_ll->ch_ctrl |= new_len;
-               if (!cur_ll->next) {
-                       while (num_entries) {
-                               if (!ll) {
-                                       cur_ll->next =
-                                           pnx4008_alloc_ll_entry(&cur_ll->
-                                                                  next_dma);
-                                       ll = cur_ll->next;
-                               } else {
-                                       ll->next =
-                                           pnx4008_alloc_ll_entry(&ll->
-                                                                  next_dma);
-                                       ll = ll->next;
-                               }
-
-                               if (ctrl->si)
-                                       ll->src_addr =
-                                           cur_ll->src_addr +
-                                           src_width * new_len * count;
-                               else
-                                       ll->src_addr = cur_ll->src_addr;
-                               if (ctrl->di)
-                                       ll->dest_addr =
-                                           cur_ll->dest_addr +
-                                           dest_width * new_len * count;
-                               else
-                                       ll->dest_addr = cur_ll->dest_addr;
-                               ll->ch_ctrl = cur_ll->ch_ctrl & 0x7fffffff;
-                               ll->next_dma = 0;
-                               ll->next = NULL;
-                               num_entries--;
-                               count++;
-                       }
-               } else {
-                       struct pnx4008_dma_ll *ll_old = cur_ll->next;
-                       unsigned long ll_dma_old = cur_ll->next_dma;
-                       while (num_entries) {
-                               if (!ll) {
-                                       cur_ll->next =
-                                           pnx4008_alloc_ll_entry(&cur_ll->
-                                                                  next_dma);
-                                       ll = cur_ll->next;
-                               } else {
-                                       ll->next =
-                                           pnx4008_alloc_ll_entry(&ll->
-                                                                  next_dma);
-                                       ll = ll->next;
-                               }
-
-                               if (ctrl->si)
-                                       ll->src_addr =
-                                           cur_ll->src_addr +
-                                           src_width * new_len * count;
-                               else
-                                       ll->src_addr = cur_ll->src_addr;
-                               if (ctrl->di)
-                                       ll->dest_addr =
-                                           cur_ll->dest_addr +
-                                           dest_width * new_len * count;
-                               else
-                                       ll->dest_addr = cur_ll->dest_addr;
-                               ll->ch_ctrl = cur_ll->ch_ctrl & 0x7fffffff;
-                               ll->next_dma = 0;
-                               ll->next = NULL;
-                               num_entries--;
-                               count++;
-                       }
-
-                       ll->next_dma = ll_dma_old;
-                       ll->next = ll_old;
-               }
-               /* adjust last length/tc */
-               ll->ch_ctrl = cur_ll->ch_ctrl & (~0x7ff);
-               ll->ch_ctrl |= old_len - new_len * (count - 1);
-               cur_ll->ch_ctrl &= 0x7fffffff;
-       }
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_dma_split_ll_entry);
-
-int pnx4008_config_channel(int ch, struct pnx4008_dma_config * config)
-{
-       if (!VALID_CHANNEL(ch) || !dma_channels[ch].name)
-               return -EINVAL;
-
-       pnx4008_dma_lock();
-       __raw_writel(config->src_addr, DMAC_Cx_SRC_ADDR(ch));
-       __raw_writel(config->dest_addr, DMAC_Cx_DEST_ADDR(ch));
-
-       if (config->is_ll)
-               __raw_writel(config->ll_dma, DMAC_Cx_LLI(ch));
-       else
-               __raw_writel(0, DMAC_Cx_LLI(ch));
-
-       __raw_writel(config->ch_ctrl, DMAC_Cx_CONTROL(ch));
-       __raw_writel(config->ch_cfg, DMAC_Cx_CONFIG(ch));
-       pnx4008_dma_unlock();
-
-       return 0;
-
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_config_channel);
-
-int pnx4008_channel_get_config(int ch, struct pnx4008_dma_config * config)
-{
-       if (!VALID_CHANNEL(ch) || !dma_channels[ch].name || !config)
-               return -EINVAL;
-
-       pnx4008_dma_lock();
-       config->ch_cfg = __raw_readl(DMAC_Cx_CONFIG(ch));
-       config->ch_ctrl = __raw_readl(DMAC_Cx_CONTROL(ch));
-
-       config->ll_dma = __raw_readl(DMAC_Cx_LLI(ch));
-       config->is_ll = config->ll_dma ? 1 : 0;
-
-       config->src_addr = __raw_readl(DMAC_Cx_SRC_ADDR(ch));
-       config->dest_addr = __raw_readl(DMAC_Cx_DEST_ADDR(ch));
-       pnx4008_dma_unlock();
-
-       return 0;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_channel_get_config);
-
-int pnx4008_dma_ch_enable(int ch)
-{
-       unsigned long ch_cfg;
-
-       if (!VALID_CHANNEL(ch) || !dma_channels[ch].name)
-               return -EINVAL;
-
-       pnx4008_dma_lock();
-       ch_cfg = __raw_readl(DMAC_Cx_CONFIG(ch));
-       ch_cfg |= 1;
-       __raw_writel(ch_cfg, DMAC_Cx_CONFIG(ch));
-       pnx4008_dma_unlock();
-
-       return 0;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_dma_ch_enable);
-
-int pnx4008_dma_ch_disable(int ch)
-{
-       unsigned long ch_cfg;
-
-       if (!VALID_CHANNEL(ch) || !dma_channels[ch].name)
-               return -EINVAL;
-
-       pnx4008_dma_lock();
-       ch_cfg = __raw_readl(DMAC_Cx_CONFIG(ch));
-       ch_cfg &= ~1;
-       __raw_writel(ch_cfg, DMAC_Cx_CONFIG(ch));
-       pnx4008_dma_unlock();
-
-       return 0;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_dma_ch_disable);
-
-int pnx4008_dma_ch_enabled(int ch)
-{
-       unsigned long ch_cfg;
-
-       if (!VALID_CHANNEL(ch) || !dma_channels[ch].name)
-               return -EINVAL;
-
-       pnx4008_dma_lock();
-       ch_cfg = __raw_readl(DMAC_Cx_CONFIG(ch));
-       pnx4008_dma_unlock();
-
-       return ch_cfg & 1;
-}
-
-EXPORT_SYMBOL_GPL(pnx4008_dma_ch_enabled);
-
-static irqreturn_t dma_irq_handler(int irq, void *dev_id)
-{
-       int i;
-       unsigned long dint = __raw_readl(DMAC_INT_STAT);
-       unsigned long tcint = __raw_readl(DMAC_INT_TC_STAT);
-       unsigned long eint = __raw_readl(DMAC_INT_ERR_STAT);
-       unsigned long i_bit;
-
-       for (i = MAX_DMA_CHANNELS - 1; i >= 0; i--) {
-               i_bit = 1 << i;
-               if (dint & i_bit) {
-                       struct dma_channel *channel = &dma_channels[i];
-
-                       if (channel->name && channel->irq_handler) {
-                               int cause = 0;
-
-                               if (eint & i_bit)
-                                       cause |= DMA_ERR_INT;
-                               if (tcint & i_bit)
-                                       cause |= DMA_TC_INT;
-                               channel->irq_handler(i, cause, channel->data);
-                       } else {
-                               /*
-                                * IRQ for an unregistered DMA channel
-                                */
-                               printk(KERN_WARNING
-                                      "spurious IRQ for DMA channel %d\n", i);
-                       }
-                       if (tcint & i_bit)
-                               __raw_writel(i_bit, DMAC_INT_TC_CLEAR);
-                       if (eint & i_bit)
-                               __raw_writel(i_bit, DMAC_INT_ERR_CLEAR);
-               }
-       }
-       return IRQ_HANDLED;
-}
-
-static int __init pnx4008_dma_init(void)
-{
-       int ret, i;
-
-       ret = request_irq(DMA_INT, dma_irq_handler, 0, "DMA", NULL);
-       if (ret) {
-               printk(KERN_CRIT "Wow!  Can't register IRQ for DMA\n");
-               goto out;
-       }
-
-       ll_pool.count = 0x4000 / sizeof(struct pnx4008_dma_ll);
-       ll_pool.cur = ll_pool.vaddr =
-           dma_alloc_coherent(NULL, ll_pool.count * sizeof(struct pnx4008_dma_ll),
-                              &ll_pool.dma_addr, GFP_KERNEL);
-
-       if (!ll_pool.vaddr) {
-               ret = -ENOMEM;
-               free_irq(DMA_INT, NULL);
-               goto out;
-       }
-
-       for (i = 0; i < ll_pool.count - 1; i++) {
-               void **addr = ll_pool.vaddr + i * sizeof(struct pnx4008_dma_ll);
-               *addr = (void *)addr + sizeof(struct pnx4008_dma_ll);
-       }
-       *(long *)(ll_pool.vaddr +
-                 (ll_pool.count - 1) * sizeof(struct pnx4008_dma_ll)) =
-           (long)ll_pool.vaddr;
-
-       __raw_writel(1, DMAC_CONFIG);
-
-out:
-       return ret;
-}
-arch_initcall(pnx4008_dma_init);
diff --git a/arch/arm/mach-pnx4008/gpio.c b/arch/arm/mach-pnx4008/gpio.c
deleted file mode 100644 (file)
index d3e71d3..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/gpio.c
- *
- * PNX4008 GPIO driver
- *
- * Author: Dmitry Chigirev <source@mvista.com>
- *
- * Based on reference code by Iwo Mergler and Z.Tabaaloute from Philips:
- * Copyright (c) 2005 Koninklijke Philips Electronics N.V.
- *
- * 2005 (c) MontaVista Software, Inc. 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/types.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/io.h>
-#include <mach/hardware.h>
-#include <mach/platform.h>
-#include <mach/gpio-pnx4008.h>
-
-/* register definitions */
-#define PIO_VA_BASE    IO_ADDRESS(PNX4008_PIO_BASE)
-
-#define PIO_INP_STATE  (0x00U)
-#define PIO_OUTP_SET   (0x04U)
-#define PIO_OUTP_CLR   (0x08U)
-#define PIO_OUTP_STATE (0x0CU)
-#define PIO_DRV_SET    (0x10U)
-#define PIO_DRV_CLR    (0x14U)
-#define PIO_DRV_STATE  (0x18U)
-#define PIO_SDINP_STATE        (0x1CU)
-#define PIO_SDOUTP_SET (0x20U)
-#define PIO_SDOUTP_CLR (0x24U)
-#define PIO_MUX_SET    (0x28U)
-#define PIO_MUX_CLR    (0x2CU)
-#define PIO_MUX_STATE  (0x30U)
-
-static inline void gpio_lock(void)
-{
-       local_irq_disable();
-}
-
-static inline void gpio_unlock(void)
-{
-       local_irq_enable();
-}
-
-/* Inline functions */
-static inline int gpio_read_bit(u32 reg, int gpio)
-{
-       u32 bit, val;
-       int ret = -EFAULT;
-
-       if (gpio < 0)
-               goto out;
-
-       bit = GPIO_BIT(gpio);
-       if (bit) {
-               val = __raw_readl(PIO_VA_BASE + reg);
-               ret = (val & bit) ? 1 : 0;
-       }
-out:
-       return ret;
-}
-
-static inline int gpio_set_bit(u32 reg, int gpio)
-{
-       u32 bit, val;
-       int ret = -EFAULT;
-
-       if (gpio < 0)
-               goto out;
-
-       bit = GPIO_BIT(gpio);
-       if (bit) {
-               val = __raw_readl(PIO_VA_BASE + reg);
-               val |= bit;
-               __raw_writel(val, PIO_VA_BASE + reg);
-               ret = 0;
-       }
-out:
-       return ret;
-}
-
-/* Very simple access control, bitmap for allocated/free */
-static unsigned long access_map[4];
-#define INP_INDEX      0
-#define OUTP_INDEX     1
-#define GPIO_INDEX     2
-#define MUX_INDEX      3
-
-/*GPIO to Input Mapping */
-static short gpio_to_inp_map[32] = {
-       -1, -1, -1, -1, -1, -1, -1, -1,
-       -1, -1, -1, -1, -1, -1, -1, -1,
-       -1, -1, -1, -1, -1, -1, -1, -1,
-       -1, 10, 11, 12, 13, 14, 24, -1
-};
-
-/*GPIO to Mux Mapping */
-static short gpio_to_mux_map[32] = {
-       -1, -1, -1, -1, -1, -1, -1, -1,
-       -1, -1, -1, -1, -1, -1, -1, -1,
-       -1, -1, -1, -1, -1, -1, -1, -1,
-       -1, -1, -1, 0, 1, 4, 5, -1
-};
-
-/*Output to Mux Mapping */
-static short outp_to_mux_map[32] = {
-       -1, -1, -1, 6, -1, -1, -1, -1,
-       -1, -1, -1, -1, -1, -1, -1, -1,
-       -1, -1, -1, -1, -1, 2, -1, -1,
-       -1, -1, -1, -1, -1, -1, -1, -1
-};
-
-int pnx4008_gpio_register_pin(unsigned short pin)
-{
-       unsigned long bit = GPIO_BIT(pin);
-       int ret = -EBUSY;       /* Already in use */
-
-       gpio_lock();
-
-       if (GPIO_ISBID(pin)) {
-               if (access_map[GPIO_INDEX] & bit)
-                       goto out;
-               access_map[GPIO_INDEX] |= bit;
-
-       } else if (GPIO_ISRAM(pin)) {
-               if (access_map[GPIO_INDEX] & bit)
-                       goto out;
-               access_map[GPIO_INDEX] |= bit;
-
-       } else if (GPIO_ISMUX(pin)) {
-               if (access_map[MUX_INDEX] & bit)
-                       goto out;
-               access_map[MUX_INDEX] |= bit;
-
-       } else if (GPIO_ISOUT(pin)) {
-               if (access_map[OUTP_INDEX] & bit)
-                       goto out;
-               access_map[OUTP_INDEX] |= bit;
-
-       } else if (GPIO_ISIN(pin)) {
-               if (access_map[INP_INDEX] & bit)
-                       goto out;
-               access_map[INP_INDEX] |= bit;
-       } else
-               goto out;
-       ret = 0;
-
-out:
-       gpio_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(pnx4008_gpio_register_pin);
-
-int pnx4008_gpio_unregister_pin(unsigned short pin)
-{
-       unsigned long bit = GPIO_BIT(pin);
-       int ret = -EFAULT;      /* Not registered */
-
-       gpio_lock();
-
-       if (GPIO_ISBID(pin)) {
-               if (~access_map[GPIO_INDEX] & bit)
-                       goto out;
-               access_map[GPIO_INDEX] &= ~bit;
-       } else if (GPIO_ISRAM(pin)) {
-               if (~access_map[GPIO_INDEX] & bit)
-                       goto out;
-               access_map[GPIO_INDEX] &= ~bit;
-       } else if (GPIO_ISMUX(pin)) {
-               if (~access_map[MUX_INDEX] & bit)
-                       goto out;
-               access_map[MUX_INDEX] &= ~bit;
-       } else if (GPIO_ISOUT(pin)) {
-               if (~access_map[OUTP_INDEX] & bit)
-                       goto out;
-               access_map[OUTP_INDEX] &= ~bit;
-       } else if (GPIO_ISIN(pin)) {
-               if (~access_map[INP_INDEX] & bit)
-                       goto out;
-               access_map[INP_INDEX] &= ~bit;
-       } else
-               goto out;
-       ret = 0;
-
-out:
-       gpio_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(pnx4008_gpio_unregister_pin);
-
-unsigned long pnx4008_gpio_read_pin(unsigned short pin)
-{
-       unsigned long ret = -EFAULT;
-       int gpio = GPIO_BIT_MASK(pin);
-       gpio_lock();
-       if (GPIO_ISOUT(pin)) {
-               ret = gpio_read_bit(PIO_OUTP_STATE, gpio);
-       } else if (GPIO_ISRAM(pin)) {
-               if (gpio_read_bit(PIO_DRV_STATE, gpio) == 0) {
-                       ret = gpio_read_bit(PIO_SDINP_STATE, gpio);
-               }
-       } else if (GPIO_ISBID(pin)) {
-               ret = gpio_read_bit(PIO_DRV_STATE, gpio);
-               if (ret > 0)
-                       ret = gpio_read_bit(PIO_OUTP_STATE, gpio);
-               else if (ret == 0)
-                       ret =
-                           gpio_read_bit(PIO_INP_STATE, gpio_to_inp_map[gpio]);
-       } else if (GPIO_ISIN(pin)) {
-               ret = gpio_read_bit(PIO_INP_STATE, gpio);
-       }
-       gpio_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(pnx4008_gpio_read_pin);
-
-/* Write Value to output */
-int pnx4008_gpio_write_pin(unsigned short pin, int output)
-{
-       int gpio = GPIO_BIT_MASK(pin);
-       int ret = -EFAULT;
-
-       gpio_lock();
-       if (GPIO_ISOUT(pin)) {
-               printk( "writing '%x' to '%x'\n",
-                               gpio, output ? PIO_OUTP_SET : PIO_OUTP_CLR );
-               ret = gpio_set_bit(output ? PIO_OUTP_SET : PIO_OUTP_CLR, gpio);
-       } else if (GPIO_ISRAM(pin)) {
-               if (gpio_read_bit(PIO_DRV_STATE, gpio) > 0)
-                       ret = gpio_set_bit(output ? PIO_SDOUTP_SET :
-                                          PIO_SDOUTP_CLR, gpio);
-       } else if (GPIO_ISBID(pin)) {
-               if (gpio_read_bit(PIO_DRV_STATE, gpio) > 0)
-                       ret = gpio_set_bit(output ? PIO_OUTP_SET :
-                                          PIO_OUTP_CLR, gpio);
-       }
-       gpio_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(pnx4008_gpio_write_pin);
-
-/* Value = 1 : Set GPIO pin as output */
-/* Value = 0 : Set GPIO pin as input */
-int pnx4008_gpio_set_pin_direction(unsigned short pin, int output)
-{
-       int gpio = GPIO_BIT_MASK(pin);
-       int ret = -EFAULT;
-
-       gpio_lock();
-       if (GPIO_ISBID(pin) || GPIO_ISRAM(pin)) {
-               ret = gpio_set_bit(output ? PIO_DRV_SET : PIO_DRV_CLR, gpio);
-       }
-       gpio_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(pnx4008_gpio_set_pin_direction);
-
-/* Read GPIO pin direction: 0= pin used as input, 1= pin used as output*/
-int pnx4008_gpio_read_pin_direction(unsigned short pin)
-{
-       int gpio = GPIO_BIT_MASK(pin);
-       int ret = -EFAULT;
-
-       gpio_lock();
-       if (GPIO_ISBID(pin) || GPIO_ISRAM(pin)) {
-               ret = gpio_read_bit(PIO_DRV_STATE, gpio);
-       }
-       gpio_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(pnx4008_gpio_read_pin_direction);
-
-/* Value = 1 : Set pin to muxed function  */
-/* Value = 0 : Set pin as GPIO */
-int pnx4008_gpio_set_pin_mux(unsigned short pin, int output)
-{
-       int gpio = GPIO_BIT_MASK(pin);
-       int ret = -EFAULT;
-
-       gpio_lock();
-       if (GPIO_ISBID(pin)) {
-               ret =
-                   gpio_set_bit(output ? PIO_MUX_SET : PIO_MUX_CLR,
-                                gpio_to_mux_map[gpio]);
-       } else if (GPIO_ISOUT(pin)) {
-               ret =
-                   gpio_set_bit(output ? PIO_MUX_SET : PIO_MUX_CLR,
-                                outp_to_mux_map[gpio]);
-       } else if (GPIO_ISMUX(pin)) {
-               ret = gpio_set_bit(output ? PIO_MUX_SET : PIO_MUX_CLR, gpio);
-       }
-       gpio_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(pnx4008_gpio_set_pin_mux);
-
-/* Read pin mux function: 0= pin used as GPIO, 1= pin used for muxed function*/
-int pnx4008_gpio_read_pin_mux(unsigned short pin)
-{
-       int gpio = GPIO_BIT_MASK(pin);
-       int ret = -EFAULT;
-
-       gpio_lock();
-       if (GPIO_ISBID(pin)) {
-               ret = gpio_read_bit(PIO_MUX_STATE, gpio_to_mux_map[gpio]);
-       } else if (GPIO_ISOUT(pin)) {
-               ret = gpio_read_bit(PIO_MUX_STATE, outp_to_mux_map[gpio]);
-       } else if (GPIO_ISMUX(pin)) {
-               ret = gpio_read_bit(PIO_MUX_STATE, gpio);
-       }
-       gpio_unlock();
-       return ret;
-}
-
-EXPORT_SYMBOL(pnx4008_gpio_read_pin_mux);
diff --git a/arch/arm/mach-pnx4008/i2c.c b/arch/arm/mach-pnx4008/i2c.c
deleted file mode 100644 (file)
index 550cfc2..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * I2C initialization for PNX4008.
- *
- * Author: Vitaly Wool <vitalywool@gmail.com>
- *
- * 2005-2006 (c) MontaVista Software, Inc. 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/i2c.h>
-#include <linux/i2c-pnx.h>
-#include <linux/platform_device.h>
-#include <linux/err.h>
-#include <mach/platform.h>
-#include <mach/irqs.h>
-
-static struct resource i2c0_resources[] = {
-       {
-               .start = PNX4008_I2C1_BASE,
-               .end = PNX4008_I2C1_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       }, {
-               .start = I2C_1_INT,
-               .end = I2C_1_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct resource i2c1_resources[] = {
-       {
-               .start = PNX4008_I2C2_BASE,
-               .end = PNX4008_I2C2_BASE + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       }, {
-               .start = I2C_2_INT,
-               .end = I2C_2_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct resource i2c2_resources[] = {
-       {
-               .start = PNX4008_USB_CONFIG_BASE + 0x300,
-               .end = PNX4008_USB_CONFIG_BASE + 0x300 + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       }, {
-               .start = USB_I2C_INT,
-               .end = USB_I2C_INT,
-               .flags = IORESOURCE_IRQ,
-       },
-};
-
-static struct platform_device i2c0_device = {
-       .name = "pnx-i2c.0",
-       .id = 0,
-       .resource = i2c0_resources,
-       .num_resources = ARRAY_SIZE(i2c0_resources),
-};
-
-static struct platform_device i2c1_device = {
-       .name = "pnx-i2c.1",
-       .id = 1,
-       .resource = i2c1_resources,
-       .num_resources = ARRAY_SIZE(i2c1_resources),
-};
-
-static struct platform_device i2c2_device = {
-       .name = "pnx-i2c.2",
-       .id = 2,
-       .resource = i2c2_resources,
-       .num_resources = ARRAY_SIZE(i2c2_resources),
-};
-
-static struct platform_device *devices[] __initdata = {
-       &i2c0_device,
-       &i2c1_device,
-       &i2c2_device,
-};
-
-void __init pnx4008_register_i2c_devices(void)
-{
-       platform_add_devices(devices, ARRAY_SIZE(devices));
-}
diff --git a/arch/arm/mach-pnx4008/include/mach/clock.h b/arch/arm/mach-pnx4008/include/mach/clock.h
deleted file mode 100644 (file)
index 8d2a5ef..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/clock.h
- *
- * Clock control driver for PNX4008 - header file
- *
- * Authors: Vitaly Wool, Dmitry Chigirev <source@mvista.com>
- *
- * 2005 (c) MontaVista Software, Inc. 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 __PNX4008_CLOCK_H__
-#define __PNX4008_CLOCK_H__
-
-struct module;
-struct clk;
-
-#define PWRMAN_VA_BASE         IO_ADDRESS(PNX4008_PWRMAN_BASE)
-#define HCLKDIVCTRL_REG                (PWRMAN_VA_BASE + 0x40)
-#define PWRCTRL_REG            (PWRMAN_VA_BASE + 0x44)
-#define PLLCTRL_REG            (PWRMAN_VA_BASE + 0x48)
-#define OSC13CTRL_REG          (PWRMAN_VA_BASE + 0x4c)
-#define SYSCLKCTRL_REG         (PWRMAN_VA_BASE + 0x50)
-#define HCLKPLLCTRL_REG                (PWRMAN_VA_BASE + 0x58)
-#define USBCTRL_REG            (PWRMAN_VA_BASE + 0x64)
-#define SDRAMCLKCTRL_REG       (PWRMAN_VA_BASE + 0x68)
-#define MSCTRL_REG             (PWRMAN_VA_BASE + 0x80)
-#define BTCLKCTRL              (PWRMAN_VA_BASE + 0x84)
-#define DUMCLKCTRL_REG         (PWRMAN_VA_BASE + 0x90)
-#define I2CCLKCTRL_REG         (PWRMAN_VA_BASE + 0xac)
-#define KEYCLKCTRL_REG         (PWRMAN_VA_BASE + 0xb0)
-#define TSCLKCTRL_REG          (PWRMAN_VA_BASE + 0xb4)
-#define PWMCLKCTRL_REG         (PWRMAN_VA_BASE + 0xb8)
-#define TIMCLKCTRL_REG         (PWRMAN_VA_BASE + 0xbc)
-#define SPICTRL_REG            (PWRMAN_VA_BASE + 0xc4)
-#define FLASHCLKCTRL_REG       (PWRMAN_VA_BASE + 0xc8)
-#define UART3CLK_REG           (PWRMAN_VA_BASE + 0xd0)
-#define UARTCLKCTRL_REG                (PWRMAN_VA_BASE + 0xe4)
-#define DMACLKCTRL_REG         (PWRMAN_VA_BASE + 0xe8)
-#define AUTOCLK_CTRL           (PWRMAN_VA_BASE + 0xec)
-#define JPEGCLKCTRL_REG                (PWRMAN_VA_BASE + 0xfc)
-
-#define AUDIOCONFIG_VA_BASE    IO_ADDRESS(PNX4008_AUDIOCONFIG_BASE)
-#define DSPPLLCTRL_REG         (AUDIOCONFIG_VA_BASE + 0x60)
-#define DSPCLKCTRL_REG         (AUDIOCONFIG_VA_BASE + 0x64)
-#define AUDIOCLKCTRL_REG       (AUDIOCONFIG_VA_BASE + 0x68)
-#define AUDIOPLLCTRL_REG       (AUDIOCONFIG_VA_BASE + 0x6C)
-
-#define USB_OTG_CLKCTRL_REG    IO_ADDRESS(PNX4008_USB_CONFIG_BASE + 0xff4)
-
-#define VFP9CLKCTRL_REG                IO_ADDRESS(PNX4008_DEBUG_BASE)
-
-#define CLK_RATE_13MHZ 13000
-#define CLK_RATE_1MHZ 1000
-#define CLK_RATE_208MHZ 208000
-#define CLK_RATE_48MHZ 48000
-#define CLK_RATE_32KHZ 32
-
-#define PNX4008_UART_CLK CLK_RATE_13MHZ * 1000 /* in MHz */
-
-#endif
diff --git a/arch/arm/mach-pnx4008/include/mach/debug-macro.S b/arch/arm/mach-pnx4008/include/mach/debug-macro.S
deleted file mode 100644 (file)
index 469d60d..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* arch/arm/mach-pnx4008/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.
- *
-*/
-
-               .macro  addruart, rp, rv, tmp
-               mov     \rp, #0x00090000
-               add     \rv, \rp, #0xf4000000   @ virtual
-               add     \rp, \rp, #0x40000000   @ physical
-               .endm
-
-#define UART_SHIFT     2
-#include <asm/hardware/debug-8250.S>
diff --git a/arch/arm/mach-pnx4008/include/mach/dma.h b/arch/arm/mach-pnx4008/include/mach/dma.h
deleted file mode 100644 (file)
index f094bf8..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  arch/arm/mach-pnx4008/include/mach/dma.h
- *
- *  PNX4008 DMA header file
- *
- *  Author:    Vitaly Wool
- *  Copyright: MontaVista Software Inc. (c) 2005
- *
- *  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_DMA_H
-#define __ASM_ARCH_DMA_H
-
-#include "platform.h"
-
-#define MAX_DMA_CHANNELS       8
-
-#define DMAC_BASE              IO_ADDRESS(PNX4008_DMA_CONFIG_BASE)
-#define DMAC_INT_STAT          (DMAC_BASE + 0x0000)
-#define DMAC_INT_TC_STAT       (DMAC_BASE + 0x0004)
-#define DMAC_INT_TC_CLEAR      (DMAC_BASE + 0x0008)
-#define DMAC_INT_ERR_STAT      (DMAC_BASE + 0x000c)
-#define DMAC_INT_ERR_CLEAR     (DMAC_BASE + 0x0010)
-#define DMAC_SOFT_SREQ         (DMAC_BASE + 0x0024)
-#define DMAC_CONFIG            (DMAC_BASE + 0x0030)
-#define DMAC_Cx_SRC_ADDR(c)    (DMAC_BASE + 0x0100 + (c) * 0x20)
-#define DMAC_Cx_DEST_ADDR(c)   (DMAC_BASE + 0x0104 + (c) * 0x20)
-#define DMAC_Cx_LLI(c)         (DMAC_BASE + 0x0108 + (c) * 0x20)
-#define DMAC_Cx_CONTROL(c)     (DMAC_BASE + 0x010c + (c) * 0x20)
-#define DMAC_Cx_CONFIG(c)      (DMAC_BASE + 0x0110 + (c) * 0x20)
-
-enum {
-       WIDTH_BYTE = 0,
-       WIDTH_HWORD,
-       WIDTH_WORD
-};
-
-enum {
-       FC_MEM2MEM_DMA,
-       FC_MEM2PER_DMA,
-       FC_PER2MEM_DMA,
-       FC_PER2PER_DMA,
-       FC_PER2PER_DPER,
-       FC_MEM2PER_PER,
-       FC_PER2MEM_PER,
-       FC_PER2PER_SPER
-};
-
-enum {
-       DMA_INT_UNKNOWN = 0,
-       DMA_ERR_INT = 1,
-       DMA_TC_INT = 2,
-};
-
-enum {
-       DMA_BUFFER_ALLOCATED = 1,
-       DMA_HAS_LL = 2,
-};
-
-enum {
-       PER_CAM_DMA_1 = 0,
-       PER_NDF_FLASH = 1,
-       PER_MBX_SLAVE_FIFO = 2,
-       PER_SPI2_REC_XMIT = 3,
-       PER_MS_SD_RX_XMIT = 4,
-       PER_HS_UART_1_XMIT = 5,
-       PER_HS_UART_1_RX = 6,
-       PER_HS_UART_2_XMIT = 7,
-       PER_HS_UART_2_RX = 8,
-       PER_HS_UART_7_XMIT = 9,
-       PER_HS_UART_7_RX = 10,
-       PER_SPI1_REC_XMIT = 11,
-       PER_MLC_NDF_SREC = 12,
-       PER_CAM_DMA_2 = 13,
-       PER_PRNG_INFIFO = 14,
-       PER_PRNG_OUTFIFO = 15,
-};
-
-struct pnx4008_dma_ch_ctrl {
-       int tc_mask;
-       int cacheable;
-       int bufferable;
-       int priv_mode;
-       int di;
-       int si;
-       int dest_ahb1;
-       int src_ahb1;
-       int dwidth;
-       int swidth;
-       int dbsize;
-       int sbsize;
-       int tr_size;
-};
-
-struct pnx4008_dma_ch_config {
-       int halt;
-       int active;
-       int lock;
-       int itc;
-       int ie;
-       int flow_cntrl;
-       int dest_per;
-       int src_per;
-};
-
-struct pnx4008_dma_ll {
-       unsigned long src_addr;
-       unsigned long dest_addr;
-       u32 next_dma;
-       unsigned long ch_ctrl;
-       struct pnx4008_dma_ll *next;
-       int flags;
-       void *alloc_data;
-       int (*free) (void *);
-};
-
-struct pnx4008_dma_config {
-       int is_ll;
-       unsigned long src_addr;
-       unsigned long dest_addr;
-       unsigned long ch_ctrl;
-       unsigned long ch_cfg;
-       struct pnx4008_dma_ll *ll;
-       u32 ll_dma;
-       int flags;
-       void *alloc_data;
-       int (*free) (void *);
-};
-
-extern struct pnx4008_dma_ll *pnx4008_alloc_ll_entry(dma_addr_t *);
-extern void pnx4008_free_ll_entry(struct pnx4008_dma_ll *, dma_addr_t);
-extern void pnx4008_free_ll(u32 ll_dma, struct pnx4008_dma_ll *);
-
-extern int pnx4008_request_channel(char *, int,
-                                  void (*)(int, int, void *),
-                                  void *);
-extern void pnx4008_free_channel(int);
-extern int pnx4008_config_dma(int, int, int);
-extern int pnx4008_dma_pack_control(const struct pnx4008_dma_ch_ctrl *,
-                                   unsigned long *);
-extern int pnx4008_dma_parse_control(unsigned long,
-                                    struct pnx4008_dma_ch_ctrl *);
-extern int pnx4008_dma_pack_config(const struct pnx4008_dma_ch_config *,
-                                  unsigned long *);
-extern int pnx4008_dma_parse_config(unsigned long,
-                                   struct pnx4008_dma_ch_config *);
-extern int pnx4008_config_channel(int, struct pnx4008_dma_config *);
-extern int pnx4008_channel_get_config(int, struct pnx4008_dma_config *);
-extern int pnx4008_dma_ch_enable(int);
-extern int pnx4008_dma_ch_disable(int);
-extern int pnx4008_dma_ch_enabled(int);
-extern void pnx4008_dma_split_head_entry(struct pnx4008_dma_config *,
-                                        struct pnx4008_dma_ch_ctrl *);
-extern void pnx4008_dma_split_ll_entry(struct pnx4008_dma_ll *,
-                                      struct pnx4008_dma_ch_ctrl *);
-
-#endif                         /* _ASM_ARCH_DMA_H */
diff --git a/arch/arm/mach-pnx4008/include/mach/entry-macro.S b/arch/arm/mach-pnx4008/include/mach/entry-macro.S
deleted file mode 100644 (file)
index 77a5558..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/entry-macro.S
- *
- * Low-level IRQ helper macros for PNX4008-based platforms
- *
- * 2005-2006 (c) MontaVista Software, Inc.
- * Author: Vitaly Wool <vwool@ru.mvista.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 "platform.h"
-
-#define IO_BASE         0xF0000000
-#define IO_ADDRESS(x)  (((((x) & 0xff000000) >> 4) | ((x) & 0xfffff)) | IO_BASE)
-
-#define INTRC_MASK                     0x00
-#define INTRC_RAW_STAT                 0x04
-#define INTRC_STAT                     0x08
-#define INTRC_POLAR                    0x0C
-#define INTRC_ACT_TYPE                 0x10
-#define INTRC_TYPE                     0x14
-
-#define SIC1_BASE_INT   32
-#define SIC2_BASE_INT   64
-
-               .macro  get_irqnr_preamble, base, tmp
-               .endm
-
-               .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
-/* decode the MIC interrupt numbers */
-               ldr     \base, =IO_ADDRESS(PNX4008_INTCTRLMIC_BASE)
-               ldr     \irqstat, [\base, #INTRC_STAT]
-
-               cmp     \irqstat,#1<<16
-               movhs   \irqnr,#16
-               movlo   \irqnr,#0
-               movhs   \irqstat,\irqstat,lsr#16
-               cmp     \irqstat,#1<<8
-               addhs   \irqnr,\irqnr,#8
-               movhs   \irqstat,\irqstat,lsr#8
-               cmp     \irqstat,#1<<4
-               addhs   \irqnr,\irqnr,#4
-               movhs   \irqstat,\irqstat,lsr#4
-               cmp     \irqstat,#1<<2
-               addhs   \irqnr,\irqnr,#2
-               movhs   \irqstat,\irqstat,lsr#2
-               cmp     \irqstat,#1<<1
-               addhs   \irqnr,\irqnr,#1
-
-/* was there an interrupt ? if not then drop out with EQ status */
-               teq     \irqstat,#0
-               beq     1003f
-
-/* and now check for extended IRQ reasons */
-               cmp     \irqnr,#1
-               bls     1003f
-               cmp     \irqnr,#30
-               blo     1002f
-
-/* IRQ 31,30  : High priority cascade IRQ handle */
-/* read the correct SIC */
-/* decoding status after compare : eq is 30 (SIC1) , ne is 31 (SIC2) */
-/* set the base IRQ number */
-               ldreq   \base, =IO_ADDRESS(PNX4008_INTCTRLSIC1_BASE)
-               moveq  \irqnr,#SIC1_BASE_INT
-               ldrne   \base, =IO_ADDRESS(PNX4008_INTCTRLSIC2_BASE)
-               movne   \irqnr,#SIC2_BASE_INT
-               ldr     \irqstat, [\base, #INTRC_STAT]
-               ldr     \tmp,     [\base, #INTRC_TYPE]
-/* and with inverted mask : low priority interrupts  */
-               and     \irqstat,\irqstat,\tmp
-               b       1004f
-
-1003:
-/* IRQ 1,0  : Low priority cascade IRQ handle */
-/* read the correct SIC */
-/* decoding status after compare : eq is 1 (SIC2) , ne is 0 (SIC1)*/
-/* read the correct SIC */
-/* set the base IRQ number  */
-               ldrne   \base, =IO_ADDRESS(PNX4008_INTCTRLSIC1_BASE)
-               movne   \irqnr,#SIC1_BASE_INT
-               ldreq   \base, =IO_ADDRESS(PNX4008_INTCTRLSIC2_BASE)
-               moveq   \irqnr,#SIC2_BASE_INT
-               ldr     \irqstat, [\base, #INTRC_STAT]
-               ldr     \tmp,     [\base, #INTRC_TYPE]
-/* and with inverted mask : low priority interrupts  */
-               bic     \irqstat,\irqstat,\tmp
-
-1004:
-
-               cmp     \irqstat,#1<<16
-               addhs   \irqnr,\irqnr,#16
-               movhs   \irqstat,\irqstat,lsr#16
-               cmp     \irqstat,#1<<8
-               addhs   \irqnr,\irqnr,#8
-               movhs   \irqstat,\irqstat,lsr#8
-               cmp     \irqstat,#1<<4
-               addhs   \irqnr,\irqnr,#4
-               movhs   \irqstat,\irqstat,lsr#4
-               cmp     \irqstat,#1<<2
-               addhs   \irqnr,\irqnr,#2
-               movhs   \irqstat,\irqstat,lsr#2
-               cmp     \irqstat,#1<<1
-               addhs   \irqnr,\irqnr,#1
-
-
-/* is irqstat not zero */
-
-1002:
-/* we assert that irqstat is not equal to zero and return ne status if true*/
-               teq     \irqstat,#0
-1003:
-               .endm
-
diff --git a/arch/arm/mach-pnx4008/include/mach/gpio-pnx4008.h b/arch/arm/mach-pnx4008/include/mach/gpio-pnx4008.h
deleted file mode 100644 (file)
index 41027dd..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/gpio-pnx4008.h
- *
- * PNX4008 GPIO driver - header file
- *
- * Author: Dmitry Chigirev <source@mvista.com>
- *
- * Based on reference code by Iwo Mergler and Z.Tabaaloute from Philips:
- * Copyright (c) 2005 Koninklijke Philips Electronics N.V.
- *
- * 2005 (c) MontaVista Software, Inc. 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 _PNX4008_GPIO_H_
-#define _PNX4008_GPIO_H_
-
-
-/* Block numbers */
-#define GPIO_IN                (0)
-#define GPIO_OUT               (0x100)
-#define GPIO_BID               (0x200)
-#define GPIO_RAM               (0x300)
-#define GPIO_MUX               (0x400)
-
-#define GPIO_TYPE_MASK(K) ((K) & 0x700)
-
-/* INPUT GPIOs */
-/* GPI */
-#define GPI_00         (GPIO_IN | 0)
-#define GPI_01         (GPIO_IN | 1)
-#define GPI_02         (GPIO_IN | 2)
-#define GPI_03                 (GPIO_IN | 3)
-#define GPI_04         (GPIO_IN | 4)
-#define GPI_05         (GPIO_IN | 5)
-#define GPI_06         (GPIO_IN | 6)
-#define GPI_07         (GPIO_IN | 7)
-#define GPI_08         (GPIO_IN | 8)
-#define GPI_09         (GPIO_IN | 9)
-#define U1_RX          (GPIO_IN | 15)
-#define U2_HTCS        (GPIO_IN | 16)
-#define U2_RX          (GPIO_IN | 17)
-#define U3_RX          (GPIO_IN | 18)
-#define U4_RX          (GPIO_IN | 19)
-#define U5_RX          (GPIO_IN | 20)
-#define U6_IRRX        (GPIO_IN | 21)
-#define U7_HCTS        (GPIO_IN | 22)
-#define U7_RX          (GPIO_IN | 23)
-/* MISC IN */
-#define SPI1_DATIN     (GPIO_IN | 25)
-#define DISP_SYNC      (GPIO_IN | 26)
-#define SPI2_DATIN     (GPIO_IN | 27)
-#define GPI_11         (GPIO_IN | 28)
-
-#define GPIO_IN_MASK   0x1eff83ff
-
-/* OUTPUT GPIOs */
-/* GPO */
-#define GPO_00         (GPIO_OUT | 0)
-#define GPO_01         (GPIO_OUT | 1)
-#define GPO_02         (GPIO_OUT | 2)
-#define GPO_03                 (GPIO_OUT | 3)
-#define GPO_04         (GPIO_OUT | 4)
-#define GPO_05         (GPIO_OUT | 5)
-#define GPO_06         (GPIO_OUT | 6)
-#define GPO_07         (GPIO_OUT | 7)
-#define GPO_08         (GPIO_OUT | 8)
-#define GPO_09         (GPIO_OUT | 9)
-#define GPO_10         (GPIO_OUT | 10)
-#define GPO_11                 (GPIO_OUT | 11)
-#define GPO_12         (GPIO_OUT | 12)
-#define GPO_13         (GPIO_OUT | 13)
-#define GPO_14         (GPIO_OUT | 14)
-#define GPO_15         (GPIO_OUT | 15)
-#define GPO_16         (GPIO_OUT | 16)
-#define GPO_17                 (GPIO_OUT | 17)
-#define GPO_18         (GPIO_OUT | 18)
-#define GPO_19         (GPIO_OUT | 19)
-#define GPO_20         (GPIO_OUT | 20)
-#define GPO_21         (GPIO_OUT | 21)
-#define GPO_22         (GPIO_OUT | 22)
-#define GPO_23         (GPIO_OUT | 23)
-
-#define GPIO_OUT_MASK   0xffffff
-
-/* BIDIRECTIONAL GPIOs */
-/* RAM pins */
-#define RAM_D19                (GPIO_RAM | 0)
-#define RAM_D20        (GPIO_RAM | 1)
-#define RAM_D21        (GPIO_RAM | 2)
-#define RAM_D22        (GPIO_RAM | 3)
-#define RAM_D23        (GPIO_RAM | 4)
-#define RAM_D24        (GPIO_RAM | 5)
-#define RAM_D25        (GPIO_RAM | 6)
-#define RAM_D26        (GPIO_RAM | 7)
-#define RAM_D27                (GPIO_RAM | 8)
-#define RAM_D28        (GPIO_RAM | 9)
-#define RAM_D29        (GPIO_RAM | 10)
-#define RAM_D30        (GPIO_RAM | 11)
-#define RAM_D31        (GPIO_RAM | 12)
-
-#define GPIO_RAM_MASK   0x1fff
-
-/* I/O pins */
-#define GPIO_00        (GPIO_BID | 25)
-#define GPIO_01        (GPIO_BID | 26)
-#define GPIO_02        (GPIO_BID | 27)
-#define GPIO_03        (GPIO_BID | 28)
-#define GPIO_04        (GPIO_BID | 29)
-#define GPIO_05        (GPIO_BID | 30)
-
-#define GPIO_BID_MASK   0x7e000000
-
-/* Non-GPIO multiplexed PIOs. For multiplexing with GPIO, please use GPIO macros */
-#define GPIO_SDRAM_SEL         (GPIO_MUX | 3)
-
-#define GPIO_MUX_MASK   0x8
-
-/* Extraction/assembly macros */
-#define GPIO_BIT_MASK(K) ((K) & 0x1F)
-#define GPIO_BIT(K) (1 << GPIO_BIT_MASK(K))
-#define GPIO_ISMUX(K) ((GPIO_TYPE_MASK(K) == GPIO_MUX) && (GPIO_BIT(K) & GPIO_MUX_MASK))
-#define GPIO_ISRAM(K) ((GPIO_TYPE_MASK(K) == GPIO_RAM) && (GPIO_BIT(K) & GPIO_RAM_MASK))
-#define GPIO_ISBID(K) ((GPIO_TYPE_MASK(K) == GPIO_BID) && (GPIO_BIT(K) & GPIO_BID_MASK))
-#define GPIO_ISOUT(K) ((GPIO_TYPE_MASK(K) == GPIO_OUT) && (GPIO_BIT(K) & GPIO_OUT_MASK))
-#define GPIO_ISIN(K)  ((GPIO_TYPE_MASK(K) == GPIO_IN) && (GPIO_BIT(K) & GPIO_IN_MASK))
-
-/* Start Enable Pin Interrupts - table 58 page 66 */
-
-#define SE_PIN_BASE_INT   32
-
-#define SE_U7_RX_INT            63
-#define SE_U7_HCTS_INT          62
-#define SE_BT_CLKREQ_INT        61
-#define SE_U6_IRRX_INT          60
-/*59 unused*/
-#define SE_U5_RX_INT            58
-#define SE_GPI_11_INT           57
-#define SE_U3_RX_INT            56
-#define SE_U2_HCTS_INT          55
-#define SE_U2_RX_INT            54
-#define SE_U1_RX_INT            53
-#define SE_DISP_SYNC_INT        52
-/*51 unused*/
-#define SE_SDIO_INT_N           50
-#define SE_MSDIO_START_INT      49
-#define SE_GPI_06_INT           48
-#define SE_GPI_05_INT           47
-#define SE_GPI_04_INT           46
-#define SE_GPI_03_INT           45
-#define SE_GPI_02_INT           44
-#define SE_GPI_01_INT           43
-#define SE_GPI_00_INT           42
-#define SE_SYSCLKEN_PIN_INT     41
-#define SE_SPI1_DATAIN_INT      40
-#define SE_GPI_07_INT           39
-#define SE_SPI2_DATAIN_INT      38
-#define SE_GPI_10_INT           37
-#define SE_GPI_09_INT           36
-#define SE_GPI_08_INT           35
-/*34-32 unused*/
-
-/* Start Enable Internal Interrupts - table 57 page 65 */
-
-#define SE_INT_BASE_INT   0
-
-#define SE_TS_IRQ               31
-#define SE_TS_P_INT             30
-#define SE_TS_AUX_INT           29
-/*27-28 unused*/
-#define SE_USB_AHB_NEED_CLK_INT 26
-#define SE_MSTIMER_INT          25
-#define SE_RTC_INT              24
-#define SE_USB_NEED_CLK_INT     23
-#define SE_USB_INT              22
-#define SE_USB_I2C_INT          21
-#define SE_USB_OTG_TIMER_INT    20
-#define SE_USB_OTG_ATX_INT_N    19
-/*18 unused*/
-#define SE_DSP_GPIO4_INT        17
-#define SE_KEY_IRQ              16
-#define SE_DSP_SLAVEPORT_INT    15
-#define SE_DSP_GPIO1_INT        14
-#define SE_DSP_GPIO0_INT        13
-#define SE_DSP_AHB_INT          12
-/*11-6 unused*/
-#define SE_GPIO_05_INT          5
-#define SE_GPIO_04_INT          4
-#define SE_GPIO_03_INT          3
-#define SE_GPIO_02_INT          2
-#define SE_GPIO_01_INT          1
-#define SE_GPIO_00_INT          0
-
-#define START_INT_REG_BIT(irq) (1<<((irq)&0x1F))
-
-#define START_INT_ER_REG(irq)     IO_ADDRESS((PNX4008_PWRMAN_BASE + 0x20 + (((irq)&(0x1<<5))>>1)))
-#define START_INT_RSR_REG(irq)    IO_ADDRESS((PNX4008_PWRMAN_BASE + 0x24 + (((irq)&(0x1<<5))>>1)))
-#define START_INT_SR_REG(irq)     IO_ADDRESS((PNX4008_PWRMAN_BASE + 0x28 + (((irq)&(0x1<<5))>>1)))
-#define START_INT_APR_REG(irq)    IO_ADDRESS((PNX4008_PWRMAN_BASE + 0x2C + (((irq)&(0x1<<5))>>1)))
-
-extern int pnx4008_gpio_register_pin(unsigned short pin);
-extern int pnx4008_gpio_unregister_pin(unsigned short pin);
-extern unsigned long pnx4008_gpio_read_pin(unsigned short pin);
-extern int pnx4008_gpio_write_pin(unsigned short pin, int output);
-extern int pnx4008_gpio_set_pin_direction(unsigned short pin, int output);
-extern int pnx4008_gpio_read_pin_direction(unsigned short pin);
-extern int pnx4008_gpio_set_pin_mux(unsigned short pin, int output);
-extern int pnx4008_gpio_read_pin_mux(unsigned short pin);
-
-static inline void start_int_umask(u8 irq)
-{
-       __raw_writel(__raw_readl(START_INT_ER_REG(irq)) |
-                    START_INT_REG_BIT(irq), START_INT_ER_REG(irq));
-}
-
-static inline void start_int_mask(u8 irq)
-{
-       __raw_writel(__raw_readl(START_INT_ER_REG(irq)) &
-                    ~START_INT_REG_BIT(irq), START_INT_ER_REG(irq));
-}
-
-static inline void start_int_ack(u8 irq)
-{
-       __raw_writel(START_INT_REG_BIT(irq), START_INT_RSR_REG(irq));
-}
-
-static inline void start_int_set_falling_edge(u8 irq)
-{
-       __raw_writel(__raw_readl(START_INT_APR_REG(irq)) &
-                    ~START_INT_REG_BIT(irq), START_INT_APR_REG(irq));
-}
-
-static inline void start_int_set_rising_edge(u8 irq)
-{
-       __raw_writel(__raw_readl(START_INT_APR_REG(irq)) |
-                    START_INT_REG_BIT(irq), START_INT_APR_REG(irq));
-}
-
-#endif                         /* _PNX4008_GPIO_H_ */
diff --git a/arch/arm/mach-pnx4008/include/mach/hardware.h b/arch/arm/mach-pnx4008/include/mach/hardware.h
deleted file mode 100644 (file)
index 7b98b82..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/hardware.h
- *
- * Copyright (c) 2005 MontaVista Software, Inc. <source@mvista.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
- */
-#ifndef __ASM_ARCH_HARDWARE_H
-#define __ASM_ARCH_HARDWARE_H
-
-#include <asm/sizes.h>
-#include <mach/platform.h>
-
-/* Start of virtual addresses for IO devices */
-#define IO_BASE         0xF0000000
-
-/* This macro relies on fact that for all HW i/o addresses bits 20-23 are 0 */
-#define IO_ADDRESS(x)  (((((x) & 0xff000000) >> 4) | ((x) & 0xfffff)) | IO_BASE)
-
-#endif
diff --git a/arch/arm/mach-pnx4008/include/mach/irq.h b/arch/arm/mach-pnx4008/include/mach/irq.h
deleted file mode 100644 (file)
index 2a690ca..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/irq.h
- *
- * PNX4008 IRQ controller driver - header file
- * this one is used in entry-arnv.S as well so it cannot contain C code
- *
- * Copyright (c) 2005 Philips Semiconductors
- * Copyright (c) 2005 MontaVista Software, 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.
- */
-#ifndef __PNX4008_IRQ_H__
-#define __PNX4008_IRQ_H__
-
-#define MIC_VA_BASE             IO_ADDRESS(PNX4008_INTCTRLMIC_BASE)
-#define SIC1_VA_BASE            IO_ADDRESS(PNX4008_INTCTRLSIC1_BASE)
-#define SIC2_VA_BASE            IO_ADDRESS(PNX4008_INTCTRLSIC2_BASE)
-
-/* Manual: Chapter 20, page 195 */
-
-#define INTC_BIT(irq) (1<< ((irq) & 0x1F))
-
-#define INTC_ER(irq)    IO_ADDRESS((PNX4008_INTCTRLMIC_BASE + 0x0 + (((irq)&(0x3<<5))<<9)))
-#define INTC_RSR(irq)   IO_ADDRESS((PNX4008_INTCTRLMIC_BASE + 0x4 + (((irq)&(0x3<<5))<<9)))
-#define INTC_SR(irq)    IO_ADDRESS((PNX4008_INTCTRLMIC_BASE + 0x8 + (((irq)&(0x3<<5))<<9)))
-#define INTC_APR(irq)   IO_ADDRESS((PNX4008_INTCTRLMIC_BASE + 0xC + (((irq)&(0x3<<5))<<9)))
-#define INTC_ATR(irq)   IO_ADDRESS((PNX4008_INTCTRLMIC_BASE + 0x10 + (((irq)&(0x3<<5))<<9)))
-#define INTC_ITR(irq)   IO_ADDRESS((PNX4008_INTCTRLMIC_BASE + 0x14 + (((irq)&(0x3<<5))<<9)))
-
-#define START_INT_REG_BIT(irq) (1<<((irq)&0x1F))
-
-#define START_INT_ER_REG(irq)     IO_ADDRESS((PNX4008_PWRMAN_BASE + 0x20 + (((irq)&(0x1<<5))>>1)))
-#define START_INT_RSR_REG(irq)    IO_ADDRESS((PNX4008_PWRMAN_BASE + 0x24 + (((irq)&(0x1<<5))>>1)))
-#define START_INT_SR_REG(irq)     IO_ADDRESS((PNX4008_PWRMAN_BASE + 0x28 + (((irq)&(0x1<<5))>>1)))
-#define START_INT_APR_REG(irq)    IO_ADDRESS((PNX4008_PWRMAN_BASE + 0x2C + (((irq)&(0x1<<5))>>1)))
-
-extern void __init pnx4008_init_irq(void);
-
-#endif /* __PNX4008_IRQ_H__ */
diff --git a/arch/arm/mach-pnx4008/include/mach/irqs.h b/arch/arm/mach-pnx4008/include/mach/irqs.h
deleted file mode 100644 (file)
index f6b33cf..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/irqs.h
- *
- * PNX4008 IRQ controller driver - header file
- *
- * Author: Dmitry Chigirev <source@mvista.com>
- *
- * 2005 (c) MontaVista Software, Inc. 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 __PNX4008_IRQS_h__
-#define __PNX4008_IRQS_h__
-
-#define NR_IRQS         96
-
-/*Manual: table 259, page 199*/
-
-/*SUB2 Interrupt Routing (SIC2)*/
-
-#define SIC2_BASE_INT   64
-
-#define CLK_SWITCH_ARM_INT 95  /*manual: Clkswitch ARM  */
-#define CLK_SWITCH_DSP_INT 94  /*manual: ClkSwitch DSP  */
-#define CLK_SWITCH_AUD_INT 93  /*manual: Clkswitch AUD  */
-#define GPI_06_INT         92
-#define GPI_05_INT         91
-#define GPI_04_INT         90
-#define GPI_03_INT         89
-#define GPI_02_INT         88
-#define GPI_01_INT         87
-#define GPI_00_INT         86
-#define BT_CLKREQ_INT      85
-#define SPI1_DATIN_INT     84
-#define U5_RX_INT          83
-#define SDIO_INT_N         82
-#define CAM_HS_INT         81
-#define CAM_VS_INT         80
-#define GPI_07_INT         79
-#define DISP_SYNC_INT      78
-#define DSP_INT8           77
-#define U7_HCTS_INT        76
-#define GPI_10_INT         75
-#define GPI_09_INT         74
-#define GPI_08_INT         73
-#define DSP_INT7           72
-#define U2_HCTS_INT        71
-#define SPI2_DATIN_INT     70
-#define GPIO_05_INT        69
-#define GPIO_04_INT        68
-#define GPIO_03_INT        67
-#define GPIO_02_INT        66
-#define GPIO_01_INT        65
-#define GPIO_00_INT        64
-
-/*Manual: table 258, page 198*/
-
-/*SUB1 Interrupt Routing (SIC1)*/
-
-#define SIC1_BASE_INT   32
-
-#define USB_I2C_INT        63
-#define USB_DEV_HP_INT     62
-#define USB_DEV_LP_INT     61
-#define USB_DEV_DMA_INT    60
-#define USB_HOST_INT       59
-#define USB_OTG_ATX_INT_N  58
-#define USB_OTG_TIMER_INT  57
-#define SW_INT             56
-#define SPI1_INT           55
-#define KEY_IRQ            54
-#define DSP_M_INT          53
-#define RTC_INT            52
-#define I2C_1_INT          51
-#define I2C_2_INT          50
-#define PLL1_LOCK_INT      49
-#define PLL2_LOCK_INT      48
-#define PLL3_LOCK_INT      47
-#define PLL4_LOCK_INT      46
-#define PLL5_LOCK_INT      45
-#define SPI2_INT           44
-#define DSP_INT1           43
-#define DSP_INT2           42
-#define DSP_TDM_INT2       41
-#define TS_AUX_INT         40
-#define TS_IRQ             39
-#define TS_P_INT           38
-#define UOUT1_TO_PAD_INT   37
-#define GPI_11_INT         36
-#define DSP_INT4           35
-#define JTAG_COMM_RX_INT   34
-#define JTAG_COMM_TX_INT   33
-#define DSP_INT3           32
-
-/*Manual: table 257, page 197*/
-
-/*MAIN Interrupt Routing*/
-
-#define MAIN_BASE_INT   0
-
-#define SUB2_FIQ_N         31  /*active low */
-#define SUB1_FIQ_N         30  /*active low */
-#define JPEG_INT           29
-#define DMA_INT            28
-#define MSTIMER_INT        27
-#define IIR1_INT           26
-#define IIR2_INT           25
-#define IIR7_INT           24
-#define DSP_TDM_INT0       23
-#define DSP_TDM_INT1       22
-#define DSP_P_INT          21
-#define DSP_INT0           20
-#define DUM_INT            19
-#define UOUT0_TO_PAD_INT   18
-#define MP4_ENC_INT        17
-#define MP4_DEC_INT        16
-#define SD0_INT            15
-#define MBX_INT            14
-#define SD1_INT            13
-#define MS_INT_N           12
-#define FLASH_INT          11 /*NAND*/
-#define IIR6_INT           10
-#define IIR5_INT           9
-#define IIR4_INT           8
-#define IIR3_INT           7
-#define WATCH_INT          6
-#define HSTIMER_INT        5
-#define ARCH_TIMER_IRQ     HSTIMER_INT
-#define CAM_INT            4
-#define PRNG_INT           3
-#define CRYPTO_INT         2
-#define SUB2_IRQ_N         1   /*active low */
-#define SUB1_IRQ_N         0   /*active low */
-
-#define PNX4008_IRQ_TYPES \
-{                                           /*IRQ #'s: */         \
-IRQ_TYPE_LEVEL_LOW,  IRQ_TYPE_LEVEL_LOW,  IRQ_TYPE_LEVEL_LOW,  IRQ_TYPE_LEVEL_HIGH, /*  0, 1, 2, 3 */     \
-IRQ_TYPE_LEVEL_LOW,  IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /*  4, 5, 6, 7 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /*  8, 9,10,11 */     \
-IRQ_TYPE_LEVEL_LOW,  IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 12,13,14,15 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 16,17,18,19 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 20,21,22,23 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 24,25,26,27 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_LOW,  IRQ_TYPE_LEVEL_LOW,  /* 28,29,30,31 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_LOW,  IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 32,33,34,35 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_EDGE_FALLING, IRQ_TYPE_LEVEL_HIGH, /* 36,37,38,39 */  \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 40,41,42,43 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 44,45,46,47 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_LOW,  IRQ_TYPE_LEVEL_LOW,  /* 48,49,50,51 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 52,53,54,55 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_LOW,  IRQ_TYPE_LEVEL_HIGH, /* 56,57,58,59 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 60,61,62,63 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 64,65,66,67 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 68,69,70,71 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 72,73,74,75 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 76,77,78,79 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 80,81,82,83 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 84,85,86,87 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 88,89,90,91 */     \
-IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, IRQ_TYPE_LEVEL_HIGH, /* 92,93,94,95 */     \
-}
-
-/* Start Enable Pin Interrupts - table 58 page 66 */
-
-#define SE_PIN_BASE_INT   32
-
-#define SE_U7_RX_INT            63
-#define SE_U7_HCTS_INT          62
-#define SE_BT_CLKREQ_INT        61
-#define SE_U6_IRRX_INT          60
-/*59 unused*/
-#define SE_U5_RX_INT            58
-#define SE_GPI_11_INT           57
-#define SE_U3_RX_INT            56
-#define SE_U2_HCTS_INT          55
-#define SE_U2_RX_INT            54
-#define SE_U1_RX_INT            53
-#define SE_DISP_SYNC_INT        52
-/*51 unused*/
-#define SE_SDIO_INT_N           50
-#define SE_MSDIO_START_INT      49
-#define SE_GPI_06_INT           48
-#define SE_GPI_05_INT           47
-#define SE_GPI_04_INT           46
-#define SE_GPI_03_INT           45
-#define SE_GPI_02_INT           44
-#define SE_GPI_01_INT           43
-#define SE_GPI_00_INT           42
-#define SE_SYSCLKEN_PIN_INT     41
-#define SE_SPI1_DATAIN_INT      40
-#define SE_GPI_07_INT           39
-#define SE_SPI2_DATAIN_INT      38
-#define SE_GPI_10_INT           37
-#define SE_GPI_09_INT           36
-#define SE_GPI_08_INT           35
-/*34-32 unused*/
-
-/* Start Enable Internal Interrupts - table 57 page 65 */
-
-#define SE_INT_BASE_INT   0
-
-#define SE_TS_IRQ               31
-#define SE_TS_P_INT             30
-#define SE_TS_AUX_INT           29
-/*27-28 unused*/
-#define SE_USB_AHB_NEED_CLK_INT 26
-#define SE_MSTIMER_INT          25
-#define SE_RTC_INT              24
-#define SE_USB_NEED_CLK_INT     23
-#define SE_USB_INT              22
-#define SE_USB_I2C_INT          21
-#define SE_USB_OTG_TIMER_INT    20
-
-#endif /* __PNX4008_IRQS_h__ */
diff --git a/arch/arm/mach-pnx4008/include/mach/platform.h b/arch/arm/mach-pnx4008/include/mach/platform.h
deleted file mode 100644 (file)
index 368c2c1..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/platform.h
- *
- * PNX4008 Base addresses - header file
- *
- * Author: Dmitry Chigirev <source@mvista.com>
- *
- * Based on reference code received from Philips:
- * Copyright (C) 2003 Philips Semiconductors
- *
- * 2005 (c) MontaVista Software, Inc. 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_PLATFORM_H__
-#define __ASM_ARCH_PLATFORM_H__
-
-#define PNX4008_IRAM_BASE              0x08000000
-#define PNX4008_IRAM_SIZE              0x00010000
-#define PNX4008_YUV_SLAVE_BASE         0x10000000
-#define PNX4008_DUM_SLAVE_BASE         0x18000000
-#define PNX4008_NDF_FLASH_BASE         0x20020000
-#define PNX4008_SPI1_BASE              0x20088000
-#define PNX4008_SPI2_BASE              0x20090000
-#define PNX4008_SD_CONFIG_BASE         0x20098000
-#define PNX4008_FLASH_DATA             0x200B0000
-#define PNX4008_MLC_FLASH_BASE         0x200B8000
-#define PNX4008_JPEG_CONFIG_BASE       0x300A0000
-#define PNX4008_DMA_CONFIG_BASE                0x31000000
-#define PNX4008_USB_CONFIG_BASE                0x31020000
-#define PNX4008_SDRAM_CFG_BASE         0x31080000
-#define PNX4008_AHB2FAB_BASE           0x40000000
-#define PNX4008_PWRMAN_BASE            0x40004000
-#define PNX4008_INTCTRLMIC_BASE                0x40008000
-#define PNX4008_INTCTRLSIC1_BASE       0x4000C000
-#define PNX4008_INTCTRLSIC2_BASE       0x40010000
-#define PNX4008_HSUART1_BASE           0x40014000
-#define PNX4008_HSUART2_BASE           0x40018000
-#define PNX4008_HSUART7_BASE           0x4001C000
-#define PNX4008_RTC_BASE               0x40024000
-#define PNX4008_PIO_BASE               0x40028000
-#define PNX4008_MSTIMER_BASE           0x40034000
-#define PNX4008_HSTIMER_BASE           0x40038000
-#define PNX4008_WDOG_BASE              0x4003C000
-#define PNX4008_DEBUG_BASE             0x40040000
-#define PNX4008_TOUCH1_BASE            0x40048000
-#define PNX4008_KEYSCAN_BASE           0x40050000
-#define PNX4008_UARTCTRL_BASE          0x40054000
-#define PNX4008_PWM_BASE               0x4005C000
-#define PNX4008_UART3_BASE             0x40080000
-#define PNX4008_UART4_BASE             0x40088000
-#define PNX4008_UART5_BASE             0x40090000
-#define PNX4008_UART6_BASE             0x40098000
-#define PNX4008_I2C1_BASE              0x400A0000
-#define PNX4008_I2C2_BASE              0x400A8000
-#define PNX4008_MAGICGATE_BASE         0x400B0000
-#define PNX4008_DUMCONF_BASE           0x400B8000
-#define PNX4008_DUM_MAINCFG_BASE               0x400BC000
-#define PNX4008_DSP_BASE               0x400C0000
-#define PNX4008_PROFCOUNTER_BASE       0x400C8000
-#define PNX4008_CRYPTO_BASE            0x400D0000
-#define PNX4008_CAMIFCONF_BASE         0x400D8000
-#define PNX4008_YUV2RGB_BASE           0x400E0000
-#define PNX4008_AUDIOCONFIG_BASE       0x400E8000
-
-#endif
diff --git a/arch/arm/mach-pnx4008/include/mach/pm.h b/arch/arm/mach-pnx4008/include/mach/pm.h
deleted file mode 100644 (file)
index 2fa685b..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/pm.h
- *
- * PNX4008 Power Management Routiness - header file
- *
- * Authors: Vitaly Wool, Dmitry Chigirev <source@mvista.com>
- *
- * 2005 (c) MontaVista Software, Inc. 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_PNX4008_PM_H
-#define __ASM_ARCH_PNX4008_PM_H
-
-#ifndef __ASSEMBLER__
-#include "irq.h"
-#include "irqs.h"
-#include "clock.h"
-
-extern void pnx4008_pm_idle(void);
-extern void pnx4008_pm_suspend(void);
-extern unsigned int pnx4008_cpu_suspend_sz;
-extern void pnx4008_cpu_suspend(void);
-extern unsigned int pnx4008_cpu_standby_sz;
-extern void pnx4008_cpu_standby(void);
-
-extern int pnx4008_startup_pll(struct clk *);
-extern int pnx4008_shutdown_pll(struct clk *);
-
-#endif                         /* ASSEMBLER */
-#endif                         /* __ASM_ARCH_PNX4008_PM_H */
diff --git a/arch/arm/mach-pnx4008/include/mach/timex.h b/arch/arm/mach-pnx4008/include/mach/timex.h
deleted file mode 100644 (file)
index b383c7d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/timex.h
- *
- * PNX4008 timers header file
- *
- * Author: Dmitry Chigirev <source@mvista.com>
- *
- * 2005 (c) MontaVista Software, Inc. 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 __PNX4008_TIMEX_H
-#define __PNX4008_TIMEX_H
-
-#define CLOCK_TICK_RATE                1000000
-
-#endif
diff --git a/arch/arm/mach-pnx4008/include/mach/uncompress.h b/arch/arm/mach-pnx4008/include/mach/uncompress.h
deleted file mode 100644 (file)
index bb4751e..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  arch/arm/mach-pnx4008/include/mach/uncompress.h
- *
- *  Copyright (C) 1999 ARM Limited
- *  Copyright (C) 2006 MontaVista Software, 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.
- *
- * 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
- */
-
-#define UART5_BASE 0x40090000
-
-#define UART5_DR    (*(volatile unsigned char *) (UART5_BASE))
-#define UART5_FR    (*(volatile unsigned char *) (UART5_BASE + 18))
-
-static __inline__ void putc(char c)
-{
-       while (UART5_FR & (1 << 5))
-               barrier();
-
-       UART5_DR = c;
-}
-
-/*
- * This does not append a newline
- */
-static inline void flush(void)
-{
-}
-
-/*
- * nothing to do
- */
-#define arch_decomp_setup()
-#define arch_decomp_wdog()
diff --git a/arch/arm/mach-pnx4008/irq.c b/arch/arm/mach-pnx4008/irq.c
deleted file mode 100644 (file)
index 41e4201..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/irq.c
- *
- * PNX4008 IRQ controller driver
- *
- * Author: Dmitry Chigirev <source@mvista.com>
- *
- * Based on reference code received from Philips:
- * Copyright (C) 2003 Philips Semiconductors
- *
- * 2005 (c) MontaVista Software, Inc. 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/types.h>
-#include <linux/mm.h>
-#include <linux/interrupt.h>
-#include <linux/list.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <linux/device.h>
-#include <linux/irq.h>
-#include <linux/io.h>
-#include <mach/hardware.h>
-#include <asm/setup.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/irq.h>
-#include <asm/mach/map.h>
-#include <mach/irq.h>
-
-static u8 pnx4008_irq_type[NR_IRQS] = PNX4008_IRQ_TYPES;
-
-static void pnx4008_mask_irq(struct irq_data *d)
-{
-       __raw_writel(__raw_readl(INTC_ER(d->irq)) & ~INTC_BIT(d->irq), INTC_ER(d->irq));        /* mask interrupt */
-}
-
-static void pnx4008_unmask_irq(struct irq_data *d)
-{
-       __raw_writel(__raw_readl(INTC_ER(d->irq)) | INTC_BIT(d->irq), INTC_ER(d->irq)); /* unmask interrupt */
-}
-
-static void pnx4008_mask_ack_irq(struct irq_data *d)
-{
-       __raw_writel(__raw_readl(INTC_ER(d->irq)) & ~INTC_BIT(d->irq), INTC_ER(d->irq));        /* mask interrupt */
-       __raw_writel(INTC_BIT(d->irq), INTC_SR(d->irq));        /* clear interrupt status */
-}
-
-static int pnx4008_set_irq_type(struct irq_data *d, unsigned int type)
-{
-       switch (type) {
-       case IRQ_TYPE_EDGE_RISING:
-               __raw_writel(__raw_readl(INTC_ATR(d->irq)) | INTC_BIT(d->irq), INTC_ATR(d->irq));       /*edge sensitive */
-               __raw_writel(__raw_readl(INTC_APR(d->irq)) | INTC_BIT(d->irq), INTC_APR(d->irq));       /*rising edge */
-               irq_set_handler(d->irq, handle_edge_irq);
-               break;
-       case IRQ_TYPE_EDGE_FALLING:
-               __raw_writel(__raw_readl(INTC_ATR(d->irq)) | INTC_BIT(d->irq), INTC_ATR(d->irq));       /*edge sensitive */
-               __raw_writel(__raw_readl(INTC_APR(d->irq)) & ~INTC_BIT(d->irq), INTC_APR(d->irq));      /*falling edge */
-               irq_set_handler(d->irq, handle_edge_irq);
-               break;
-       case IRQ_TYPE_LEVEL_LOW:
-               __raw_writel(__raw_readl(INTC_ATR(d->irq)) & ~INTC_BIT(d->irq), INTC_ATR(d->irq));      /*level sensitive */
-               __raw_writel(__raw_readl(INTC_APR(d->irq)) & ~INTC_BIT(d->irq), INTC_APR(d->irq));      /*low level */
-               irq_set_handler(d->irq, handle_level_irq);
-               break;
-       case IRQ_TYPE_LEVEL_HIGH:
-               __raw_writel(__raw_readl(INTC_ATR(d->irq)) & ~INTC_BIT(d->irq), INTC_ATR(d->irq));      /*level sensitive */
-               __raw_writel(__raw_readl(INTC_APR(d->irq)) | INTC_BIT(d->irq), INTC_APR(d->irq));       /* high level */
-               irq_set_handler(d->irq, handle_level_irq);
-               break;
-
-       /* IRQ_TYPE_EDGE_BOTH is not supported */
-       default:
-               printk(KERN_ERR "PNX4008 IRQ: Unsupported irq type %d\n", type);
-               return -1;
-       }
-       return 0;
-}
-
-static struct irq_chip pnx4008_irq_chip = {
-       .irq_ack = pnx4008_mask_ack_irq,
-       .irq_mask = pnx4008_mask_irq,
-       .irq_unmask = pnx4008_unmask_irq,
-       .irq_set_type = pnx4008_set_irq_type,
-};
-
-void __init pnx4008_init_irq(void)
-{
-       unsigned int i;
-
-       /* configure IRQ's */
-       for (i = 0; i < NR_IRQS; i++) {
-               set_irq_flags(i, IRQF_VALID);
-               irq_set_chip(i, &pnx4008_irq_chip);
-               pnx4008_set_irq_type(irq_get_irq_data(i), pnx4008_irq_type[i]);
-       }
-
-       /* configure and enable IRQ 0,1,30,31 (cascade interrupts) */
-       pnx4008_set_irq_type(irq_get_irq_data(SUB1_IRQ_N),
-                            pnx4008_irq_type[SUB1_IRQ_N]);
-       pnx4008_set_irq_type(irq_get_irq_data(SUB2_IRQ_N),
-                            pnx4008_irq_type[SUB2_IRQ_N]);
-       pnx4008_set_irq_type(irq_get_irq_data(SUB1_FIQ_N),
-                            pnx4008_irq_type[SUB1_FIQ_N]);
-       pnx4008_set_irq_type(irq_get_irq_data(SUB2_FIQ_N),
-                            pnx4008_irq_type[SUB2_FIQ_N]);
-
-       /* mask all others */
-       __raw_writel((1 << SUB2_FIQ_N) | (1 << SUB1_FIQ_N) |
-                       (1 << SUB2_IRQ_N) | (1 << SUB1_IRQ_N),
-               INTC_ER(MAIN_BASE_INT));
-       __raw_writel(0, INTC_ER(SIC1_BASE_INT));
-       __raw_writel(0, INTC_ER(SIC2_BASE_INT));
-}
-
diff --git a/arch/arm/mach-pnx4008/pm.c b/arch/arm/mach-pnx4008/pm.c
deleted file mode 100644 (file)
index 26f8d06..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/pm.c
- *
- * Power Management driver for PNX4008
- *
- * Authors: Vitaly Wool, Dmitry Chigirev <source@mvista.com>
- *
- * 2005 (c) MontaVista Software, Inc. 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/pm.h>
-#include <linux/rtc.h>
-#include <linux/sched.h>
-#include <linux/proc_fs.h>
-#include <linux/suspend.h>
-#include <linux/delay.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/slab.h>
-
-#include <asm/cacheflush.h>
-
-#include <mach/hardware.h>
-#include <mach/pm.h>
-#include <mach/clock.h>
-
-#define SRAM_VA IO_ADDRESS(PNX4008_IRAM_BASE)
-
-static void *saved_sram;
-
-static struct clk *pll4_clk;
-
-static inline void pnx4008_standby(void)
-{
-       void (*pnx4008_cpu_standby_ptr) (void);
-
-       local_irq_disable();
-       local_fiq_disable();
-
-       clk_disable(pll4_clk);
-
-       /*saving portion of SRAM to be used by suspend function. */
-       memcpy(saved_sram, (void *)SRAM_VA, pnx4008_cpu_standby_sz);
-
-       /*make sure SRAM copy gets physically written into SDRAM.
-          SDRAM will be placed into self-refresh during power down */
-       flush_cache_all();
-
-       /*copy suspend function into SRAM */
-       memcpy((void *)SRAM_VA, pnx4008_cpu_standby, pnx4008_cpu_standby_sz);
-
-       /*do suspend */
-       pnx4008_cpu_standby_ptr = (void *)SRAM_VA;
-       pnx4008_cpu_standby_ptr();
-
-       /*restoring portion of SRAM that was used by suspend function */
-       memcpy((void *)SRAM_VA, saved_sram, pnx4008_cpu_standby_sz);
-
-       clk_enable(pll4_clk);
-
-       local_fiq_enable();
-       local_irq_enable();
-}
-
-static inline void pnx4008_suspend(void)
-{
-       void (*pnx4008_cpu_suspend_ptr) (void);
-
-       local_irq_disable();
-       local_fiq_disable();
-
-       clk_disable(pll4_clk);
-
-       __raw_writel(0xffffffff, START_INT_RSR_REG(SE_PIN_BASE_INT));
-       __raw_writel(0xffffffff, START_INT_RSR_REG(SE_INT_BASE_INT));
-
-       /*saving portion of SRAM to be used by suspend function. */
-       memcpy(saved_sram, (void *)SRAM_VA, pnx4008_cpu_suspend_sz);
-
-       /*make sure SRAM copy gets physically written into SDRAM.
-          SDRAM will be placed into self-refresh during power down */
-       flush_cache_all();
-
-       /*copy suspend function into SRAM */
-       memcpy((void *)SRAM_VA, pnx4008_cpu_suspend, pnx4008_cpu_suspend_sz);
-
-       /*do suspend */
-       pnx4008_cpu_suspend_ptr = (void *)SRAM_VA;
-       pnx4008_cpu_suspend_ptr();
-
-       /*restoring portion of SRAM that was used by suspend function */
-       memcpy((void *)SRAM_VA, saved_sram, pnx4008_cpu_suspend_sz);
-
-       clk_enable(pll4_clk);
-
-       local_fiq_enable();
-       local_irq_enable();
-}
-
-static int pnx4008_pm_enter(suspend_state_t state)
-{
-       switch (state) {
-       case PM_SUSPEND_STANDBY:
-               pnx4008_standby();
-               break;
-       case PM_SUSPEND_MEM:
-               pnx4008_suspend();
-               break;
-       }
-       return 0;
-}
-
-static int pnx4008_pm_valid(suspend_state_t state)
-{
-       return (state == PM_SUSPEND_STANDBY) ||
-              (state == PM_SUSPEND_MEM);
-}
-
-static const struct platform_suspend_ops pnx4008_pm_ops = {
-       .enter = pnx4008_pm_enter,
-       .valid = pnx4008_pm_valid,
-};
-
-int __init pnx4008_pm_init(void)
-{
-       u32 sram_size_to_allocate;
-
-       pll4_clk = clk_get(0, "ck_pll4");
-       if (IS_ERR(pll4_clk)) {
-               printk(KERN_ERR
-                      "PM Suspend cannot acquire ARM(PLL4) clock control\n");
-               return PTR_ERR(pll4_clk);
-       }
-
-       if (pnx4008_cpu_standby_sz > pnx4008_cpu_suspend_sz)
-               sram_size_to_allocate = pnx4008_cpu_standby_sz;
-       else
-               sram_size_to_allocate = pnx4008_cpu_suspend_sz;
-
-       saved_sram = kmalloc(sram_size_to_allocate, GFP_ATOMIC);
-       if (!saved_sram) {
-               printk(KERN_ERR
-                      "PM Suspend: cannot allocate memory to save portion of SRAM\n");
-               clk_put(pll4_clk);
-               return -ENOMEM;
-       }
-
-       suspend_set_ops(&pnx4008_pm_ops);
-       return 0;
-}
diff --git a/arch/arm/mach-pnx4008/serial.c b/arch/arm/mach-pnx4008/serial.c
deleted file mode 100644 (file)
index 374c138..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  linux/arch/arm/mach-pnx4008/serial.c
- *
- *  PNX4008 UART initialization
- *
- *  Copyright: MontaVista Software Inc. (c) 2005
- *
- *  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/io.h>
-
-#include <mach/platform.h>
-#include <mach/hardware.h>
-
-#include <linux/serial_core.h>
-#include <linux/serial_reg.h>
-
-#include <mach/gpio-pnx4008.h>
-#include <mach/clock.h>
-
-#define UART_3         0
-#define UART_4         1
-#define UART_5         2
-#define UART_6         3
-#define UART_UNKNOWN   (-1)
-
-#define UART3_BASE_VA  IO_ADDRESS(PNX4008_UART3_BASE)
-#define UART4_BASE_VA  IO_ADDRESS(PNX4008_UART4_BASE)
-#define UART5_BASE_VA  IO_ADDRESS(PNX4008_UART5_BASE)
-#define UART6_BASE_VA  IO_ADDRESS(PNX4008_UART6_BASE)
-
-#define UART_FCR_OFFSET                8
-#define UART_FIFO_SIZE         64
-
-void pnx4008_uart_init(void)
-{
-       u32 tmp;
-       int i = UART_FIFO_SIZE;
-
-       __raw_writel(0xC1, UART5_BASE_VA + UART_FCR_OFFSET);
-       __raw_writel(0xC1, UART3_BASE_VA + UART_FCR_OFFSET);
-
-       /* Send a NULL to fix the UART HW bug */
-       __raw_writel(0x00, UART5_BASE_VA);
-       __raw_writel(0x00, UART3_BASE_VA);
-
-       while (i--) {
-               tmp = __raw_readl(UART5_BASE_VA);
-               tmp = __raw_readl(UART3_BASE_VA);
-       }
-       __raw_writel(0, UART5_BASE_VA + UART_FCR_OFFSET);
-       __raw_writel(0, UART3_BASE_VA + UART_FCR_OFFSET);
-
-       /* setup wakeup interrupt */
-       start_int_set_rising_edge(SE_U3_RX_INT);
-       start_int_ack(SE_U3_RX_INT);
-       start_int_umask(SE_U3_RX_INT);
-
-       start_int_set_rising_edge(SE_U5_RX_INT);
-       start_int_ack(SE_U5_RX_INT);
-       start_int_umask(SE_U5_RX_INT);
-}
-
diff --git a/arch/arm/mach-pnx4008/sleep.S b/arch/arm/mach-pnx4008/sleep.S
deleted file mode 100644 (file)
index f4eed49..0000000
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * linux/arch/arm/mach-pnx4008/sleep.S
- *
- * PNX4008 support for STOP mode and SDRAM self-refresh
- *
- * Authors: Dmitry Chigirev, Vitaly Wool <source@mvista.com>
- *
- * 2005 (c) MontaVista Software, Inc. 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/linkage.h>
-#include <asm/assembler.h>
-#include <mach/hardware.h>
-
-#define PWRMAN_VA_BASE IO_ADDRESS(PNX4008_PWRMAN_BASE)
-#define PWR_CTRL_REG_OFFS 0x44
-
-#define SDRAM_CFG_VA_BASE IO_ADDRESS(PNX4008_SDRAM_CFG_BASE)
-#define MPMC_STATUS_REG_OFFS 0x4
-
-               .text
-
-ENTRY(pnx4008_cpu_suspend)
-       @this function should be entered in Direct run mode.
-
-       @ save registers on stack
-       stmfd   sp!, {r0 - r6, lr}
-
-       @ setup Power Manager base address in r4
-       @ and put it's value in r5
-       mov     r4, #(PWRMAN_VA_BASE & 0xff000000)
-       orr     r4, r4, #(PWRMAN_VA_BASE & 0x00ff0000)
-       orr     r4, r4, #(PWRMAN_VA_BASE & 0x0000ff00)
-       orr     r4, r4, #(PWRMAN_VA_BASE & 0x000000ff)
-       ldr     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ setup SDRAM controller base address in r2
-       @ and put it's value in r3
-       mov     r2, #(SDRAM_CFG_VA_BASE & 0xff000000)
-       orr     r2, r2, #(SDRAM_CFG_VA_BASE & 0x00ff0000)
-       orr     r2, r2, #(SDRAM_CFG_VA_BASE & 0x0000ff00)
-       orr     r2, r2, #(SDRAM_CFG_VA_BASE & 0x000000ff)
-       ldr     r3, [r2, #MPMC_STATUS_REG_OFFS] @extra read - HW bug workaround
-
-       @ clear SDRAM self-refresh bit latch
-       and     r5, r5, #(~(1 << 8))
-       @ clear SDRAM self-refresh bit
-       and     r5, r5, #(~(1 << 9))
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ do save current bit settings in r1
-       mov     r1, r5
-
-       @ set SDRAM self-refresh bit
-       orr     r5, r5, #(1 << 9)
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ set SDRAM self-refresh bit latch
-       orr     r5, r5, #(1 << 8)
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ clear SDRAM self-refresh bit latch
-       and     r5, r5, #(~(1 << 8))
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ clear SDRAM self-refresh bit
-       and     r5, r5, #(~(1 << 9))
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ wait for SDRAM to get into self-refresh mode
-2:     ldr     r3, [r2, #MPMC_STATUS_REG_OFFS]
-       tst     r3, #(1 << 2)
-       beq     2b
-
-       @ to prepare SDRAM to get out of self-refresh mode after wakeup
-       orr     r5, r5, #(1 << 7)
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ do enter stop mode
-       orr     r5, r5, #(1 << 0)
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-       nop
-
-       @ sleeping now...
-
-       @ coming out of STOP mode into Direct Run mode
-       @ clear STOP mode and SDRAM self-refresh bits
-       str     r1, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ wait for SDRAM to get out self-refresh mode
-3:     ldr     r3, [r2, #MPMC_STATUS_REG_OFFS]
-       tst     r3, #5
-       bne     3b
-
-       @ restore regs and return
-       ldmfd   sp!, {r0 - r6, pc}
-
-ENTRY(pnx4008_cpu_suspend_sz)
-       .word   . - pnx4008_cpu_suspend
-
-ENTRY(pnx4008_cpu_standby)
-       @ save registers on stack
-       stmfd   sp!, {r0 - r6, lr}
-
-       @ setup Power Manager base address in r4
-       @ and put it's value in r5
-       mov     r4, #(PWRMAN_VA_BASE & 0xff000000)
-       orr     r4, r4, #(PWRMAN_VA_BASE & 0x00ff0000)
-       orr     r4, r4, #(PWRMAN_VA_BASE & 0x0000ff00)
-       orr     r4, r4, #(PWRMAN_VA_BASE & 0x000000ff)
-       ldr     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ setup SDRAM controller base address in r2
-       @ and put it's value in r3
-       mov     r2, #(SDRAM_CFG_VA_BASE & 0xff000000)
-       orr     r2, r2, #(SDRAM_CFG_VA_BASE & 0x00ff0000)
-       orr     r2, r2, #(SDRAM_CFG_VA_BASE & 0x0000ff00)
-       orr     r2, r2, #(SDRAM_CFG_VA_BASE & 0x000000ff)
-       ldr     r3, [r2, #MPMC_STATUS_REG_OFFS] @extra read - HW bug workaround
-
-       @ clear SDRAM self-refresh bit latch
-       and     r5, r5, #(~(1 << 8))
-       @ clear SDRAM self-refresh bit
-       and     r5, r5, #(~(1 << 9))
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ do save current bit settings in r1
-       mov     r1, r5
-
-       @ set SDRAM self-refresh bit
-       orr     r5, r5, #(1 << 9)
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ set SDRAM self-refresh bit latch
-       orr     r5, r5, #(1 << 8)
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ clear SDRAM self-refresh bit latch
-       and     r5, r5, #(~(1 << 8))
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ clear SDRAM self-refresh bit
-       and     r5, r5, #(~(1 << 9))
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ wait for SDRAM to get into self-refresh mode
-2:     ldr     r3, [r2, #MPMC_STATUS_REG_OFFS]
-       tst     r3, #(1 << 2)
-       beq     2b
-
-       @ set 'get out of self-refresh mode after wakeup' bit
-       orr     r5, r5, #(1 << 7)
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       mcr     p15, 0, r0, c7, c0, 4   @ kinda sleeping now...
-
-       @ set SDRAM self-refresh bit latch
-       orr     r5, r5, #(1 << 8)
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ clear SDRAM self-refresh bit latch
-       and     r5, r5, #(~(1 << 8))
-       str     r5, [r4, #PWR_CTRL_REG_OFFS]
-
-       @ wait for SDRAM to get out self-refresh mode
-3:     ldr     r3, [r2, #MPMC_STATUS_REG_OFFS]
-       tst     r3, #5
-       bne     3b
-
-       @ restore regs and return
-       ldmfd   sp!, {r0 - r6, pc}
-
-ENTRY(pnx4008_cpu_standby_sz)
-       .word   . - pnx4008_cpu_standby
-
-ENTRY(pnx4008_cache_clean_invalidate)
-       stmfd   sp!, {r0 - r6, lr}
-#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH
-       mcr     p15, 0, ip, c7, c6, 0           @ invalidate D cache
-#else
-1:     mrc     p15, 0, r15, c7, c14, 3         @ test,clean,invalidate
-       bne     1b
-#endif
-       ldmfd   sp!, {r0 - r6, pc}
diff --git a/arch/arm/mach-pnx4008/time.c b/arch/arm/mach-pnx4008/time.c
deleted file mode 100644 (file)
index 0cfe8af..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/time.c
- *
- * PNX4008 Timers
- *
- * Authors: Vitaly Wool, Dmitry Chigirev, Grigory Tolstolytkin <source@mvista.com>
- *
- * 2005 (c) MontaVista Software, Inc. 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/delay.h>
-#include <linux/interrupt.h>
-#include <linux/sched.h>
-#include <linux/spinlock.h>
-#include <linux/module.h>
-#include <linux/kallsyms.h>
-#include <linux/time.h>
-#include <linux/timex.h>
-#include <linux/irq.h>
-#include <linux/io.h>
-
-#include <mach/hardware.h>
-#include <asm/leds.h>
-#include <asm/mach/time.h>
-#include <asm/errno.h>
-
-#include "time.h"
-
-/*! Note: all timers are UPCOUNTING */
-
-/*!
- * Returns number of us since last clock interrupt.  Note that interrupts
- * will have been disabled by do_gettimeoffset()
- */
-static unsigned long pnx4008_gettimeoffset(void)
-{
-       u32 ticks_to_match =
-           __raw_readl(HSTIM_MATCH0) - __raw_readl(HSTIM_COUNTER);
-       u32 elapsed = LATCH - ticks_to_match;
-       return (elapsed * (tick_nsec / 1000)) / LATCH;
-}
-
-/*!
- * IRQ handler for the timer
- */
-static irqreturn_t pnx4008_timer_interrupt(int irq, void *dev_id)
-{
-       if (__raw_readl(HSTIM_INT) & MATCH0_INT) {
-
-               do {
-                       timer_tick();
-
-                       /*
-                        * this algorithm takes care of possible delay
-                        * for this interrupt handling longer than a normal
-                        * timer period
-                        */
-                       __raw_writel(__raw_readl(HSTIM_MATCH0) + LATCH,
-                                    HSTIM_MATCH0);
-                       __raw_writel(MATCH0_INT, HSTIM_INT);    /* clear interrupt */
-
-                       /*
-                        * The goal is to keep incrementing HSTIM_MATCH0
-                        * register until HSTIM_MATCH0 indicates time after
-                        * what HSTIM_COUNTER indicates.
-                        */
-               } while ((signed)
-                        (__raw_readl(HSTIM_MATCH0) -
-                         __raw_readl(HSTIM_COUNTER)) < 0);
-       }
-
-       return IRQ_HANDLED;
-}
-
-static struct irqaction pnx4008_timer_irq = {
-       .name = "PNX4008 Tick Timer",
-       .flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
-       .handler = pnx4008_timer_interrupt
-};
-
-/*!
- * Set up timer and timer interrupt.
- */
-static __init void pnx4008_setup_timer(void)
-{
-       __raw_writel(RESET_COUNT, MSTIM_CTRL);
-       while (__raw_readl(MSTIM_COUNTER)) ;    /* wait for reset to complete. 100% guarantee event */
-       __raw_writel(0, MSTIM_CTRL);    /* stop the timer */
-       __raw_writel(0, MSTIM_MCTRL);
-
-       __raw_writel(RESET_COUNT, HSTIM_CTRL);
-       while (__raw_readl(HSTIM_COUNTER)) ;    /* wait for reset to complete. 100% guarantee event */
-       __raw_writel(0, HSTIM_CTRL);
-       __raw_writel(0, HSTIM_MCTRL);
-       __raw_writel(0, HSTIM_CCR);
-       __raw_writel(12, HSTIM_PMATCH); /* scale down to 1 MHZ */
-       __raw_writel(LATCH, HSTIM_MATCH0);
-       __raw_writel(MR0_INT, HSTIM_MCTRL);
-
-       setup_irq(HSTIMER_INT, &pnx4008_timer_irq);
-
-       __raw_writel(COUNT_ENAB | DEBUG_EN, HSTIM_CTRL);        /*start timer, stop when JTAG active */
-}
-
-/* Timer Clock Control in PM register */
-#define TIMCLK_CTRL_REG  IO_ADDRESS((PNX4008_PWRMAN_BASE + 0xBC))
-#define WATCHDOG_CLK_EN                   1
-#define TIMER_CLK_EN                      2    /* HS and MS timers? */
-
-static u32 timclk_ctrl_reg_save;
-
-void pnx4008_timer_suspend(void)
-{
-       timclk_ctrl_reg_save = __raw_readl(TIMCLK_CTRL_REG);
-       __raw_writel(0, TIMCLK_CTRL_REG);       /* disable timers */
-}
-
-void pnx4008_timer_resume(void)
-{
-       __raw_writel(timclk_ctrl_reg_save, TIMCLK_CTRL_REG);    /* enable timers */
-}
-
-struct sys_timer pnx4008_timer = {
-       .init = pnx4008_setup_timer,
-       .offset = pnx4008_gettimeoffset,
-       .suspend = pnx4008_timer_suspend,
-       .resume = pnx4008_timer_resume,
-};
-
diff --git a/arch/arm/mach-pnx4008/time.h b/arch/arm/mach-pnx4008/time.h
deleted file mode 100644 (file)
index 75e88c5..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * arch/arm/mach-pnx4008/include/mach/timex.h
- *
- * PNX4008 timers header file
- *
- * Author: Dmitry Chigirev <source@mvista.com>
- *
- * 2005 (c) MontaVista Software, Inc. 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 PNX_TIME_H
-#define PNX_TIME_H
-
-#include <linux/io.h>
-#include <mach/hardware.h>
-
-#define TICKS2USECS(x) (x)
-
-/* MilliSecond Timer - Chapter 21 Page 202 */
-
-#define MSTIM_INT     IO_ADDRESS((PNX4008_MSTIMER_BASE + 0x0))
-#define MSTIM_CTRL    IO_ADDRESS((PNX4008_MSTIMER_BASE + 0x4))
-#define MSTIM_COUNTER IO_ADDRESS((PNX4008_MSTIMER_BASE + 0x8))
-#define MSTIM_MCTRL   IO_ADDRESS((PNX4008_MSTIMER_BASE + 0x14))
-#define MSTIM_MATCH0  IO_ADDRESS((PNX4008_MSTIMER_BASE + 0x18))
-#define MSTIM_MATCH1  IO_ADDRESS((PNX4008_MSTIMER_BASE + 0x1c))
-
-/* High Speed Timer - Chpater 22, Page 205 */
-
-#define HSTIM_INT     IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x0))
-#define HSTIM_CTRL    IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x4))
-#define HSTIM_COUNTER IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x8))
-#define HSTIM_PMATCH  IO_ADDRESS((PNX4008_HSTIMER_BASE + 0xC))
-#define HSTIM_PCOUNT  IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x10))
-#define HSTIM_MCTRL   IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x14))
-#define HSTIM_MATCH0  IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x18))
-#define HSTIM_MATCH1  IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x1c))
-#define HSTIM_MATCH2  IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x20))
-#define HSTIM_CCR     IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x28))
-#define HSTIM_CR0     IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x2C))
-#define HSTIM_CR1     IO_ADDRESS((PNX4008_HSTIMER_BASE + 0x30))
-
-/* IMPORTANT: both timers are UPCOUNTING */
-
-/* xSTIM_MCTRL bit definitions */
-#define MR0_INT        1
-#define RESET_COUNT0   (1<<1)
-#define STOP_COUNT0    (1<<2)
-#define MR1_INT        (1<<3)
-#define RESET_COUNT1   (1<<4)
-#define STOP_COUNT1    (1<<5)
-#define MR2_INT        (1<<6)
-#define RESET_COUNT2   (1<<7)
-#define STOP_COUNT2    (1<<8)
-
-/* xSTIM_CTRL bit definitions */
-#define COUNT_ENAB     1
-#define RESET_COUNT    (1<<1)
-#define DEBUG_EN       (1<<2)
-
-/* xSTIM_INT bit definitions */
-#define MATCH0_INT     1
-#define MATCH1_INT     (1<<1)
-#define MATCH2_INT     (1<<2)
-#define RTC_TICK0      (1<<4)
-#define RTC_TICK1      (1<<5)
-
-#endif
diff --git a/arch/arm/mach-prima2/Kconfig b/arch/arm/mach-prima2/Kconfig
new file mode 100644 (file)
index 0000000..41fc853
--- /dev/null
@@ -0,0 +1,19 @@
+if ARCH_SIRF
+
+menu "CSR SiRF primaII/Marco/Polo Specific Features"
+
+config ARCH_PRIMA2
+       bool "CSR SiRFSoC PRIMA2 ARM Cortex A9 Platform"
+       default y
+       select CPU_V7
+       select ZONE_DMA
+       select SIRF_IRQ
+       help
+          Support for CSR SiRFSoC ARM Cortex A9 Platform
+
+endmenu
+
+config SIRF_IRQ
+       bool
+
+endif
index 13dd160..fc9ce22 100644 (file)
@@ -1,9 +1,8 @@
 obj-y := timer.o
-obj-y += irq.o
-obj-y += clock.o
 obj-y += rstc.o
-obj-y += prima2.o
+obj-y += common.o
 obj-y += rtciobrg.o
 obj-$(CONFIG_DEBUG_LL) += lluart.o
 obj-$(CONFIG_CACHE_L2X0) += l2x0.o
 obj-$(CONFIG_SUSPEND) += pm.o sleep.o
+obj-$(CONFIG_SIRF_IRQ) += irq.o
index c77a488..98167da 100644 (file)
@@ -1,3 +1,5 @@
 zreladdr-y             += 0x00008000
 params_phys-y          := 0x00000100
 initrd_phys-y          := 0x00800000
+
+dtb-$(CONFIG_ARCH_PRIMA2) += prima2-evb.dtb
diff --git a/arch/arm/mach-prima2/clock.c b/arch/arm/mach-prima2/clock.c
deleted file mode 100644 (file)
index aebad7e..0000000
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- * Clock tree for CSR SiRFprimaII
- *
- * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
- *
- * Licensed under GPLv2 or later.
- */
-
-#include <linux/module.h>
-#include <linux/bitops.h>
-#include <linux/err.h>
-#include <linux/errno.h>
-#include <linux/io.h>
-#include <linux/clkdev.h>
-#include <linux/clk.h>
-#include <linux/spinlock.h>
-#include <linux/of.h>
-#include <linux/of_address.h>
-#include <asm/mach/map.h>
-#include <mach/map.h>
-
-#define SIRFSOC_CLKC_CLK_EN0    0x0000
-#define SIRFSOC_CLKC_CLK_EN1    0x0004
-#define SIRFSOC_CLKC_REF_CFG    0x0014
-#define SIRFSOC_CLKC_CPU_CFG    0x0018
-#define SIRFSOC_CLKC_MEM_CFG    0x001c
-#define SIRFSOC_CLKC_SYS_CFG    0x0020
-#define SIRFSOC_CLKC_IO_CFG     0x0024
-#define SIRFSOC_CLKC_DSP_CFG    0x0028
-#define SIRFSOC_CLKC_GFX_CFG    0x002c
-#define SIRFSOC_CLKC_MM_CFG     0x0030
-#define SIRFSOC_LKC_LCD_CFG     0x0034
-#define SIRFSOC_CLKC_MMC_CFG    0x0038
-#define SIRFSOC_CLKC_PLL1_CFG0  0x0040
-#define SIRFSOC_CLKC_PLL2_CFG0  0x0044
-#define SIRFSOC_CLKC_PLL3_CFG0  0x0048
-#define SIRFSOC_CLKC_PLL1_CFG1  0x004c
-#define SIRFSOC_CLKC_PLL2_CFG1  0x0050
-#define SIRFSOC_CLKC_PLL3_CFG1  0x0054
-#define SIRFSOC_CLKC_PLL1_CFG2  0x0058
-#define SIRFSOC_CLKC_PLL2_CFG2  0x005c
-#define SIRFSOC_CLKC_PLL3_CFG2  0x0060
-
-#define SIRFSOC_CLOCK_VA_BASE          SIRFSOC_VA(0x005000)
-
-#define KHZ     1000
-#define MHZ     (KHZ * KHZ)
-
-struct clk_ops {
-       unsigned long (*get_rate)(struct clk *clk);
-       long (*round_rate)(struct clk *clk, unsigned long rate);
-       int (*set_rate)(struct clk *clk, unsigned long rate);
-       int (*enable)(struct clk *clk);
-       int (*disable)(struct clk *clk);
-       struct clk *(*get_parent)(struct clk *clk);
-       int (*set_parent)(struct clk *clk, struct clk *parent);
-};
-
-struct clk {
-       struct clk *parent;     /* parent clk */
-       unsigned long rate;     /* clock rate in Hz */
-       signed char usage;      /* clock enable count */
-       signed char enable_bit; /* enable bit: 0 ~ 63 */
-       unsigned short regofs;  /* register offset */
-       struct clk_ops *ops;    /* clock operation */
-};
-
-static DEFINE_SPINLOCK(clocks_lock);
-
-static inline unsigned long clkc_readl(unsigned reg)
-{
-       return readl(SIRFSOC_CLOCK_VA_BASE + reg);
-}
-
-static inline void clkc_writel(u32 val, unsigned reg)
-{
-       writel(val, SIRFSOC_CLOCK_VA_BASE + reg);
-}
-
-/*
- * osc_rtc - real time oscillator - 32.768KHz
- * osc_sys - high speed oscillator - 26MHz
- */
-
-static struct clk clk_rtc = {
-       .rate = 32768,
-};
-
-static struct clk clk_osc = {
-       .rate = 26 * MHZ,
-};
-
-/*
- * std pll
- */
-static unsigned long std_pll_get_rate(struct clk *clk)
-{
-       unsigned long fin = clk_get_rate(clk->parent);
-       u32 regcfg2 = clk->regofs + SIRFSOC_CLKC_PLL1_CFG2 -
-               SIRFSOC_CLKC_PLL1_CFG0;
-
-       if (clkc_readl(regcfg2) & BIT(2)) {
-               /* pll bypass mode */
-               clk->rate = fin;
-       } else {
-               /* fout = fin * nf / nr / od */
-               u32 cfg0 = clkc_readl(clk->regofs);
-               u32 nf = (cfg0 & (BIT(13) - 1)) + 1;
-               u32 nr = ((cfg0 >> 13) & (BIT(6) - 1)) + 1;
-               u32 od = ((cfg0 >> 19) & (BIT(4) - 1)) + 1;
-               WARN_ON(fin % MHZ);
-               clk->rate = fin / MHZ * nf / nr / od * MHZ;
-       }
-
-       return clk->rate;
-}
-
-static int std_pll_set_rate(struct clk *clk, unsigned long rate)
-{
-       unsigned long fin, nf, nr, od, reg;
-
-       /*
-        * fout = fin * nf / (nr * od);
-        * set od = 1, nr = fin/MHz, so fout = nf * MHz
-        */
-
-       nf = rate / MHZ;
-       if (unlikely((rate % MHZ) || nf > BIT(13) || nf < 1))
-               return -EINVAL;
-
-       fin = clk_get_rate(clk->parent);
-       BUG_ON(fin < MHZ);
-
-       nr = fin / MHZ;
-       BUG_ON((fin % MHZ) || nr > BIT(6));
-
-       od = 1;
-
-       reg = (nf - 1) | ((nr - 1) << 13) | ((od - 1) << 19);
-       clkc_writel(reg, clk->regofs);
-
-       reg = clk->regofs + SIRFSOC_CLKC_PLL1_CFG1 - SIRFSOC_CLKC_PLL1_CFG0;
-       clkc_writel((nf >> 1) - 1, reg);
-
-       reg = clk->regofs + SIRFSOC_CLKC_PLL1_CFG2 - SIRFSOC_CLKC_PLL1_CFG0;
-       while (!(clkc_readl(reg) & BIT(6)))
-               cpu_relax();
-
-       clk->rate = 0; /* set to zero will force recalculation */
-       return 0;
-}
-
-static struct clk_ops std_pll_ops = {
-       .get_rate = std_pll_get_rate,
-       .set_rate = std_pll_set_rate,
-};
-
-static struct clk clk_pll1 = {
-       .parent = &clk_osc,
-       .regofs = SIRFSOC_CLKC_PLL1_CFG0,
-       .ops = &std_pll_ops,
-};
-
-static struct clk clk_pll2 = {
-       .parent = &clk_osc,
-       .regofs = SIRFSOC_CLKC_PLL2_CFG0,
-       .ops = &std_pll_ops,
-};
-
-static struct clk clk_pll3 = {
-       .parent = &clk_osc,
-       .regofs = SIRFSOC_CLKC_PLL3_CFG0,
-       .ops = &std_pll_ops,
-};
-
-/*
- * clock domains - cpu, mem, sys/io
- */
-
-static struct clk clk_mem;
-
-static struct clk *dmn_get_parent(struct clk *clk)
-{
-       struct clk *clks[] = {
-               &clk_osc, &clk_rtc, &clk_pll1, &clk_pll2, &clk_pll3
-       };
-       u32 cfg = clkc_readl(clk->regofs);
-       WARN_ON((cfg & (BIT(3) - 1)) > 4);
-       return clks[cfg & (BIT(3) - 1)];
-}
-
-static int dmn_set_parent(struct clk *clk, struct clk *parent)
-{
-       const struct clk *clks[] = {
-               &clk_osc, &clk_rtc, &clk_pll1, &clk_pll2, &clk_pll3
-       };
-       u32 cfg = clkc_readl(clk->regofs);
-       int i;
-       for (i = 0; i < ARRAY_SIZE(clks); i++) {
-               if (clks[i] == parent) {
-                       cfg &= ~(BIT(3) - 1);
-                       clkc_writel(cfg | i, clk->regofs);
-                       /* BIT(3) - switching status: 1 - busy, 0 - done */
-                       while (clkc_readl(clk->regofs) & BIT(3))
-                               cpu_relax();
-                       return 0;
-               }
-       }
-       return -EINVAL;
-}
-
-static unsigned long dmn_get_rate(struct clk *clk)
-{
-       unsigned long fin = clk_get_rate(clk->parent);
-       u32 cfg = clkc_readl(clk->regofs);
-       if (cfg & BIT(24)) {
-               /* fcd bypass mode */
-               clk->rate = fin;
-       } else {
-               /*
-                * wait count: bit[19:16], hold count: bit[23:20]
-                */
-               u32 wait = (cfg >> 16) & (BIT(4) - 1);
-               u32 hold = (cfg >> 20) & (BIT(4) - 1);
-
-               clk->rate = fin / (wait + hold + 2);
-       }
-
-       return clk->rate;
-}
-
-static int dmn_set_rate(struct clk *clk, unsigned long rate)
-{
-       unsigned long fin;
-       unsigned ratio, wait, hold, reg;
-       unsigned bits = (clk == &clk_mem) ? 3 : 4;
-
-       fin = clk_get_rate(clk->parent);
-       ratio = fin / rate;
-
-       if (unlikely(ratio < 2 || ratio > BIT(bits + 1)))
-               return -EINVAL;
-
-       WARN_ON(fin % rate);
-
-       wait = (ratio >> 1) - 1;
-       hold = ratio - wait - 2;
-
-       reg = clkc_readl(clk->regofs);
-       reg &= ~(((BIT(bits) - 1) << 16) | ((BIT(bits) - 1) << 20));
-       reg |= (wait << 16) | (hold << 20) | BIT(25);
-       clkc_writel(reg, clk->regofs);
-
-       /* waiting FCD been effective */
-       while (clkc_readl(clk->regofs) & BIT(25))
-               cpu_relax();
-
-       clk->rate = 0; /* set to zero will force recalculation */
-
-       return 0;
-}
-
-/*
- * cpu clock has no FCD register in Prima2, can only change pll
- */
-static int cpu_set_rate(struct clk *clk, unsigned long rate)
-{
-       int ret1, ret2;
-       struct clk *cur_parent, *tmp_parent;
-
-       cur_parent = dmn_get_parent(clk);
-       BUG_ON(cur_parent == NULL || cur_parent->usage > 1);
-
-       /* switch to tmp pll before setting parent clock's rate */
-       tmp_parent = cur_parent == &clk_pll1 ? &clk_pll2 : &clk_pll1;
-       ret1 = dmn_set_parent(clk, tmp_parent);
-       BUG_ON(ret1);
-
-       ret2 = clk_set_rate(cur_parent, rate);
-
-       ret1 = dmn_set_parent(clk, cur_parent);
-
-       clk->rate = 0; /* set to zero will force recalculation */
-
-       return ret2 ? ret2 : ret1;
-}
-
-static struct clk_ops cpu_ops = {
-       .get_parent = dmn_get_parent,
-       .set_parent = dmn_set_parent,
-       .set_rate = cpu_set_rate,
-};
-
-static struct clk clk_cpu = {
-       .parent = &clk_pll1,
-       .regofs = SIRFSOC_CLKC_CPU_CFG,
-       .ops = &cpu_ops,
-};
-
-
-static struct clk_ops msi_ops = {
-       .set_rate = dmn_set_rate,
-       .get_rate = dmn_get_rate,
-       .set_parent = dmn_set_parent,
-       .get_parent = dmn_get_parent,
-};
-
-static struct clk clk_mem = {
-       .parent = &clk_pll2,
-       .regofs = SIRFSOC_CLKC_MEM_CFG,
-       .ops = &msi_ops,
-};
-
-static struct clk clk_sys = {
-       .parent = &clk_pll3,
-       .regofs = SIRFSOC_CLKC_SYS_CFG,
-       .ops = &msi_ops,
-};
-
-static struct clk clk_io = {
-       .parent = &clk_pll3,
-       .regofs = SIRFSOC_CLKC_IO_CFG,
-       .ops = &msi_ops,
-};
-
-/*
- * on-chip clock sets
- */
-static struct clk_lookup onchip_clks[] = {
-       {
-               .dev_id = "rtc",
-               .clk = &clk_rtc,
-       }, {
-               .dev_id = "osc",
-               .clk = &clk_osc,
-       }, {
-               .dev_id = "pll1",
-               .clk = &clk_pll1,
-       }, {
-               .dev_id = "pll2",
-               .clk = &clk_pll2,
-       }, {
-               .dev_id = "pll3",
-               .clk = &clk_pll3,
-       }, {
-               .dev_id = "cpu",
-               .clk = &clk_cpu,
-       }, {
-               .dev_id = "mem",
-               .clk = &clk_mem,
-       }, {
-               .dev_id = "sys",
-               .clk = &clk_sys,
-       }, {
-               .dev_id = "io",
-               .clk = &clk_io,
-       },
-};
-
-int clk_enable(struct clk *clk)
-{
-       unsigned long flags;
-
-       if (unlikely(IS_ERR_OR_NULL(clk)))
-               return -EINVAL;
-
-       if (clk->parent)
-               clk_enable(clk->parent);
-
-       spin_lock_irqsave(&clocks_lock, flags);
-       if (!clk->usage++ && clk->ops && clk->ops->enable)
-               clk->ops->enable(clk);
-       spin_unlock_irqrestore(&clocks_lock, flags);
-       return 0;
-}
-EXPORT_SYMBOL(clk_enable);
-
-void clk_disable(struct clk *clk)
-{
-       unsigned long flags;
-
-       if (unlikely(IS_ERR_OR_NULL(clk)))
-               return;
-
-       WARN_ON(!clk->usage);
-
-       spin_lock_irqsave(&clocks_lock, flags);
-       if (--clk->usage == 0 && clk->ops && clk->ops->disable)
-               clk->ops->disable(clk);
-       spin_unlock_irqrestore(&clocks_lock, flags);
-
-       if (clk->parent)
-               clk_disable(clk->parent);
-}
-EXPORT_SYMBOL(clk_disable);
-
-unsigned long clk_get_rate(struct clk *clk)
-{
-       if (unlikely(IS_ERR_OR_NULL(clk)))
-               return 0;
-
-       if (clk->rate)
-               return clk->rate;
-
-       if (clk->ops && clk->ops->get_rate)
-               return clk->ops->get_rate(clk);
-
-       return clk_get_rate(clk->parent);
-}
-EXPORT_SYMBOL(clk_get_rate);
-
-long clk_round_rate(struct clk *clk, unsigned long rate)
-{
-       if (unlikely(IS_ERR_OR_NULL(clk)))
-               return 0;
-
-       if (clk->ops && clk->ops->round_rate)
-               return clk->ops->round_rate(clk, rate);
-
-       return 0;
-}
-EXPORT_SYMBOL(clk_round_rate);
-
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
-       if (unlikely(IS_ERR_OR_NULL(clk)))
-               return -EINVAL;
-
-       if (!clk->ops || !clk->ops->set_rate)
-               return -EINVAL;
-
-       return clk->ops->set_rate(clk, rate);
-}
-EXPORT_SYMBOL(clk_set_rate);
-
-int clk_set_parent(struct clk *clk, struct clk *parent)
-{
-       int ret;
-       unsigned long flags;
-
-       if (unlikely(IS_ERR_OR_NULL(clk)))
-               return -EINVAL;
-
-       if (!clk->ops || !clk->ops->set_parent)
-               return -EINVAL;
-
-       spin_lock_irqsave(&clocks_lock, flags);
-       ret = clk->ops->set_parent(clk, parent);
-       if (!ret) {
-               parent->usage += clk->usage;
-               clk->parent->usage -= clk->usage;
-               BUG_ON(clk->parent->usage < 0);
-               clk->parent = parent;
-       }
-       spin_unlock_irqrestore(&clocks_lock, flags);
-       return ret;
-}
-EXPORT_SYMBOL(clk_set_parent);
-
-struct clk *clk_get_parent(struct clk *clk)
-{
-       unsigned long flags;
-
-       if (unlikely(IS_ERR_OR_NULL(clk)))
-               return NULL;
-
-       if (!clk->ops || !clk->ops->get_parent)
-               return clk->parent;
-
-       spin_lock_irqsave(&clocks_lock, flags);
-       clk->parent = clk->ops->get_parent(clk);
-       spin_unlock_irqrestore(&clocks_lock, flags);
-       return clk->parent;
-}
-EXPORT_SYMBOL(clk_get_parent);
-
-static void __init sirfsoc_clk_init(void)
-{
-       clkdev_add_table(onchip_clks, ARRAY_SIZE(onchip_clks));
-}
-
-static struct of_device_id clkc_ids[] = {
-       { .compatible = "sirf,prima2-clkc" },
-       {},
-};
-
-void __init sirfsoc_of_clk_init(void)
-{
-       struct device_node *np;
-       struct resource res;
-       struct map_desc sirfsoc_clkc_iodesc = {
-               .virtual = SIRFSOC_CLOCK_VA_BASE,
-               .type    = MT_DEVICE,
-       };
-
-       np = of_find_matching_node(NULL, clkc_ids);
-       if (!np)
-               panic("unable to find compatible clkc node in dtb\n");
-
-       if (of_address_to_resource(np, 0, &res))
-               panic("unable to find clkc range in dtb");
-       of_node_put(np);
-
-       sirfsoc_clkc_iodesc.pfn = __phys_to_pfn(res.start);
-       sirfsoc_clkc_iodesc.length = 1 + res.end - res.start;
-
-       iotable_init(&sirfsoc_clkc_iodesc, 1);
-
-       sirfsoc_clk_init();
-}
similarity index 81%
rename from arch/arm/mach-prima2/prima2.c
rename to arch/arm/mach-prima2/common.c
index 8f0429d..f25a541 100644 (file)
@@ -30,21 +30,21 @@ void __init sirfsoc_init_late(void)
        sirfsoc_pm_init();
 }
 
-static const char *prima2cb_dt_match[] __initdata = {
-       "sirf,prima2-cb",
+#ifdef CONFIG_ARCH_PRIMA2
+static const char *prima2_dt_match[] __initdata = {
+       "sirf,prima2",
        NULL
 };
 
-MACHINE_START(PRIMA2_EVB, "prima2cb")
+DT_MACHINE_START(PRIMA2_DT, "Generic PRIMA2 (Flattened Device Tree)")
        /* Maintainer: Barry Song <baohua.song@csr.com> */
-       .atag_offset    = 0x100,
-       .init_early     = sirfsoc_of_clk_init,
        .map_io         = sirfsoc_map_lluart,
        .init_irq       = sirfsoc_of_irq_init,
        .timer          = &sirfsoc_timer,
        .dma_zone_size  = SZ_256M,
        .init_machine   = sirfsoc_mach_init,
        .init_late      = sirfsoc_init_late,
-       .dt_compat      = prima2cb_dt_match,
+       .dt_compat      = prima2_dt_match,
        .restart        = sirfsoc_restart,
 MACHINE_END
+#endif
index a7b9415..7dee917 100644 (file)
@@ -63,7 +63,7 @@ void __init sirfsoc_of_irq_init(void)
 
        np = of_find_matching_node(NULL, intc_ids);
        if (!np)
-               panic("unable to find compatible intc node in dtb\n");
+               return;
 
        sirfsoc_intc_base = of_iomap(np, 0);
        if (!sirfsoc_intc_base)
index f224107..d95bf25 100644 (file)
@@ -21,6 +21,8 @@
 #include <asm/sched_clock.h>
 #include <asm/mach/time.h>
 
+#include "common.h"
+
 #define SIRFSOC_TIMER_COUNTER_LO       0x0000
 #define SIRFSOC_TIMER_COUNTER_HI       0x0004
 #define SIRFSOC_TIMER_MATCH_0          0x0008
@@ -188,9 +190,13 @@ static void __init sirfsoc_clockevent_init(void)
 static void __init sirfsoc_timer_init(void)
 {
        unsigned long rate;
+       struct clk *clk;
+
+       /* initialize clocking early, we want to set the OS timer */
+       sirfsoc_of_clk_init();
 
        /* timer's input clock is io clock */
-       struct clk *clk = clk_get_sys("io", NULL);
+       clk = clk_get_sys("io", NULL);
 
        BUG_ON(IS_ERR(clk));
 
index fe2d1f8..8e6288d 100644 (file)
@@ -25,6 +25,18 @@ config PXA_V7_MACH_AUTO
 if !ARCH_PXA_V7
 comment "Intel/Marvell Dev Platforms (sorted by hardware release time)"
 
+config MACH_PXA3XX_DT
+       bool "Support PXA3xx platforms from device tree"
+       select PXA3xx
+       select CPU_PXA300
+       select POWER_SUPPLY
+       select HAVE_PWM
+       select USE_OF
+       help
+         Include support for Marvell PXA3xx based platforms using
+         the device tree. Needn't select any other machine while
+         MACH_PXA3XX_DT is enabled.
+
 config ARCH_LUBBOCK
        bool "Intel DBPXA250 Development Platform (aka Lubbock)"
        select PXA25x
index be0f7df..2bedc9e 100644 (file)
@@ -26,6 +26,9 @@ obj-$(CONFIG_CPU_PXA930)      += pxa930.o
 
 # NOTE: keep the order of boards in accordance to their order in Kconfig
 
+# Device Tree support
+obj-$(CONFIG_MACH_PXA3XX_DT)   += pxa-dt.o
+
 # Intel/Marvell Dev Platforms
 obj-$(CONFIG_ARCH_LUBBOCK)     += lubbock.o
 obj-$(CONFIG_MACH_MAINSTONE)   += mainstone.o
index 2a37a9a..d4e9499 100644 (file)
@@ -127,8 +127,10 @@ void clk_pxa3xx_cken_enable(struct clk *clk)
 
        if (clk->cken < 32)
                CKENA |= mask;
-       else
+       else if (clk->cken < 64)
                CKENB |= mask;
+       else
+               CKENC |= mask;
 }
 
 void clk_pxa3xx_cken_disable(struct clk *clk)
@@ -137,8 +139,10 @@ void clk_pxa3xx_cken_disable(struct clk *clk)
 
        if (clk->cken < 32)
                CKENA &= ~mask;
-       else
+       else if (clk->cken < 64)
                CKENB &= ~mask;
+       else
+               CKENC &= ~mask;
 }
 
 const struct clkops clk_pxa3xx_cken_ops = {
index 339eb2a..adf32e6 100644 (file)
@@ -6,7 +6,6 @@
 #include <linux/spi/pxa2xx_spi.h>
 #include <linux/i2c/pxa-i2c.h>
 
-#include <asm/pmu.h>
 #include <mach/udc.h>
 #include <mach/pxa3xx-u2d.h>
 #include <mach/pxafb.h>
@@ -42,7 +41,7 @@ static struct resource pxa_resource_pmu = {
 
 struct platform_device pxa_device_pmu = {
        .name           = "arm-pmu",
-       .id             = ARM_PMU_DEVICE_CPU,
+       .id             = -1,
        .resource       = &pxa_resource_pmu,
        .num_resources  = 1,
 };
index 207ecb4..f4d48d2 100644 (file)
 #define AICSR          __REG(0x41340008)       /* Application Subsystem Interrupt Control/Status Register */
 #define CKENA          __REG(0x4134000C)       /* A Clock Enable Register */
 #define CKENB          __REG(0x41340010)       /* B Clock Enable Register */
+#define CKENC          __REG(0x41340024)       /* C Clock Enable Register */
 #define AC97_DIV       __REG(0x41340014)       /* AC97 clock divisor value register */
 
 #define ACCR_XPDIS             (1 << 31)       /* Core PLL Output Disable */
index 5dae15e..b6cc181 100644 (file)
@@ -17,6 +17,8 @@
 #include <linux/syscore_ops.h>
 #include <linux/io.h>
 #include <linux/irq.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
 
 #include <asm/exception.h>
 
@@ -25,8 +27,6 @@
 
 #include "generic.h"
 
-#define IRQ_BASE               io_p2v(0x40d00000)
-
 #define ICIP                   (0x000)
 #define ICMR                   (0x004)
 #define ICLR                   (0x008)
  * This is for peripheral IRQs internal to the PXA chip.
  */
 
+static void __iomem *pxa_irq_base;
 static int pxa_internal_irq_nr;
-
-static inline int cpu_has_ipr(void)
-{
-       return !cpu_is_pxa25x();
-}
+static bool cpu_has_ipr;
 
 static inline void __iomem *irq_base(int i)
 {
-       static unsigned long phys_base[] = {
-               0x40d00000,
-               0x40d0009c,
-               0x40d00130,
+       static unsigned long phys_base_offset[] = {
+               0x0,
+               0x9c,
+               0x130,
        };
 
-       return io_p2v(phys_base[i]);
+       return pxa_irq_base + phys_base_offset[i];
 }
 
 void pxa_mask_irq(struct irq_data *d)
@@ -96,8 +93,8 @@ asmlinkage void __exception_irq_entry icip_handle_irq(struct pt_regs *regs)
        uint32_t icip, icmr, mask;
 
        do {
-               icip = __raw_readl(IRQ_BASE + ICIP);
-               icmr = __raw_readl(IRQ_BASE + ICMR);
+               icip = __raw_readl(pxa_irq_base + ICIP);
+               icmr = __raw_readl(pxa_irq_base + ICMR);
                mask = icip & icmr;
 
                if (mask == 0)
@@ -128,6 +125,8 @@ void __init pxa_init_irq(int irq_nr, int (*fn)(struct irq_data *, unsigned int))
        BUG_ON(irq_nr > MAX_INTERNAL_IRQS);
 
        pxa_internal_irq_nr = irq_nr;
+       cpu_has_ipr = !cpu_is_pxa25x();
+       pxa_irq_base = io_p2v(0x40d00000);
 
        for (n = 0; n < irq_nr; n += 32) {
                void __iomem *base = irq_base(n >> 5);
@@ -136,8 +135,8 @@ void __init pxa_init_irq(int irq_nr, int (*fn)(struct irq_data *, unsigned int))
                __raw_writel(0, base + ICLR);   /* all IRQs are IRQ, not FIQ */
                for (i = n; (i < (n + 32)) && (i < irq_nr); i++) {
                        /* initialize interrupt priority */
-                       if (cpu_has_ipr())
-                               __raw_writel(i | IPR_VALID, IRQ_BASE + IPR(i));
+                       if (cpu_has_ipr)
+                               __raw_writel(i | IPR_VALID, pxa_irq_base + IPR(i));
 
                        irq = PXA_IRQ(i);
                        irq_set_chip_and_handler(irq, &pxa_internal_irq_chip,
@@ -168,9 +167,9 @@ static int pxa_irq_suspend(void)
                __raw_writel(0, base + ICMR);
        }
 
-       if (cpu_has_ipr()) {
+       if (cpu_has_ipr) {
                for (i = 0; i < pxa_internal_irq_nr; i++)
-                       saved_ipr[i] = __raw_readl(IRQ_BASE + IPR(i));
+                       saved_ipr[i] = __raw_readl(pxa_irq_base + IPR(i));
        }
 
        return 0;
@@ -187,11 +186,11 @@ static void pxa_irq_resume(void)
                __raw_writel(0, base + ICLR);
        }
 
-       if (cpu_has_ipr())
+       if (cpu_has_ipr)
                for (i = 0; i < pxa_internal_irq_nr; i++)
-                       __raw_writel(saved_ipr[i], IRQ_BASE + IPR(i));
+                       __raw_writel(saved_ipr[i], pxa_irq_base + IPR(i));
 
-       __raw_writel(1, IRQ_BASE + ICCR);
+       __raw_writel(1, pxa_irq_base + ICCR);
 }
 #else
 #define pxa_irq_suspend                NULL
@@ -202,3 +201,93 @@ struct syscore_ops pxa_irq_syscore_ops = {
        .suspend        = pxa_irq_suspend,
        .resume         = pxa_irq_resume,
 };
+
+#ifdef CONFIG_OF
+static struct irq_domain *pxa_irq_domain;
+
+static int pxa_irq_map(struct irq_domain *h, unsigned int virq,
+                      irq_hw_number_t hw)
+{
+       void __iomem *base = irq_base(hw / 32);
+
+       /* initialize interrupt priority */
+       if (cpu_has_ipr)
+               __raw_writel(hw | IPR_VALID, pxa_irq_base + IPR(hw));
+
+       irq_set_chip_and_handler(hw, &pxa_internal_irq_chip,
+                                handle_level_irq);
+       irq_set_chip_data(hw, base);
+       set_irq_flags(hw, IRQF_VALID);
+
+       return 0;
+}
+
+static struct irq_domain_ops pxa_irq_ops = {
+       .map    = pxa_irq_map,
+       .xlate  = irq_domain_xlate_onecell,
+};
+
+static const struct of_device_id intc_ids[] __initconst = {
+       { .compatible = "marvell,pxa-intc", },
+       {}
+};
+
+void __init pxa_dt_irq_init(int (*fn)(struct irq_data *, unsigned int))
+{
+       struct device_node *node;
+       const struct of_device_id *of_id;
+       struct pxa_intc_conf *conf;
+       struct resource res;
+       int n, ret;
+
+       node = of_find_matching_node(NULL, intc_ids);
+       if (!node) {
+               pr_err("Failed to find interrupt controller in arch-pxa\n");
+               return;
+       }
+       of_id = of_match_node(intc_ids, node);
+       conf = of_id->data;
+
+       ret = of_property_read_u32(node, "marvell,intc-nr-irqs",
+                                  &pxa_internal_irq_nr);
+       if (ret) {
+               pr_err("Not found marvell,intc-nr-irqs property\n");
+               return;
+       }
+
+       ret = of_address_to_resource(node, 0, &res);
+       if (ret < 0) {
+               pr_err("No registers defined for node\n");
+               return;
+       }
+       pxa_irq_base = io_p2v(res.start);
+
+       if (of_find_property(node, "marvell,intc-priority", NULL))
+               cpu_has_ipr = 1;
+
+       ret = irq_alloc_descs(-1, 0, pxa_internal_irq_nr, 0);
+       if (ret < 0) {
+               pr_err("Failed to allocate IRQ numbers\n");
+               return;
+       }
+
+       pxa_irq_domain = irq_domain_add_legacy(node, pxa_internal_irq_nr, 0, 0,
+                                              &pxa_irq_ops, NULL);
+       if (!pxa_irq_domain)
+               panic("Unable to add PXA IRQ domain\n");
+
+       irq_set_default_host(pxa_irq_domain);
+
+       for (n = 0; n < pxa_internal_irq_nr; n += 32) {
+               void __iomem *base = irq_base(n >> 5);
+
+               __raw_writel(0, base + ICMR);   /* disable all IRQs */
+               __raw_writel(0, base + ICLR);   /* all IRQs are IRQ, not FIQ */
+       }
+
+       /* only unmasked interrupts kick us out of idle */
+       __raw_writel(1, irq_base(0) + ICCR);
+
+       pxa_internal_irq_chip.irq_set_wake = fn;
+}
+#endif /* CONFIG_OF */
diff --git a/arch/arm/mach-pxa/pxa-dt.c b/arch/arm/mach-pxa/pxa-dt.c
new file mode 100644 (file)
index 0000000..c9192ce
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ *  linux/arch/arm/mach-pxa/pxa-dt.c
+ *
+ *  Copyright (C) 2012 Daniel Mack
+ *
+ *  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 <linux/irq.h>
+#include <linux/irqdomain.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <asm/mach/arch.h>
+#include <asm/mach/time.h>
+#include <mach/irqs.h>
+#include <mach/pxa3xx.h>
+
+#include "generic.h"
+
+#ifdef CONFIG_PXA3xx
+extern void __init pxa3xx_dt_init_irq(void);
+
+static const struct of_dev_auxdata pxa3xx_auxdata_lookup[] __initconst = {
+       OF_DEV_AUXDATA("mrvl,pxa-uart",         0x40100000, "pxa2xx-uart.0", NULL),
+       OF_DEV_AUXDATA("mrvl,pxa-uart",         0x40200000, "pxa2xx-uart.1", NULL),
+       OF_DEV_AUXDATA("mrvl,pxa-uart",         0x40700000, "pxa2xx-uart.2", NULL),
+       OF_DEV_AUXDATA("mrvl,pxa-uart",         0x41600000, "pxa2xx-uart.3", NULL),
+       OF_DEV_AUXDATA("marvell,pxa-mmc",       0x41100000, "pxa2xx-mci.0", NULL),
+       OF_DEV_AUXDATA("mrvl,pxa-gpio",         0x40e00000, "pxa-gpio", NULL),
+       OF_DEV_AUXDATA("marvell,pxa-ohci",      0x4c000000, "pxa27x-ohci", NULL),
+       OF_DEV_AUXDATA("mrvl,pxa-i2c",          0x40301680, "pxa2xx-i2c.0", NULL),
+       OF_DEV_AUXDATA("mrvl,pwri2c",           0x40f500c0, "pxa3xx-i2c.1", NULL),
+       OF_DEV_AUXDATA("marvell,pxa3xx-nand",   0x43100000, "pxa3xx-nand", NULL),
+       {}
+};
+
+static void __init pxa3xx_dt_init(void)
+{
+       of_platform_populate(NULL, of_default_bus_match_table,
+                            pxa3xx_auxdata_lookup, NULL);
+}
+
+static const char *pxa3xx_dt_board_compat[] __initdata = {
+       "marvell,pxa300",
+       "marvell,pxa310",
+       "marvell,pxa320",
+       NULL,
+};
+#endif
+
+#ifdef CONFIG_PXA3xx
+DT_MACHINE_START(PXA_DT, "Marvell PXA3xx (Device Tree Support)")
+       .map_io         = pxa3xx_map_io,
+       .init_irq       = pxa3xx_dt_init_irq,
+       .handle_irq     = pxa3xx_handle_irq,
+       .timer          = &pxa_timer,
+       .restart        = pxa_restart,
+       .init_machine   = pxa3xx_dt_init,
+       .dt_compat      = pxa3xx_dt_board_compat,
+MACHINE_END
+#endif
index dffb7e8..ff9c957 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/platform_device.h>
 #include <linux/irq.h>
 #include <linux/io.h>
+#include <linux/of.h>
 #include <linux/syscore_ops.h>
 #include <linux/i2c/pxa-i2c.h>
 
@@ -40,6 +41,8 @@
 #define PECR_IE(n)     ((1 << ((n) * 2)) << 28)
 #define PECR_IS(n)     ((1 << ((n) * 2)) << 29)
 
+extern void __init pxa_dt_irq_init(int (*fn)(struct irq_data *, unsigned int));
+
 static DEFINE_PXA3_CKEN(pxa3xx_ffuart, FFUART, 14857000, 1);
 static DEFINE_PXA3_CKEN(pxa3xx_btuart, BTUART, 14857000, 1);
 static DEFINE_PXA3_CKEN(pxa3xx_stuart, STUART, 14857000, 1);
@@ -382,7 +385,7 @@ static void __init pxa_init_ext_wakeup_irq(int (*fn)(struct irq_data *,
        pxa_ext_wakeup_chip.irq_set_wake = fn;
 }
 
-void __init pxa3xx_init_irq(void)
+static void __init __pxa3xx_init_irq(void)
 {
        /* enable CP6 access */
        u32 value;
@@ -390,10 +393,23 @@ void __init pxa3xx_init_irq(void)
        value |= (1 << 6);
        __asm__ __volatile__("mcr p15, 0, %0, c15, c1, 0\n": :"r"(value));
 
-       pxa_init_irq(56, pxa3xx_set_wake);
        pxa_init_ext_wakeup_irq(pxa3xx_set_wake);
 }
 
+void __init pxa3xx_init_irq(void)
+{
+       __pxa3xx_init_irq();
+       pxa_init_irq(56, pxa3xx_set_wake);
+}
+
+#ifdef CONFIG_OF
+void __init pxa3xx_dt_init_irq(void)
+{
+       __pxa3xx_init_irq();
+       pxa_dt_irq_init(pxa3xx_set_wake);
+}
+#endif /* CONFIG_OF */
+
 static struct map_desc pxa3xx_io_desc[] __initdata = {
        {       /* Mem Ctl */
                .virtual        = (unsigned long)SMEMC_VIRT,
@@ -466,7 +482,8 @@ static int __init pxa3xx_init(void)
                register_syscore_ops(&pxa3xx_mfp_syscore_ops);
                register_syscore_ops(&pxa3xx_clock_syscore_ops);
 
-               ret = platform_add_devices(devices, ARRAY_SIZE(devices));
+               if (!of_have_populated_dt())
+                       ret = platform_add_devices(devices, ARRAY_SIZE(devices));
        }
 
        return ret;
index 45868bb..ff007d1 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/ata_platform.h>
 #include <linux/amba/mmci.h>
 #include <linux/gfp.h>
-#include <linux/clkdev.h>
 #include <linux/mtd/physmap.h>
 
 #include <mach/hardware.h>
@@ -226,115 +225,10 @@ struct mmci_platform_data realview_mmc1_plat_data = {
        .cd_invert      = true,
 };
 
-/*
- * Clock handling
- */
-static const struct icst_params realview_oscvco_params = {
-       .ref            = 24000000,
-       .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 void realview_oscvco_set(struct clk *clk, struct icst_vco vco)
-{
-       void __iomem *sys_lock = __io_address(REALVIEW_SYS_BASE) + REALVIEW_SYS_LOCK_OFFSET;
-       u32 val;
-
-       val = readl(clk->vcoreg) & ~0x7ffff;
-       val |= vco.v | (vco.r << 9) | (vco.s << 16);
-
-       writel(0xa05f, sys_lock);
-       writel(val, clk->vcoreg);
-       writel(0, sys_lock);
-}
-
-static const struct clk_ops oscvco_clk_ops = {
-       .round  = icst_clk_round,
-       .set    = icst_clk_set,
-       .setvco = realview_oscvco_set,
-};
-
-static struct clk oscvco_clk = {
-       .ops    = &oscvco_clk_ops,
-       .params = &realview_oscvco_params,
-};
-
-/*
- * These are fixed clocks.
- */
-static struct clk ref24_clk = {
-       .rate   = 24000000,
-};
-
-static struct clk sp804_clk = {
-       .rate   = 1000000,
-};
-
-static struct clk dummy_apb_pclk;
-
-static struct clk_lookup lookups[] = {
-       {       /* Bus clock */
-               .con_id         = "apb_pclk",
-               .clk            = &dummy_apb_pclk,
-       }, {    /* UART0 */
-               .dev_id         = "dev:uart0",
-               .clk            = &ref24_clk,
-       }, {    /* UART1 */
-               .dev_id         = "dev:uart1",
-               .clk            = &ref24_clk,
-       }, {    /* UART2 */
-               .dev_id         = "dev:uart2",
-               .clk            = &ref24_clk,
-       }, {    /* UART3 */
-               .dev_id         = "fpga:uart3",
-               .clk            = &ref24_clk,
-       }, {    /* UART3 is on the dev chip in PB1176 */
-               .dev_id         = "dev:uart3",
-               .clk            = &ref24_clk,
-       }, {    /* UART4 only exists in PB1176 */
-               .dev_id         = "fpga:uart4",
-               .clk            = &ref24_clk,
-       }, {    /* KMI0 */
-               .dev_id         = "fpga:kmi0",
-               .clk            = &ref24_clk,
-       }, {    /* KMI1 */
-               .dev_id         = "fpga:kmi1",
-               .clk            = &ref24_clk,
-       }, {    /* MMC0 */
-               .dev_id         = "fpga:mmc0",
-               .clk            = &ref24_clk,
-       }, {    /* CLCD is in the PB1176 and EB DevChip */
-               .dev_id         = "dev:clcd",
-               .clk            = &oscvco_clk,
-       }, {    /* PB:CLCD */
-               .dev_id         = "issp:clcd",
-               .clk            = &oscvco_clk,
-       }, {    /* SSP */
-               .dev_id         = "dev:ssp0",
-               .clk            = &ref24_clk,
-       }, {    /* SP804 timers */
-               .dev_id         = "sp804",
-               .clk            = &sp804_clk,
-       },
-};
-
 void __init realview_init_early(void)
 {
        void __iomem *sys = __io_address(REALVIEW_SYS_BASE);
 
-       if (machine_is_realview_pb1176())
-               oscvco_clk.vcoreg = sys + REALVIEW_SYS_OSC0_OFFSET;
-       else
-               oscvco_clk.vcoreg = sys + REALVIEW_SYS_OSC4_OFFSET;
-
-       clkdev_add_table(lookups, ARRAY_SIZE(lookups));
-
        versatile_sched_clock_init(sys + REALVIEW_SYS_24MHz_OFFSET, 24000000);
 }
 
diff --git a/arch/arm/mach-realview/include/mach/clkdev.h b/arch/arm/mach-realview/include/mach/clkdev.h
deleted file mode 100644 (file)
index e58d077..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-#ifndef __ASM_MACH_CLKDEV_H
-#define __ASM_MACH_CLKDEV_H
-
-#include <plat/clock.h>
-
-struct clk {
-       unsigned long           rate;
-       const struct clk_ops    *ops;
-       const struct icst_params *params;
-       void __iomem            *vcoreg;
-};
-
-#define __clk_get(clk) ({ 1; })
-#define __clk_put(clk) do { } while (0)
-
-#endif
index baf382c..ce77476 100644 (file)
 #include <linux/amba/mmci.h>
 #include <linux/amba/pl022.h>
 #include <linux/io.h>
+#include <linux/platform_data/clk-realview.h>
 
 #include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
-#include <asm/pmu.h>
 #include <asm/pgtable.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
@@ -297,7 +297,7 @@ static struct resource pmu_resources[] = {
 
 static struct platform_device pmu_device = {
        .name                   = "arm-pmu",
-       .id                     = ARM_PMU_DEVICE_CPU,
+       .id                     = -1,
        .num_resources          = ARRAY_SIZE(pmu_resources),
        .resource               = pmu_resources,
 };
@@ -414,6 +414,7 @@ static void __init realview_eb_timer_init(void)
        else
                timer_irq = IRQ_EB_TIMER0_1;
 
+       realview_clk_init(__io_address(REALVIEW_SYS_BASE), false);
        realview_timer_init(timer_irq);
        realview_eb_twd_init();
 }
index b1d7caf..e21711d 100644 (file)
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/partitions.h>
 #include <linux/io.h>
+#include <linux/platform_data/clk-realview.h>
 
 #include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
-#include <asm/pmu.h>
 #include <asm/pgtable.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
@@ -280,7 +280,7 @@ static struct resource pmu_resource = {
 
 static struct platform_device pmu_device = {
        .name                   = "arm-pmu",
-       .id                     = ARM_PMU_DEVICE_CPU,
+       .id                     = -1,
        .num_resources          = 1,
        .resource               = &pmu_resource,
 };
@@ -326,6 +326,7 @@ static void __init realview_pb1176_timer_init(void)
        timer2_va_base = __io_address(REALVIEW_PB1176_TIMER2_3_BASE);
        timer3_va_base = __io_address(REALVIEW_PB1176_TIMER2_3_BASE) + 0x20;
 
+       realview_clk_init(__io_address(REALVIEW_SYS_BASE), true);
        realview_timer_init(IRQ_DC1176_TIMER0);
 }
 
index a98c536..b442fb2 100644 (file)
 #include <linux/amba/mmci.h>
 #include <linux/amba/pl022.h>
 #include <linux/io.h>
+#include <linux/platform_data/clk-realview.h>
 
 #include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
-#include <asm/pmu.h>
 #include <asm/pgtable.h>
 #include <asm/hardware/gic.h>
 #include <asm/hardware/cache-l2x0.h>
@@ -263,7 +263,7 @@ static struct resource pmu_resources[] = {
 
 static struct platform_device pmu_device = {
        .name                   = "arm-pmu",
-       .id                     = ARM_PMU_DEVICE_CPU,
+       .id                     = -1,
        .num_resources          = ARRAY_SIZE(pmu_resources),
        .resource               = pmu_resources,
 };
@@ -312,6 +312,7 @@ static void __init realview_pb11mp_timer_init(void)
        timer2_va_base = __io_address(REALVIEW_PB11MP_TIMER2_3_BASE);
        timer3_va_base = __io_address(REALVIEW_PB11MP_TIMER2_3_BASE) + 0x20;
 
+       realview_clk_init(__io_address(REALVIEW_SYS_BASE), false);
        realview_timer_init(IRQ_TC11MP_TIMER0_1);
        realview_pb11mp_twd_init();
 }
index 5965017..1435cd8 100644 (file)
 #include <linux/amba/mmci.h>
 #include <linux/amba/pl022.h>
 #include <linux/io.h>
+#include <linux/platform_data/clk-realview.h>
 
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
-#include <asm/pmu.h>
 #include <asm/pgtable.h>
 #include <asm/hardware/gic.h>
 
@@ -241,7 +241,7 @@ static struct resource pmu_resource = {
 
 static struct platform_device pmu_device = {
        .name                   = "arm-pmu",
-       .id                     = ARM_PMU_DEVICE_CPU,
+       .id                     = -1,
        .num_resources          = 1,
        .resource               = &pmu_resource,
 };
@@ -261,6 +261,7 @@ static void __init realview_pba8_timer_init(void)
        timer2_va_base = __io_address(REALVIEW_PBA8_TIMER2_3_BASE);
        timer3_va_base = __io_address(REALVIEW_PBA8_TIMER2_3_BASE) + 0x20;
 
+       realview_clk_init(__io_address(REALVIEW_SYS_BASE), false);
        realview_timer_init(IRQ_PBA8_TIMER0_1);
 }
 
index 3f2f605..5d2c8be 100644 (file)
 #include <linux/amba/mmci.h>
 #include <linux/amba/pl022.h>
 #include <linux/io.h>
+#include <linux/platform_data/clk-realview.h>
 
 #include <asm/irq.h>
 #include <asm/leds.h>
 #include <asm/mach-types.h>
-#include <asm/pmu.h>
 #include <asm/smp_twd.h>
 #include <asm/pgtable.h>
 #include <asm/hardware/gic.h>
@@ -280,7 +280,7 @@ static struct resource pmu_resources[] = {
 
 static struct platform_device pmu_device = {
        .name                   = "arm-pmu",
-       .id                     = ARM_PMU_DEVICE_CPU,
+       .id                     = -1,
        .num_resources          = ARRAY_SIZE(pmu_resources),
        .resource               = pmu_resources,
 };
@@ -320,6 +320,7 @@ static void __init realview_pbx_timer_init(void)
        timer2_va_base = __io_address(REALVIEW_PBX_TIMER2_3_BASE);
        timer3_va_base = __io_address(REALVIEW_PBX_TIMER2_3_BASE) + 0x20;
 
+       realview_clk_init(__io_address(REALVIEW_SYS_BASE), false);
        realview_timer_init(IRQ_PBX_TIMER0_1);
        realview_pbx_twd_init();
 }
index a5eeb62..57aee91 100644 (file)
@@ -138,19 +138,7 @@ static struct platform_driver h1940bt_driver = {
        .remove         = h1940bt_remove,
 };
 
-
-static int __init h1940bt_init(void)
-{
-       return platform_driver_register(&h1940bt_driver);
-}
-
-static void __exit h1940bt_exit(void)
-{
-       platform_driver_unregister(&h1940bt_driver);
-}
-
-module_init(h1940bt_init);
-module_exit(h1940bt_exit);
+module_platform_driver(h1940bt_driver);
 
 MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
 MODULE_DESCRIPTION("Driver for the iPAQ H1940 bluetooth chip");
index 5a7d0c0..0c7ed7a 100644 (file)
@@ -424,7 +424,8 @@ static void __init anubis_map_io(void)
                anubis_nand_sets[0].nr_partitions = ARRAY_SIZE(anubis_default_nand_part_large);
        } else {
                /* ensure that the GPIO is setup */
-               s3c2410_gpio_setpin(S3C2410_GPA(0), 1);
+               gpio_request_one(S3C2410_GPA(0), GPIOF_OUT_INIT_HIGH, NULL);
+               gpio_free(S3C2410_GPA(0));
        }
 }
 
index ae73ba3..4713347 100644 (file)
@@ -512,8 +512,8 @@ static void jive_power_off(void)
 {
        printk(KERN_INFO "powering system down...\n");
 
-       s3c2410_gpio_setpin(S3C2410_GPC(5), 1);
-       s3c_gpio_cfgpin(S3C2410_GPC(5), S3C2410_GPIO_OUTPUT);
+       gpio_request_one(S3C2410_GPC(5), GPIOF_OUT_INIT_HIGH, NULL);
+       gpio_free(S3C2410_GPC(5));
 }
 
 static void __init jive_machine_init(void)
@@ -623,11 +623,11 @@ static void __init jive_machine_init(void)
        gpio_request(S3C2410_GPB(7), "jive spi");
        gpio_direction_output(S3C2410_GPB(7), 1);
 
-       s3c2410_gpio_setpin(S3C2410_GPB(6), 0);
-       s3c_gpio_cfgpin(S3C2410_GPB(6), S3C2410_GPIO_OUTPUT);
+       gpio_request_one(S3C2410_GPB(6), GPIOF_OUT_INIT_LOW, NULL);
+       gpio_free(S3C2410_GPB(6));
 
-       s3c2410_gpio_setpin(S3C2410_GPG(8), 1);
-       s3c_gpio_cfgpin(S3C2410_GPG(8), S3C2410_GPIO_OUTPUT);
+       gpio_request_one(S3C2410_GPG(8), GPIOF_OUT_INIT_HIGH, NULL);
+       gpio_free(S3C2410_GPG(8));
 
        /* initialise the WM8750 spi */
 
index bd6d252..734bbfe 100644 (file)
@@ -638,9 +638,9 @@ static void __init mini2440_init(void)
        gpio_free(S3C2410_GPG(4));
 
        /* remove pullup on optional PWM backlight -- unused on 3.5 and 7"s */
+       gpio_request_one(S3C2410_GPB(1), GPIOF_IN, NULL);
        s3c_gpio_setpull(S3C2410_GPB(1), S3C_GPIO_PULL_UP);
-       s3c2410_gpio_setpin(S3C2410_GPB(1), 0);
-       s3c_gpio_cfgpin(S3C2410_GPB(1), S3C2410_GPIO_INPUT);
+       gpio_free(S3C2410_GPB(1));
 
        /* mark the key as input, without pullups (there is one on the board) */
        for (i = 0; i < ARRAY_SIZE(mini2440_buttons); i++) {
index 5c05ba1..a71a551 100644 (file)
@@ -119,17 +119,17 @@ static struct platform_device *nexcoder_devices[] __initdata = {
 
 static void __init nexcoder_sensorboard_init(void)
 {
-       // Initialize SCCB bus
-       s3c2410_gpio_setpin(S3C2410_GPE(14), 1); // IICSCL
-       s3c_gpio_cfgpin(S3C2410_GPE(14), S3C2410_GPIO_OUTPUT);
-       s3c2410_gpio_setpin(S3C2410_GPE(15), 1); // IICSDA
-       s3c_gpio_cfgpin(S3C2410_GPE(15), S3C2410_GPIO_OUTPUT);
-
-       // Power up the sensor board
-       s3c2410_gpio_setpin(S3C2410_GPF(1), 1);
-       s3c_gpio_cfgpin(S3C2410_GPF(1), S3C2410_GPIO_OUTPUT); // CAM_GPIO7 => nLDO_PWRDN
-       s3c2410_gpio_setpin(S3C2410_GPF(2), 0);
-       s3c_gpio_cfgpin(S3C2410_GPF(2), S3C2410_GPIO_OUTPUT); // CAM_GPIO6 => CAM_PWRDN
+       /* Initialize SCCB bus */
+       gpio_request_one(S3C2410_GPE(14), GPIOF_OUT_INIT_HIGH, NULL);
+       gpio_free(S3C2410_GPE(14)); /* IICSCL */
+       gpio_request_one(S3C2410_GPE(15), GPIOF_OUT_INIT_HIGH, NULL);
+       gpio_free(S3C2410_GPE(15)); /* IICSDA */
+
+       /* Power up the sensor board */
+       gpio_request_one(S3C2410_GPF(1), GPIOF_OUT_INIT_HIGH, NULL);
+       gpio_free(S3C2410_GPF(1)); /* CAM_GPIO7 => nLDO_PWRDN */
+       gpio_request_one(S3C2410_GPF(2), GPIOF_OUT_INIT_LOW, NULL);
+       gpio_free(S3C2410_GPF(2)); /* CAM_GPIO6 => CAM_PWRDN */
 }
 
 static void __init nexcoder_map_io(void)
index ad2792d..5876c6b 100644 (file)
@@ -175,18 +175,7 @@ static struct platform_driver osiris_dvs_driver = {
        },
 };
 
-static int __init osiris_dvs_init(void)
-{
-       return platform_driver_register(&osiris_dvs_driver);
-}
-
-static void __exit osiris_dvs_exit(void)
-{
-       platform_driver_unregister(&osiris_dvs_driver);
-}
-
-module_init(osiris_dvs_init);
-module_exit(osiris_dvs_exit);
+module_platform_driver(osiris_dvs_driver);
 
 MODULE_DESCRIPTION("Simtec OSIRIS DVS support");
 MODULE_AUTHOR("Ben Dooks <ben@simtec.co.uk>");
index 95d0772..c0fb3c1 100644 (file)
@@ -274,8 +274,8 @@ static int osiris_pm_suspend(void)
        __raw_writeb(tmp, OSIRIS_VA_CTRL0);
 
        /* ensure that an nRESET is not generated on resume. */
-       s3c2410_gpio_setpin(S3C2410_GPA(21), 1);
-       s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPIO_OUTPUT);
+       gpio_request_one(S3C2410_GPA(21), GPIOF_OUT_INIT_HIGH, NULL);
+       gpio_free(S3C2410_GPA(21));
 
        return 0;
 }
@@ -396,7 +396,8 @@ static void __init osiris_map_io(void)
                osiris_nand_sets[0].nr_partitions = ARRAY_SIZE(osiris_default_nand_part_large);
        } else {
                /* write-protect line to the NAND */
-               s3c2410_gpio_setpin(S3C2410_GPA(0), 1);
+               gpio_request_one(S3C2410_GPA(0), GPIOF_OUT_INIT_HIGH, NULL);
+               gpio_free(S3C2410_GPA(0));
        }
 
        /* fix bus configuration (nBE settings wrong on ABLE pre v2.20) */
index 2704bcd..d35b94e 100644 (file)
@@ -21,9 +21,6 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/time.h>
 
-#define IO_BASE                 0xe0000000
-#define IO_SIZE                 0x08000000
-#define IO_START                0x40000000
 #define ROMCARD_SIZE            0x08000000
 #define ROMCARD_START           0x10000000
 
@@ -104,20 +101,6 @@ arch_initcall(shark_init);
 
 extern void shark_init_irq(void);
 
-static struct map_desc shark_io_desc[] __initdata = {
-       {
-               .virtual        = IO_BASE,
-               .pfn            = __phys_to_pfn(IO_START),
-               .length         = IO_SIZE,
-               .type           = MT_DEVICE
-       }
-};
-
-static void __init shark_map_io(void)
-{
-       iotable_init(shark_io_desc, ARRAY_SIZE(shark_io_desc));
-}
-
 #define IRQ_TIMER 0
 #define HZ_TIME ((1193180 + HZ/2) / HZ)
 
@@ -158,7 +141,6 @@ static void shark_init_early(void)
 MACHINE_START(SHARK, "Shark")
        /* Maintainer: Alexander Schulz */
        .atag_offset    = 0x3000,
-       .map_io         = shark_map_io,
        .init_early     = shark_init_early,
        .init_irq       = shark_init_irq,
        .timer          = &shark_timer,
index 20eb2bf..d129119 100644 (file)
 */
 
                .macro  addruart, rp, rv, tmp
-               mov     \rp, #0xe0000000
-               orr     \rp, \rp, #0x000003f8
-               mov     \rv, \rp
+               mov     \rp, #0x3f8
+               orr     \rv, \rp, #0xfe000000
+               orr     \rv, \rv, #0x00e00000
+               orr     \rp, \rp, #0x40000000
                .endm
 
                .macro  senduart,rd,rx
index 5901b09..c9e49f0 100644 (file)
@@ -8,7 +8,8 @@
  * warranty of any kind, whether express or implied.
  */
                .macro  get_irqnr_preamble, base, tmp
-               mov     \base, #0xe0000000
+               mov     \base, #0xfe000000
+               orr     \base, \base, #0x00e00000
                .endm
 
                .macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
diff --git a/arch/arm/mach-shark/include/mach/io.h b/arch/arm/mach-shark/include/mach/io.h
deleted file mode 100644 (file)
index 1a45fc0..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * arch/arm/mach-shark/include/mach/io.h
- *
- * by Alexander Schulz
- *
- * derived from:
- * arch/arm/mach-ebsa110/include/mach/io.h
- * Copyright (C) 1997,1998 Russell King
- */
-
-#ifndef __ASM_ARM_ARCH_IO_H
-#define __ASM_ARM_ARCH_IO_H
-
-#define IO_SPACE_LIMIT 0xffffffff
-
-#define __io(a)                 ((void __iomem *)(0xe0000000 + (a)))
-
-#endif
index 9089407..b8b4ab3 100644 (file)
@@ -8,12 +8,15 @@
 #include <linux/kernel.h>
 #include <linux/pci.h>
 #include <linux/init.h>
+#include <linux/io.h>
 #include <video/vga.h>
 
 #include <asm/irq.h>
 #include <asm/mach/pci.h>
 #include <asm/mach-types.h>
 
+#define IO_START       0x40000000
+
 static int __init shark_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 {
        if (dev->bus->number == 0)
@@ -44,6 +47,8 @@ static int __init shark_pci_init(void)
        pcibios_min_mem = 0x50000000;
        vga_base = 0xe8000000;
 
+       pci_ioremap_io(0, IO_START);
+
        pci_common_init(&shark_pci);
 
        return 0;
index 498efd9..5e41019 100644 (file)
@@ -7,3 +7,7 @@ __ZRELADDR      := $(shell /bin/bash -c 'printf "0x%08x" \
 #
 #params_phys-y (Instead: Pass atags pointer in r2)
 #initrd_phys-y (Instead: Use compiled-in initramfs)
+
+dtb-$(CONFIG_MACH_KZM9G) += sh73a0-kzm9g.dtb
+dtb-$(CONFIG_MACH_KZM9D) += emev2-kzm9d.dtb
+dtb-$(CONFIG_MACH_ARMADILLO800EVA) += r8a7740-armadillo800eva.dtb
index d82c010..cfc3b5c 100644 (file)
@@ -40,7 +40,6 @@
 #include <linux/mmc/sh_mobile_sdhi.h>
 #include <linux/mfd/tmio.h>
 #include <linux/sh_clk.h>
-#include <linux/videodev2.h>
 #include <video/sh_mobile_lcdc.h>
 #include <video/sh_mipi_dsi.h>
 #include <sound/sh_fsi.h>
index 15ffb4c..b573de0 100644 (file)
@@ -522,13 +522,14 @@ static struct platform_device hdmi_lcdc_device = {
 };
 
 /* GPIO KEY */
-#define GPIO_KEY(c, g, d) { .code = c, .gpio = g, .desc = d, .active_low = 1 }
+#define GPIO_KEY(c, g, d, ...) \
+       { .code = c, .gpio = g, .desc = d, .active_low = 1, __VA_ARGS__ }
 
 static struct gpio_keys_button gpio_buttons[] = {
-       GPIO_KEY(KEY_POWER,     GPIO_PORT99,    "SW1"),
-       GPIO_KEY(KEY_BACK,      GPIO_PORT100,   "SW2"),
-       GPIO_KEY(KEY_MENU,      GPIO_PORT97,    "SW3"),
-       GPIO_KEY(KEY_HOME,      GPIO_PORT98,    "SW4"),
+       GPIO_KEY(KEY_POWER,     GPIO_PORT99,    "SW3", .wakeup = 1),
+       GPIO_KEY(KEY_BACK,      GPIO_PORT100,   "SW4"),
+       GPIO_KEY(KEY_MENU,      GPIO_PORT97,    "SW5"),
+       GPIO_KEY(KEY_HOME,      GPIO_PORT98,    "SW6"),
 };
 
 static struct gpio_keys_platform_data gpio_key_info = {
@@ -903,8 +904,8 @@ static struct platform_device *eva_devices[] __initdata = {
        &camera_device,
        &ceu0_device,
        &fsi_device,
-       &fsi_hdmi_device,
        &fsi_wm8978_device,
+       &fsi_hdmi_device,
 };
 
 static void __init eva_clock_init(void)
index 53b7ea9..fd21fb6 100644 (file)
@@ -763,6 +763,13 @@ static void __init kzm_init(void)
        platform_add_devices(kzm_devices, ARRAY_SIZE(kzm_devices));
 }
 
+static void kzm9g_restart(char mode, const char *cmd)
+{
+#define RESCNT2 0xe6188020
+       /* Do soft power on reset */
+       writel((1 << 31), RESCNT2);
+}
+
 static const char *kzm9g_boards_compat_dt[] __initdata = {
        "renesas,kzm9g",
        NULL,
@@ -777,5 +784,6 @@ DT_MACHINE_START(KZM9G_DT, "kzm9g")
        .init_machine   = kzm_init,
        .init_late      = shmobile_init_late,
        .timer          = &shmobile_timer,
+       .restart        = kzm9g_restart,
        .dt_compat      = kzm9g_boards_compat_dt,
 MACHINE_END
index 7654404..164fca0 100644 (file)
@@ -697,6 +697,7 @@ static struct platform_device usbhs0_device = {
  *  - J30 "open"
  *  - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET
  *  - add .get_vbus = usbhs_get_vbus in usbhs1_private
+ *  - check usbhs0_device(pio)/usbhs1_device(irq) order in mackerel_devices.
  */
 #define IRQ8 evt2irq(0x0300)
 #define USB_PHY_MODE           (1 << 4)
@@ -1327,8 +1328,8 @@ static struct platform_device *mackerel_devices[] __initdata = {
        &nor_flash_device,
        &smc911x_device,
        &lcdc_device,
-       &usbhs1_device,
        &usbhs0_device,
+       &usbhs1_device,
        &leds_device,
        &fsi_device,
        &fsi_ak4643_device,
index 3a528cf..fcf5a47 100644 (file)
@@ -67,7 +67,7 @@ static struct smsc911x_platform_config smsc911x_platdata = {
 
 static struct platform_device eth_device = {
        .name           = "smsc911x",
-       .id             = 0,
+       .id             = -1,
        .dev  = {
                .platform_data = &smsc911x_platdata,
        },
index 339c62c..3cafb6a 100644 (file)
@@ -86,11 +86,16 @@ static struct clk div4_clks[DIV4_NR] = {
                                      0x0300, CLK_ENABLE_ON_INIT),
 };
 
-enum { MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
+enum { MSTP323, MSTP322, MSTP321, MSTP320,
+       MSTP026, MSTP025, MSTP024, MSTP023, MSTP022, MSTP021,
        MSTP016, MSTP015, MSTP014,
        MSTP_NR };
 
 static struct clk mstp_clks[MSTP_NR] = {
+       [MSTP323] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 23, 0), /* SDHI0 */
+       [MSTP322] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 22, 0), /* SDHI1 */
+       [MSTP321] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 21, 0), /* SDHI2 */
+       [MSTP320] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR3, 20, 0), /* SDHI3 */
        [MSTP026] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 26, 0), /* SCIF0 */
        [MSTP025] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 25, 0), /* SCIF1 */
        [MSTP024] = SH_CLK_MSTP32(&div4_clks[DIV4_P], MSTPCR0, 24, 0), /* SCIF2 */
@@ -149,6 +154,10 @@ static struct clk_lookup lookups[] = {
        CLKDEV_DEV_ID("sh-sci.3", &mstp_clks[MSTP023]), /* SCIF3 */
        CLKDEV_DEV_ID("sh-sci.4", &mstp_clks[MSTP022]), /* SCIF4 */
        CLKDEV_DEV_ID("sh-sci.5", &mstp_clks[MSTP021]), /* SCIF6 */
+       CLKDEV_DEV_ID("sh_mobile_sdhi.0", &mstp_clks[MSTP323]), /* SDHI0 */
+       CLKDEV_DEV_ID("sh_mobile_sdhi.1", &mstp_clks[MSTP322]), /* SDHI1 */
+       CLKDEV_DEV_ID("sh_mobile_sdhi.2", &mstp_clks[MSTP321]), /* SDHI2 */
+       CLKDEV_DEV_ID("sh_mobile_sdhi.3", &mstp_clks[MSTP320]), /* SDHI3 */
 };
 
 void __init r8a7779_clock_init(void)
index ee44740..588555a 100644 (file)
@@ -259,9 +259,9 @@ static int sh73a0_set_wake(struct irq_data *data, unsigned int on)
        return 0; /* always allow wakeup */
 }
 
-#define RELOC_BASE 0x1000
+#define RELOC_BASE 0x1200
 
-/* INTCA IRQ pins at INTCS + 0x1000 to make space for GIC+INTC handling */
+/* INTCA IRQ pins at INTCS + RELOC_BASE to make space for GIC+INTC handling */
 #define INTCS_VECT_RELOC(n, vect) INTCS_VECT((n), (vect) + RELOC_BASE)
 
 INTC_IRQ_PINS_32(intca_irq_pins, 0xe6900000,
index dae9aa6..61446f3 100644 (file)
@@ -356,6 +356,26 @@ static struct platform_device gio4_device = {
        },
 };
 
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start  = 152,
+               .end    = 152,
+               .flags  = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start  = 153,
+               .end    = 153,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name           = "arm-pmu",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(pmu_resources),
+       .resource       = pmu_resources,
+};
+
 static struct platform_device *emev2_early_devices[] __initdata = {
        &uart0_device,
        &uart1_device,
@@ -370,6 +390,7 @@ static struct platform_device *emev2_late_devices[] __initdata = {
        &gio2_device,
        &gio3_device,
        &gio4_device,
+       &pmu_device,
 };
 
 void __init emev2_add_standard_devices(void)
index d230af6..38ed2dd 100644 (file)
@@ -734,6 +734,26 @@ static struct platform_device mpdma0_device = {
        },
 };
 
+static struct resource pmu_resources[] = {
+       [0] = {
+               .start  = gic_spi(55),
+               .end    = gic_spi(55),
+               .flags  = IORESOURCE_IRQ,
+       },
+       [1] = {
+               .start  = gic_spi(56),
+               .end    = gic_spi(56),
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+static struct platform_device pmu_device = {
+       .name           = "arm-pmu",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(pmu_resources),
+       .resource       = pmu_resources,
+};
+
 static struct platform_device *sh73a0_early_devices[] __initdata = {
        &scif0_device,
        &scif1_device,
@@ -757,6 +777,7 @@ static struct platform_device *sh73a0_late_devices[] __initdata = {
        &i2c4_device,
        &dma0_device,
        &mpdma0_device,
+       &pmu_device,
 };
 
 #define SRCR2          0xe61580b0
index 9077aaa..5f3c03b 100644 (file)
@@ -34,7 +34,6 @@ config ARCH_TEGRA_3x_SOC
        select USB_ARCH_HAS_EHCI if USB_SUPPORT
        select USB_ULPI if USB
        select USB_ULPI_VIEWPORT if USB_SUPPORT
-       select USE_OF
        select ARM_ERRATA_743622
        select ARM_ERRATA_751472
        select ARM_ERRATA_754322
@@ -60,25 +59,6 @@ config TEGRA_AHB
 
 comment "Tegra board type"
 
-config MACH_HARMONY
-       bool "Harmony board"
-       depends on ARCH_TEGRA_2x_SOC
-       help
-         Support for nVidia Harmony development platform
-
-config MACH_PAZ00
-       bool "Paz00 board"
-       depends on ARCH_TEGRA_2x_SOC
-       help
-         Support for the Toshiba AC100/Dynabook AZ netbook
-
-config MACH_TRIMSLICE
-       bool "TrimSlice board"
-       depends on ARCH_TEGRA_2x_SOC
-       select TEGRA_PCI
-       help
-         Support for CompuLab TrimSlice platform
-
 choice
         prompt "Default low-level debug console UART"
         default TEGRA_DEBUG_UART_NONE
@@ -130,13 +110,6 @@ config TEGRA_DEBUG_UART_AUTO_SCRATCH
 
 endchoice
 
-config TEGRA_SYSTEM_DMA
-       bool "Enable system DMA driver for NVIDIA Tegra SoCs"
-       default y
-       help
-         Adds system DMA functionality for NVIDIA Tegra SoCs, used by
-         several Tegra device drivers
-
 config TEGRA_EMC_SCALING_ENABLE
        bool "Enable scaling the memory frequency"
 
index c3d7303..04eb74e 100644 (file)
@@ -12,13 +12,16 @@ obj-y                                       += powergate.o
 obj-y                                  += apbio.o
 obj-$(CONFIG_CPU_IDLE)                 += cpuidle.o
 obj-$(CONFIG_CPU_IDLE)                 += sleep.o
-obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += tegra2_clocks.o
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += tegra20_clocks.o
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)         += tegra20_clocks_data.o
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += tegra2_emc.o
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += sleep-t20.o
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += tegra30_clocks.o
+obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += tegra30_clocks_data.o
+obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += sleep-t30.o
 obj-$(CONFIG_SMP)                      += platsmp.o headsmp.o
 obj-$(CONFIG_SMP)                       += reset.o
 obj-$(CONFIG_HOTPLUG_CPU)               += hotplug.o
-obj-$(CONFIG_TEGRA_SYSTEM_DMA)         += dma.o
 obj-$(CONFIG_CPU_FREQ)                  += cpu-tegra.o
 obj-$(CONFIG_TEGRA_PCI)                        += pcie.o
 obj-$(CONFIG_USB_SUPPORT)              += usb_phy.o
@@ -26,13 +29,6 @@ obj-$(CONFIG_USB_SUPPORT)            += usb_phy.o
 obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += board-dt-tegra20.o
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)                += board-dt-tegra30.o
 
-obj-$(CONFIG_MACH_HARMONY)              += board-harmony.o
-obj-$(CONFIG_MACH_HARMONY)              += board-harmony-pinmux.o
-obj-$(CONFIG_MACH_HARMONY)              += board-harmony-pcie.o
-obj-$(CONFIG_MACH_HARMONY)              += board-harmony-power.o
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += board-harmony-pcie.o
 
-obj-$(CONFIG_MACH_PAZ00)               += board-paz00.o
-obj-$(CONFIG_MACH_PAZ00)               += board-paz00-pinmux.o
-
-obj-$(CONFIG_MACH_TRIMSLICE)            += board-trimslice.o
-obj-$(CONFIG_MACH_TRIMSLICE)            += board-trimslice-pinmux.o
+obj-$(CONFIG_ARCH_TEGRA_2x_SOC)                += board-paz00.o
index dc0fe38..b5015d0 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "apbio.h"
 
-#if defined(CONFIG_TEGRA_SYSTEM_DMA) || defined(CONFIG_TEGRA20_APB_DMA)
+#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;
@@ -37,121 +37,6 @@ 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);
 
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-static struct tegra_dma_channel *tegra_apb_dma;
-
-bool tegra_apb_init(void)
-{
-       struct tegra_dma_channel *ch;
-
-       mutex_lock(&tegra_apb_dma_lock);
-
-       /* Check to see if we raced to setup */
-       if (tegra_apb_dma)
-               goto out;
-
-       ch = tegra_dma_allocate_channel(TEGRA_DMA_MODE_ONESHOT |
-               TEGRA_DMA_SHARED);
-
-       if (!ch)
-               goto out_fail;
-
-       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__);
-               tegra_dma_free_channel(ch);
-               goto out_fail;
-       }
-
-       tegra_apb_dma = ch;
-out:
-       mutex_unlock(&tegra_apb_dma_lock);
-       return true;
-
-out_fail:
-       mutex_unlock(&tegra_apb_dma_lock);
-       return false;
-}
-
-static void apb_dma_complete(struct tegra_dma_req *req)
-{
-       complete(&tegra_apb_wait);
-}
-
-static u32 tegra_apb_readl_using_dma(unsigned long offset)
-{
-       struct tegra_dma_req req;
-       int ret;
-
-       if (!tegra_apb_dma && !tegra_apb_init())
-               return tegra_apb_readl_direct(offset);
-
-       mutex_lock(&tegra_apb_dma_lock);
-       req.complete = apb_dma_complete;
-       req.to_memory = 1;
-       req.dest_addr = tegra_apb_bb_phys;
-       req.dest_bus_width = 32;
-       req.dest_wrap = 1;
-       req.source_addr = offset;
-       req.source_bus_width = 32;
-       req.source_wrap = 4;
-       req.req_sel = TEGRA_DMA_REQ_SEL_CNTR;
-       req.size = 4;
-
-       INIT_COMPLETION(tegra_apb_wait);
-
-       tegra_dma_enqueue_req(tegra_apb_dma, &req);
-
-       ret = wait_for_completion_timeout(&tegra_apb_wait,
-               msecs_to_jiffies(50));
-
-       if (WARN(ret == 0, "apb read dma timed out")) {
-               tegra_dma_dequeue_req(tegra_apb_dma, &req);
-               *(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)
-{
-       struct tegra_dma_req req;
-       int ret;
-
-       if (!tegra_apb_dma && !tegra_apb_init()) {
-               tegra_apb_writel_direct(value, offset);
-               return;
-       }
-
-       mutex_lock(&tegra_apb_dma_lock);
-       *((u32 *)tegra_apb_bb) = value;
-       req.complete = apb_dma_complete;
-       req.to_memory = 0;
-       req.dest_addr = offset;
-       req.dest_wrap = 4;
-       req.dest_bus_width = 32;
-       req.source_addr = tegra_apb_bb_phys;
-       req.source_bus_width = 32;
-       req.source_wrap = 1;
-       req.req_sel = TEGRA_DMA_REQ_SEL_CNTR;
-       req.size = 4;
-
-       INIT_COMPLETION(tegra_apb_wait);
-
-       tegra_dma_enqueue_req(tegra_apb_dma, &req);
-
-       ret = wait_for_completion_timeout(&tegra_apb_wait,
-               msecs_to_jiffies(50));
-
-       if (WARN(ret == 0, "apb write dma timed out"))
-               tegra_dma_dequeue_req(tegra_apb_dma, &req);
-
-       mutex_unlock(&tegra_apb_dma_lock);
-}
-
-#else
 static struct dma_chan *tegra_apb_dma_chan;
 static struct dma_slave_config dma_sconfig;
 
@@ -279,7 +164,6 @@ static void tegra_apb_writel_using_dma(u32 value, unsigned long offset)
                pr_err("error in writing offset 0x%08lx using dma\n", offset);
        mutex_unlock(&tegra_apb_dma_lock);
 }
-#endif
 #else
 #define tegra_apb_readl_using_dma tegra_apb_readl_direct
 #define tegra_apb_writel_using_dma tegra_apb_writel_direct
@@ -293,12 +177,12 @@ static apbio_write_fptr apbio_write;
 
 static u32 tegra_apb_readl_direct(unsigned long offset)
 {
-       return readl(IO_TO_VIRT(offset));
+       return readl(IO_ADDRESS(offset));
 }
 
 static void tegra_apb_writel_direct(u32 value, unsigned long offset)
 {
-       writel(value, IO_TO_VIRT(offset));
+       writel(value, IO_ADDRESS(offset));
 }
 
 void tegra_apb_io_init(void)
index c099963..5957ffb 100644 (file)
@@ -42,7 +42,6 @@
 #include <mach/irqs.h>
 
 #include "board.h"
-#include "board-harmony.h"
 #include "clock.h"
 #include "devices.h"
 
@@ -71,6 +70,7 @@ struct of_dev_auxdata tegra20_auxdata_lookup[] __initdata = {
 
 static __initdata struct tegra_clk_init_table tegra_dt_clk_init_table[] = {
        /* name         parent          rate            enabled */
+       { "uarta",      "pll_p",        216000000,      true },
        { "uartd",      "pll_p",        216000000,      true },
        { "usbd",       "clk_m",        12000000,       false },
        { "usb2",       "clk_m",        12000000,       false },
@@ -95,54 +95,40 @@ static void __init tegra_dt_init(void)
                                tegra20_auxdata_lookup, NULL);
 }
 
-#ifdef CONFIG_MACH_TRIMSLICE
 static void __init trimslice_init(void)
 {
+#ifdef CONFIG_TEGRA_PCI
        int ret;
 
        ret = tegra_pcie_init(true, true);
        if (ret)
                pr_err("tegra_pci_init() failed: %d\n", ret);
-}
 #endif
+}
 
-#ifdef CONFIG_MACH_HARMONY
 static void __init harmony_init(void)
 {
+#ifdef CONFIG_TEGRA_PCI
        int ret;
 
-       ret = harmony_regulator_init();
-       if (ret) {
-               pr_err("harmony_regulator_init() failed: %d\n", ret);
-               return;
-       }
-
        ret = harmony_pcie_init();
        if (ret)
                pr_err("harmony_pcie_init() failed: %d\n", ret);
-}
 #endif
+}
 
-#ifdef CONFIG_MACH_PAZ00
 static void __init paz00_init(void)
 {
        tegra_paz00_wifikill_init();
 }
-#endif
 
 static struct {
        char *machine;
        void (*init)(void);
 } board_init_funcs[] = {
-#ifdef CONFIG_MACH_TRIMSLICE
        { "compulab,trimslice", trimslice_init },
-#endif
-#ifdef CONFIG_MACH_HARMONY
        { "nvidia,harmony", harmony_init },
-#endif
-#ifdef CONFIG_MACH_PAZ00
        { "compal,paz00", paz00_init },
-#endif
 };
 
 static void __init tegra_dt_init_late(void)
index e8c3fda..3cdc1bb 100644 (file)
 #include <linux/kernel.h>
 #include <linux/gpio.h>
 #include <linux/err.h>
+#include <linux/of_gpio.h>
 #include <linux/regulator/consumer.h>
 
 #include <asm/mach-types.h>
 
 #include "board.h"
-#include "board-harmony.h"
 
 #ifdef CONFIG_TEGRA_PCI
 
 int __init harmony_pcie_init(void)
 {
+       struct device_node *np;
+       int en_vdd_1v05;
        struct regulator *regulator = NULL;
        int err;
 
-       err = gpio_request(TEGRA_GPIO_EN_VDD_1V05_GPIO, "EN_VDD_1V05");
-       if (err)
+       np = of_find_node_by_path("/regulators/regulator@3");
+       if (!np) {
+               pr_err("%s: of_find_node_by_path failed\n", __func__);
+               return -ENODEV;
+       }
+
+       en_vdd_1v05 = of_get_named_gpio(np, "gpio", 0);
+       if (en_vdd_1v05 < 0) {
+               pr_err("%s: of_get_named_gpio failed: %d\n", __func__,
+                      en_vdd_1v05);
+               return en_vdd_1v05;
+       }
+
+       err = gpio_request(en_vdd_1v05, "EN_VDD_1V05");
+       if (err) {
+               pr_err("%s: gpio_request failed: %d\n", __func__, err);
                return err;
+       }
 
-       gpio_direction_output(TEGRA_GPIO_EN_VDD_1V05_GPIO, 1);
+       gpio_direction_output(en_vdd_1v05, 1);
 
-       regulator = regulator_get(NULL, "pex_clk");
-       if (IS_ERR_OR_NULL(regulator))
+       regulator = regulator_get(NULL, "vdd_ldo0,vddio_pex_clk");
+       if (IS_ERR_OR_NULL(regulator)) {
+               pr_err("%s: regulator_get failed: %d\n", __func__,
+                      (int)PTR_ERR(regulator));
                goto err_reg;
+       }
 
        regulator_enable(regulator);
 
        err = tegra_pcie_init(true, true);
-       if (err)
+       if (err) {
+               pr_err("%s: tegra_pcie_init failed: %d\n", __func__, err);
                goto err_pcie;
+       }
 
        return 0;
 
@@ -54,20 +76,9 @@ err_pcie:
        regulator_disable(regulator);
        regulator_put(regulator);
 err_reg:
-       gpio_free(TEGRA_GPIO_EN_VDD_1V05_GPIO);
+       gpio_free(en_vdd_1v05);
 
        return err;
 }
 
-static int __init harmony_pcie_initcall(void)
-{
-       if (!machine_is_harmony())
-               return 0;
-
-       return harmony_pcie_init();
-}
-
-/* PCI should be initialized after I2C, mfd and regulators */
-subsys_initcall_sync(harmony_pcie_initcall);
-
 #endif
diff --git a/arch/arm/mach-tegra/board-harmony-pinmux.c b/arch/arm/mach-tegra/board-harmony-pinmux.c
deleted file mode 100644 (file)
index 83d420f..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * arch/arm/mach-tegra/board-harmony-pinmux.c
- *
- * Copyright (C) 2010 Google, Inc.
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * 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 "board-harmony.h"
-#include "board-pinmux.h"
-
-static struct pinctrl_map harmony_map[] = {
-       TEGRA_MAP_MUXCONF("ata",   "ide",           none, driven),
-       TEGRA_MAP_MUXCONF("atb",   "sdio4",         none, driven),
-       TEGRA_MAP_MUXCONF("atc",   "nand",          none, driven),
-       TEGRA_MAP_MUXCONF("atd",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("ate",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("cdev1", "plla_out",      none, driven),
-       TEGRA_MAP_MUXCONF("cdev2", "pllp_out4",     down, tristate),
-       TEGRA_MAP_MUXCONF("crtp",  "crt",           none, tristate),
-       TEGRA_MAP_MUXCONF("csus",  "vi_sensor_clk", down, tristate),
-       TEGRA_MAP_MUXCONF("dap1",  "dap1",          none, driven),
-       TEGRA_MAP_MUXCONF("dap2",  "dap2",          none, tristate),
-       TEGRA_MAP_MUXCONF("dap3",  "dap3",          none, tristate),
-       TEGRA_MAP_MUXCONF("dap4",  "dap4",          none, tristate),
-       TEGRA_MAP_MUXCONF("ddc",   "i2c2",          up,   driven),
-       TEGRA_MAP_MUXCONF("dta",   "sdio2",         up,   driven),
-       TEGRA_MAP_MUXCONF("dtb",   "rsvd1",         none, driven),
-       TEGRA_MAP_MUXCONF("dtc",   "rsvd1",         none, tristate),
-       TEGRA_MAP_MUXCONF("dtd",   "sdio2",         up,   driven),
-       TEGRA_MAP_MUXCONF("dte",   "rsvd1",         none, tristate),
-       TEGRA_MAP_MUXCONF("dtf",   "i2c3",          none, tristate),
-       TEGRA_MAP_MUXCONF("gma",   "sdio4",         none, driven),
-       TEGRA_MAP_MUXCONF("gmb",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("gmc",   "uartd",         none, driven),
-       TEGRA_MAP_MUXCONF("gmd",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("gme",   "sdio4",         none, driven),
-       TEGRA_MAP_MUXCONF("gpu",   "gmi",           none, tristate),
-       TEGRA_MAP_MUXCONF("gpu7",  "rtck",          none, driven),
-       TEGRA_MAP_MUXCONF("gpv",   "pcie",          none, driven),
-       TEGRA_MAP_MUXCONF("hdint", "hdmi",          na,   tristate),
-       TEGRA_MAP_MUXCONF("i2cp",  "i2cp",          none, driven),
-       TEGRA_MAP_MUXCONF("irrx",  "uarta",         up,   tristate),
-       TEGRA_MAP_MUXCONF("irtx",  "uarta",         up,   tristate),
-       TEGRA_MAP_MUXCONF("kbca",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("kbcb",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("kbcc",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("kbcd",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("kbce",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("kbcf",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("lcsn",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("ld0",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld1",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld10",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld11",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld12",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld13",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld14",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld15",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld16",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld17",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld2",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld3",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld4",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld5",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld6",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld7",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld8",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld9",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ldc",   "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("ldi",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lhp0",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lhp1",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lhp2",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lhs",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lm0",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lm1",   "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lpp",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lpw0",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lpw1",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lpw2",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lsc0",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lsc1",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsck",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsda",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsdi",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lspi",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lvp0",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lvp1",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lvs",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("owc",   "rsvd2",         na,   tristate),
-       TEGRA_MAP_MUXCONF("pmc",   "pwr_on",        na,   driven),
-       TEGRA_MAP_MUXCONF("pta",   "hdmi",          none, driven),
-       TEGRA_MAP_MUXCONF("rm",    "i2c1",          none, driven),
-       TEGRA_MAP_MUXCONF("sdb",   "pwm",           na,   tristate),
-       TEGRA_MAP_MUXCONF("sdc",   "pwm",           up,   driven),
-       TEGRA_MAP_MUXCONF("sdd",   "pwm",           up,   tristate),
-       TEGRA_MAP_MUXCONF("sdio1", "sdio1",         none, tristate),
-       TEGRA_MAP_MUXCONF("slxa",  "pcie",          none, driven),
-       TEGRA_MAP_MUXCONF("slxc",  "spdif",         none, tristate),
-       TEGRA_MAP_MUXCONF("slxd",  "spdif",         none, tristate),
-       TEGRA_MAP_MUXCONF("slxk",  "pcie",          none, driven),
-       TEGRA_MAP_MUXCONF("spdi",  "rsvd2",         none, tristate),
-       TEGRA_MAP_MUXCONF("spdo",  "rsvd2",         none, tristate),
-       TEGRA_MAP_MUXCONF("spia",  "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("spib",  "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("spic",  "gmi",           up,   tristate),
-       TEGRA_MAP_MUXCONF("spid",  "spi1",          down, tristate),
-       TEGRA_MAP_MUXCONF("spie",  "spi1",          up,   tristate),
-       TEGRA_MAP_MUXCONF("spif",  "spi1",          down, tristate),
-       TEGRA_MAP_MUXCONF("spig",  "spi2_alt",      none, tristate),
-       TEGRA_MAP_MUXCONF("spih",  "spi2_alt",      up,   tristate),
-       TEGRA_MAP_MUXCONF("uaa",   "ulpi",          up,   tristate),
-       TEGRA_MAP_MUXCONF("uab",   "ulpi",          up,   tristate),
-       TEGRA_MAP_MUXCONF("uac",   "rsvd2",         none, tristate),
-       TEGRA_MAP_MUXCONF("uad",   "irda",          up,   tristate),
-       TEGRA_MAP_MUXCONF("uca",   "uartc",         up,   tristate),
-       TEGRA_MAP_MUXCONF("ucb",   "uartc",         up,   tristate),
-       TEGRA_MAP_MUXCONF("uda",   "ulpi",          none, tristate),
-       TEGRA_MAP_CONF("ck32",    none, na),
-       TEGRA_MAP_CONF("ddrc",    none, na),
-       TEGRA_MAP_CONF("pmca",    none, na),
-       TEGRA_MAP_CONF("pmcb",    none, na),
-       TEGRA_MAP_CONF("pmcc",    none, na),
-       TEGRA_MAP_CONF("pmcd",    none, na),
-       TEGRA_MAP_CONF("pmce",    none, na),
-       TEGRA_MAP_CONF("xm2c",    none, na),
-       TEGRA_MAP_CONF("xm2d",    none, na),
-       TEGRA_MAP_CONF("ls",      up,   na),
-       TEGRA_MAP_CONF("lc",      up,   na),
-       TEGRA_MAP_CONF("ld17_0",  down, na),
-       TEGRA_MAP_CONF("ld19_18", down, na),
-       TEGRA_MAP_CONF("ld21_20", down, na),
-       TEGRA_MAP_CONF("ld23_22", down, na),
-};
-
-static struct tegra_board_pinmux_conf conf = {
-       .maps = harmony_map,
-       .map_count = ARRAY_SIZE(harmony_map),
-};
-
-void harmony_pinmux_init(void)
-{
-       tegra_board_pinmux_init(&conf, NULL);
-}
diff --git a/arch/arm/mach-tegra/board-harmony-power.c b/arch/arm/mach-tegra/board-harmony-power.c
deleted file mode 100644 (file)
index b7344be..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2010 NVIDIA, 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.
- *
- * 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/i2c.h>
-#include <linux/platform_device.h>
-#include <linux/gpio.h>
-#include <linux/regulator/machine.h>
-#include <linux/regulator/fixed.h>
-#include <linux/mfd/tps6586x.h>
-#include <linux/of.h>
-#include <linux/of_i2c.h>
-
-#include <asm/mach-types.h>
-
-#include <mach/irqs.h>
-
-#include "board-harmony.h"
-
-static struct regulator_consumer_supply tps658621_ldo0_supply[] = {
-       REGULATOR_SUPPLY("pex_clk", NULL),
-};
-
-static struct regulator_init_data ldo0_data = {
-       .supply_regulator = "vdd_sm2",
-       .constraints = {
-               .name = "vdd_ldo0",
-               .min_uV = 3300 * 1000,
-               .max_uV = 3300 * 1000,
-               .valid_modes_mask = (REGULATOR_MODE_NORMAL |
-                                    REGULATOR_MODE_STANDBY),
-               .valid_ops_mask = (REGULATOR_CHANGE_MODE |
-                                  REGULATOR_CHANGE_STATUS |
-                                  REGULATOR_CHANGE_VOLTAGE),
-               .apply_uV = 1,
-       },
-       .num_consumer_supplies = ARRAY_SIZE(tps658621_ldo0_supply),
-       .consumer_supplies = tps658621_ldo0_supply,
-};
-
-#define HARMONY_REGULATOR_INIT(_id, _name, _supply, _minmv, _maxmv, _on)\
-       static struct regulator_init_data _id##_data = {                \
-               .supply_regulator = _supply,                            \
-               .constraints = {                                        \
-                       .name = _name,                                  \
-                       .min_uV = (_minmv)*1000,                        \
-                       .max_uV = (_maxmv)*1000,                        \
-                       .valid_modes_mask = (REGULATOR_MODE_NORMAL |    \
-                                            REGULATOR_MODE_STANDBY),   \
-                       .valid_ops_mask = (REGULATOR_CHANGE_MODE |      \
-                                          REGULATOR_CHANGE_STATUS |    \
-                                          REGULATOR_CHANGE_VOLTAGE),   \
-                       .always_on = _on,                               \
-               },                                                      \
-       }
-
-HARMONY_REGULATOR_INIT(sm0,  "vdd_sm0",  "vdd_sys", 725, 1500, 1);
-HARMONY_REGULATOR_INIT(sm1,  "vdd_sm1",  "vdd_sys", 725, 1500, 1);
-HARMONY_REGULATOR_INIT(sm2,  "vdd_sm2",  "vdd_sys", 3000, 4550, 1);
-HARMONY_REGULATOR_INIT(ldo1, "vdd_ldo1", "vdd_sm2", 725, 1500, 1);
-HARMONY_REGULATOR_INIT(ldo2, "vdd_ldo2", "vdd_sm2", 725, 1500, 0);
-HARMONY_REGULATOR_INIT(ldo3, "vdd_ldo3", "vdd_sm2", 1250, 3300, 1);
-HARMONY_REGULATOR_INIT(ldo4, "vdd_ldo4", "vdd_sm2", 1700, 2475, 1);
-HARMONY_REGULATOR_INIT(ldo5, "vdd_ldo5", NULL,     1250, 3300, 1);
-HARMONY_REGULATOR_INIT(ldo6, "vdd_ldo6", "vdd_sm2", 1250, 3300, 0);
-HARMONY_REGULATOR_INIT(ldo7, "vdd_ldo7", "vdd_sm2", 1250, 3300, 0);
-HARMONY_REGULATOR_INIT(ldo8, "vdd_ldo8", "vdd_sm2", 1250, 3300, 0);
-HARMONY_REGULATOR_INIT(ldo9, "vdd_ldo9", "vdd_sm2", 1250, 3300, 1);
-
-#define TPS_REG(_id, _data)                    \
-       {                                       \
-               .id = TPS6586X_ID_##_id,        \
-               .name = "tps6586x-regulator",   \
-               .platform_data = _data,         \
-       }
-
-static struct tps6586x_subdev_info tps_devs[] = {
-       TPS_REG(SM_0, &sm0_data),
-       TPS_REG(SM_1, &sm1_data),
-       TPS_REG(SM_2, &sm2_data),
-       TPS_REG(LDO_0, &ldo0_data),
-       TPS_REG(LDO_1, &ldo1_data),
-       TPS_REG(LDO_2, &ldo2_data),
-       TPS_REG(LDO_3, &ldo3_data),
-       TPS_REG(LDO_4, &ldo4_data),
-       TPS_REG(LDO_5, &ldo5_data),
-       TPS_REG(LDO_6, &ldo6_data),
-       TPS_REG(LDO_7, &ldo7_data),
-       TPS_REG(LDO_8, &ldo8_data),
-       TPS_REG(LDO_9, &ldo9_data),
-};
-
-static struct tps6586x_platform_data tps_platform = {
-       .irq_base       = TEGRA_NR_IRQS,
-       .num_subdevs    = ARRAY_SIZE(tps_devs),
-       .subdevs        = tps_devs,
-       .gpio_base      = HARMONY_GPIO_TPS6586X(0),
-};
-
-static struct i2c_board_info __initdata harmony_regulators[] = {
-       {
-               I2C_BOARD_INFO("tps6586x", 0x34),
-               .irq            = INT_EXTERNAL_PMU,
-               .platform_data  = &tps_platform,
-       },
-};
-
-int __init harmony_regulator_init(void)
-{
-       regulator_register_always_on(0, "vdd_sys",
-               NULL, 0, 5000000);
-
-       if (machine_is_harmony()) {
-               i2c_register_board_info(3, harmony_regulators, 1);
-       } else { /* Harmony, booted using device tree */
-               struct device_node *np;
-               struct i2c_adapter *adapter;
-
-               np = of_find_node_by_path("/i2c@7000d000");
-               if (np == NULL) {
-                       pr_err("Could not find device_node for DVC I2C\n");
-                       return -ENODEV;
-               }
-
-               adapter = of_find_i2c_adapter_by_node(np);
-               if (!adapter) {
-                       pr_err("Could not find i2c_adapter for DVC I2C\n");
-                       return -ENODEV;
-               }
-
-               i2c_new_device(adapter, harmony_regulators);
-       }
-
-       return 0;
-}
diff --git a/arch/arm/mach-tegra/board-harmony.c b/arch/arm/mach-tegra/board-harmony.c
deleted file mode 100644 (file)
index e65e837..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * arch/arm/mach-tegra/board-harmony.c
- *
- * Copyright (C) 2010 Google, Inc.
- * Copyright (C) 2011 NVIDIA, 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/init.h>
-#include <linux/platform_device.h>
-#include <linux/serial_8250.h>
-#include <linux/of_serial.h>
-#include <linux/clk.h>
-#include <linux/dma-mapping.h>
-#include <linux/pda_power.h>
-#include <linux/io.h>
-#include <linux/gpio.h>
-#include <linux/i2c.h>
-
-#include <sound/wm8903.h>
-
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-#include <asm/hardware/gic.h>
-#include <asm/setup.h>
-
-#include <mach/tegra_wm8903_pdata.h>
-#include <mach/iomap.h>
-#include <mach/irqs.h>
-#include <mach/sdhci.h>
-
-#include "board.h"
-#include "board-harmony.h"
-#include "clock.h"
-#include "devices.h"
-#include "gpio-names.h"
-
-static struct plat_serial8250_port debug_uart_platform_data[] = {
-       {
-               .membase        = IO_ADDRESS(TEGRA_UARTD_BASE),
-               .mapbase        = TEGRA_UARTD_BASE,
-               .irq            = INT_UARTD,
-               .flags          = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE,
-               .type           = PORT_TEGRA,
-               .handle_break   = tegra_serial_handle_break,
-               .iotype         = UPIO_MEM,
-               .regshift       = 2,
-               .uartclk        = 216000000,
-       }, {
-               .flags          = 0
-       }
-};
-
-static struct platform_device debug_uart = {
-       .name = "serial8250",
-       .id = PLAT8250_DEV_PLATFORM,
-       .dev = {
-               .platform_data = debug_uart_platform_data,
-       },
-};
-
-static struct tegra_wm8903_platform_data harmony_audio_pdata = {
-       .gpio_spkr_en           = TEGRA_GPIO_SPKR_EN,
-       .gpio_hp_det            = TEGRA_GPIO_HP_DET,
-       .gpio_hp_mute           = -1,
-       .gpio_int_mic_en        = TEGRA_GPIO_INT_MIC_EN,
-       .gpio_ext_mic_en        = TEGRA_GPIO_EXT_MIC_EN,
-};
-
-static struct platform_device harmony_audio_device = {
-       .name   = "tegra-snd-wm8903",
-       .id     = 0,
-       .dev    = {
-               .platform_data  = &harmony_audio_pdata,
-       },
-};
-
-static struct wm8903_platform_data harmony_wm8903_pdata = {
-       .irq_active_low = 0,
-       .micdet_cfg = 0,
-       .micdet_delay = 100,
-       .gpio_base = HARMONY_GPIO_WM8903(0),
-       .gpio_cfg = {
-               0,
-               0,
-               WM8903_GPIO_CONFIG_ZERO,
-               0,
-               0,
-       },
-};
-
-static struct i2c_board_info __initdata wm8903_board_info = {
-       I2C_BOARD_INFO("wm8903", 0x1a),
-       .platform_data = &harmony_wm8903_pdata,
-};
-
-static void __init harmony_i2c_init(void)
-{
-       platform_device_register(&tegra_i2c_device1);
-       platform_device_register(&tegra_i2c_device2);
-       platform_device_register(&tegra_i2c_device3);
-       platform_device_register(&tegra_i2c_device4);
-
-       wm8903_board_info.irq = gpio_to_irq(TEGRA_GPIO_CDC_IRQ);
-       i2c_register_board_info(0, &wm8903_board_info, 1);
-}
-
-static struct platform_device *harmony_devices[] __initdata = {
-       &debug_uart,
-       &tegra_sdhci_device1,
-       &tegra_sdhci_device2,
-       &tegra_sdhci_device4,
-       &tegra_ehci3_device,
-       &tegra_i2s_device1,
-       &tegra_das_device,
-       &harmony_audio_device,
-};
-
-static void __init tegra_harmony_fixup(struct tag *tags, char **cmdline,
-       struct meminfo *mi)
-{
-       mi->nr_banks = 2;
-       mi->bank[0].start = PHYS_OFFSET;
-       mi->bank[0].size = 448 * SZ_1M;
-       mi->bank[1].start = SZ_512M;
-       mi->bank[1].size = SZ_512M;
-}
-
-static __initdata struct tegra_clk_init_table harmony_clk_init_table[] = {
-       /* name         parent          rate            enabled */
-       { "uartd",      "pll_p",        216000000,      true },
-       { "pll_a",      "pll_p_out1",   56448000,       true },
-       { "pll_a_out0", "pll_a",        11289600,       true },
-       { "cdev1",      NULL,           0,              true },
-       { "i2s1",       "pll_a_out0",   11289600,       false},
-       { "usb3",       "clk_m",        12000000,       true },
-       { NULL,         NULL,           0,              0},
-};
-
-
-static struct tegra_sdhci_platform_data sdhci_pdata1 = {
-       .cd_gpio        = -1,
-       .wp_gpio        = -1,
-       .power_gpio     = -1,
-};
-
-static struct tegra_sdhci_platform_data sdhci_pdata2 = {
-       .cd_gpio        = TEGRA_GPIO_SD2_CD,
-       .wp_gpio        = TEGRA_GPIO_SD2_WP,
-       .power_gpio     = TEGRA_GPIO_SD2_POWER,
-};
-
-static struct tegra_sdhci_platform_data sdhci_pdata4 = {
-       .cd_gpio        = TEGRA_GPIO_SD4_CD,
-       .wp_gpio        = TEGRA_GPIO_SD4_WP,
-       .power_gpio     = TEGRA_GPIO_SD4_POWER,
-       .is_8bit        = 1,
-};
-
-static void __init tegra_harmony_init(void)
-{
-       tegra_clk_init_from_table(harmony_clk_init_table);
-
-       harmony_pinmux_init();
-
-       tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1;
-       tegra_sdhci_device2.dev.platform_data = &sdhci_pdata2;
-       tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4;
-
-       platform_add_devices(harmony_devices, ARRAY_SIZE(harmony_devices));
-       harmony_i2c_init();
-       harmony_regulator_init();
-}
-
-MACHINE_START(HARMONY, "harmony")
-       .atag_offset    = 0x100,
-       .fixup          = tegra_harmony_fixup,
-       .map_io         = tegra_map_common_io,
-       .init_early     = tegra20_init_early,
-       .init_irq       = tegra_init_irq,
-       .handle_irq     = gic_handle_irq,
-       .timer          = &tegra_timer,
-       .init_machine   = tegra_harmony_init,
-       .init_late      = tegra_init_late,
-       .restart        = tegra_assert_system_reset,
-MACHINE_END
diff --git a/arch/arm/mach-tegra/board-harmony.h b/arch/arm/mach-tegra/board-harmony.h
deleted file mode 100644 (file)
index 139d96c..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * arch/arm/mach-tegra/board-harmony.h
- *
- * 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_BOARD_HARMONY_H
-#define _MACH_TEGRA_BOARD_HARMONY_H
-
-#include <mach/gpio-tegra.h>
-
-#define HARMONY_GPIO_TPS6586X(_x_)     (TEGRA_NR_GPIOS + (_x_))
-#define HARMONY_GPIO_WM8903(_x_)       (HARMONY_GPIO_TPS6586X(4) + (_x_))
-
-#define TEGRA_GPIO_SD2_CD              TEGRA_GPIO_PI5
-#define TEGRA_GPIO_SD2_WP              TEGRA_GPIO_PH1
-#define TEGRA_GPIO_SD2_POWER           TEGRA_GPIO_PT3
-#define TEGRA_GPIO_SD4_CD              TEGRA_GPIO_PH2
-#define TEGRA_GPIO_SD4_WP              TEGRA_GPIO_PH3
-#define TEGRA_GPIO_SD4_POWER           TEGRA_GPIO_PI6
-#define TEGRA_GPIO_CDC_IRQ             TEGRA_GPIO_PX3
-#define TEGRA_GPIO_SPKR_EN             HARMONY_GPIO_WM8903(2)
-#define TEGRA_GPIO_HP_DET              TEGRA_GPIO_PW2
-#define TEGRA_GPIO_INT_MIC_EN          TEGRA_GPIO_PX0
-#define TEGRA_GPIO_EXT_MIC_EN          TEGRA_GPIO_PX1
-#define TEGRA_GPIO_EN_VDD_1V05_GPIO    HARMONY_GPIO_TPS6586X(2)
-
-void harmony_pinmux_init(void);
-int harmony_regulator_init(void);
-
-#endif
diff --git a/arch/arm/mach-tegra/board-paz00-pinmux.c b/arch/arm/mach-tegra/board-paz00-pinmux.c
deleted file mode 100644 (file)
index 6f1111b..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * arch/arm/mach-tegra/board-paz00-pinmux.c
- *
- * Copyright (C) 2010 Marc Dietrich <marvin24@gmx.de>
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * 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 "board-paz00.h"
-#include "board-pinmux.h"
-
-static struct pinctrl_map paz00_map[] = {
-       TEGRA_MAP_MUXCONF("ata",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("atb",   "sdio4",         none, driven),
-       TEGRA_MAP_MUXCONF("atc",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("atd",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("ate",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("cdev1", "plla_out",      none, driven),
-       TEGRA_MAP_MUXCONF("cdev2", "pllp_out4",     down, driven),
-       TEGRA_MAP_MUXCONF("crtp",  "crt",           none, tristate),
-       TEGRA_MAP_MUXCONF("csus",  "pllc_out1",     down, tristate),
-       TEGRA_MAP_MUXCONF("dap1",  "dap1",          none, driven),
-       TEGRA_MAP_MUXCONF("dap2",  "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("dap3",  "dap3",          none, tristate),
-       TEGRA_MAP_MUXCONF("dap4",  "dap4",          none, tristate),
-       TEGRA_MAP_MUXCONF("ddc",   "i2c2",          up,   driven),
-       TEGRA_MAP_MUXCONF("dta",   "rsvd1",         up,   tristate),
-       TEGRA_MAP_MUXCONF("dtb",   "rsvd1",         none, tristate),
-       TEGRA_MAP_MUXCONF("dtc",   "rsvd1",         none, tristate),
-       TEGRA_MAP_MUXCONF("dtd",   "rsvd1",         up,   tristate),
-       TEGRA_MAP_MUXCONF("dte",   "rsvd1",         none, tristate),
-       TEGRA_MAP_MUXCONF("dtf",   "i2c3",          none, driven),
-       TEGRA_MAP_MUXCONF("gma",   "sdio4",         none, driven),
-       TEGRA_MAP_MUXCONF("gmb",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("gmc",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("gmd",   "gmi",           none, driven),
-       TEGRA_MAP_MUXCONF("gme",   "sdio4",         none, driven),
-       TEGRA_MAP_MUXCONF("gpu",   "pwm",           none, driven),
-       TEGRA_MAP_MUXCONF("gpu7",  "rtck",          none, driven),
-       TEGRA_MAP_MUXCONF("gpv",   "pcie",          none, driven),
-       TEGRA_MAP_MUXCONF("hdint", "hdmi",          na,   driven),
-       TEGRA_MAP_MUXCONF("i2cp",  "i2cp",          none, driven),
-       TEGRA_MAP_MUXCONF("irrx",  "uarta",         up,   driven),
-       TEGRA_MAP_MUXCONF("irtx",  "uarta",         up,   driven),
-       TEGRA_MAP_MUXCONF("kbca",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("kbcb",  "sdio2",         up,   driven),
-       TEGRA_MAP_MUXCONF("kbcc",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("kbcd",  "sdio2",         up,   driven),
-       TEGRA_MAP_MUXCONF("kbce",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("kbcf",  "kbc",           up,   driven),
-       TEGRA_MAP_MUXCONF("lcsn",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("ld0",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld1",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld10",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld11",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld12",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld13",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld14",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld15",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld16",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld17",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld2",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld3",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld4",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld5",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld6",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld7",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld8",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld9",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ldc",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ldi",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lhp0",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lhp1",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lhp2",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lhs",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lm0",   "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lm1",   "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lpp",   "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lpw0",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lpw1",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lpw2",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsc0",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lsc1",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsck",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsda",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsdi",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lspi",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lvp0",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lvp1",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lvs",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("owc",   "owr",           up,   tristate),
-       TEGRA_MAP_MUXCONF("pmc",   "pwr_on",        na,   driven),
-       TEGRA_MAP_MUXCONF("pta",   "hdmi",          none, driven),
-       TEGRA_MAP_MUXCONF("rm",    "i2c1",          none, driven),
-       TEGRA_MAP_MUXCONF("sdb",   "pwm",           na,   tristate),
-       TEGRA_MAP_MUXCONF("sdc",   "twc",           up,   tristate),
-       TEGRA_MAP_MUXCONF("sdd",   "pwm",           up,   tristate),
-       TEGRA_MAP_MUXCONF("sdio1", "sdio1",         none, driven),
-       TEGRA_MAP_MUXCONF("slxa",  "pcie",          none, tristate),
-       TEGRA_MAP_MUXCONF("slxc",  "spi4",          none, tristate),
-       TEGRA_MAP_MUXCONF("slxd",  "spi4",          none, tristate),
-       TEGRA_MAP_MUXCONF("slxk",  "pcie",          none, driven),
-       TEGRA_MAP_MUXCONF("spdi",  "rsvd2",         none, tristate),
-       TEGRA_MAP_MUXCONF("spdo",  "rsvd2",         none, driven),
-       TEGRA_MAP_MUXCONF("spia",  "gmi",           down, tristate),
-       TEGRA_MAP_MUXCONF("spib",  "gmi",           down, tristate),
-       TEGRA_MAP_MUXCONF("spic",  "gmi",           up,   driven),
-       TEGRA_MAP_MUXCONF("spid",  "gmi",           down, tristate),
-       TEGRA_MAP_MUXCONF("spie",  "gmi",           up,   tristate),
-       TEGRA_MAP_MUXCONF("spif",  "rsvd4",         down, tristate),
-       TEGRA_MAP_MUXCONF("spig",  "spi2_alt",      up,   driven),
-       TEGRA_MAP_MUXCONF("spih",  "spi2_alt",      up,   tristate),
-       TEGRA_MAP_MUXCONF("uaa",   "ulpi",          up,   driven),
-       TEGRA_MAP_MUXCONF("uab",   "ulpi",          up,   driven),
-       TEGRA_MAP_MUXCONF("uac",   "rsvd4",         none, driven),
-       TEGRA_MAP_MUXCONF("uad",   "spdif",         up,   tristate),
-       TEGRA_MAP_MUXCONF("uca",   "uartc",         up,   tristate),
-       TEGRA_MAP_MUXCONF("ucb",   "uartc",         up,   tristate),
-       TEGRA_MAP_MUXCONF("uda",   "ulpi",          none, driven),
-       TEGRA_MAP_CONF("ck32",    none, na),
-       TEGRA_MAP_CONF("ddrc",    none, na),
-       TEGRA_MAP_CONF("pmca",    none, na),
-       TEGRA_MAP_CONF("pmcb",    none, na),
-       TEGRA_MAP_CONF("pmcc",    none, na),
-       TEGRA_MAP_CONF("pmcd",    none, na),
-       TEGRA_MAP_CONF("pmce",    none, na),
-       TEGRA_MAP_CONF("xm2c",    none, na),
-       TEGRA_MAP_CONF("xm2d",    none, na),
-       TEGRA_MAP_CONF("ls",      up,   na),
-       TEGRA_MAP_CONF("lc",      up,   na),
-       TEGRA_MAP_CONF("ld17_0",  down, na),
-       TEGRA_MAP_CONF("ld19_18", down, na),
-       TEGRA_MAP_CONF("ld21_20", down, na),
-       TEGRA_MAP_CONF("ld23_22", down, na),
-};
-
-static struct tegra_board_pinmux_conf conf = {
-       .maps = paz00_map,
-       .map_count = ARRAY_SIZE(paz00_map),
-};
-
-void paz00_pinmux_init(void)
-{
-       tegra_board_pinmux_init(&conf, NULL);
-}
index 4b64af5..5930551 100644 (file)
  *
  */
 
-#include <linux/kernel.h>
-#include <linux/init.h>
 #include <linux/platform_device.h>
-#include <linux/serial_8250.h>
-#include <linux/of_serial.h>
-#include <linux/clk.h>
-#include <linux/dma-mapping.h>
-#include <linux/gpio_keys.h>
-#include <linux/pda_power.h>
-#include <linux/io.h>
-#include <linux/input.h>
-#include <linux/i2c.h>
-#include <linux/gpio.h>
 #include <linux/rfkill-gpio.h>
 
-#include <asm/hardware/gic.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/mach/time.h>
-#include <asm/setup.h>
-
-#include <mach/iomap.h>
-#include <mach/irqs.h>
-#include <mach/sdhci.h>
-
-#include "board.h"
 #include "board-paz00.h"
-#include "clock.h"
-#include "devices.h"
-#include "gpio-names.h"
-
-static struct plat_serial8250_port debug_uart_platform_data[] = {
-       {
-               /* serial port on JP1 */
-               .membase        = IO_ADDRESS(TEGRA_UARTA_BASE),
-               .mapbase        = TEGRA_UARTA_BASE,
-               .irq            = INT_UARTA,
-               .flags          = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE,
-               .type           = PORT_TEGRA,
-               .handle_break   = tegra_serial_handle_break,
-               .iotype         = UPIO_MEM,
-               .regshift       = 2,
-               .uartclk        = 216000000,
-       }, {
-               /* serial port on mini-pcie */
-               .membase        = IO_ADDRESS(TEGRA_UARTC_BASE),
-               .mapbase        = TEGRA_UARTC_BASE,
-               .irq            = INT_UARTC,
-               .flags          = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE,
-               .type           = PORT_TEGRA,
-               .handle_break   = tegra_serial_handle_break,
-               .iotype         = UPIO_MEM,
-               .regshift       = 2,
-               .uartclk        = 216000000,
-       }, {
-               .flags          = 0
-       }
-};
-
-static struct platform_device debug_uart = {
-       .name = "serial8250",
-       .id = PLAT8250_DEV_PLATFORM,
-       .dev = {
-               .platform_data = debug_uart_platform_data,
-       },
-};
 
 static struct rfkill_gpio_platform_data wifi_rfkill_platform_data = {
        .name           = "wifi_rfkill",
@@ -99,137 +37,7 @@ static struct platform_device wifi_rfkill_device = {
        },
 };
 
-static struct gpio_led gpio_leds[] = {
-       {
-               .name                   = "wifi-led",
-               .default_trigger        = "rfkill0",
-               .gpio                   = TEGRA_WIFI_LED,
-       },
-};
-
-static struct gpio_led_platform_data gpio_led_info = {
-       .leds           = gpio_leds,
-       .num_leds       = ARRAY_SIZE(gpio_leds),
-};
-
-static struct platform_device leds_gpio = {
-       .name   = "leds-gpio",
-       .id     = -1,
-       .dev    = {
-               .platform_data = &gpio_led_info,
-        },
-};
-
-static struct gpio_keys_button paz00_gpio_keys_buttons[] = {
-       {
-               .code           = KEY_POWER,
-               .gpio           = TEGRA_GPIO_POWERKEY,
-               .active_low     = 1,
-               .desc           = "Power",
-               .type           = EV_KEY,
-               .wakeup         = 1,
-       },
-};
-
-static struct gpio_keys_platform_data paz00_gpio_keys = {
-       .buttons        = paz00_gpio_keys_buttons,
-       .nbuttons       = ARRAY_SIZE(paz00_gpio_keys_buttons),
-};
-
-static struct platform_device gpio_keys_device = {
-       .name   = "gpio-keys",
-       .id     = -1,
-       .dev    = {
-               .platform_data = &paz00_gpio_keys,
-       },
-};
-
-static struct platform_device *paz00_devices[] __initdata = {
-       &debug_uart,
-       &tegra_sdhci_device4,
-       &tegra_sdhci_device1,
-       &leds_gpio,
-       &gpio_keys_device,
-};
-
-static void paz00_i2c_init(void)
-{
-       platform_device_register(&tegra_i2c_device1);
-       platform_device_register(&tegra_i2c_device2);
-       platform_device_register(&tegra_i2c_device4);
-}
-
-static void paz00_usb_init(void)
-{
-       tegra_ehci2_ulpi_phy_config.reset_gpio = TEGRA_ULPI_RST;
-
-       platform_device_register(&tegra_ehci2_device);
-       platform_device_register(&tegra_ehci3_device);
-}
-
-static void __init tegra_paz00_fixup(struct tag *tags, char **cmdline,
-       struct meminfo *mi)
-{
-       mi->nr_banks = 1;
-       mi->bank[0].start = PHYS_OFFSET;
-       mi->bank[0].size = 448 * SZ_1M;
-}
-
-static __initdata struct tegra_clk_init_table paz00_clk_init_table[] = {
-       /* name         parent          rate            enabled */
-       { "uarta",      "pll_p",        216000000,      true },
-       { "uartc",      "pll_p",        216000000,      true },
-
-       { "usbd",       "clk_m",        12000000,       false },
-       { "usb2",       "clk_m",        12000000,       false },
-       { "usb3",       "clk_m",        12000000,       false },
-
-       { NULL,         NULL,           0,              0},
-};
-
-static struct tegra_sdhci_platform_data sdhci_pdata1 = {
-       .cd_gpio        = TEGRA_GPIO_SD1_CD,
-       .wp_gpio        = TEGRA_GPIO_SD1_WP,
-       .power_gpio     = TEGRA_GPIO_SD1_POWER,
-};
-
-static struct tegra_sdhci_platform_data sdhci_pdata4 = {
-       .cd_gpio        = -1,
-       .wp_gpio        = -1,
-       .power_gpio     = -1,
-       .is_8bit        = 1,
-};
-
 void __init tegra_paz00_wifikill_init(void)
 {
        platform_device_register(&wifi_rfkill_device);
 }
-
-static void __init tegra_paz00_init(void)
-{
-       tegra_clk_init_from_table(paz00_clk_init_table);
-
-       paz00_pinmux_init();
-
-       tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1;
-       tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4;
-
-       platform_add_devices(paz00_devices, ARRAY_SIZE(paz00_devices));
-       tegra_paz00_wifikill_init();
-
-       paz00_i2c_init();
-       paz00_usb_init();
-}
-
-MACHINE_START(PAZ00, "Toshiba AC100 / Dynabook AZ")
-       .atag_offset    = 0x100,
-       .fixup          = tegra_paz00_fixup,
-       .map_io         = tegra_map_common_io,
-       .init_early     = tegra20_init_early,
-       .init_irq       = tegra_init_irq,
-       .handle_irq     = gic_handle_irq,
-       .timer          = &tegra_timer,
-       .init_machine   = tegra_paz00_init,
-       .init_late      = tegra_init_late,
-       .restart        = tegra_assert_system_reset,
-MACHINE_END
index 3c9f8da..25c08ec 100644 (file)
 #ifndef _MACH_TEGRA_BOARD_PAZ00_H
 #define _MACH_TEGRA_BOARD_PAZ00_H
 
-#include <mach/gpio-tegra.h>
+#include "gpio-names.h"
 
-/* SDCARD */
-#define TEGRA_GPIO_SD1_CD              TEGRA_GPIO_PV5
-#define TEGRA_GPIO_SD1_WP              TEGRA_GPIO_PH1
-#define TEGRA_GPIO_SD1_POWER           TEGRA_GPIO_PV1
-
-/* ULPI */
-#define TEGRA_ULPI_RST                 TEGRA_GPIO_PV0
-
-/* WIFI */
 #define TEGRA_WIFI_PWRN                        TEGRA_GPIO_PK5
 #define TEGRA_WIFI_RST                 TEGRA_GPIO_PD1
-#define TEGRA_WIFI_LED                 TEGRA_GPIO_PD0
-
-/* WakeUp */
-#define TEGRA_GPIO_POWERKEY    TEGRA_GPIO_PJ7
-
-void paz00_pinmux_init(void);
 
 #endif
diff --git a/arch/arm/mach-tegra/board-trimslice-pinmux.c b/arch/arm/mach-tegra/board-trimslice-pinmux.c
deleted file mode 100644 (file)
index 7b39511..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * arch/arm/mach-tegra/board-trimslice-pinmux.c
- *
- * Copyright (C) 2011 CompuLab, Ltd.
- * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
- *
- * 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 "board-trimslice.h"
-#include "board-pinmux.h"
-
-static struct pinctrl_map trimslice_map[] = {
-       TEGRA_MAP_MUXCONF("ata",   "ide",           none, tristate),
-       TEGRA_MAP_MUXCONF("atb",   "sdio4",         none, driven),
-       TEGRA_MAP_MUXCONF("atc",   "nand",          none, tristate),
-       TEGRA_MAP_MUXCONF("atd",   "gmi",           none, tristate),
-       TEGRA_MAP_MUXCONF("ate",   "gmi",           none, tristate),
-       TEGRA_MAP_MUXCONF("cdev1", "plla_out",      none, driven),
-       TEGRA_MAP_MUXCONF("cdev2", "pllp_out4",     down, tristate),
-       TEGRA_MAP_MUXCONF("crtp",  "crt",           none, tristate),
-       TEGRA_MAP_MUXCONF("csus",  "vi_sensor_clk", down, tristate),
-       TEGRA_MAP_MUXCONF("dap1",  "dap1",          none, driven),
-       TEGRA_MAP_MUXCONF("dap2",  "dap2",          none, tristate),
-       TEGRA_MAP_MUXCONF("dap3",  "dap3",          none, tristate),
-       TEGRA_MAP_MUXCONF("dap4",  "dap4",          none, tristate),
-       TEGRA_MAP_MUXCONF("ddc",   "i2c2",          up,   driven),
-       TEGRA_MAP_MUXCONF("dta",   "vi",            none, tristate),
-       TEGRA_MAP_MUXCONF("dtb",   "vi",            none, tristate),
-       TEGRA_MAP_MUXCONF("dtc",   "vi",            none, tristate),
-       TEGRA_MAP_MUXCONF("dtd",   "vi",            none, tristate),
-       TEGRA_MAP_MUXCONF("dte",   "vi",            none, tristate),
-       TEGRA_MAP_MUXCONF("dtf",   "i2c3",          up,   driven),
-       TEGRA_MAP_MUXCONF("gma",   "sdio4",         none, driven),
-       TEGRA_MAP_MUXCONF("gmb",   "nand",          none, tristate),
-       TEGRA_MAP_MUXCONF("gmc",   "sflash",        none, driven),
-       TEGRA_MAP_MUXCONF("gmd",   "sflash",        none, driven),
-       TEGRA_MAP_MUXCONF("gme",   "gmi",           none, tristate),
-       TEGRA_MAP_MUXCONF("gpu",   "uarta",         none, driven),
-       TEGRA_MAP_MUXCONF("gpu7",  "rtck",          none, driven),
-       TEGRA_MAP_MUXCONF("gpv",   "pcie",          none, driven),
-       TEGRA_MAP_MUXCONF("hdint", "hdmi",          na,   tristate),
-       TEGRA_MAP_MUXCONF("i2cp",  "i2cp",          none, tristate),
-       TEGRA_MAP_MUXCONF("irrx",  "uartb",         up,   tristate),
-       TEGRA_MAP_MUXCONF("irtx",  "uartb",         up,   tristate),
-       TEGRA_MAP_MUXCONF("kbca",  "kbc",           up,   tristate),
-       TEGRA_MAP_MUXCONF("kbcb",  "kbc",           up,   tristate),
-       TEGRA_MAP_MUXCONF("kbcc",  "kbc",           up,   tristate),
-       TEGRA_MAP_MUXCONF("kbcd",  "kbc",           up,   tristate),
-       TEGRA_MAP_MUXCONF("kbce",  "kbc",           up,   tristate),
-       TEGRA_MAP_MUXCONF("kbcf",  "kbc",           up,   tristate),
-       TEGRA_MAP_MUXCONF("lcsn",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("ld0",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld1",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld10",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld11",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld12",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld13",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld14",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld15",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld16",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld17",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld2",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld3",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld4",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld5",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld6",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld7",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld8",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ld9",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("ldc",   "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("ldi",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lhp0",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lhp1",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lhp2",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lhs",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lm0",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lm1",   "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lpp",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lpw0",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lpw1",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lpw2",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lsc0",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lsc1",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsck",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsda",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lsdi",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lspi",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lvp0",  "displaya",      na,   tristate),
-       TEGRA_MAP_MUXCONF("lvp1",  "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("lvs",   "displaya",      na,   driven),
-       TEGRA_MAP_MUXCONF("owc",   "rsvd2",         up,   tristate),
-       TEGRA_MAP_MUXCONF("pmc",   "pwr_on",        na,   tristate),
-       TEGRA_MAP_MUXCONF("pta",   "gmi",           none, tristate),
-       TEGRA_MAP_MUXCONF("rm",    "i2c1",          up,   driven),
-       TEGRA_MAP_MUXCONF("sdb",   "pwm",           na,   driven),
-       TEGRA_MAP_MUXCONF("sdc",   "pwm",           up,   driven),
-       TEGRA_MAP_MUXCONF("sdd",   "pwm",           up,   driven),
-       TEGRA_MAP_MUXCONF("sdio1", "sdio1",         none, driven),
-       TEGRA_MAP_MUXCONF("slxa",  "pcie",          none, driven),
-       TEGRA_MAP_MUXCONF("slxc",  "sdio3",         none, tristate),
-       TEGRA_MAP_MUXCONF("slxd",  "sdio3",         none, tristate),
-       TEGRA_MAP_MUXCONF("slxk",  "pcie",          none, driven),
-       TEGRA_MAP_MUXCONF("spdi",  "spdif",         none, tristate),
-       TEGRA_MAP_MUXCONF("spdo",  "spdif",         none, tristate),
-       TEGRA_MAP_MUXCONF("spia",  "spi2",          down, tristate),
-       TEGRA_MAP_MUXCONF("spib",  "spi2",          down, tristate),
-       TEGRA_MAP_MUXCONF("spic",  "spi2",          up,   tristate),
-       TEGRA_MAP_MUXCONF("spid",  "spi1",          down, tristate),
-       TEGRA_MAP_MUXCONF("spie",  "spi1",          up,   tristate),
-       TEGRA_MAP_MUXCONF("spif",  "spi1",          down, tristate),
-       TEGRA_MAP_MUXCONF("spig",  "spi2_alt",      up,   tristate),
-       TEGRA_MAP_MUXCONF("spih",  "spi2_alt",      up,   tristate),
-       TEGRA_MAP_MUXCONF("uaa",   "ulpi",          up,   tristate),
-       TEGRA_MAP_MUXCONF("uab",   "ulpi",          up,   tristate),
-       TEGRA_MAP_MUXCONF("uac",   "rsvd2",         none, driven),
-       TEGRA_MAP_MUXCONF("uad",   "irda",          up,   tristate),
-       TEGRA_MAP_MUXCONF("uca",   "uartc",         up,   tristate),
-       TEGRA_MAP_MUXCONF("ucb",   "uartc",         up,   tristate),
-       TEGRA_MAP_MUXCONF("uda",   "ulpi",          none, tristate),
-       TEGRA_MAP_CONF("ck32",    none, na),
-       TEGRA_MAP_CONF("ddrc",    none, na),
-       TEGRA_MAP_CONF("pmca",    none, na),
-       TEGRA_MAP_CONF("pmcb",    none, na),
-       TEGRA_MAP_CONF("pmcc",    none, na),
-       TEGRA_MAP_CONF("pmcd",    none, na),
-       TEGRA_MAP_CONF("pmce",    none, na),
-       TEGRA_MAP_CONF("xm2c",    none, na),
-       TEGRA_MAP_CONF("xm2d",    none, na),
-       TEGRA_MAP_CONF("ls",      up,   na),
-       TEGRA_MAP_CONF("lc",      up,   na),
-       TEGRA_MAP_CONF("ld17_0",  down, na),
-       TEGRA_MAP_CONF("ld19_18", down, na),
-       TEGRA_MAP_CONF("ld21_20", down, na),
-       TEGRA_MAP_CONF("ld23_22", down, na),
-};
-
-static struct tegra_board_pinmux_conf conf = {
-       .maps = trimslice_map,
-       .map_count = ARRAY_SIZE(trimslice_map),
-};
-
-void trimslice_pinmux_init(void)
-{
-       tegra_board_pinmux_init(&conf, NULL);
-}
diff --git a/arch/arm/mach-tegra/board-trimslice.c b/arch/arm/mach-tegra/board-trimslice.c
deleted file mode 100644 (file)
index 776aa95..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * arch/arm/mach-tegra/board-trimslice.c
- *
- * Copyright (C) 2011 CompuLab, Ltd.
- * Author: Mike Rapoport <mike@compulab.co.il>
- *
- * Based on board-harmony.c
- * 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/init.h>
-#include <linux/platform_device.h>
-#include <linux/serial_8250.h>
-#include <linux/of_serial.h>
-#include <linux/io.h>
-#include <linux/i2c.h>
-#include <linux/gpio.h>
-#include <linux/platform_data/tegra_usb.h>
-
-#include <asm/hardware/gic.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/setup.h>
-
-#include <mach/iomap.h>
-#include <mach/sdhci.h>
-
-#include "board.h"
-#include "clock.h"
-#include "devices.h"
-#include "gpio-names.h"
-
-#include "board-trimslice.h"
-
-static struct plat_serial8250_port debug_uart_platform_data[] = {
-       {
-               .membase        = IO_ADDRESS(TEGRA_UARTA_BASE),
-               .mapbase        = TEGRA_UARTA_BASE,
-               .irq            = INT_UARTA,
-               .flags          = UPF_BOOT_AUTOCONF | UPF_FIXED_TYPE,
-               .type           = PORT_TEGRA,
-               .handle_break   = tegra_serial_handle_break,
-               .iotype         = UPIO_MEM,
-               .regshift       = 2,
-               .uartclk        = 216000000,
-       }, {
-               .flags          = 0
-       }
-};
-
-static struct platform_device debug_uart = {
-       .name   = "serial8250",
-       .id     = PLAT8250_DEV_PLATFORM,
-       .dev    = {
-               .platform_data  = debug_uart_platform_data,
-       },
-};
-static struct tegra_sdhci_platform_data sdhci_pdata1 = {
-       .cd_gpio        = -1,
-       .wp_gpio        = -1,
-       .power_gpio     = -1,
-};
-
-static struct tegra_sdhci_platform_data sdhci_pdata4 = {
-       .cd_gpio        = TRIMSLICE_GPIO_SD4_CD,
-       .wp_gpio        = TRIMSLICE_GPIO_SD4_WP,
-       .power_gpio     = -1,
-};
-
-static struct platform_device trimslice_audio_device = {
-       .name   = "tegra-snd-trimslice",
-       .id     = 0,
-};
-
-static struct platform_device *trimslice_devices[] __initdata = {
-       &debug_uart,
-       &tegra_sdhci_device1,
-       &tegra_sdhci_device4,
-       &tegra_i2s_device1,
-       &tegra_das_device,
-       &trimslice_audio_device,
-};
-
-static struct i2c_board_info trimslice_i2c3_board_info[] = {
-       {
-               I2C_BOARD_INFO("tlv320aic23", 0x1a),
-       },
-       {
-               I2C_BOARD_INFO("em3027", 0x56),
-       },
-};
-
-static void trimslice_i2c_init(void)
-{
-       platform_device_register(&tegra_i2c_device1);
-       platform_device_register(&tegra_i2c_device2);
-       platform_device_register(&tegra_i2c_device3);
-
-       i2c_register_board_info(2, trimslice_i2c3_board_info,
-                               ARRAY_SIZE(trimslice_i2c3_board_info));
-}
-
-static void trimslice_usb_init(void)
-{
-       struct tegra_ehci_platform_data *pdata;
-
-       pdata = tegra_ehci1_device.dev.platform_data;
-       pdata->vbus_gpio = TRIMSLICE_GPIO_USB1_MODE;
-
-       tegra_ehci2_ulpi_phy_config.reset_gpio = TEGRA_GPIO_PV0;
-
-       platform_device_register(&tegra_ehci3_device);
-       platform_device_register(&tegra_ehci2_device);
-       platform_device_register(&tegra_ehci1_device);
-}
-
-static void __init tegra_trimslice_fixup(struct tag *tags, char **cmdline,
-       struct meminfo *mi)
-{
-       mi->nr_banks = 2;
-       mi->bank[0].start = PHYS_OFFSET;
-       mi->bank[0].size = 448 * SZ_1M;
-       mi->bank[1].start = SZ_512M;
-       mi->bank[1].size = SZ_512M;
-}
-
-static __initdata struct tegra_clk_init_table trimslice_clk_init_table[] = {
-       /* name         parent          rate            enabled */
-       { "uarta",      "pll_p",        216000000,      true },
-       { "pll_a",      "pll_p_out1",   56448000,       true },
-       { "pll_a_out0", "pll_a",        11289600,       true },
-       { "cdev1",      NULL,           0,              true },
-       { "i2s1",       "pll_a_out0",   11289600,       false},
-       { NULL,         NULL,           0,              0},
-};
-
-static int __init tegra_trimslice_pci_init(void)
-{
-       if (!machine_is_trimslice())
-               return 0;
-
-       return tegra_pcie_init(true, true);
-}
-subsys_initcall(tegra_trimslice_pci_init);
-
-static void __init tegra_trimslice_init(void)
-{
-       tegra_clk_init_from_table(trimslice_clk_init_table);
-
-       trimslice_pinmux_init();
-
-       tegra_sdhci_device1.dev.platform_data = &sdhci_pdata1;
-       tegra_sdhci_device4.dev.platform_data = &sdhci_pdata4;
-
-       platform_add_devices(trimslice_devices, ARRAY_SIZE(trimslice_devices));
-
-       trimslice_i2c_init();
-       trimslice_usb_init();
-}
-
-MACHINE_START(TRIMSLICE, "trimslice")
-       .atag_offset    = 0x100,
-       .fixup          = tegra_trimslice_fixup,
-       .map_io         = tegra_map_common_io,
-       .init_early     = tegra20_init_early,
-       .init_irq       = tegra_init_irq,
-       .handle_irq     = gic_handle_irq,
-       .timer          = &tegra_timer,
-       .init_machine   = tegra_trimslice_init,
-       .init_late      = tegra_init_late,
-       .restart        = tegra_assert_system_reset,
-MACHINE_END
diff --git a/arch/arm/mach-tegra/board-trimslice.h b/arch/arm/mach-tegra/board-trimslice.h
deleted file mode 100644 (file)
index 50f128d..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * arch/arm/mach-tegra/board-trimslice.h
- *
- * Copyright (C) 2011 CompuLab, Ltd.
- *
- * 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_BOARD_TRIMSLICE_H
-#define _MACH_TEGRA_BOARD_TRIMSLICE_H
-
-#include <mach/gpio-tegra.h>
-
-#define TRIMSLICE_GPIO_SD4_CD  TEGRA_GPIO_PP1  /* mmc4 cd */
-#define TRIMSLICE_GPIO_SD4_WP  TEGRA_GPIO_PP2  /* mmc4 wp */
-
-#define TRIMSLICE_GPIO_USB1_MODE       TEGRA_GPIO_PV2 /* USB1 mode */
-#define TRIMSLICE_GPIO_USB2_RST                TEGRA_GPIO_PV0 /* USB2 PHY reset */
-
-void trimslice_pinmux_init(void);
-
-#endif
index 58f981c..fd82085 100644 (file)
@@ -1,6 +1,7 @@
 /*
  *
  * Copyright (C) 2010 Google, Inc.
+ * Copyright (c) 2012 NVIDIA CORPORATION.  All rights reserved.
  *
  * Author:
  *     Colin Cross <ccross@google.com>
@@ -19,8 +20,6 @@
 #include <linux/kernel.h>
 #include <linux/clk.h>
 #include <linux/clkdev.h>
-#include <linux/debugfs.h>
-#include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/list.h>
 #include <linux/module.h>
 
 #include "board.h"
 #include "clock.h"
+#include "tegra_cpu_car.h"
+
+/* Global data of Tegra CPU CAR ops */
+struct tegra_cpu_car_ops *tegra_cpu_car_ops;
 
 /*
  * Locking:
  *
- * Each struct clk has a spinlock.
- *
- * To avoid AB-BA locking problems, locks must always be traversed from child
- * clock to parent clock.  For example, when enabling a clock, the clock's lock
- * is taken, and then clk_enable is called on the parent, which take's the
- * parent clock's lock.  There is one exceptions to this ordering: When dumping
- * the clock tree through debugfs.  In this case, clk_lock_all is called,
- * which attemps to iterate through the entire list of clocks and take every
- * clock lock.  If any call to spin_trylock fails, all locked clocks are
- * unlocked, and the process is retried.  When all the locks are held,
- * the only clock operation that can be called is clk_get_rate_all_locked.
- *
- * Within a single clock, no clock operation can call another clock operation
- * on itself, except for clk_get_rate_locked and clk_set_rate_locked.  Any
- * clock operation can call any other clock operation on any of it's possible
- * parents.
- *
  * An additional mutex, clock_list_lock, is used to protect the list of all
  * clocks.
  *
- * The clock operations must lock internally to protect against
- * read-modify-write on registers that are shared by multiple clocks
  */
 static DEFINE_MUTEX(clock_list_lock);
 static LIST_HEAD(clocks);
 
-struct clk *tegra_get_clock_by_name(const char *name)
-{
-       struct clk *c;
-       struct clk *ret = NULL;
-       mutex_lock(&clock_list_lock);
-       list_for_each_entry(c, &clocks, node) {
-               if (strcmp(c->name, name) == 0) {
-                       ret = c;
-                       break;
-               }
-       }
-       mutex_unlock(&clock_list_lock);
-       return ret;
-}
-
-/* Must be called with c->spinlock held */
-static unsigned long clk_predict_rate_from_parent(struct clk *c, struct clk *p)
-{
-       u64 rate;
-
-       rate = clk_get_rate(p);
-
-       if (c->mul != 0 && c->div != 0) {
-               rate *= c->mul;
-               rate += c->div - 1; /* round up */
-               do_div(rate, c->div);
-       }
-
-       return rate;
-}
-
-/* Must be called with c->spinlock held */
-unsigned long clk_get_rate_locked(struct clk *c)
-{
-       unsigned long rate;
-
-       if (c->parent)
-               rate = clk_predict_rate_from_parent(c, c->parent);
-       else
-               rate = c->rate;
-
-       return rate;
-}
-
-unsigned long clk_get_rate(struct clk *c)
+void tegra_clk_add(struct clk *clk)
 {
-       unsigned long flags;
-       unsigned long rate;
-
-       spin_lock_irqsave(&c->spinlock, flags);
-
-       rate = clk_get_rate_locked(c);
-
-       spin_unlock_irqrestore(&c->spinlock, flags);
-
-       return rate;
-}
-EXPORT_SYMBOL(clk_get_rate);
-
-int clk_reparent(struct clk *c, struct clk *parent)
-{
-       c->parent = parent;
-       return 0;
-}
-
-void clk_init(struct clk *c)
-{
-       spin_lock_init(&c->spinlock);
-
-       if (c->ops && c->ops->init)
-               c->ops->init(c);
-
-       if (!c->ops || !c->ops->enable) {
-               c->refcnt++;
-               c->set = true;
-               if (c->parent)
-                       c->state = c->parent->state;
-               else
-                       c->state = ON;
-       }
+       struct clk_tegra *c = to_clk_tegra(__clk_get_hw(clk));
 
        mutex_lock(&clock_list_lock);
        list_add(&c->node, &clocks);
        mutex_unlock(&clock_list_lock);
 }
 
-int clk_enable(struct clk *c)
-{
-       int ret = 0;
-       unsigned long flags;
-
-       spin_lock_irqsave(&c->spinlock, flags);
-
-       if (c->refcnt == 0) {
-               if (c->parent) {
-                       ret = clk_enable(c->parent);
-                       if (ret)
-                               goto out;
-               }
-
-               if (c->ops && c->ops->enable) {
-                       ret = c->ops->enable(c);
-                       if (ret) {
-                               if (c->parent)
-                                       clk_disable(c->parent);
-                               goto out;
-                       }
-                       c->state = ON;
-                       c->set = true;
-               }
-       }
-       c->refcnt++;
-out:
-       spin_unlock_irqrestore(&c->spinlock, flags);
-       return ret;
-}
-EXPORT_SYMBOL(clk_enable);
-
-void clk_disable(struct clk *c)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&c->spinlock, flags);
-
-       if (c->refcnt == 0) {
-               WARN(1, "Attempting to disable clock %s with refcnt 0", c->name);
-               spin_unlock_irqrestore(&c->spinlock, flags);
-               return;
-       }
-       if (c->refcnt == 1) {
-               if (c->ops && c->ops->disable)
-                       c->ops->disable(c);
-
-               if (c->parent)
-                       clk_disable(c->parent);
-
-               c->state = OFF;
-       }
-       c->refcnt--;
-
-       spin_unlock_irqrestore(&c->spinlock, flags);
-}
-EXPORT_SYMBOL(clk_disable);
-
-int clk_set_parent(struct clk *c, struct clk *parent)
-{
-       int ret;
-       unsigned long flags;
-       unsigned long new_rate;
-       unsigned long old_rate;
-
-       spin_lock_irqsave(&c->spinlock, flags);
-
-       if (!c->ops || !c->ops->set_parent) {
-               ret = -ENOSYS;
-               goto out;
-       }
-
-       new_rate = clk_predict_rate_from_parent(c, parent);
-       old_rate = clk_get_rate_locked(c);
-
-       ret = c->ops->set_parent(c, parent);
-       if (ret)
-               goto out;
-
-out:
-       spin_unlock_irqrestore(&c->spinlock, flags);
-       return ret;
-}
-EXPORT_SYMBOL(clk_set_parent);
-
-struct clk *clk_get_parent(struct clk *c)
-{
-       return c->parent;
-}
-EXPORT_SYMBOL(clk_get_parent);
-
-int clk_set_rate_locked(struct clk *c, unsigned long rate)
-{
-       long new_rate;
-
-       if (!c->ops || !c->ops->set_rate)
-               return -ENOSYS;
-
-       if (rate > c->max_rate)
-               rate = c->max_rate;
-
-       if (c->ops && c->ops->round_rate) {
-               new_rate = c->ops->round_rate(c, rate);
-
-               if (new_rate < 0)
-                       return new_rate;
-
-               rate = new_rate;
-       }
-
-       return c->ops->set_rate(c, rate);
-}
-
-int clk_set_rate(struct clk *c, unsigned long rate)
-{
-       int ret;
-       unsigned long flags;
-
-       spin_lock_irqsave(&c->spinlock, flags);
-
-       ret = clk_set_rate_locked(c, rate);
-
-       spin_unlock_irqrestore(&c->spinlock, flags);
-
-       return ret;
-}
-EXPORT_SYMBOL(clk_set_rate);
-
-
-/* Must be called with clocks lock and all indvidual clock locks held */
-unsigned long clk_get_rate_all_locked(struct clk *c)
+struct clk *tegra_get_clock_by_name(const char *name)
 {
-       u64 rate;
-       int mul = 1;
-       int div = 1;
-       struct clk *p = c;
-
-       while (p) {
-               c = p;
-               if (c->mul != 0 && c->div != 0) {
-                       mul *= c->mul;
-                       div *= c->div;
+       struct clk_tegra *c;
+       struct clk *ret = NULL;
+       mutex_lock(&clock_list_lock);
+       list_for_each_entry(c, &clocks, node) {
+               if (strcmp(__clk_get_name(c->hw.clk), name) == 0) {
+                       ret = c->hw.clk;
+                       break;
                }
-               p = c->parent;
-       }
-
-       rate = c->rate;
-       rate *= mul;
-       do_div(rate, div);
-
-       return rate;
-}
-
-long clk_round_rate(struct clk *c, unsigned long rate)
-{
-       unsigned long flags;
-       long ret;
-
-       spin_lock_irqsave(&c->spinlock, flags);
-
-       if (!c->ops || !c->ops->round_rate) {
-               ret = -ENOSYS;
-               goto out;
        }
-
-       if (rate > c->max_rate)
-               rate = c->max_rate;
-
-       ret = c->ops->round_rate(c, rate);
-
-out:
-       spin_unlock_irqrestore(&c->spinlock, flags);
+       mutex_unlock(&clock_list_lock);
        return ret;
 }
-EXPORT_SYMBOL(clk_round_rate);
 
 static int tegra_clk_init_one_from_table(struct tegra_clk_init_table *table)
 {
        struct clk *c;
        struct clk *p;
+       struct clk *parent;
 
        int ret = 0;
 
        c = tegra_get_clock_by_name(table->name);
 
        if (!c) {
-               pr_warning("Unable to initialize clock %s\n",
+               pr_warn("Unable to initialize clock %s\n",
                        table->name);
                return -ENODEV;
        }
 
+       parent = clk_get_parent(c);
+
        if (table->parent) {
                p = tegra_get_clock_by_name(table->parent);
                if (!p) {
-                       pr_warning("Unable to find parent %s of clock %s\n",
+                       pr_warn("Unable to find parent %s of clock %s\n",
                                table->parent, table->name);
                        return -ENODEV;
                }
 
-               if (c->parent != p) {
+               if (parent != p) {
                        ret = clk_set_parent(c, p);
                        if (ret) {
-                               pr_warning("Unable to set parent %s of clock %s: %d\n",
+                               pr_warn("Unable to set parent %s of clock %s: %d\n",
                                        table->parent, table->name, ret);
                                return -EINVAL;
                        }
@@ -360,16 +109,16 @@ static int tegra_clk_init_one_from_table(struct tegra_clk_init_table *table)
        if (table->rate && table->rate != clk_get_rate(c)) {
                ret = clk_set_rate(c, table->rate);
                if (ret) {
-                       pr_warning("Unable to set clock %s to rate %lu: %d\n",
+                       pr_warn("Unable to set clock %s to rate %lu: %d\n",
                                table->name, table->rate, ret);
                        return -EINVAL;
                }
        }
 
        if (table->enabled) {
-               ret = clk_enable(c);
+               ret = clk_prepare_enable(c);
                if (ret) {
-                       pr_warning("Unable to enable clock %s: %d\n",
+                       pr_warn("Unable to enable clock %s: %d\n",
                                table->name, ret);
                        return -EINVAL;
                }
@@ -383,19 +132,20 @@ void tegra_clk_init_from_table(struct tegra_clk_init_table *table)
        for (; table->name; table++)
                tegra_clk_init_one_from_table(table);
 }
-EXPORT_SYMBOL(tegra_clk_init_from_table);
 
 void tegra_periph_reset_deassert(struct clk *c)
 {
-       BUG_ON(!c->ops->reset);
-       c->ops->reset(c, false);
+       struct clk_tegra *clk = to_clk_tegra(__clk_get_hw(c));
+       BUG_ON(!clk->reset);
+       clk->reset(__clk_get_hw(c), false);
 }
 EXPORT_SYMBOL(tegra_periph_reset_deassert);
 
 void tegra_periph_reset_assert(struct clk *c)
 {
-       BUG_ON(!c->ops->reset);
-       c->ops->reset(c, true);
+       struct clk_tegra *clk = to_clk_tegra(__clk_get_hw(c));
+       BUG_ON(!clk->reset);
+       clk->reset(__clk_get_hw(c), true);
 }
 EXPORT_SYMBOL(tegra_periph_reset_assert);
 
@@ -405,268 +155,14 @@ EXPORT_SYMBOL(tegra_periph_reset_assert);
 int tegra_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting)
 {
        int ret = 0;
-       unsigned long flags;
+       struct clk_tegra *clk = to_clk_tegra(__clk_get_hw(c));
 
-       spin_lock_irqsave(&c->spinlock, flags);
-
-       if (!c->ops || !c->ops->clk_cfg_ex) {
+       if (!clk->clk_cfg_ex) {
                ret = -ENOSYS;
                goto out;
        }
-       ret = c->ops->clk_cfg_ex(c, p, setting);
+       ret = clk->clk_cfg_ex(__clk_get_hw(c), p, setting);
 
 out:
-       spin_unlock_irqrestore(&c->spinlock, flags);
-
        return ret;
 }
-
-#ifdef CONFIG_DEBUG_FS
-
-static int __clk_lock_all_spinlocks(void)
-{
-       struct clk *c;
-
-       list_for_each_entry(c, &clocks, node)
-               if (!spin_trylock(&c->spinlock))
-                       goto unlock_spinlocks;
-
-       return 0;
-
-unlock_spinlocks:
-       list_for_each_entry_continue_reverse(c, &clocks, node)
-               spin_unlock(&c->spinlock);
-
-       return -EAGAIN;
-}
-
-static void __clk_unlock_all_spinlocks(void)
-{
-       struct clk *c;
-
-       list_for_each_entry_reverse(c, &clocks, node)
-               spin_unlock(&c->spinlock);
-}
-
-/*
- * This function retries until it can take all locks, and may take
- * an arbitrarily long time to complete.
- * Must be called with irqs enabled, returns with irqs disabled
- * Must be called with clock_list_lock held
- */
-static void clk_lock_all(void)
-{
-       int ret;
-retry:
-       local_irq_disable();
-
-       ret = __clk_lock_all_spinlocks();
-       if (ret)
-               goto failed_spinlocks;
-
-       /* All locks taken successfully, return */
-       return;
-
-failed_spinlocks:
-       local_irq_enable();
-       yield();
-       goto retry;
-}
-
-/*
- * Unlocks all clocks after a clk_lock_all
- * Must be called with irqs disabled, returns with irqs enabled
- * Must be called with clock_list_lock held
- */
-static void clk_unlock_all(void)
-{
-       __clk_unlock_all_spinlocks();
-
-       local_irq_enable();
-}
-
-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 = "uninit";
-       char div[8] = {0};
-
-       if (c->state == ON)
-               state = "on";
-       else if (c->state == OFF)
-               state = "off";
-
-       if (c->mul != 0 && c->div != 0) {
-               if (c->mul > c->div) {
-                       int mul = c->mul / c->div;
-                       int mul2 = (c->mul * 10 / c->div) % 10;
-                       int mul3 = (c->mul * 10) % c->div;
-                       if (mul2 == 0 && mul3 == 0)
-                               snprintf(div, sizeof(div), "x%d", mul);
-                       else if (mul3 == 0)
-                               snprintf(div, sizeof(div), "x%d.%d", mul, mul2);
-                       else
-                               snprintf(div, sizeof(div), "x%d.%d..", mul, mul2);
-               } else {
-                       snprintf(div, sizeof(div), "%d%s", c->div / c->mul,
-                               (c->div % c->mul) ? ".5" : "");
-               }
-       }
-
-       seq_printf(s, "%*s%c%c%-*s %-6s %-3d %-8s %-10lu\n",
-               level * 3 + 1, "",
-               c->rate > c->max_rate ? '!' : ' ',
-               !c->set ? '*' : ' ',
-               30 - level * 3, c->name,
-               state, c->refcnt, div, clk_get_rate_all_locked(c));
-
-       list_for_each_entry(child, &clocks, node) {
-               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;
-       seq_printf(s, "   clock                          state  ref div      rate\n");
-       seq_printf(s, "--------------------------------------------------------------\n");
-
-       mutex_lock(&clock_list_lock);
-
-       clk_lock_all();
-
-       list_for_each_entry(c, &clocks, node)
-               if (c->parent == NULL)
-                       clock_tree_show_one(s, c, 0);
-
-       clk_unlock_all();
-
-       mutex_unlock(&clock_list_lock);
-       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 possible_parents_show(struct seq_file *s, void *data)
-{
-       struct clk *c = s->private;
-       int i;
-
-       for (i = 0; c->inputs[i].input; i++) {
-               char *first = (i == 0) ? "" : " ";
-               seq_printf(s, "%s%s", first, c->inputs[i].input->name);
-       }
-       seq_printf(s, "\n");
-       return 0;
-}
-
-static int possible_parents_open(struct inode *inode, struct file *file)
-{
-       return single_open(file, possible_parents_show, inode->i_private);
-}
-
-static const struct file_operations possible_parents_fops = {
-       .open           = possible_parents_open,
-       .read           = seq_read,
-       .llseek         = seq_lseek,
-       .release        = single_release,
-};
-
-static int clk_debugfs_register_one(struct clk *c)
-{
-       struct dentry *d;
-
-       d = debugfs_create_dir(c->name, clk_debugfs_root);
-       if (!d)
-               return -ENOMEM;
-       c->dent = d;
-
-       d = debugfs_create_u8("refcnt", S_IRUGO, c->dent, (u8 *)&c->refcnt);
-       if (!d)
-               goto err_out;
-
-       d = debugfs_create_u32("rate", S_IRUGO, c->dent, (u32 *)&c->rate);
-       if (!d)
-               goto err_out;
-
-       d = debugfs_create_x32("flags", S_IRUGO, c->dent, (u32 *)&c->flags);
-       if (!d)
-               goto err_out;
-
-       if (c->inputs) {
-               d = debugfs_create_file("possible_parents", S_IRUGO, c->dent,
-                       c, &possible_parents_fops);
-               if (!d)
-                       goto err_out;
-       }
-
-       return 0;
-
-err_out:
-       debugfs_remove_recursive(c->dent);
-       return -ENOMEM;
-}
-
-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;
-}
-
-int __init tegra_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, node) {
-               err = clk_debugfs_register(c);
-               if (err)
-                       goto err_out;
-       }
-       return 0;
-err_out:
-       debugfs_remove_recursive(clk_debugfs_root);
-       return err;
-}
-
-#endif
index bc30065..2aa37f5 100644 (file)
@@ -2,6 +2,7 @@
  * arch/arm/mach-tegra/include/mach/clock.h
  *
  * Copyright (C) 2010 Google, Inc.
+ * Copyright (c) 2012 NVIDIA CORPORATION.  All rights reserved.
  *
  * Author:
  *     Colin Cross <ccross@google.com>
@@ -20,9 +21,9 @@
 #ifndef __MACH_TEGRA_CLOCK_H
 #define __MACH_TEGRA_CLOCK_H
 
+#include <linux/clk-provider.h>
 #include <linux/clkdev.h>
 #include <linux/list.h>
-#include <linux/spinlock.h>
 
 #include <mach/clk.h>
 
@@ -52,7 +53,8 @@
 #define ENABLE_ON_INIT         (1 << 28)
 #define PERIPH_ON_APB           (1 << 29)
 
-struct clk;
+struct clk_tegra;
+#define to_clk_tegra(_hw) container_of(_hw, struct clk_tegra, hw)
 
 struct clk_mux_sel {
        struct clk      *input;
@@ -68,47 +70,29 @@ struct clk_pll_freq_table {
        u8              cpcon;
 };
 
-struct clk_ops {
-       void            (*init)(struct clk *);
-       int             (*enable)(struct clk *);
-       void            (*disable)(struct clk *);
-       int             (*set_parent)(struct clk *, struct clk *);
-       int             (*set_rate)(struct clk *, unsigned long);
-       long            (*round_rate)(struct clk *, unsigned long);
-       void            (*reset)(struct clk *, bool);
-       int             (*clk_cfg_ex)(struct clk *,
-                               enum tegra_clk_ex_param, u32);
-};
-
 enum clk_state {
        UNINITIALIZED = 0,
        ON,
        OFF,
 };
 
-struct clk {
+struct clk_tegra {
        /* node for master clocks list */
-       struct list_head        node;           /* node for list of all clocks */
+       struct list_head        node;   /* node for list of all clocks */
        struct clk_lookup       lookup;
+       struct clk_hw           hw;
 
-#ifdef CONFIG_DEBUG_FS
-       struct dentry           *dent;
-#endif
        bool                    set;
-       struct clk_ops          *ops;
-       unsigned long           rate;
+       unsigned long           fixed_rate;
        unsigned long           max_rate;
        unsigned long           min_rate;
        u32                     flags;
        const char              *name;
 
-       u32                     refcnt;
        enum clk_state          state;
-       struct clk              *parent;
        u32                     div;
        u32                     mul;
 
-       const struct clk_mux_sel        *inputs;
        u32                             reg;
        u32                             reg_shift;
 
@@ -144,7 +128,8 @@ struct clk {
                } shared_bus_user;
        } u;
 
-       spinlock_t spinlock;
+       void (*reset)(struct clk_hw *, bool);
+       int (*clk_cfg_ex)(struct clk_hw *, enum tegra_clk_ex_param, u32);
 };
 
 struct clk_duplicate {
@@ -159,13 +144,10 @@ struct tegra_clk_init_table {
        bool enabled;
 };
 
+void tegra_clk_add(struct clk *c);
 void tegra2_init_clocks(void);
 void tegra30_init_clocks(void);
-void clk_init(struct clk *clk);
 struct clk *tegra_get_clock_by_name(const char *name);
-int clk_reparent(struct clk *c, struct clk *parent);
 void tegra_clk_init_from_table(struct tegra_clk_init_table *table);
-unsigned long clk_get_rate_locked(struct clk *c);
-int clk_set_rate_locked(struct clk *c, unsigned long rate);
 
 #endif
index 96fef6b..0560538 100644 (file)
@@ -34,6 +34,7 @@
 #include "fuse.h"
 #include "pmc.h"
 #include "apbio.h"
+#include "sleep.h"
 
 /*
  * Storage for debug-macro.S's state.
@@ -135,6 +136,7 @@ void __init tegra20_init_early(void)
        tegra_init_cache(0x331, 0x441);
        tegra_pmc_init();
        tegra_powergate_init();
+       tegra20_hotplug_init();
 }
 #endif
 #ifdef CONFIG_ARCH_TEGRA_3x_SOC
@@ -147,11 +149,11 @@ void __init tegra30_init_early(void)
        tegra_init_cache(0x441, 0x551);
        tegra_pmc_init();
        tegra_powergate_init();
+       tegra30_hotplug_init();
 }
 #endif
 
 void __init tegra_init_late(void)
 {
-       tegra_clk_debugfs_init();
        tegra_powergate_debugfs_init();
 }
index ceb52db..627bf0f 100644 (file)
@@ -49,6 +49,8 @@ static struct cpufreq_frequency_table freq_table[] = {
 #define NUM_CPUS       2
 
 static struct clk *cpu_clk;
+static struct clk *pll_x_clk;
+static struct clk *pll_p_clk;
 static struct clk *emc_clk;
 
 static unsigned long target_cpu_speed[NUM_CPUS];
@@ -71,6 +73,42 @@ static unsigned int tegra_getspeed(unsigned int cpu)
        return rate;
 }
 
+static int tegra_cpu_clk_set_rate(unsigned long rate)
+{
+       int ret;
+
+       /*
+        * Take an extra reference to the main pll so it doesn't turn
+        * off when we move the cpu off of it
+        */
+       clk_prepare_enable(pll_x_clk);
+
+       ret = clk_set_parent(cpu_clk, pll_p_clk);
+       if (ret) {
+               pr_err("Failed to switch cpu to clock pll_p\n");
+               goto out;
+       }
+
+       if (rate == clk_get_rate(pll_p_clk))
+               goto out;
+
+       ret = clk_set_rate(pll_x_clk, rate);
+       if (ret) {
+               pr_err("Failed to change pll_x to %lu\n", rate);
+               goto out;
+       }
+
+       ret = clk_set_parent(cpu_clk, pll_x_clk);
+       if (ret) {
+               pr_err("Failed to switch cpu to clock pll_x\n");
+               goto out;
+       }
+
+out:
+       clk_disable_unprepare(pll_x_clk);
+       return ret;
+}
+
 static int tegra_update_cpu_speed(unsigned long rate)
 {
        int ret = 0;
@@ -101,7 +139,7 @@ static int tegra_update_cpu_speed(unsigned long rate)
               freqs.old, freqs.new);
 #endif
 
-       ret = clk_set_rate(cpu_clk, freqs.new * 1000);
+       ret = tegra_cpu_clk_set_rate(freqs.new * 1000);
        if (ret) {
                pr_err("cpu-tegra: Failed to set cpu frequency to %d kHz\n",
                        freqs.new);
@@ -183,6 +221,14 @@ static int tegra_cpu_init(struct cpufreq_policy *policy)
        if (IS_ERR(cpu_clk))
                return PTR_ERR(cpu_clk);
 
+       pll_x_clk = clk_get_sys(NULL, "pll_x");
+       if (IS_ERR(pll_x_clk))
+               return PTR_ERR(pll_x_clk);
+
+       pll_p_clk = clk_get_sys(NULL, "pll_p");
+       if (IS_ERR(pll_p_clk))
+               return PTR_ERR(pll_p_clk);
+
        emc_clk = clk_get_sys("cpu", "emc");
        if (IS_ERR(emc_clk)) {
                clk_put(cpu_clk);
index c70e65f..61e9603 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/fsl_devices.h>
 #include <linux/serial_8250.h>
 #include <linux/i2c-tegra.h>
-#include <asm/pmu.h>
 #include <mach/irqs.h>
 #include <mach/iomap.h>
 #include <mach/dma.h>
@@ -516,7 +515,7 @@ static struct resource tegra_pmu_resources[] = {
 
 struct platform_device tegra_pmu_device = {
        .name           = "arm-pmu",
-       .id             = ARM_PMU_DEVICE_CPU,
+       .id             = -1,
        .num_resources  = ARRAY_SIZE(tegra_pmu_resources),
        .resource       = tegra_pmu_resources,
 };
diff --git a/arch/arm/mach-tegra/dma.c b/arch/arm/mach-tegra/dma.c
deleted file mode 100644 (file)
index 29c5114..0000000
+++ /dev/null
@@ -1,823 +0,0 @@
-/*
- * arch/arm/mach-tegra/dma.c
- *
- * System DMA driver for NVIDIA Tegra SoCs
- *
- * Copyright (c) 2008-2009, NVIDIA 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; 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/io.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <linux/spinlock.h>
-#include <linux/err.h>
-#include <linux/irq.h>
-#include <linux/delay.h>
-#include <linux/clk.h>
-#include <mach/dma.h>
-#include <mach/irqs.h>
-#include <mach/iomap.h>
-#include <mach/suspend.h>
-
-#include "apbio.h"
-
-#define APB_DMA_GEN                            0x000
-#define GEN_ENABLE                             (1<<31)
-
-#define APB_DMA_CNTRL                          0x010
-
-#define APB_DMA_IRQ_MASK                       0x01c
-
-#define APB_DMA_IRQ_MASK_SET                   0x020
-
-#define APB_DMA_CHAN_CSR                       0x000
-#define CSR_ENB                                        (1<<31)
-#define CSR_IE_EOC                             (1<<30)
-#define CSR_HOLD                               (1<<29)
-#define CSR_DIR                                        (1<<28)
-#define CSR_ONCE                               (1<<27)
-#define CSR_FLOW                               (1<<21)
-#define CSR_REQ_SEL_SHIFT                      16
-#define CSR_WCOUNT_SHIFT                       2
-#define CSR_WCOUNT_MASK                                0xFFFC
-
-#define APB_DMA_CHAN_STA                               0x004
-#define STA_BUSY                               (1<<31)
-#define STA_ISE_EOC                            (1<<30)
-#define STA_HALT                               (1<<29)
-#define STA_PING_PONG                          (1<<28)
-#define STA_COUNT_SHIFT                                2
-#define STA_COUNT_MASK                         0xFFFC
-
-#define APB_DMA_CHAN_AHB_PTR                           0x010
-
-#define APB_DMA_CHAN_AHB_SEQ                           0x014
-#define AHB_SEQ_INTR_ENB                       (1<<31)
-#define AHB_SEQ_BUS_WIDTH_SHIFT                        28
-#define AHB_SEQ_BUS_WIDTH_MASK                 (0x7<<AHB_SEQ_BUS_WIDTH_SHIFT)
-#define AHB_SEQ_BUS_WIDTH_8                    (0<<AHB_SEQ_BUS_WIDTH_SHIFT)
-#define AHB_SEQ_BUS_WIDTH_16                   (1<<AHB_SEQ_BUS_WIDTH_SHIFT)
-#define AHB_SEQ_BUS_WIDTH_32                   (2<<AHB_SEQ_BUS_WIDTH_SHIFT)
-#define AHB_SEQ_BUS_WIDTH_64                   (3<<AHB_SEQ_BUS_WIDTH_SHIFT)
-#define AHB_SEQ_BUS_WIDTH_128                  (4<<AHB_SEQ_BUS_WIDTH_SHIFT)
-#define AHB_SEQ_DATA_SWAP                      (1<<27)
-#define AHB_SEQ_BURST_MASK                     (0x7<<24)
-#define AHB_SEQ_BURST_1                                (4<<24)
-#define AHB_SEQ_BURST_4                                (5<<24)
-#define AHB_SEQ_BURST_8                                (6<<24)
-#define AHB_SEQ_DBL_BUF                                (1<<19)
-#define AHB_SEQ_WRAP_SHIFT                     16
-#define AHB_SEQ_WRAP_MASK                      (0x7<<AHB_SEQ_WRAP_SHIFT)
-
-#define APB_DMA_CHAN_APB_PTR                           0x018
-
-#define APB_DMA_CHAN_APB_SEQ                           0x01c
-#define APB_SEQ_BUS_WIDTH_SHIFT                        28
-#define APB_SEQ_BUS_WIDTH_MASK                 (0x7<<APB_SEQ_BUS_WIDTH_SHIFT)
-#define APB_SEQ_BUS_WIDTH_8                    (0<<APB_SEQ_BUS_WIDTH_SHIFT)
-#define APB_SEQ_BUS_WIDTH_16                   (1<<APB_SEQ_BUS_WIDTH_SHIFT)
-#define APB_SEQ_BUS_WIDTH_32                   (2<<APB_SEQ_BUS_WIDTH_SHIFT)
-#define APB_SEQ_BUS_WIDTH_64                   (3<<APB_SEQ_BUS_WIDTH_SHIFT)
-#define APB_SEQ_BUS_WIDTH_128                  (4<<APB_SEQ_BUS_WIDTH_SHIFT)
-#define APB_SEQ_DATA_SWAP                      (1<<27)
-#define APB_SEQ_WRAP_SHIFT                     16
-#define APB_SEQ_WRAP_MASK                      (0x7<<APB_SEQ_WRAP_SHIFT)
-
-#define TEGRA_SYSTEM_DMA_CH_NR                 16
-#define TEGRA_SYSTEM_DMA_AVP_CH_NUM            4
-#define TEGRA_SYSTEM_DMA_CH_MIN                        0
-#define TEGRA_SYSTEM_DMA_CH_MAX        \
-       (TEGRA_SYSTEM_DMA_CH_NR - TEGRA_SYSTEM_DMA_AVP_CH_NUM - 1)
-
-#define NV_DMA_MAX_TRASFER_SIZE 0x10000
-
-static const unsigned int ahb_addr_wrap_table[8] = {
-       0, 32, 64, 128, 256, 512, 1024, 2048
-};
-
-static const unsigned int apb_addr_wrap_table[8] = {
-       0, 1, 2, 4, 8, 16, 32, 64
-};
-
-static const unsigned int bus_width_table[5] = {
-       8, 16, 32, 64, 128
-};
-
-#define TEGRA_DMA_NAME_SIZE 16
-struct tegra_dma_channel {
-       struct list_head        list;
-       int                     id;
-       spinlock_t              lock;
-       char                    name[TEGRA_DMA_NAME_SIZE];
-       void  __iomem           *addr;
-       int                     mode;
-       int                     irq;
-       int                     req_transfer_count;
-};
-
-#define  NV_DMA_MAX_CHANNELS  32
-
-static bool tegra_dma_initialized;
-static DEFINE_MUTEX(tegra_dma_lock);
-static DEFINE_SPINLOCK(enable_lock);
-
-static DECLARE_BITMAP(channel_usage, NV_DMA_MAX_CHANNELS);
-static struct tegra_dma_channel dma_channels[NV_DMA_MAX_CHANNELS];
-
-static void tegra_dma_update_hw(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *req);
-static void tegra_dma_update_hw_partial(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *req);
-static void tegra_dma_stop(struct tegra_dma_channel *ch);
-
-void tegra_dma_flush(struct tegra_dma_channel *ch)
-{
-}
-EXPORT_SYMBOL(tegra_dma_flush);
-
-void tegra_dma_dequeue(struct tegra_dma_channel *ch)
-{
-       struct tegra_dma_req *req;
-
-       if (tegra_dma_is_empty(ch))
-               return;
-
-       req = list_entry(ch->list.next, typeof(*req), node);
-
-       tegra_dma_dequeue_req(ch, req);
-       return;
-}
-
-static void tegra_dma_stop(struct tegra_dma_channel *ch)
-{
-       u32 csr;
-       u32 status;
-
-       csr = readl(ch->addr + APB_DMA_CHAN_CSR);
-       csr &= ~CSR_IE_EOC;
-       writel(csr, ch->addr + APB_DMA_CHAN_CSR);
-
-       csr &= ~CSR_ENB;
-       writel(csr, ch->addr + APB_DMA_CHAN_CSR);
-
-       status = readl(ch->addr + APB_DMA_CHAN_STA);
-       if (status & STA_ISE_EOC)
-               writel(status, ch->addr + APB_DMA_CHAN_STA);
-}
-
-static int tegra_dma_cancel(struct tegra_dma_channel *ch)
-{
-       unsigned long irq_flags;
-
-       spin_lock_irqsave(&ch->lock, irq_flags);
-       while (!list_empty(&ch->list))
-               list_del(ch->list.next);
-
-       tegra_dma_stop(ch);
-
-       spin_unlock_irqrestore(&ch->lock, irq_flags);
-       return 0;
-}
-
-static unsigned int get_channel_status(struct tegra_dma_channel *ch,
-                       struct tegra_dma_req *req, bool is_stop_dma)
-{
-       void __iomem *addr = IO_ADDRESS(TEGRA_APB_DMA_BASE);
-       unsigned int status;
-
-       if (is_stop_dma) {
-               /*
-                * STOP the DMA and get the transfer count.
-                * Getting the transfer count is tricky.
-                *  - Globally disable DMA on all channels
-                *  - Read the channel's status register to know the number
-                *    of pending bytes to be transfered.
-                *  - Stop the dma channel
-                *  - Globally re-enable DMA to resume other transfers
-                */
-               spin_lock(&enable_lock);
-               writel(0, addr + APB_DMA_GEN);
-               udelay(20);
-               status = readl(ch->addr + APB_DMA_CHAN_STA);
-               tegra_dma_stop(ch);
-               writel(GEN_ENABLE, addr + APB_DMA_GEN);
-               spin_unlock(&enable_lock);
-               if (status & STA_ISE_EOC) {
-                       pr_err("Got Dma Int here clearing");
-                       writel(status, ch->addr + APB_DMA_CHAN_STA);
-               }
-               req->status = TEGRA_DMA_REQ_ERROR_ABORTED;
-       } else {
-               status = readl(ch->addr + APB_DMA_CHAN_STA);
-       }
-       return status;
-}
-
-/* should be called with the channel lock held */
-static unsigned int dma_active_count(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *req, unsigned int status)
-{
-       unsigned int to_transfer;
-       unsigned int req_transfer_count;
-       unsigned int bytes_transferred;
-
-       to_transfer = ((status & STA_COUNT_MASK) >> STA_COUNT_SHIFT) + 1;
-       req_transfer_count = ch->req_transfer_count + 1;
-       bytes_transferred = req_transfer_count;
-       if (status & STA_BUSY)
-               bytes_transferred -= to_transfer;
-       /*
-        * In continuous transfer mode, DMA only tracks the count of the
-        * half DMA buffer. So, if the DMA already finished half the DMA
-        * then add the half buffer to the completed count.
-        */
-       if (ch->mode & TEGRA_DMA_MODE_CONTINOUS) {
-               if (req->buffer_status == TEGRA_DMA_REQ_BUF_STATUS_HALF_FULL)
-                       bytes_transferred += req_transfer_count;
-               if (status & STA_ISE_EOC)
-                       bytes_transferred += req_transfer_count;
-       }
-       bytes_transferred *= 4;
-       return bytes_transferred;
-}
-
-int tegra_dma_dequeue_req(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *_req)
-{
-       unsigned int status;
-       struct tegra_dma_req *req = NULL;
-       int found = 0;
-       unsigned long irq_flags;
-       int stop = 0;
-
-       spin_lock_irqsave(&ch->lock, irq_flags);
-
-       if (list_entry(ch->list.next, struct tegra_dma_req, node) == _req)
-               stop = 1;
-
-       list_for_each_entry(req, &ch->list, node) {
-               if (req == _req) {
-                       list_del(&req->node);
-                       found = 1;
-                       break;
-               }
-       }
-       if (!found) {
-               spin_unlock_irqrestore(&ch->lock, irq_flags);
-               return 0;
-       }
-
-       if (!stop)
-               goto skip_stop_dma;
-
-       status = get_channel_status(ch, req, true);
-       req->bytes_transferred = dma_active_count(ch, req, status);
-
-       if (!list_empty(&ch->list)) {
-               /* if the list is not empty, queue the next request */
-               struct tegra_dma_req *next_req;
-               next_req = list_entry(ch->list.next,
-                       typeof(*next_req), node);
-               tegra_dma_update_hw(ch, next_req);
-       }
-
-skip_stop_dma:
-       req->status = -TEGRA_DMA_REQ_ERROR_ABORTED;
-
-       spin_unlock_irqrestore(&ch->lock, irq_flags);
-
-       /* Callback should be called without any lock */
-       req->complete(req);
-       return 0;
-}
-EXPORT_SYMBOL(tegra_dma_dequeue_req);
-
-bool tegra_dma_is_empty(struct tegra_dma_channel *ch)
-{
-       unsigned long irq_flags;
-       bool is_empty;
-
-       spin_lock_irqsave(&ch->lock, irq_flags);
-       if (list_empty(&ch->list))
-               is_empty = true;
-       else
-               is_empty = false;
-       spin_unlock_irqrestore(&ch->lock, irq_flags);
-       return is_empty;
-}
-EXPORT_SYMBOL(tegra_dma_is_empty);
-
-bool tegra_dma_is_req_inflight(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *_req)
-{
-       unsigned long irq_flags;
-       struct tegra_dma_req *req;
-
-       spin_lock_irqsave(&ch->lock, irq_flags);
-       list_for_each_entry(req, &ch->list, node) {
-               if (req == _req) {
-                       spin_unlock_irqrestore(&ch->lock, irq_flags);
-                       return true;
-               }
-       }
-       spin_unlock_irqrestore(&ch->lock, irq_flags);
-       return false;
-}
-EXPORT_SYMBOL(tegra_dma_is_req_inflight);
-
-int tegra_dma_enqueue_req(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *req)
-{
-       unsigned long irq_flags;
-       struct tegra_dma_req *_req;
-       int start_dma = 0;
-
-       if (req->size > NV_DMA_MAX_TRASFER_SIZE ||
-               req->source_addr & 0x3 || req->dest_addr & 0x3) {
-               pr_err("Invalid DMA request for channel %d\n", ch->id);
-               return -EINVAL;
-       }
-
-       spin_lock_irqsave(&ch->lock, irq_flags);
-
-       list_for_each_entry(_req, &ch->list, node) {
-               if (req == _req) {
-                   spin_unlock_irqrestore(&ch->lock, irq_flags);
-                   return -EEXIST;
-               }
-       }
-
-       req->bytes_transferred = 0;
-       req->status = 0;
-       req->buffer_status = 0;
-       if (list_empty(&ch->list))
-               start_dma = 1;
-
-       list_add_tail(&req->node, &ch->list);
-
-       if (start_dma)
-               tegra_dma_update_hw(ch, req);
-
-       spin_unlock_irqrestore(&ch->lock, irq_flags);
-
-       return 0;
-}
-EXPORT_SYMBOL(tegra_dma_enqueue_req);
-
-struct tegra_dma_channel *tegra_dma_allocate_channel(int mode)
-{
-       int channel;
-       struct tegra_dma_channel *ch = NULL;
-
-       if (!tegra_dma_initialized)
-               return NULL;
-
-       mutex_lock(&tegra_dma_lock);
-
-       /* first channel is the shared channel */
-       if (mode & TEGRA_DMA_SHARED) {
-               channel = TEGRA_SYSTEM_DMA_CH_MIN;
-       } else {
-               channel = find_first_zero_bit(channel_usage,
-                       ARRAY_SIZE(dma_channels));
-               if (channel >= ARRAY_SIZE(dma_channels))
-                       goto out;
-       }
-       __set_bit(channel, channel_usage);
-       ch = &dma_channels[channel];
-       ch->mode = mode;
-
-out:
-       mutex_unlock(&tegra_dma_lock);
-       return ch;
-}
-EXPORT_SYMBOL(tegra_dma_allocate_channel);
-
-void tegra_dma_free_channel(struct tegra_dma_channel *ch)
-{
-       if (ch->mode & TEGRA_DMA_SHARED)
-               return;
-       tegra_dma_cancel(ch);
-       mutex_lock(&tegra_dma_lock);
-       __clear_bit(ch->id, channel_usage);
-       mutex_unlock(&tegra_dma_lock);
-}
-EXPORT_SYMBOL(tegra_dma_free_channel);
-
-static void tegra_dma_update_hw_partial(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *req)
-{
-       u32 apb_ptr;
-       u32 ahb_ptr;
-
-       if (req->to_memory) {
-               apb_ptr = req->source_addr;
-               ahb_ptr = req->dest_addr;
-       } else {
-               apb_ptr = req->dest_addr;
-               ahb_ptr = req->source_addr;
-       }
-       writel(apb_ptr, ch->addr + APB_DMA_CHAN_APB_PTR);
-       writel(ahb_ptr, ch->addr + APB_DMA_CHAN_AHB_PTR);
-
-       req->status = TEGRA_DMA_REQ_INFLIGHT;
-       return;
-}
-
-static void tegra_dma_update_hw(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *req)
-{
-       int ahb_addr_wrap;
-       int apb_addr_wrap;
-       int ahb_bus_width;
-       int apb_bus_width;
-       int index;
-
-       u32 ahb_seq;
-       u32 apb_seq;
-       u32 ahb_ptr;
-       u32 apb_ptr;
-       u32 csr;
-
-       csr = CSR_IE_EOC | CSR_FLOW;
-       ahb_seq = AHB_SEQ_INTR_ENB | AHB_SEQ_BURST_1;
-       apb_seq = 0;
-
-       csr |= req->req_sel << CSR_REQ_SEL_SHIFT;
-
-       /* One shot mode is always single buffered,
-        * continuous mode is always double buffered
-        * */
-       if (ch->mode & TEGRA_DMA_MODE_ONESHOT) {
-               csr |= CSR_ONCE;
-               ch->req_transfer_count = (req->size >> 2) - 1;
-       } else {
-               ahb_seq |= AHB_SEQ_DBL_BUF;
-
-               /* In double buffered mode, we set the size to half the
-                * requested size and interrupt when half the buffer
-                * is full */
-               ch->req_transfer_count = (req->size >> 3) - 1;
-       }
-
-       csr |= ch->req_transfer_count << CSR_WCOUNT_SHIFT;
-
-       if (req->to_memory) {
-               apb_ptr = req->source_addr;
-               ahb_ptr = req->dest_addr;
-
-               apb_addr_wrap = req->source_wrap;
-               ahb_addr_wrap = req->dest_wrap;
-               apb_bus_width = req->source_bus_width;
-               ahb_bus_width = req->dest_bus_width;
-
-       } else {
-               csr |= CSR_DIR;
-               apb_ptr = req->dest_addr;
-               ahb_ptr = req->source_addr;
-
-               apb_addr_wrap = req->dest_wrap;
-               ahb_addr_wrap = req->source_wrap;
-               apb_bus_width = req->dest_bus_width;
-               ahb_bus_width = req->source_bus_width;
-       }
-
-       apb_addr_wrap >>= 2;
-       ahb_addr_wrap >>= 2;
-
-       /* set address wrap for APB size */
-       index = 0;
-       do  {
-               if (apb_addr_wrap_table[index] == apb_addr_wrap)
-                       break;
-               index++;
-       } while (index < ARRAY_SIZE(apb_addr_wrap_table));
-       BUG_ON(index == ARRAY_SIZE(apb_addr_wrap_table));
-       apb_seq |= index << APB_SEQ_WRAP_SHIFT;
-
-       /* set address wrap for AHB size */
-       index = 0;
-       do  {
-               if (ahb_addr_wrap_table[index] == ahb_addr_wrap)
-                       break;
-               index++;
-       } while (index < ARRAY_SIZE(ahb_addr_wrap_table));
-       BUG_ON(index == ARRAY_SIZE(ahb_addr_wrap_table));
-       ahb_seq |= index << AHB_SEQ_WRAP_SHIFT;
-
-       for (index = 0; index < ARRAY_SIZE(bus_width_table); index++) {
-               if (bus_width_table[index] == ahb_bus_width)
-                       break;
-       }
-       BUG_ON(index == ARRAY_SIZE(bus_width_table));
-       ahb_seq |= index << AHB_SEQ_BUS_WIDTH_SHIFT;
-
-       for (index = 0; index < ARRAY_SIZE(bus_width_table); index++) {
-               if (bus_width_table[index] == apb_bus_width)
-                       break;
-       }
-       BUG_ON(index == ARRAY_SIZE(bus_width_table));
-       apb_seq |= index << APB_SEQ_BUS_WIDTH_SHIFT;
-
-       writel(csr, ch->addr + APB_DMA_CHAN_CSR);
-       writel(apb_seq, ch->addr + APB_DMA_CHAN_APB_SEQ);
-       writel(apb_ptr, ch->addr + APB_DMA_CHAN_APB_PTR);
-       writel(ahb_seq, ch->addr + APB_DMA_CHAN_AHB_SEQ);
-       writel(ahb_ptr, ch->addr + APB_DMA_CHAN_AHB_PTR);
-
-       csr |= CSR_ENB;
-       writel(csr, ch->addr + APB_DMA_CHAN_CSR);
-
-       req->status = TEGRA_DMA_REQ_INFLIGHT;
-}
-
-static void handle_oneshot_dma(struct tegra_dma_channel *ch)
-{
-       struct tegra_dma_req *req;
-       unsigned long irq_flags;
-
-       spin_lock_irqsave(&ch->lock, irq_flags);
-       if (list_empty(&ch->list)) {
-               spin_unlock_irqrestore(&ch->lock, irq_flags);
-               return;
-       }
-
-       req = list_entry(ch->list.next, typeof(*req), node);
-       if (req) {
-               int bytes_transferred;
-
-               bytes_transferred = ch->req_transfer_count;
-               bytes_transferred += 1;
-               bytes_transferred <<= 2;
-
-               list_del(&req->node);
-               req->bytes_transferred = bytes_transferred;
-               req->status = TEGRA_DMA_REQ_SUCCESS;
-
-               spin_unlock_irqrestore(&ch->lock, irq_flags);
-               /* Callback should be called without any lock */
-               pr_debug("%s: transferred %d bytes\n", __func__,
-                       req->bytes_transferred);
-               req->complete(req);
-               spin_lock_irqsave(&ch->lock, irq_flags);
-       }
-
-       if (!list_empty(&ch->list)) {
-               req = list_entry(ch->list.next, typeof(*req), node);
-               /* the complete function we just called may have enqueued
-                  another req, in which case dma has already started */
-               if (req->status != TEGRA_DMA_REQ_INFLIGHT)
-                       tegra_dma_update_hw(ch, req);
-       }
-       spin_unlock_irqrestore(&ch->lock, irq_flags);
-}
-
-static void handle_continuous_dma(struct tegra_dma_channel *ch)
-{
-       struct tegra_dma_req *req;
-       unsigned long irq_flags;
-
-       spin_lock_irqsave(&ch->lock, irq_flags);
-       if (list_empty(&ch->list)) {
-               spin_unlock_irqrestore(&ch->lock, irq_flags);
-               return;
-       }
-
-       req = list_entry(ch->list.next, typeof(*req), node);
-       if (req) {
-               if (req->buffer_status == TEGRA_DMA_REQ_BUF_STATUS_EMPTY) {
-                       bool is_dma_ping_complete;
-                       is_dma_ping_complete = (readl(ch->addr + APB_DMA_CHAN_STA)
-                                               & STA_PING_PONG) ? true : false;
-                       if (req->to_memory)
-                               is_dma_ping_complete = !is_dma_ping_complete;
-                       /* Out of sync - Release current buffer */
-                       if (!is_dma_ping_complete) {
-                               int bytes_transferred;
-
-                               bytes_transferred = ch->req_transfer_count;
-                               bytes_transferred += 1;
-                               bytes_transferred <<= 3;
-                               req->buffer_status = TEGRA_DMA_REQ_BUF_STATUS_FULL;
-                               req->bytes_transferred = bytes_transferred;
-                               req->status = TEGRA_DMA_REQ_SUCCESS;
-                               tegra_dma_stop(ch);
-
-                               if (!list_is_last(&req->node, &ch->list)) {
-                                       struct tegra_dma_req *next_req;
-
-                                       next_req = list_entry(req->node.next,
-                                               typeof(*next_req), node);
-                                       tegra_dma_update_hw(ch, next_req);
-                               }
-
-                               list_del(&req->node);
-
-                               /* DMA lock is NOT held when callbak is called */
-                               spin_unlock_irqrestore(&ch->lock, irq_flags);
-                               req->complete(req);
-                               return;
-                       }
-                       /* Load the next request into the hardware, if available
-                        * */
-                       if (!list_is_last(&req->node, &ch->list)) {
-                               struct tegra_dma_req *next_req;
-
-                               next_req = list_entry(req->node.next,
-                                       typeof(*next_req), node);
-                               tegra_dma_update_hw_partial(ch, next_req);
-                       }
-                       req->buffer_status = TEGRA_DMA_REQ_BUF_STATUS_HALF_FULL;
-                       req->status = TEGRA_DMA_REQ_SUCCESS;
-                       /* DMA lock is NOT held when callback is called */
-                       spin_unlock_irqrestore(&ch->lock, irq_flags);
-                       if (likely(req->threshold))
-                               req->threshold(req);
-                       return;
-
-               } else if (req->buffer_status ==
-                       TEGRA_DMA_REQ_BUF_STATUS_HALF_FULL) {
-                       /* Callback when the buffer is completely full (i.e on
-                        * the second  interrupt */
-                       int bytes_transferred;
-
-                       bytes_transferred = ch->req_transfer_count;
-                       bytes_transferred += 1;
-                       bytes_transferred <<= 3;
-
-                       req->buffer_status = TEGRA_DMA_REQ_BUF_STATUS_FULL;
-                       req->bytes_transferred = bytes_transferred;
-                       req->status = TEGRA_DMA_REQ_SUCCESS;
-                       list_del(&req->node);
-
-                       /* DMA lock is NOT held when callbak is called */
-                       spin_unlock_irqrestore(&ch->lock, irq_flags);
-                       req->complete(req);
-                       return;
-
-               } else {
-                       BUG();
-               }
-       }
-       spin_unlock_irqrestore(&ch->lock, irq_flags);
-}
-
-static irqreturn_t dma_isr(int irq, void *data)
-{
-       struct tegra_dma_channel *ch = data;
-       unsigned long status;
-
-       status = readl(ch->addr + APB_DMA_CHAN_STA);
-       if (status & STA_ISE_EOC)
-               writel(status, ch->addr + APB_DMA_CHAN_STA);
-       else {
-               pr_warning("Got a spurious ISR for DMA channel %d\n", ch->id);
-               return IRQ_HANDLED;
-       }
-       return IRQ_WAKE_THREAD;
-}
-
-static irqreturn_t dma_thread_fn(int irq, void *data)
-{
-       struct tegra_dma_channel *ch = data;
-
-       if (ch->mode & TEGRA_DMA_MODE_ONESHOT)
-               handle_oneshot_dma(ch);
-       else
-               handle_continuous_dma(ch);
-
-
-       return IRQ_HANDLED;
-}
-
-int __init tegra_dma_init(void)
-{
-       int ret = 0;
-       int i;
-       unsigned int irq;
-       void __iomem *addr;
-       struct clk *c;
-
-       bitmap_fill(channel_usage, NV_DMA_MAX_CHANNELS);
-
-       c = clk_get_sys("tegra-apbdma", NULL);
-       if (IS_ERR(c)) {
-               pr_err("Unable to get clock for APB DMA\n");
-               ret = PTR_ERR(c);
-               goto fail;
-       }
-       ret = clk_prepare_enable(c);
-       if (ret != 0) {
-               pr_err("Unable to enable clock for APB DMA\n");
-               goto fail;
-       }
-
-       addr = IO_ADDRESS(TEGRA_APB_DMA_BASE);
-       writel(GEN_ENABLE, addr + APB_DMA_GEN);
-       writel(0, addr + APB_DMA_CNTRL);
-       writel(0xFFFFFFFFul >> (31 - TEGRA_SYSTEM_DMA_CH_MAX),
-              addr + APB_DMA_IRQ_MASK_SET);
-
-       for (i = TEGRA_SYSTEM_DMA_CH_MIN; i <= TEGRA_SYSTEM_DMA_CH_MAX; i++) {
-               struct tegra_dma_channel *ch = &dma_channels[i];
-
-               ch->id = i;
-               snprintf(ch->name, TEGRA_DMA_NAME_SIZE, "dma_channel_%d", i);
-
-               ch->addr = IO_ADDRESS(TEGRA_APB_DMA_CH0_BASE +
-                       TEGRA_APB_DMA_CH0_SIZE * i);
-
-               spin_lock_init(&ch->lock);
-               INIT_LIST_HEAD(&ch->list);
-
-               irq = INT_APB_DMA_CH0 + i;
-               ret = request_threaded_irq(irq, dma_isr, dma_thread_fn, 0,
-                       dma_channels[i].name, ch);
-               if (ret) {
-                       pr_err("Failed to register IRQ %d for DMA %d\n",
-                               irq, i);
-                       goto fail;
-               }
-               ch->irq = irq;
-
-               __clear_bit(i, channel_usage);
-       }
-       /* mark the shared channel allocated */
-       __set_bit(TEGRA_SYSTEM_DMA_CH_MIN, channel_usage);
-
-       tegra_dma_initialized = true;
-
-       return 0;
-fail:
-       writel(0, addr + APB_DMA_GEN);
-       for (i = TEGRA_SYSTEM_DMA_CH_MIN; i <= TEGRA_SYSTEM_DMA_CH_MAX; i++) {
-               struct tegra_dma_channel *ch = &dma_channels[i];
-               if (ch->irq)
-                       free_irq(ch->irq, ch);
-       }
-       return ret;
-}
-postcore_initcall(tegra_dma_init);
-
-#ifdef CONFIG_PM
-static u32 apb_dma[5*TEGRA_SYSTEM_DMA_CH_NR + 3];
-
-void tegra_dma_suspend(void)
-{
-       void __iomem *addr = IO_ADDRESS(TEGRA_APB_DMA_BASE);
-       u32 *ctx = apb_dma;
-       int i;
-
-       *ctx++ = readl(addr + APB_DMA_GEN);
-       *ctx++ = readl(addr + APB_DMA_CNTRL);
-       *ctx++ = readl(addr + APB_DMA_IRQ_MASK);
-
-       for (i = 0; i < TEGRA_SYSTEM_DMA_CH_NR; i++) {
-               addr = IO_ADDRESS(TEGRA_APB_DMA_CH0_BASE +
-                                 TEGRA_APB_DMA_CH0_SIZE * i);
-
-               *ctx++ = readl(addr + APB_DMA_CHAN_CSR);
-               *ctx++ = readl(addr + APB_DMA_CHAN_AHB_PTR);
-               *ctx++ = readl(addr + APB_DMA_CHAN_AHB_SEQ);
-               *ctx++ = readl(addr + APB_DMA_CHAN_APB_PTR);
-               *ctx++ = readl(addr + APB_DMA_CHAN_APB_SEQ);
-       }
-}
-
-void tegra_dma_resume(void)
-{
-       void __iomem *addr = IO_ADDRESS(TEGRA_APB_DMA_BASE);
-       u32 *ctx = apb_dma;
-       int i;
-
-       writel(*ctx++, addr + APB_DMA_GEN);
-       writel(*ctx++, addr + APB_DMA_CNTRL);
-       writel(*ctx++, addr + APB_DMA_IRQ_MASK);
-
-       for (i = 0; i < TEGRA_SYSTEM_DMA_CH_NR; i++) {
-               addr = IO_ADDRESS(TEGRA_APB_DMA_CH0_BASE +
-                                 TEGRA_APB_DMA_CH0_SIZE * i);
-
-               writel(*ctx++, addr + APB_DMA_CHAN_CSR);
-               writel(*ctx++, addr + APB_DMA_CHAN_AHB_PTR);
-               writel(*ctx++, addr + APB_DMA_CHAN_AHB_SEQ);
-               writel(*ctx++, addr + APB_DMA_CHAN_APB_PTR);
-               writel(*ctx++, addr + APB_DMA_CHAN_APB_SEQ);
-       }
-}
-
-#endif
index f946d12..0b7db17 100644 (file)
@@ -93,9 +93,9 @@ void tegra_init_fuse(void)
 {
        u32 id;
 
-       u32 reg = readl(IO_TO_VIRT(TEGRA_CLK_RESET_BASE + 0x48));
+       u32 reg = readl(IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x48));
        reg |= 1 << 28;
-       writel(reg, IO_TO_VIRT(TEGRA_CLK_RESET_BASE + 0x48));
+       writel(reg, IO_ADDRESS(TEGRA_CLK_RESET_BASE + 0x48));
 
        reg = tegra_fuse_readl(FUSE_SKU_INFO);
        tegra_sku_id = reg & 0xFF;
index fef9c2c..6addc78 100644 (file)
@@ -7,17 +7,13 @@
 
 #include "flowctrl.h"
 #include "reset.h"
+#include "sleep.h"
 
 #define APB_MISC_GP_HIDREV     0x804
 #define PMC_SCRATCH41  0x140
 
 #define RESET_DATA(x)  ((TEGRA_RESET_##x)*4)
 
-       .macro mov32, reg, val
-       movw    \reg, #:lower16:\val
-       movt    \reg, #:upper16:\val
-       .endm
-
         .section ".text.head", "ax"
        __CPUINIT
 
index d8dc9dd..d02a354 100644 (file)
@@ -1,91 +1,23 @@
 /*
- *  linux/arch/arm/mach-realview/hotplug.c
  *
  *  Copyright (C) 2002 ARM Ltd.
  *  All Rights Reserved
+ *  Copyright (c) 2010, 2012 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/kernel.h>
-#include <linux/errno.h>
 #include <linux/smp.h>
 
 #include <asm/cacheflush.h>
-#include <asm/cp15.h>
+#include <asm/smp_plat.h>
 
-static inline void cpu_enter_lowpower(void)
-{
-       unsigned int v;
-
-       flush_cache_all();
-       asm volatile(
-       "       mcr     p15, 0, %1, c7, c5, 0\n"
-       "       mcr     p15, 0, %1, c7, c10, 4\n"
-       /*
-        * Turn off coherency
-        */
-       "       mrc     p15, 0, %0, c1, c0, 1\n"
-       "       bic     %0, %0, #0x20\n"
-       "       mcr     p15, 0, %0, c1, c0, 1\n"
-       "       mrc     p15, 0, %0, c1, c0, 0\n"
-       "       bic     %0, %0, %2\n"
-       "       mcr     p15, 0, %0, c1, c0, 0\n"
-         : "=&r" (v)
-         : "r" (0), "Ir" (CR_C)
-         : "cc");
-}
-
-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, #0x20\n"
-       "       mcr     p15, 0, %0, c1, c0, 1\n"
-         : "=&r" (v)
-         : "Ir" (CR_C)
-         : "cc");
-}
-
-static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
-{
-       /*
-        * there is no power-control hardware on this platform, so all
-        * we can do is put the core into WFI; this is safe as the calling
-        * code will have already disabled interrupts
-        */
-       for (;;) {
-               /*
-                * here's the WFI
-                */
-               asm(".word      0xe320f003\n"
-                   :
-                   :
-                   : "memory", "cc");
+#include "sleep.h"
+#include "tegra_cpu_car.h"
 
-               /*if (pen_release == cpu) {*/
-                       /*
-                        * OK, proper wakeup, we're done
-                        */
-                       break;
-               /*}*/
-
-               /*
-                * Getting here, means that we have come out of WFI without
-                * having been woken up - this shouldn't happen
-                *
-                * Just note it happening - when we're woken, we can report
-                * its occurrence.
-                */
-               (*spurious)++;
-       }
-}
+static void (*tegra_hotplug_shutdown)(void);
 
 int platform_cpu_kill(unsigned int cpu)
 {
@@ -99,22 +31,20 @@ int platform_cpu_kill(unsigned int cpu)
  */
 void platform_cpu_die(unsigned int cpu)
 {
-       int spurious = 0;
+       cpu = cpu_logical_map(cpu);
 
-       /*
-        * we're ready for shutdown now, so do it
-        */
-       cpu_enter_lowpower();
-       platform_do_lowpower(cpu, &spurious);
+       /* Flush the L1 data cache. */
+       flush_cache_all();
 
-       /*
-        * bring this CPU back into the world of cache
-        * coherency, and then restore interrupts
-        */
-       cpu_leave_lowpower();
+       /* Shut down the current CPU. */
+       tegra_hotplug_shutdown();
 
-       if (spurious)
-               pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
+       /* Clock gate the CPU */
+       tegra_wait_cpu_in_reset(cpu);
+       tegra_disable_cpu_clock(cpu);
+
+       /* Should never return here. */
+       BUG();
 }
 
 int platform_cpu_disable(unsigned int cpu)
@@ -125,3 +55,19 @@ int platform_cpu_disable(unsigned int cpu)
         */
        return cpu == 0 ? -EPERM : 0;
 }
+
+#ifdef CONFIG_ARCH_TEGRA_2x_SOC
+extern void tegra20_hotplug_shutdown(void);
+void __init tegra20_hotplug_init(void)
+{
+       tegra_hotplug_shutdown = tegra20_hotplug_shutdown;
+}
+#endif
+
+#ifdef CONFIG_ARCH_TEGRA_3x_SOC
+extern void tegra30_hotplug_shutdown(void);
+void __init tegra30_hotplug_init(void)
+{
+       tegra_hotplug_shutdown = tegra30_hotplug_shutdown;
+}
+#endif
index d97e403..95f3a54 100644 (file)
@@ -34,7 +34,10 @@ enum tegra_clk_ex_param {
 void tegra_periph_reset_deassert(struct clk *c);
 void tegra_periph_reset_assert(struct clk *c);
 
+#ifndef CONFIG_COMMON_CLK
 unsigned long clk_get_rate_all_locked(struct clk *c);
+#endif
+
 void tegra2_sdmmc_tap_delay(struct clk *c, int delay);
 int tegra_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting);
 
index 9077092..3081cc6 100644 (file)
 #define TEGRA_DMA_REQ_SEL_OWR                  25
 #define TEGRA_DMA_REQ_SEL_INVALID              31
 
-struct tegra_dma_req;
-struct tegra_dma_channel;
-
-enum tegra_dma_mode {
-       TEGRA_DMA_SHARED = 1,
-       TEGRA_DMA_MODE_CONTINOUS = 2,
-       TEGRA_DMA_MODE_ONESHOT = 4,
-};
-
-enum tegra_dma_req_error {
-       TEGRA_DMA_REQ_SUCCESS = 0,
-       TEGRA_DMA_REQ_ERROR_ABORTED,
-       TEGRA_DMA_REQ_INFLIGHT,
-};
-
-enum tegra_dma_req_buff_status {
-       TEGRA_DMA_REQ_BUF_STATUS_EMPTY = 0,
-       TEGRA_DMA_REQ_BUF_STATUS_HALF_FULL,
-       TEGRA_DMA_REQ_BUF_STATUS_FULL,
-};
-
-struct tegra_dma_req {
-       struct list_head node;
-       unsigned int modid;
-       int instance;
-
-       /* Called when the req is complete and from the DMA ISR context.
-        * When this is called the req structure is no longer queued by
-        * the DMA channel.
-        *
-        * State of the DMA depends on the number of req it has. If there are
-        * no DMA requests queued up, then it will STOP the DMA. It there are
-        * more requests in the DMA, then it will queue the next request.
-        */
-       void (*complete)(struct tegra_dma_req *req);
-
-       /*  This is a called from the DMA ISR context when the DMA is still in
-        *  progress and is actively filling same buffer.
-        *
-        *  In case of continuous mode receive, this threshold is 1/2 the buffer
-        *  size. In other cases, this will not even be called as there is no
-        *  hardware support for it.
-        *
-        * In the case of continuous mode receive, if there is next req already
-        * queued, DMA programs the HW to use that req when this req is
-        * completed. If there is no "next req" queued, then DMA ISR doesn't do
-        * anything before calling this callback.
-        *
-        *      This is mainly used by the cases, where the clients has queued
-        *      only one req and want to get some sort of DMA threshold
-        *      callback to program the next buffer.
-        *
-        */
-       void (*threshold)(struct tegra_dma_req *req);
-
-       /* 1 to copy to memory.
-        * 0 to copy from the memory to device FIFO */
-       int to_memory;
-
-       void *virt_addr;
-
-       unsigned long source_addr;
-       unsigned long dest_addr;
-       unsigned long dest_wrap;
-       unsigned long source_wrap;
-       unsigned long source_bus_width;
-       unsigned long dest_bus_width;
-       unsigned long req_sel;
-       unsigned int size;
-
-       /* Updated by the DMA driver on the conpletion of the request. */
-       int bytes_transferred;
-       int status;
-
-       /* DMA completion tracking information */
-       int buffer_status;
-
-       /* Client specific data */
-       void *dev;
-};
-
-int tegra_dma_enqueue_req(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *req);
-int tegra_dma_dequeue_req(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *req);
-void tegra_dma_dequeue(struct tegra_dma_channel *ch);
-void tegra_dma_flush(struct tegra_dma_channel *ch);
-
-bool tegra_dma_is_req_inflight(struct tegra_dma_channel *ch,
-       struct tegra_dma_req *req);
-bool tegra_dma_is_empty(struct tegra_dma_channel *ch);
-
-struct tegra_dma_channel *tegra_dma_allocate_channel(int mode);
-void tegra_dma_free_channel(struct tegra_dma_channel *ch);
-
-int __init tegra_dma_init(void);
-
 #endif
diff --git a/arch/arm/mach-tegra/include/mach/io.h b/arch/arm/mach-tegra/include/mach/io.h
deleted file mode 100644 (file)
index fe700f9..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * arch/arm/mach-tegra/include/mach/io.h
- *
- * Copyright (C) 2010 Google, Inc.
- *
- * Author:
- *     Colin Cross <ccross@google.com>
- *     Erik Gilling <konkers@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_IO_H
-#define __MACH_TEGRA_IO_H
-
-#define IO_SPACE_LIMIT 0xffff
-
-#ifndef __ASSEMBLER__
-
-#ifdef CONFIG_TEGRA_PCI
-extern void __iomem *tegra_pcie_io_base;
-
-static inline void __iomem *__io(unsigned long addr)
-{
-       return tegra_pcie_io_base + (addr & IO_SPACE_LIMIT);
-}
-#else
-static inline void __iomem *__io(unsigned long addr)
-{
-       return (void __iomem *)addr;
-}
-#endif
-
-#define __io(a)         __io(a)
-
-#endif
-
-#endif
index 7e76da7..fee3a94 100644 (file)
 #define IO_APB_VIRT    IOMEM(0xFE300000)
 #define IO_APB_SIZE    SZ_1M
 
+#define TEGRA_PCIE_BASE                0x80000000
+#define TEGRA_PCIE_IO_BASE     (TEGRA_PCIE_BASE + SZ_4M)
+
 #define IO_TO_VIRT_BETWEEN(p, st, sz)  ((p) >= (st) && (p) < ((st) + (sz)))
 #define IO_TO_VIRT_XLATE(p, pst, vst)  (((p) - (pst) + (vst)))
 
index d3ad515..3463fb5 100644 (file)
@@ -171,8 +171,6 @@ static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
  * 0x90000000 - 0x9fffffff - non-prefetchable memory
  * 0xa0000000 - 0xbfffffff - prefetchable memory
  */
-#define TEGRA_PCIE_BASE                0x80000000
-
 #define PCIE_REGS_SZ           SZ_16K
 #define PCIE_CFG_OFF           PCIE_REGS_SZ
 #define PCIE_CFG_SZ            SZ_1M
@@ -180,8 +178,6 @@ static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
 #define PCIE_EXT_CFG_SZ                SZ_1M
 #define PCIE_IOMAP_SZ          (PCIE_REGS_SZ + PCIE_CFG_SZ + PCIE_EXT_CFG_SZ)
 
-#define MMIO_BASE              (TEGRA_PCIE_BASE + SZ_4M)
-#define MMIO_SIZE              SZ_64K
 #define MEM_BASE_0             (TEGRA_PCIE_BASE + SZ_256M)
 #define MEM_SIZE_0             SZ_128M
 #define MEM_BASE_1             (MEM_BASE_0 + MEM_SIZE_0)
@@ -204,10 +200,9 @@ struct tegra_pcie_port {
 
        bool                    link_up;
 
-       char                    io_space_name[16];
        char                    mem_space_name[16];
        char                    prefetch_space_name[20];
-       struct resource         res[3];
+       struct resource         res[2];
 };
 
 struct tegra_pcie_info {
@@ -223,17 +218,7 @@ struct tegra_pcie_info {
        struct clk              *pll_e;
 };
 
-static struct tegra_pcie_info tegra_pcie = {
-       .res_mmio = {
-               .name = "PCI IO",
-               .start = MMIO_BASE,
-               .end = MMIO_BASE + MMIO_SIZE - 1,
-               .flags = IORESOURCE_MEM,
-       },
-};
-
-void __iomem *tegra_pcie_io_base;
-EXPORT_SYMBOL(tegra_pcie_io_base);
+static struct tegra_pcie_info tegra_pcie;
 
 static inline void afi_writel(u32 value, unsigned long offset)
 {
@@ -391,24 +376,7 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
        pp = tegra_pcie.port + nr;
        pp->root_bus_nr = sys->busnr;
 
-       /*
-        * IORESOURCE_IO
-        */
-       snprintf(pp->io_space_name, sizeof(pp->io_space_name),
-                "PCIe %d I/O", pp->index);
-       pp->io_space_name[sizeof(pp->io_space_name) - 1] = 0;
-       pp->res[0].name = pp->io_space_name;
-       if (pp->index == 0) {
-               pp->res[0].start = PCIBIOS_MIN_IO;
-               pp->res[0].end = pp->res[0].start + SZ_32K - 1;
-       } else {
-               pp->res[0].start = PCIBIOS_MIN_IO + SZ_32K;
-               pp->res[0].end = IO_SPACE_LIMIT;
-       }
-       pp->res[0].flags = IORESOURCE_IO;
-       if (request_resource(&ioport_resource, &pp->res[0]))
-               panic("Request PCIe IO resource failed\n");
-       pci_add_resource_offset(&sys->resources, &pp->res[0], sys->io_offset);
+       pci_ioremap_io(nr * SZ_64K, TEGRA_PCIE_IO_BASE);
 
        /*
         * IORESOURCE_MEM
@@ -416,18 +384,18 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
        snprintf(pp->mem_space_name, sizeof(pp->mem_space_name),
                 "PCIe %d MEM", pp->index);
        pp->mem_space_name[sizeof(pp->mem_space_name) - 1] = 0;
-       pp->res[1].name = pp->mem_space_name;
+       pp->res[0].name = pp->mem_space_name;
        if (pp->index == 0) {
-               pp->res[1].start = MEM_BASE_0;
-               pp->res[1].end = pp->res[1].start + MEM_SIZE_0 - 1;
+               pp->res[0].start = MEM_BASE_0;
+               pp->res[0].end = pp->res[0].start + MEM_SIZE_0 - 1;
        } else {
-               pp->res[1].start = MEM_BASE_1;
-               pp->res[1].end = pp->res[1].start + MEM_SIZE_1 - 1;
+               pp->res[0].start = MEM_BASE_1;
+               pp->res[0].end = pp->res[0].start + MEM_SIZE_1 - 1;
        }
-       pp->res[1].flags = IORESOURCE_MEM;
-       if (request_resource(&iomem_resource, &pp->res[1]))
+       pp->res[0].flags = IORESOURCE_MEM;
+       if (request_resource(&iomem_resource, &pp->res[0]))
                panic("Request PCIe Memory resource failed\n");
-       pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset);
+       pci_add_resource_offset(&sys->resources, &pp->res[0], sys->mem_offset);
 
        /*
         * IORESOURCE_MEM | IORESOURCE_PREFETCH
@@ -435,18 +403,18 @@ static int tegra_pcie_setup(int nr, struct pci_sys_data *sys)
        snprintf(pp->prefetch_space_name, sizeof(pp->prefetch_space_name),
                 "PCIe %d PREFETCH MEM", pp->index);
        pp->prefetch_space_name[sizeof(pp->prefetch_space_name) - 1] = 0;
-       pp->res[2].name = pp->prefetch_space_name;
+       pp->res[1].name = pp->prefetch_space_name;
        if (pp->index == 0) {
-               pp->res[2].start = PREFETCH_MEM_BASE_0;
-               pp->res[2].end = pp->res[2].start + PREFETCH_MEM_SIZE_0 - 1;
+               pp->res[1].start = PREFETCH_MEM_BASE_0;
+               pp->res[1].end = pp->res[1].start + PREFETCH_MEM_SIZE_0 - 1;
        } else {
-               pp->res[2].start = PREFETCH_MEM_BASE_1;
-               pp->res[2].end = pp->res[2].start + PREFETCH_MEM_SIZE_1 - 1;
+               pp->res[1].start = PREFETCH_MEM_BASE_1;
+               pp->res[1].end = pp->res[1].start + PREFETCH_MEM_SIZE_1 - 1;
        }
-       pp->res[2].flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
-       if (request_resource(&iomem_resource, &pp->res[2]))
+       pp->res[1].flags = IORESOURCE_MEM | IORESOURCE_PREFETCH;
+       if (request_resource(&iomem_resource, &pp->res[1]))
                panic("Request PCIe Prefetch Memory resource failed\n");
-       pci_add_resource_offset(&sys->resources, &pp->res[2], sys->mem_offset);
+       pci_add_resource_offset(&sys->resources, &pp->res[1], sys->mem_offset);
 
        return 1;
 }
@@ -541,8 +509,8 @@ static void tegra_pcie_setup_translations(void)
 
        /* Bar 2: downstream IO bar */
        fpci_bar = ((__u32)0xfdfc << 16);
-       size = MMIO_SIZE;
-       axi_address = MMIO_BASE;
+       size = SZ_128K;
+       axi_address = TEGRA_PCIE_IO_BASE;
        afi_writel(axi_address, AFI_AXI_BAR2_START);
        afi_writel(size >> 12, AFI_AXI_BAR2_SZ);
        afi_writel(fpci_bar, AFI_FPCI_BAR2);
@@ -776,7 +744,6 @@ static void tegra_pcie_clocks_put(void)
 
 static int __init tegra_pcie_get_resources(void)
 {
-       struct resource *res_mmio = &tegra_pcie.res_mmio;
        int err;
 
        err = tegra_pcie_clocks_get();
@@ -798,34 +765,16 @@ static int __init tegra_pcie_get_resources(void)
                goto err_map_reg;
        }
 
-       err = request_resource(&iomem_resource, res_mmio);
-       if (err) {
-               pr_err("PCIE: Failed to request resources: %d\n", err);
-               goto err_req_io;
-       }
-
-       tegra_pcie_io_base = ioremap_nocache(res_mmio->start,
-                                            resource_size(res_mmio));
-       if (tegra_pcie_io_base == NULL) {
-               pr_err("PCIE: Failed to map IO\n");
-               err = -ENOMEM;
-               goto err_map_io;
-       }
-
        err = request_irq(INT_PCIE_INTR, tegra_pcie_isr,
                          IRQF_SHARED, "PCIE", &tegra_pcie);
        if (err) {
                pr_err("PCIE: Failed to register IRQ: %d\n", err);
-               goto err_irq;
+               goto err_req_io;
        }
        set_irq_flags(INT_PCIE_INTR, IRQF_VALID);
 
        return 0;
 
-err_irq:
-       iounmap(tegra_pcie_io_base);
-err_map_io:
-       release_resource(&tegra_pcie.res_mmio);
 err_req_io:
        iounmap(tegra_pcie.regs);
 err_map_reg:
index 1a208db..96ed171 100644 (file)
@@ -31,6 +31,7 @@
 #include "fuse.h"
 #include "flowctrl.h"
 #include "reset.h"
+#include "tegra_cpu_car.h"
 
 extern void tegra_secondary_startup(void);
 
@@ -38,17 +39,6 @@ static void __iomem *scu_base = IO_ADDRESS(TEGRA_ARM_PERIF_BASE);
 
 #define EVP_CPU_RESET_VECTOR \
        (IO_ADDRESS(TEGRA_EXCEPTION_VECTORS_BASE) + 0x100)
-#define CLK_RST_CONTROLLER_CLK_CPU_CMPLX \
-       (IO_ADDRESS(TEGRA_CLK_RESET_BASE) + 0x4c)
-#define CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET \
-       (IO_ADDRESS(TEGRA_CLK_RESET_BASE) + 0x340)
-#define CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR \
-       (IO_ADDRESS(TEGRA_CLK_RESET_BASE) + 0x344)
-#define CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR \
-       (IO_ADDRESS(TEGRA_CLK_RESET_BASE) + 0x34c)
-
-#define CPU_CLOCK(cpu) (0x1<<(8+cpu))
-#define CPU_RESET(cpu) (0x1111ul<<(cpu))
 
 void __cpuinit platform_secondary_init(unsigned int cpu)
 {
@@ -63,13 +53,8 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
 
 static int tegra20_power_up_cpu(unsigned int cpu)
 {
-       u32 reg;
-
        /* Enable the CPU clock. */
-       reg = readl(CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
-       writel(reg & ~CPU_CLOCK(cpu), CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
-       barrier();
-       reg = readl(CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+       tegra_enable_cpu_clock(cpu);
 
        /* Clear flow controller CSR. */
        flowctrl_write_cpu_csr(cpu, 0);
@@ -79,7 +64,6 @@ static int tegra20_power_up_cpu(unsigned int cpu)
 
 static int tegra30_power_up_cpu(unsigned int cpu)
 {
-       u32 reg;
        int ret, pwrgateid;
        unsigned long timeout;
 
@@ -103,8 +87,7 @@ static int tegra30_power_up_cpu(unsigned int cpu)
        }
 
        /* CPU partition is powered. Enable the CPU clock. */
-       writel(CPU_CLOCK(cpu), CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR);
-       reg = readl(CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR);
+       tegra_enable_cpu_clock(cpu);
        udelay(10);
 
        /* Remove I/O clamps. */
@@ -128,8 +111,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
         * via the flow controller). This will have no effect on first boot
         * of the CPU since it should already be in reset.
         */
-       writel(CPU_RESET(cpu), CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
-       dmb();
+       tegra_put_cpu_in_reset(cpu);
 
        /*
         * Unhalt the CPU. If the flow controller was used to power-gate the
@@ -155,8 +137,7 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
                goto done;
 
        /* Take the CPU out of reset. */
-       writel(CPU_RESET(cpu), CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR);
-       wmb();
+       tegra_cpu_out_of_reset(cpu);
 done:
        return status;
 }
diff --git a/arch/arm/mach-tegra/sleep-t20.S b/arch/arm/mach-tegra/sleep-t20.S
new file mode 100644 (file)
index 0000000..a36ae41
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2010-2012, NVIDIA Corporation. All rights reserved.
+ * Copyright (c) 2011, Google, Inc.
+ *
+ * Author: Colin Cross <ccross@android.com>
+ *         Gary King <gking@nvidia.com>
+ *
+ * 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/linkage.h>
+
+#include <asm/assembler.h>
+
+#include <mach/iomap.h>
+
+#include "sleep.h"
+#include "flowctrl.h"
+
+#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
+/*
+ * tegra20_hotplug_shutdown(void)
+ *
+ * puts the current cpu in reset
+ * should never return
+ */
+ENTRY(tegra20_hotplug_shutdown)
+       /* Turn off SMP coherency */
+       exit_smp r4, r5
+
+       /* Put this CPU down */
+       cpu_id  r0
+       bl      tegra20_cpu_shutdown
+       mov     pc, lr                  @ should never get here
+ENDPROC(tegra20_hotplug_shutdown)
+
+/*
+ * tegra20_cpu_shutdown(int cpu)
+ *
+ * r0 is cpu to reset
+ *
+ * puts the specified CPU in wait-for-event mode on the flow controller
+ * and puts the CPU in reset
+ * can be called on the current cpu or another cpu
+ * if called on the current cpu, does not return
+ * MUST NOT BE CALLED FOR CPU 0.
+ *
+ * corrupts r0-r3, r12
+ */
+ENTRY(tegra20_cpu_shutdown)
+       cmp     r0, #0
+       moveq   pc, lr                  @ must not be called for CPU 0
+
+       cpu_to_halt_reg r1, r0
+       ldr     r3, =TEGRA_FLOW_CTRL_VIRT
+       mov     r2, #FLOW_CTRL_WAITEVENT | FLOW_CTRL_JTAG_RESUME
+       str     r2, [r3, r1]            @ put flow controller in wait event mode
+       ldr     r2, [r3, r1]
+       isb
+       dsb
+       movw    r1, 0x1011
+       mov     r1, r1, lsl r0
+       ldr     r3, =TEGRA_CLK_RESET_VIRT
+       str     r1, [r3, #0x340]        @ put slave CPU in reset
+       isb
+       dsb
+       cpu_id  r3
+       cmp     r3, r0
+       beq     .
+       mov     pc, lr
+ENDPROC(tegra20_cpu_shutdown)
+#endif
diff --git a/arch/arm/mach-tegra/sleep-t30.S b/arch/arm/mach-tegra/sleep-t30.S
new file mode 100644 (file)
index 0000000..777d9ce
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * 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/linkage.h>
+
+#include <asm/assembler.h>
+
+#include <mach/iomap.h>
+
+#include "sleep.h"
+#include "flowctrl.h"
+
+#define TEGRA30_POWER_HOTPLUG_SHUTDOWN (1 << 27) /* Hotplug shutdown */
+
+#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_PM_SLEEP)
+/*
+ * tegra30_hotplug_shutdown(void)
+ *
+ * Powergates the current CPU.
+ * Should never return.
+ */
+ENTRY(tegra30_hotplug_shutdown)
+       /* Turn off SMP coherency */
+       exit_smp r4, r5
+
+       /* Powergate this CPU */
+       mov     r0, #TEGRA30_POWER_HOTPLUG_SHUTDOWN
+       bl      tegra30_cpu_shutdown
+       mov     pc, lr                  @ should never get here
+ENDPROC(tegra30_hotplug_shutdown)
+
+/*
+ * tegra30_cpu_shutdown(unsigned long flags)
+ *
+ * Puts the current CPU in wait-for-event mode on the flow controller
+ * and powergates it -- flags (in R0) indicate the request type.
+ * Must never be called for CPU 0.
+ *
+ * corrupts r0-r4, r12
+ */
+ENTRY(tegra30_cpu_shutdown)
+       cpu_id  r3
+       cmp     r3, #0
+       moveq   pc, lr          @ Must never be called for CPU 0
+
+       ldr     r12, =TEGRA_FLOW_CTRL_VIRT
+       cpu_to_csr_reg r1, r3
+       add     r1, r1, r12     @ virtual CSR address for this CPU
+       cpu_to_halt_reg r2, r3
+       add     r2, r2, r12     @ virtual HALT_EVENTS address for this CPU
+
+       /*
+        * Clear this CPU's "event" and "interrupt" flags and power gate
+        * it when halting but not before it is in the "WFE" state.
+        */
+       movw    r12, \
+               FLOW_CTRL_CSR_INTR_FLAG | FLOW_CTRL_CSR_EVENT_FLAG | \
+               FLOW_CTRL_CSR_ENABLE
+       mov     r4, #(1 << 4)
+       orr     r12, r12, r4, lsl r3
+       str     r12, [r1]
+
+       /* Halt this CPU. */
+       mov     r3, #0x400
+delay_1:
+       subs    r3, r3, #1                      @ delay as a part of wfe war.
+       bge     delay_1;
+       cpsid   a                               @ disable imprecise aborts.
+       ldr     r3, [r1]                        @ read CSR
+       str     r3, [r1]                        @ clear CSR
+       tst     r0, #TEGRA30_POWER_HOTPLUG_SHUTDOWN
+       movne   r3, #FLOW_CTRL_WAITEVENT                @ For hotplug
+       str     r3, [r2]
+       ldr     r0, [r2]
+       b       wfe_war
+
+__cpu_reset_again:
+       dsb
+       .align 5
+       wfe                                     @ CPU should be power gated here
+wfe_war:
+       b       __cpu_reset_again
+
+       /*
+        * 38 nop's, which fills reset of wfe cache line and
+        * 4 more cachelines with nop
+        */
+       .rept 38
+       nop
+       .endr
+       b       .                               @ should never get here
+
+ENDPROC(tegra30_cpu_shutdown)
+#endif
index d29b156..ea81554 100644 (file)
 #include <mach/iomap.h>
 
 #include "flowctrl.h"
+#include "sleep.h"
 
-#define TEGRA_FLOW_CTRL_VIRT (TEGRA_FLOW_CTRL_BASE - IO_PPSB_PHYS \
-                                       + IO_PPSB_VIRT)
-
-/* returns the offset of the flow controller halt register for a cpu */
-.macro cpu_to_halt_reg rd, rcpu
-       cmp     \rcpu, #0
-       subne   \rd, \rcpu, #1
-       movne   \rd, \rd, lsl #3
-       addne   \rd, \rd, #0x14
-       moveq   \rd, #0
-.endm
-
-/* returns the offset of the flow controller csr register for a cpu */
-.macro cpu_to_csr_reg rd, rcpu
-       cmp     \rcpu, #0
-       subne   \rd, \rcpu, #1
-       movne   \rd, \rd, lsl #3
-       addne   \rd, \rd, #0x18
-       moveq   \rd, #8
-.endm
-
-/* returns the ID of the current processor */
-.macro cpu_id, rd
-       mrc     p15, 0, \rd, c0, c0, 5
-       and     \rd, \rd, #0xF
-.endm
-
-/* loads a 32-bit value into a register without a data access */
-.macro mov32, reg, val
-       movw    \reg, #:lower16:\val
-       movt    \reg, #:upper16:\val
-.endm
diff --git a/arch/arm/mach-tegra/sleep.h b/arch/arm/mach-tegra/sleep.h
new file mode 100644 (file)
index 0000000..e25a7cd
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2010-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_SLEEP_H
+#define __MACH_TEGRA_SLEEP_H
+
+#include <mach/iomap.h>
+
+#define TEGRA_ARM_PERIF_VIRT (TEGRA_ARM_PERIF_BASE - IO_CPU_PHYS \
+                                       + IO_CPU_VIRT)
+#define TEGRA_FLOW_CTRL_VIRT (TEGRA_FLOW_CTRL_BASE - IO_PPSB_PHYS \
+                                       + IO_PPSB_VIRT)
+#define TEGRA_CLK_RESET_VIRT (TEGRA_CLK_RESET_BASE - IO_PPSB_PHYS \
+                                       + IO_PPSB_VIRT)
+
+#ifdef __ASSEMBLY__
+/* returns the offset of the flow controller halt register for a cpu */
+.macro cpu_to_halt_reg rd, rcpu
+       cmp     \rcpu, #0
+       subne   \rd, \rcpu, #1
+       movne   \rd, \rd, lsl #3
+       addne   \rd, \rd, #0x14
+       moveq   \rd, #0
+.endm
+
+/* returns the offset of the flow controller csr register for a cpu */
+.macro cpu_to_csr_reg rd, rcpu
+       cmp     \rcpu, #0
+       subne   \rd, \rcpu, #1
+       movne   \rd, \rd, lsl #3
+       addne   \rd, \rd, #0x18
+       moveq   \rd, #8
+.endm
+
+/* returns the ID of the current processor */
+.macro cpu_id, rd
+       mrc     p15, 0, \rd, c0, c0, 5
+       and     \rd, \rd, #0xF
+.endm
+
+/* loads a 32-bit value into a register without a data access */
+.macro mov32, reg, val
+       movw    \reg, #:lower16:\val
+       movt    \reg, #:upper16:\val
+.endm
+
+/* Macro to exit SMP coherency. */
+.macro exit_smp, tmp1, tmp2
+       mrc     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
+       bic     \tmp1, \tmp1, #(1<<6) | (1<<0)  @ clear ACTLR.SMP | ACTLR.FW
+       mcr     p15, 0, \tmp1, c1, c0, 1        @ ACTLR
+       isb
+       cpu_id  \tmp1
+       mov     \tmp1, \tmp1, lsl #2
+       mov     \tmp2, #0xf
+       mov     \tmp2, \tmp2, lsl \tmp1
+       mov32   \tmp1, TEGRA_ARM_PERIF_VIRT + 0xC
+       str     \tmp2, [\tmp1]                  @ invalidate SCU tags for CPU
+       dsb
+.endm
+#else
+
+#ifdef CONFIG_HOTPLUG_CPU
+void tegra20_hotplug_init(void);
+void tegra30_hotplug_init(void);
+#else
+static inline void tegra20_hotplug_init(void) {}
+static inline void tegra30_hotplug_init(void) {}
+#endif
+
+#endif
+#endif
diff --git a/arch/arm/mach-tegra/tegra20_clocks.c b/arch/arm/mach-tegra/tegra20_clocks.c
new file mode 100644 (file)
index 0000000..9273b0d
--- /dev/null
@@ -0,0 +1,1625 @@
+/*
+ * arch/arm/mach-tegra/tegra20_clocks.c
+ *
+ * Copyright (C) 2010 Google, Inc.
+ * Copyright (c) 2010-2012 NVIDIA CORPORATION.  All rights reserved.
+ *
+ * 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/module.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/clkdev.h>
+#include <linux/clk.h>
+
+#include <mach/iomap.h>
+#include <mach/suspend.h>
+
+#include "clock.h"
+#include "fuse.h"
+#include "tegra2_emc.h"
+#include "tegra_cpu_car.h"
+
+#define RST_DEVICES                    0x004
+#define RST_DEVICES_SET                        0x300
+#define RST_DEVICES_CLR                        0x304
+#define RST_DEVICES_NUM                        3
+
+#define CLK_OUT_ENB                    0x010
+#define CLK_OUT_ENB_SET                        0x320
+#define CLK_OUT_ENB_CLR                        0x324
+#define CLK_OUT_ENB_NUM                        3
+
+#define CLK_MASK_ARM                   0x44
+#define MISC_CLK_ENB                   0x48
+
+#define OSC_CTRL                       0x50
+#define OSC_CTRL_OSC_FREQ_MASK         (3<<30)
+#define OSC_CTRL_OSC_FREQ_13MHZ                (0<<30)
+#define OSC_CTRL_OSC_FREQ_19_2MHZ      (1<<30)
+#define OSC_CTRL_OSC_FREQ_12MHZ                (2<<30)
+#define OSC_CTRL_OSC_FREQ_26MHZ                (3<<30)
+#define OSC_CTRL_MASK                  (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
+
+#define OSC_FREQ_DET                   0x58
+#define OSC_FREQ_DET_TRIG              (1<<31)
+
+#define OSC_FREQ_DET_STATUS            0x5C
+#define OSC_FREQ_DET_BUSY              (1<<31)
+#define OSC_FREQ_DET_CNT_MASK          0xFFFF
+
+#define PERIPH_CLK_SOURCE_I2S1         0x100
+#define PERIPH_CLK_SOURCE_EMC          0x19c
+#define PERIPH_CLK_SOURCE_OSC          0x1fc
+#define PERIPH_CLK_SOURCE_NUM \
+       ((PERIPH_CLK_SOURCE_OSC - PERIPH_CLK_SOURCE_I2S1) / 4)
+
+#define PERIPH_CLK_SOURCE_MASK         (3<<30)
+#define PERIPH_CLK_SOURCE_SHIFT                30
+#define PERIPH_CLK_SOURCE_PWM_MASK     (7<<28)
+#define PERIPH_CLK_SOURCE_PWM_SHIFT    28
+#define PERIPH_CLK_SOURCE_ENABLE       (1<<28)
+#define PERIPH_CLK_SOURCE_DIVU71_MASK  0xFF
+#define PERIPH_CLK_SOURCE_DIVU16_MASK  0xFFFF
+#define PERIPH_CLK_SOURCE_DIV_SHIFT    0
+
+#define SDMMC_CLK_INT_FB_SEL           (1 << 23)
+#define SDMMC_CLK_INT_FB_DLY_SHIFT     16
+#define SDMMC_CLK_INT_FB_DLY_MASK      (0xF << SDMMC_CLK_INT_FB_DLY_SHIFT)
+
+#define PLL_BASE                       0x0
+#define PLL_BASE_BYPASS                        (1<<31)
+#define PLL_BASE_ENABLE                        (1<<30)
+#define PLL_BASE_REF_ENABLE            (1<<29)
+#define PLL_BASE_OVERRIDE              (1<<28)
+#define PLL_BASE_DIVP_MASK             (0x7<<20)
+#define PLL_BASE_DIVP_SHIFT            20
+#define PLL_BASE_DIVN_MASK             (0x3FF<<8)
+#define PLL_BASE_DIVN_SHIFT            8
+#define PLL_BASE_DIVM_MASK             (0x1F)
+#define PLL_BASE_DIVM_SHIFT            0
+
+#define PLL_OUT_RATIO_MASK             (0xFF<<8)
+#define PLL_OUT_RATIO_SHIFT            8
+#define PLL_OUT_OVERRIDE               (1<<2)
+#define PLL_OUT_CLKEN                  (1<<1)
+#define PLL_OUT_RESET_DISABLE          (1<<0)
+
+#define PLL_MISC(c) (((c)->flags & PLL_ALT_MISC_REG) ? 0x4 : 0xc)
+
+#define PLL_MISC_DCCON_SHIFT           20
+#define PLL_MISC_CPCON_SHIFT           8
+#define PLL_MISC_CPCON_MASK            (0xF<<PLL_MISC_CPCON_SHIFT)
+#define PLL_MISC_LFCON_SHIFT           4
+#define PLL_MISC_LFCON_MASK            (0xF<<PLL_MISC_LFCON_SHIFT)
+#define PLL_MISC_VCOCON_SHIFT          0
+#define PLL_MISC_VCOCON_MASK           (0xF<<PLL_MISC_VCOCON_SHIFT)
+
+#define PLLU_BASE_POST_DIV             (1<<20)
+
+#define PLLD_MISC_CLKENABLE            (1<<30)
+#define PLLD_MISC_DIV_RST              (1<<23)
+#define PLLD_MISC_DCCON_SHIFT          12
+
+#define PLLE_MISC_READY                        (1 << 15)
+
+#define PERIPH_CLK_TO_ENB_REG(c)       ((c->u.periph.clk_num / 32) * 4)
+#define PERIPH_CLK_TO_ENB_SET_REG(c)   ((c->u.periph.clk_num / 32) * 8)
+#define PERIPH_CLK_TO_ENB_BIT(c)       (1 << (c->u.periph.clk_num % 32))
+
+#define SUPER_CLK_MUX                  0x00
+#define SUPER_STATE_SHIFT              28
+#define SUPER_STATE_MASK               (0xF << SUPER_STATE_SHIFT)
+#define SUPER_STATE_STANDBY            (0x0 << SUPER_STATE_SHIFT)
+#define SUPER_STATE_IDLE               (0x1 << SUPER_STATE_SHIFT)
+#define SUPER_STATE_RUN                        (0x2 << SUPER_STATE_SHIFT)
+#define SUPER_STATE_IRQ                        (0x3 << SUPER_STATE_SHIFT)
+#define SUPER_STATE_FIQ                        (0x4 << SUPER_STATE_SHIFT)
+#define SUPER_SOURCE_MASK              0xF
+#define        SUPER_FIQ_SOURCE_SHIFT          12
+#define        SUPER_IRQ_SOURCE_SHIFT          8
+#define        SUPER_RUN_SOURCE_SHIFT          4
+#define        SUPER_IDLE_SOURCE_SHIFT         0
+
+#define SUPER_CLK_DIVIDER              0x04
+
+#define BUS_CLK_DISABLE                        (1<<3)
+#define BUS_CLK_DIV_MASK               0x3
+
+#define PMC_CTRL                       0x0
+ #define PMC_CTRL_BLINK_ENB            (1 << 7)
+
+#define PMC_DPD_PADS_ORIDE             0x1c
+ #define PMC_DPD_PADS_ORIDE_BLINK_ENB  (1 << 20)
+
+#define PMC_BLINK_TIMER_DATA_ON_SHIFT  0
+#define PMC_BLINK_TIMER_DATA_ON_MASK   0x7fff
+#define PMC_BLINK_TIMER_ENB            (1 << 15)
+#define PMC_BLINK_TIMER_DATA_OFF_SHIFT 16
+#define PMC_BLINK_TIMER_DATA_OFF_MASK  0xffff
+
+/* Tegra CPU clock and reset control regs */
+#define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX         0x4c
+#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET     0x340
+#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR     0x344
+
+#define CPU_CLOCK(cpu) (0x1 << (8 + cpu))
+#define CPU_RESET(cpu) (0x1111ul << (cpu))
+
+static void __iomem *reg_clk_base = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
+static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
+
+/*
+ * Some clocks share a register with other clocks.  Any clock op that
+ * non-atomically modifies a register used by another clock must lock
+ * clock_register_lock first.
+ */
+static DEFINE_SPINLOCK(clock_register_lock);
+
+/*
+ * Some peripheral clocks share an enable bit, so refcount the enable bits
+ * in registers CLK_ENABLE_L, CLK_ENABLE_H, and CLK_ENABLE_U
+ */
+static int tegra_periph_clk_enable_refcount[3 * 32];
+
+#define clk_writel(value, reg) \
+       __raw_writel(value, reg_clk_base + (reg))
+#define clk_readl(reg) \
+       __raw_readl(reg_clk_base + (reg))
+#define pmc_writel(value, reg) \
+       __raw_writel(value, reg_pmc_base + (reg))
+#define pmc_readl(reg) \
+       __raw_readl(reg_pmc_base + (reg))
+
+static unsigned long clk_measure_input_freq(void)
+{
+       u32 clock_autodetect;
+       clk_writel(OSC_FREQ_DET_TRIG | 1, OSC_FREQ_DET);
+       do {} while (clk_readl(OSC_FREQ_DET_STATUS) & OSC_FREQ_DET_BUSY);
+       clock_autodetect = clk_readl(OSC_FREQ_DET_STATUS);
+       if (clock_autodetect >= 732 - 3 && clock_autodetect <= 732 + 3) {
+               return 12000000;
+       } else if (clock_autodetect >= 794 - 3 && clock_autodetect <= 794 + 3) {
+               return 13000000;
+       } else if (clock_autodetect >= 1172 - 3 && clock_autodetect <= 1172 + 3) {
+               return 19200000;
+       } else if (clock_autodetect >= 1587 - 3 && clock_autodetect <= 1587 + 3) {
+               return 26000000;
+       } else {
+               pr_err("%s: Unexpected clock autodetect value %d",
+                                               __func__, clock_autodetect);
+               BUG();
+               return 0;
+       }
+}
+
+static int clk_div71_get_divider(unsigned long parent_rate, unsigned long rate)
+{
+       s64 divider_u71 = parent_rate * 2;
+       divider_u71 += rate - 1;
+       do_div(divider_u71, rate);
+
+       if (divider_u71 - 2 < 0)
+               return 0;
+
+       if (divider_u71 - 2 > 255)
+               return -EINVAL;
+
+       return divider_u71 - 2;
+}
+
+static int clk_div16_get_divider(unsigned long parent_rate, unsigned long rate)
+{
+       s64 divider_u16;
+
+       divider_u16 = parent_rate;
+       divider_u16 += rate - 1;
+       do_div(divider_u16, rate);
+
+       if (divider_u16 - 1 < 0)
+               return 0;
+
+       if (divider_u16 - 1 > 0xFFFF)
+               return -EINVAL;
+
+       return divider_u16 - 1;
+}
+
+static unsigned long tegra_clk_fixed_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       return to_clk_tegra(hw)->fixed_rate;
+}
+
+struct clk_ops tegra_clk_32k_ops = {
+       .recalc_rate = tegra_clk_fixed_recalc_rate,
+};
+
+/* clk_m functions */
+static unsigned long tegra20_clk_m_recalc_rate(struct clk_hw *hw,
+                       unsigned long prate)
+{
+       if (!to_clk_tegra(hw)->fixed_rate)
+               to_clk_tegra(hw)->fixed_rate = clk_measure_input_freq();
+       return to_clk_tegra(hw)->fixed_rate;
+}
+
+static void tegra20_clk_m_init(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 osc_ctrl = clk_readl(OSC_CTRL);
+       u32 auto_clock_control = osc_ctrl & ~OSC_CTRL_OSC_FREQ_MASK;
+
+       switch (c->fixed_rate) {
+       case 12000000:
+               auto_clock_control |= OSC_CTRL_OSC_FREQ_12MHZ;
+               break;
+       case 13000000:
+               auto_clock_control |= OSC_CTRL_OSC_FREQ_13MHZ;
+               break;
+       case 19200000:
+               auto_clock_control |= OSC_CTRL_OSC_FREQ_19_2MHZ;
+               break;
+       case 26000000:
+               auto_clock_control |= OSC_CTRL_OSC_FREQ_26MHZ;
+               break;
+       default:
+               BUG();
+       }
+       clk_writel(auto_clock_control, OSC_CTRL);
+}
+
+struct clk_ops tegra_clk_m_ops = {
+       .init = tegra20_clk_m_init,
+       .recalc_rate = tegra20_clk_m_recalc_rate,
+};
+
+/* super clock functions */
+/* "super clocks" on tegra have two-stage muxes and a clock skipping
+ * super divider.  We will ignore the clock skipping divider, since we
+ * can't lower the voltage when using the clock skip, but we can if we
+ * lower the PLL frequency.
+ */
+static int tegra20_super_clk_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+
+       val = clk_readl(c->reg + SUPER_CLK_MUX);
+       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
+               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
+       c->state = ON;
+       return c->state;
+}
+
+static int tegra20_super_clk_enable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       clk_writel(0, c->reg + SUPER_CLK_DIVIDER);
+       return 0;
+}
+
+static void tegra20_super_clk_disable(struct clk_hw *hw)
+{
+       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
+
+       /* oops - don't disable the CPU clock! */
+       BUG();
+}
+
+static u8 tegra20_super_clk_get_parent(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       int val = clk_readl(c->reg + SUPER_CLK_MUX);
+       int source;
+       int shift;
+
+       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
+               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
+       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
+               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
+       source = (val >> shift) & SUPER_SOURCE_MASK;
+       return source;
+}
+
+static int tegra20_super_clk_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg + SUPER_CLK_MUX);
+       int shift;
+
+       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
+               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
+       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
+               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
+       val &= ~(SUPER_SOURCE_MASK << shift);
+       val |= index << shift;
+
+       clk_writel(val, c->reg);
+
+       return 0;
+}
+
+/* FIX ME: Need to switch parents to change the source PLL rate */
+static unsigned long tegra20_super_clk_recalc_rate(struct clk_hw *hw,
+                       unsigned long prate)
+{
+       return prate;
+}
+
+static long tegra20_super_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
+{
+       return *prate;
+}
+
+static int tegra20_super_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
+{
+       return 0;
+}
+
+struct clk_ops tegra_super_ops = {
+       .is_enabled = tegra20_super_clk_is_enabled,
+       .enable = tegra20_super_clk_enable,
+       .disable = tegra20_super_clk_disable,
+       .set_parent = tegra20_super_clk_set_parent,
+       .get_parent = tegra20_super_clk_get_parent,
+       .set_rate = tegra20_super_clk_set_rate,
+       .round_rate = tegra20_super_clk_round_rate,
+       .recalc_rate = tegra20_super_clk_recalc_rate,
+};
+
+static unsigned long tegra20_twd_clk_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = parent_rate;
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+
+       return rate;
+}
+
+struct clk_ops tegra_twd_ops = {
+       .recalc_rate = tegra20_twd_clk_recalc_rate,
+};
+
+static u8 tegra20_cop_clk_get_parent(struct clk_hw *hw)
+{
+       return 0;
+}
+
+struct clk_ops tegra_cop_ops = {
+       .get_parent = tegra20_cop_clk_get_parent,
+};
+
+/* virtual cop clock functions. Used to acquire the fake 'cop' clock to
+ * reset the COP block (i.e. AVP) */
+void tegra2_cop_clk_reset(struct clk_hw *hw, bool assert)
+{
+       unsigned long reg = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
+
+       pr_debug("%s %s\n", __func__, assert ? "assert" : "deassert");
+       clk_writel(1 << 1, reg);
+}
+
+/* bus clock functions */
+static int tegra20_bus_clk_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg);
+
+       c->state = ((val >> c->reg_shift) & BUS_CLK_DISABLE) ? OFF : ON;
+       return c->state;
+}
+
+static int tegra20_bus_clk_enable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long flags;
+       u32 val;
+
+       spin_lock_irqsave(&clock_register_lock, flags);
+
+       val = clk_readl(c->reg);
+       val &= ~(BUS_CLK_DISABLE << c->reg_shift);
+       clk_writel(val, c->reg);
+
+       spin_unlock_irqrestore(&clock_register_lock, flags);
+
+       return 0;
+}
+
+static void tegra20_bus_clk_disable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long flags;
+       u32 val;
+
+       spin_lock_irqsave(&clock_register_lock, flags);
+
+       val = clk_readl(c->reg);
+       val |= BUS_CLK_DISABLE << c->reg_shift;
+       clk_writel(val, c->reg);
+
+       spin_unlock_irqrestore(&clock_register_lock, flags);
+}
+
+static unsigned long tegra20_bus_clk_recalc_rate(struct clk_hw *hw,
+                       unsigned long prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg);
+       u64 rate = prate;
+
+       c->div = ((val >> c->reg_shift) & BUS_CLK_DIV_MASK) + 1;
+       c->mul = 1;
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+       return rate;
+}
+
+static int tegra20_bus_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       int ret = -EINVAL;
+       unsigned long flags;
+       u32 val;
+       int i;
+
+       spin_lock_irqsave(&clock_register_lock, flags);
+
+       val = clk_readl(c->reg);
+       for (i = 1; i <= 4; i++) {
+               if (rate == parent_rate / i) {
+                       val &= ~(BUS_CLK_DIV_MASK << c->reg_shift);
+                       val |= (i - 1) << c->reg_shift;
+                       clk_writel(val, c->reg);
+                       c->div = i;
+                       c->mul = 1;
+                       ret = 0;
+                       break;
+               }
+       }
+
+       spin_unlock_irqrestore(&clock_register_lock, flags);
+
+       return ret;
+}
+
+static long tegra20_bus_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
+{
+       unsigned long parent_rate = *prate;
+       s64 divider;
+
+       if (rate >= parent_rate)
+               return rate;
+
+       divider = parent_rate;
+       divider += rate - 1;
+       do_div(divider, rate);
+
+       if (divider < 0)
+               return divider;
+
+       if (divider > 4)
+               divider = 4;
+       do_div(parent_rate, divider);
+
+       return parent_rate;
+}
+
+struct clk_ops tegra_bus_ops = {
+       .is_enabled = tegra20_bus_clk_is_enabled,
+       .enable = tegra20_bus_clk_enable,
+       .disable = tegra20_bus_clk_disable,
+       .set_rate = tegra20_bus_clk_set_rate,
+       .round_rate = tegra20_bus_clk_round_rate,
+       .recalc_rate = tegra20_bus_clk_recalc_rate,
+};
+
+/* Blink output functions */
+static int tegra20_blink_clk_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+
+       val = pmc_readl(PMC_CTRL);
+       c->state = (val & PMC_CTRL_BLINK_ENB) ? ON : OFF;
+       return c->state;
+}
+
+static unsigned long tegra20_blink_clk_recalc_rate(struct clk_hw *hw,
+                       unsigned long prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = prate;
+       u32 val;
+
+       c->mul = 1;
+       val = pmc_readl(c->reg);
+
+       if (val & PMC_BLINK_TIMER_ENB) {
+               unsigned int on_off;
+
+               on_off = (val >> PMC_BLINK_TIMER_DATA_ON_SHIFT) &
+                       PMC_BLINK_TIMER_DATA_ON_MASK;
+               val >>= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
+               val &= PMC_BLINK_TIMER_DATA_OFF_MASK;
+               on_off += val;
+               /* each tick in the blink timer is 4 32KHz clocks */
+               c->div = on_off * 4;
+       } else {
+               c->div = 1;
+       }
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+       return rate;
+}
+
+static int tegra20_blink_clk_enable(struct clk_hw *hw)
+{
+       u32 val;
+
+       val = pmc_readl(PMC_DPD_PADS_ORIDE);
+       pmc_writel(val | PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
+
+       val = pmc_readl(PMC_CTRL);
+       pmc_writel(val | PMC_CTRL_BLINK_ENB, PMC_CTRL);
+
+       return 0;
+}
+
+static void tegra20_blink_clk_disable(struct clk_hw *hw)
+{
+       u32 val;
+
+       val = pmc_readl(PMC_CTRL);
+       pmc_writel(val & ~PMC_CTRL_BLINK_ENB, PMC_CTRL);
+
+       val = pmc_readl(PMC_DPD_PADS_ORIDE);
+       pmc_writel(val & ~PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
+}
+
+static int tegra20_blink_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+
+       if (rate >= parent_rate) {
+               c->div = 1;
+               pmc_writel(0, c->reg);
+       } else {
+               unsigned int on_off;
+               u32 val;
+
+               on_off = DIV_ROUND_UP(parent_rate / 8, rate);
+               c->div = on_off * 8;
+
+               val = (on_off & PMC_BLINK_TIMER_DATA_ON_MASK) <<
+                       PMC_BLINK_TIMER_DATA_ON_SHIFT;
+               on_off &= PMC_BLINK_TIMER_DATA_OFF_MASK;
+               on_off <<= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
+               val |= on_off;
+               val |= PMC_BLINK_TIMER_ENB;
+               pmc_writel(val, c->reg);
+       }
+
+       return 0;
+}
+
+static long tegra20_blink_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
+{
+       int div;
+       int mul;
+       long round_rate = *prate;
+
+       mul = 1;
+
+       if (rate >= *prate) {
+               div = 1;
+       } else {
+               div = DIV_ROUND_UP(*prate / 8, rate);
+               div *= 8;
+       }
+
+       round_rate *= mul;
+       round_rate += div - 1;
+       do_div(round_rate, div);
+
+       return round_rate;
+}
+
+struct clk_ops tegra_blink_clk_ops = {
+       .is_enabled = tegra20_blink_clk_is_enabled,
+       .enable = tegra20_blink_clk_enable,
+       .disable = tegra20_blink_clk_disable,
+       .set_rate = tegra20_blink_clk_set_rate,
+       .round_rate = tegra20_blink_clk_round_rate,
+       .recalc_rate = tegra20_blink_clk_recalc_rate,
+};
+
+/* PLL Functions */
+static int tegra20_pll_clk_wait_for_lock(struct clk_tegra *c)
+{
+       udelay(c->u.pll.lock_delay);
+       return 0;
+}
+
+static int tegra20_pll_clk_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg + PLL_BASE);
+
+       c->state = (val & PLL_BASE_ENABLE) ? ON : OFF;
+       return c->state;
+}
+
+static unsigned long tegra20_pll_clk_recalc_rate(struct clk_hw *hw,
+                               unsigned long prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg + PLL_BASE);
+       u64 rate = prate;
+
+       if (c->flags & PLL_FIXED && !(val & PLL_BASE_OVERRIDE)) {
+               const struct clk_pll_freq_table *sel;
+               for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
+                       if (sel->input_rate == prate &&
+                               sel->output_rate == c->u.pll.fixed_rate) {
+                               c->mul = sel->n;
+                               c->div = sel->m * sel->p;
+                               break;
+                       }
+               }
+               pr_err("Clock %s has unknown fixed frequency\n",
+                       __clk_get_name(hw->clk));
+               BUG();
+       } else if (val & PLL_BASE_BYPASS) {
+               c->mul = 1;
+               c->div = 1;
+       } else {
+               c->mul = (val & PLL_BASE_DIVN_MASK) >> PLL_BASE_DIVN_SHIFT;
+               c->div = (val & PLL_BASE_DIVM_MASK) >> PLL_BASE_DIVM_SHIFT;
+               if (c->flags & PLLU)
+                       c->div *= (val & PLLU_BASE_POST_DIV) ? 1 : 2;
+               else
+                       c->div *= (val & PLL_BASE_DIVP_MASK) ? 2 : 1;
+       }
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+       return rate;
+}
+
+static int tegra20_pll_clk_enable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
+
+       val = clk_readl(c->reg + PLL_BASE);
+       val &= ~PLL_BASE_BYPASS;
+       val |= PLL_BASE_ENABLE;
+       clk_writel(val, c->reg + PLL_BASE);
+
+       tegra20_pll_clk_wait_for_lock(c);
+
+       return 0;
+}
+
+static void tegra20_pll_clk_disable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
+
+       val = clk_readl(c->reg);
+       val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
+       clk_writel(val, c->reg);
+}
+
+static int tegra20_pll_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long input_rate = parent_rate;
+       const struct clk_pll_freq_table *sel;
+       u32 val;
+
+       pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
+
+       if (c->flags & PLL_FIXED) {
+               int ret = 0;
+               if (rate != c->u.pll.fixed_rate) {
+                       pr_err("%s: Can not change %s fixed rate %lu to %lu\n",
+                               __func__, __clk_get_name(hw->clk),
+                               c->u.pll.fixed_rate, rate);
+                       ret = -EINVAL;
+               }
+               return ret;
+       }
+
+       for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
+               if (sel->input_rate == input_rate && sel->output_rate == rate) {
+                       c->mul = sel->n;
+                       c->div = sel->m * sel->p;
+
+                       val = clk_readl(c->reg + PLL_BASE);
+                       if (c->flags & PLL_FIXED)
+                               val |= PLL_BASE_OVERRIDE;
+                       val &= ~(PLL_BASE_DIVP_MASK | PLL_BASE_DIVN_MASK |
+                                PLL_BASE_DIVM_MASK);
+                       val |= (sel->m << PLL_BASE_DIVM_SHIFT) |
+                               (sel->n << PLL_BASE_DIVN_SHIFT);
+                       BUG_ON(sel->p < 1 || sel->p > 2);
+                       if (c->flags & PLLU) {
+                               if (sel->p == 1)
+                                       val |= PLLU_BASE_POST_DIV;
+                       } else {
+                               if (sel->p == 2)
+                                       val |= 1 << PLL_BASE_DIVP_SHIFT;
+                       }
+                       clk_writel(val, c->reg + PLL_BASE);
+
+                       if (c->flags & PLL_HAS_CPCON) {
+                               val = clk_readl(c->reg + PLL_MISC(c));
+                               val &= ~PLL_MISC_CPCON_MASK;
+                               val |= sel->cpcon << PLL_MISC_CPCON_SHIFT;
+                               clk_writel(val, c->reg + PLL_MISC(c));
+                       }
+
+                       if (c->state == ON)
+                               tegra20_pll_clk_enable(hw);
+                       return 0;
+               }
+       }
+       return -EINVAL;
+}
+
+static long tegra20_pll_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       const struct clk_pll_freq_table *sel;
+       unsigned long input_rate = *prate;
+       u64 output_rate = *prate;
+       int mul;
+       int div;
+
+       if (c->flags & PLL_FIXED)
+               return c->u.pll.fixed_rate;
+
+       for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++)
+               if (sel->input_rate == input_rate && sel->output_rate == rate) {
+                       mul = sel->n;
+                       div = sel->m * sel->p;
+                       break;
+               }
+
+       if (sel->input_rate == 0)
+               return -EINVAL;
+
+       output_rate *= mul;
+       output_rate += div - 1; /* round up */
+       do_div(output_rate, div);
+
+       return output_rate;
+}
+
+struct clk_ops tegra_pll_ops = {
+       .is_enabled = tegra20_pll_clk_is_enabled,
+       .enable = tegra20_pll_clk_enable,
+       .disable = tegra20_pll_clk_disable,
+       .set_rate = tegra20_pll_clk_set_rate,
+       .recalc_rate = tegra20_pll_clk_recalc_rate,
+       .round_rate = tegra20_pll_clk_round_rate,
+};
+
+static void tegra20_pllx_clk_init(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+
+       if (tegra_sku_id == 7)
+               c->max_rate = 750000000;
+}
+
+struct clk_ops tegra_pllx_ops = {
+       .init = tegra20_pllx_clk_init,
+       .is_enabled = tegra20_pll_clk_is_enabled,
+       .enable = tegra20_pll_clk_enable,
+       .disable = tegra20_pll_clk_disable,
+       .set_rate = tegra20_pll_clk_set_rate,
+       .recalc_rate = tegra20_pll_clk_recalc_rate,
+       .round_rate = tegra20_pll_clk_round_rate,
+};
+
+static int tegra20_plle_clk_enable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+
+       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
+
+       mdelay(1);
+
+       val = clk_readl(c->reg + PLL_BASE);
+       if (!(val & PLLE_MISC_READY))
+               return -EBUSY;
+
+       val = clk_readl(c->reg + PLL_BASE);
+       val |= PLL_BASE_ENABLE | PLL_BASE_BYPASS;
+       clk_writel(val, c->reg + PLL_BASE);
+
+       return 0;
+}
+
+struct clk_ops tegra_plle_ops = {
+       .is_enabled = tegra20_pll_clk_is_enabled,
+       .enable = tegra20_plle_clk_enable,
+       .set_rate = tegra20_pll_clk_set_rate,
+       .recalc_rate = tegra20_pll_clk_recalc_rate,
+       .round_rate = tegra20_pll_clk_round_rate,
+};
+
+/* Clock divider ops */
+static int tegra20_pll_div_clk_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg);
+
+       val >>= c->reg_shift;
+       c->state = (val & PLL_OUT_CLKEN) ? ON : OFF;
+       if (!(val & PLL_OUT_RESET_DISABLE))
+               c->state = OFF;
+       return c->state;
+}
+
+static unsigned long tegra20_pll_div_clk_recalc_rate(struct clk_hw *hw,
+                       unsigned long prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = prate;
+       u32 val = clk_readl(c->reg);
+       u32 divu71;
+
+       val >>= c->reg_shift;
+
+       if (c->flags & DIV_U71) {
+               divu71 = (val & PLL_OUT_RATIO_MASK) >> PLL_OUT_RATIO_SHIFT;
+               c->div = (divu71 + 2);
+               c->mul = 2;
+       } else if (c->flags & DIV_2) {
+               c->div = 2;
+               c->mul = 1;
+       } else {
+               c->div = 1;
+               c->mul = 1;
+       }
+
+       rate *= c->mul;
+       rate += c->div - 1; /* round up */
+       do_div(rate, c->div);
+
+       return rate;
+}
+
+static int tegra20_pll_div_clk_enable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long flags;
+       u32 new_val;
+       u32 val;
+
+       pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
+
+       if (c->flags & DIV_U71) {
+               spin_lock_irqsave(&clock_register_lock, flags);
+               val = clk_readl(c->reg);
+               new_val = val >> c->reg_shift;
+               new_val &= 0xFFFF;
+
+               new_val |= PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE;
+
+               val &= ~(0xFFFF << c->reg_shift);
+               val |= new_val << c->reg_shift;
+               clk_writel(val, c->reg);
+               spin_unlock_irqrestore(&clock_register_lock, flags);
+               return 0;
+       } else if (c->flags & DIV_2) {
+               BUG_ON(!(c->flags & PLLD));
+               spin_lock_irqsave(&clock_register_lock, flags);
+               val = clk_readl(c->reg);
+               val &= ~PLLD_MISC_DIV_RST;
+               clk_writel(val, c->reg);
+               spin_unlock_irqrestore(&clock_register_lock, flags);
+               return 0;
+       }
+       return -EINVAL;
+}
+
+static void tegra20_pll_div_clk_disable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long flags;
+       u32 new_val;
+       u32 val;
+
+       pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
+
+       if (c->flags & DIV_U71) {
+               spin_lock_irqsave(&clock_register_lock, flags);
+               val = clk_readl(c->reg);
+               new_val = val >> c->reg_shift;
+               new_val &= 0xFFFF;
+
+               new_val &= ~(PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE);
+
+               val &= ~(0xFFFF << c->reg_shift);
+               val |= new_val << c->reg_shift;
+               clk_writel(val, c->reg);
+               spin_unlock_irqrestore(&clock_register_lock, flags);
+       } else if (c->flags & DIV_2) {
+               BUG_ON(!(c->flags & PLLD));
+               spin_lock_irqsave(&clock_register_lock, flags);
+               val = clk_readl(c->reg);
+               val |= PLLD_MISC_DIV_RST;
+               clk_writel(val, c->reg);
+               spin_unlock_irqrestore(&clock_register_lock, flags);
+       }
+}
+
+static int tegra20_pll_div_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long flags;
+       int divider_u71;
+       u32 new_val;
+       u32 val;
+
+       pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
+
+       if (c->flags & DIV_U71) {
+               divider_u71 = clk_div71_get_divider(parent_rate, rate);
+               if (divider_u71 >= 0) {
+                       spin_lock_irqsave(&clock_register_lock, flags);
+                       val = clk_readl(c->reg);
+                       new_val = val >> c->reg_shift;
+                       new_val &= 0xFFFF;
+                       if (c->flags & DIV_U71_FIXED)
+                               new_val |= PLL_OUT_OVERRIDE;
+                       new_val &= ~PLL_OUT_RATIO_MASK;
+                       new_val |= divider_u71 << PLL_OUT_RATIO_SHIFT;
+
+                       val &= ~(0xFFFF << c->reg_shift);
+                       val |= new_val << c->reg_shift;
+                       clk_writel(val, c->reg);
+                       c->div = divider_u71 + 2;
+                       c->mul = 2;
+                       spin_unlock_irqrestore(&clock_register_lock, flags);
+                       return 0;
+               }
+       } else if (c->flags & DIV_2) {
+               if (parent_rate == rate * 2)
+                       return 0;
+       }
+       return -EINVAL;
+}
+
+static long tegra20_pll_div_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long parent_rate = *prate;
+       int divider;
+
+       pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
+
+       if (c->flags & DIV_U71) {
+               divider = clk_div71_get_divider(parent_rate, rate);
+               if (divider < 0)
+                       return divider;
+               return DIV_ROUND_UP(parent_rate * 2, divider + 2);
+       } else if (c->flags & DIV_2) {
+               return DIV_ROUND_UP(parent_rate, 2);
+       }
+       return -EINVAL;
+}
+
+struct clk_ops tegra_pll_div_ops = {
+       .is_enabled = tegra20_pll_div_clk_is_enabled,
+       .enable = tegra20_pll_div_clk_enable,
+       .disable = tegra20_pll_div_clk_disable,
+       .set_rate = tegra20_pll_div_clk_set_rate,
+       .round_rate = tegra20_pll_div_clk_round_rate,
+       .recalc_rate = tegra20_pll_div_clk_recalc_rate,
+};
+
+/* Periph clk ops */
+
+static int tegra20_periph_clk_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+
+       c->state = ON;
+
+       if (!c->u.periph.clk_num)
+               goto out;
+
+       if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
+                       PERIPH_CLK_TO_ENB_BIT(c)))
+               c->state = OFF;
+
+       if (!(c->flags & PERIPH_NO_RESET))
+               if (clk_readl(RST_DEVICES + PERIPH_CLK_TO_ENB_REG(c)) &
+                               PERIPH_CLK_TO_ENB_BIT(c))
+                       c->state = OFF;
+
+out:
+       return c->state;
+}
+
+static int tegra20_periph_clk_enable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long flags;
+       u32 val;
+
+       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
+
+       if (!c->u.periph.clk_num)
+               return 0;
+
+       tegra_periph_clk_enable_refcount[c->u.periph.clk_num]++;
+       if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 1)
+               return 0;
+
+       spin_lock_irqsave(&clock_register_lock, flags);
+
+       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
+               CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
+       if (!(c->flags & PERIPH_NO_RESET) && !(c->flags & PERIPH_MANUAL_RESET))
+               clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
+                       RST_DEVICES_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
+       if (c->flags & PERIPH_EMC_ENB) {
+               /* The EMC peripheral clock has 2 extra enable bits */
+               /* FIXME: Do they need to be disabled? */
+               val = clk_readl(c->reg);
+               val |= 0x3 << 24;
+               clk_writel(val, c->reg);
+       }
+
+       spin_unlock_irqrestore(&clock_register_lock, flags);
+
+       return 0;
+}
+
+static void tegra20_periph_clk_disable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long flags;
+
+       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
+
+       if (!c->u.periph.clk_num)
+               return;
+
+       tegra_periph_clk_enable_refcount[c->u.periph.clk_num]--;
+
+       if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 0)
+               return;
+
+       spin_lock_irqsave(&clock_register_lock, flags);
+
+       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
+               CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
+
+       spin_unlock_irqrestore(&clock_register_lock, flags);
+}
+
+void tegra2_periph_clk_reset(struct clk_hw *hw, bool assert)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long base = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
+
+       pr_debug("%s %s on clock %s\n", __func__,
+               assert ? "assert" : "deassert", __clk_get_name(hw->clk));
+
+       BUG_ON(!c->u.periph.clk_num);
+
+       if (!(c->flags & PERIPH_NO_RESET))
+               clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
+                          base + PERIPH_CLK_TO_ENB_SET_REG(c));
+}
+
+static int tegra20_periph_clk_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+       u32 mask;
+       u32 shift;
+
+       pr_debug("%s: %s %d\n", __func__, __clk_get_name(hw->clk), index);
+
+       if (c->flags & MUX_PWM) {
+               shift = PERIPH_CLK_SOURCE_PWM_SHIFT;
+               mask = PERIPH_CLK_SOURCE_PWM_MASK;
+       } else {
+               shift = PERIPH_CLK_SOURCE_SHIFT;
+               mask = PERIPH_CLK_SOURCE_MASK;
+       }
+
+       val = clk_readl(c->reg);
+       val &= ~mask;
+       val |= (index) << shift;
+
+       clk_writel(val, c->reg);
+
+       return 0;
+}
+
+static u8 tegra20_periph_clk_get_parent(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg);
+       u32 mask;
+       u32 shift;
+
+       if (c->flags & MUX_PWM) {
+               shift = PERIPH_CLK_SOURCE_PWM_SHIFT;
+               mask = PERIPH_CLK_SOURCE_PWM_MASK;
+       } else {
+               shift = PERIPH_CLK_SOURCE_SHIFT;
+               mask = PERIPH_CLK_SOURCE_MASK;
+       }
+
+       if (c->flags & MUX)
+               return (val & mask) >> shift;
+       else
+               return 0;
+}
+
+static unsigned long tegra20_periph_clk_recalc_rate(struct clk_hw *hw,
+                       unsigned long prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long rate = prate;
+       u32 val = clk_readl(c->reg);
+
+       if (c->flags & DIV_U71) {
+               u32 divu71 = val & PERIPH_CLK_SOURCE_DIVU71_MASK;
+               c->div = divu71 + 2;
+               c->mul = 2;
+       } else if (c->flags & DIV_U16) {
+               u32 divu16 = val & PERIPH_CLK_SOURCE_DIVU16_MASK;
+               c->div = divu16 + 1;
+               c->mul = 1;
+       } else {
+               c->div = 1;
+               c->mul = 1;
+               return rate;
+       }
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+
+       return rate;
+}
+
+static int tegra20_periph_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+       int divider;
+
+       val = clk_readl(c->reg);
+
+       if (c->flags & DIV_U71) {
+               divider = clk_div71_get_divider(parent_rate, rate);
+
+               if (divider >= 0) {
+                       val = clk_readl(c->reg);
+                       val &= ~PERIPH_CLK_SOURCE_DIVU71_MASK;
+                       val |= divider;
+                       clk_writel(val, c->reg);
+                       c->div = divider + 2;
+                       c->mul = 2;
+                       return 0;
+               }
+       } else if (c->flags & DIV_U16) {
+               divider = clk_div16_get_divider(parent_rate, rate);
+               if (divider >= 0) {
+                       val = clk_readl(c->reg);
+                       val &= ~PERIPH_CLK_SOURCE_DIVU16_MASK;
+                       val |= divider;
+                       clk_writel(val, c->reg);
+                       c->div = divider + 1;
+                       c->mul = 1;
+                       return 0;
+               }
+       } else if (parent_rate <= rate) {
+               c->div = 1;
+               c->mul = 1;
+               return 0;
+       }
+
+       return -EINVAL;
+}
+
+static long tegra20_periph_clk_round_rate(struct clk_hw *hw,
+       unsigned long rate, unsigned long *prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long parent_rate = __clk_get_rate(__clk_get_parent(hw->clk));
+       int divider;
+
+       pr_debug("%s: %s %lu\n", __func__, __clk_get_name(hw->clk), rate);
+
+       if (prate)
+               parent_rate = *prate;
+
+       if (c->flags & DIV_U71) {
+               divider = clk_div71_get_divider(parent_rate, rate);
+               if (divider < 0)
+                       return divider;
+
+               return DIV_ROUND_UP(parent_rate * 2, divider + 2);
+       } else if (c->flags & DIV_U16) {
+               divider = clk_div16_get_divider(parent_rate, rate);
+               if (divider < 0)
+                       return divider;
+               return DIV_ROUND_UP(parent_rate, divider + 1);
+       }
+       return -EINVAL;
+}
+
+struct clk_ops tegra_periph_clk_ops = {
+       .is_enabled = tegra20_periph_clk_is_enabled,
+       .enable = tegra20_periph_clk_enable,
+       .disable = tegra20_periph_clk_disable,
+       .set_parent = tegra20_periph_clk_set_parent,
+       .get_parent = tegra20_periph_clk_get_parent,
+       .set_rate = tegra20_periph_clk_set_rate,
+       .round_rate = tegra20_periph_clk_round_rate,
+       .recalc_rate = tegra20_periph_clk_recalc_rate,
+};
+
+/* External memory controller clock ops */
+static void tegra20_emc_clk_init(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       c->max_rate = __clk_get_rate(hw->clk);
+}
+
+static long tegra20_emc_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       long emc_rate;
+       long clk_rate;
+
+       /*
+        * The slowest entry in the EMC clock table that is at least as
+        * fast as rate.
+        */
+       emc_rate = tegra_emc_round_rate(rate);
+       if (emc_rate < 0)
+               return c->max_rate;
+
+       /*
+        * The fastest rate the PLL will generate that is at most the
+        * requested rate.
+        */
+       clk_rate = tegra20_periph_clk_round_rate(hw, emc_rate, NULL);
+
+       /*
+        * If this fails, and emc_rate > clk_rate, it's because the maximum
+        * rate in the EMC tables is larger than the maximum rate of the EMC
+        * clock. The EMC clock's max rate is the rate it was running when the
+        * kernel booted. Such a mismatch is probably due to using the wrong
+        * BCT, i.e. using a Tegra20 BCT with an EMC table written for Tegra25.
+        */
+       WARN_ONCE(emc_rate != clk_rate,
+               "emc_rate %ld != clk_rate %ld",
+               emc_rate, clk_rate);
+
+       return emc_rate;
+}
+
+static int tegra20_emc_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
+{
+       int ret;
+
+       /*
+        * The Tegra2 memory controller has an interlock with the clock
+        * block that allows memory shadowed registers to be updated,
+        * and then transfer them to the main registers at the same
+        * time as the clock update without glitches.
+        */
+       ret = tegra_emc_set_rate(rate);
+       if (ret < 0)
+               return ret;
+
+       ret = tegra20_periph_clk_set_rate(hw, rate, parent_rate);
+       udelay(1);
+
+       return ret;
+}
+
+struct clk_ops tegra_emc_clk_ops = {
+       .init = tegra20_emc_clk_init,
+       .is_enabled = tegra20_periph_clk_is_enabled,
+       .enable = tegra20_periph_clk_enable,
+       .disable = tegra20_periph_clk_disable,
+       .set_parent = tegra20_periph_clk_set_parent,
+       .get_parent = tegra20_periph_clk_get_parent,
+       .set_rate = tegra20_emc_clk_set_rate,
+       .round_rate = tegra20_emc_clk_round_rate,
+       .recalc_rate = tegra20_periph_clk_recalc_rate,
+};
+
+/* Clock doubler ops */
+static int tegra20_clk_double_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+
+       c->state = ON;
+
+       if (!c->u.periph.clk_num)
+               goto out;
+
+       if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
+                       PERIPH_CLK_TO_ENB_BIT(c)))
+               c->state = OFF;
+
+out:
+       return c->state;
+};
+
+static unsigned long tegra20_clk_double_recalc_rate(struct clk_hw *hw,
+                       unsigned long prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = prate;
+
+       c->mul = 2;
+       c->div = 1;
+
+       rate *= c->mul;
+       rate += c->div - 1; /* round up */
+       do_div(rate, c->div);
+
+       return rate;
+}
+
+static long tegra20_clk_double_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
+{
+       unsigned long output_rate = *prate;
+
+       do_div(output_rate, 2);
+       return output_rate;
+}
+
+static int tegra20_clk_double_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
+{
+       if (rate != 2 * parent_rate)
+               return -EINVAL;
+       return 0;
+}
+
+struct clk_ops tegra_clk_double_ops = {
+       .is_enabled = tegra20_clk_double_is_enabled,
+       .enable = tegra20_periph_clk_enable,
+       .disable = tegra20_periph_clk_disable,
+       .set_rate = tegra20_clk_double_set_rate,
+       .recalc_rate = tegra20_clk_double_recalc_rate,
+       .round_rate = tegra20_clk_double_round_rate,
+};
+
+/* Audio sync clock ops */
+static int tegra20_audio_sync_clk_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg);
+
+       c->state = (val & (1<<4)) ? OFF : ON;
+       return c->state;
+}
+
+static int tegra20_audio_sync_clk_enable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+
+       clk_writel(0, c->reg);
+       return 0;
+}
+
+static void tegra20_audio_sync_clk_disable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       clk_writel(1, c->reg);
+}
+
+static u8 tegra20_audio_sync_clk_get_parent(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg);
+       int source;
+
+       source = val & 0xf;
+       return source;
+}
+
+static int tegra20_audio_sync_clk_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+
+       val = clk_readl(c->reg);
+       val &= ~0xf;
+       val |= index;
+
+       clk_writel(val, c->reg);
+
+       return 0;
+}
+
+struct clk_ops tegra_audio_sync_clk_ops = {
+       .is_enabled = tegra20_audio_sync_clk_is_enabled,
+       .enable = tegra20_audio_sync_clk_enable,
+       .disable = tegra20_audio_sync_clk_disable,
+       .set_parent = tegra20_audio_sync_clk_set_parent,
+       .get_parent = tegra20_audio_sync_clk_get_parent,
+};
+
+/* cdev1 and cdev2 (dap_mclk1 and dap_mclk2) ops */
+
+static int tegra20_cdev_clk_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       /* We could un-tristate the cdev1 or cdev2 pingroup here; this is
+        * currently done in the pinmux code. */
+       c->state = ON;
+
+       BUG_ON(!c->u.periph.clk_num);
+
+       if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
+                       PERIPH_CLK_TO_ENB_BIT(c)))
+               c->state = OFF;
+       return c->state;
+}
+
+static int tegra20_cdev_clk_enable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       BUG_ON(!c->u.periph.clk_num);
+
+       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
+               CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
+       return 0;
+}
+
+static void tegra20_cdev_clk_disable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       BUG_ON(!c->u.periph.clk_num);
+
+       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
+               CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
+}
+
+static unsigned long tegra20_cdev_recalc_rate(struct clk_hw *hw,
+                       unsigned long prate)
+{
+       return to_clk_tegra(hw)->fixed_rate;
+}
+
+struct clk_ops tegra_cdev_clk_ops = {
+       .is_enabled = tegra20_cdev_clk_is_enabled,
+       .enable = tegra20_cdev_clk_enable,
+       .disable = tegra20_cdev_clk_disable,
+       .recalc_rate = tegra20_cdev_recalc_rate,
+};
+
+/* Tegra20 CPU clock and reset control functions */
+static void tegra20_wait_cpu_in_reset(u32 cpu)
+{
+       unsigned int reg;
+
+       do {
+               reg = readl(reg_clk_base +
+                           TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
+               cpu_relax();
+       } while (!(reg & (1 << cpu)));  /* check CPU been reset or not */
+
+       return;
+}
+
+static void tegra20_put_cpu_in_reset(u32 cpu)
+{
+       writel(CPU_RESET(cpu),
+              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
+       dmb();
+}
+
+static void tegra20_cpu_out_of_reset(u32 cpu)
+{
+       writel(CPU_RESET(cpu),
+              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR);
+       wmb();
+}
+
+static void tegra20_enable_cpu_clock(u32 cpu)
+{
+       unsigned int reg;
+
+       reg = readl(reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+       writel(reg & ~CPU_CLOCK(cpu),
+              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+       barrier();
+       reg = readl(reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+}
+
+static void tegra20_disable_cpu_clock(u32 cpu)
+{
+       unsigned int reg;
+
+       reg = readl(reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+       writel(reg | CPU_CLOCK(cpu),
+              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+}
+
+static struct tegra_cpu_car_ops tegra20_cpu_car_ops = {
+       .wait_for_reset = tegra20_wait_cpu_in_reset,
+       .put_in_reset   = tegra20_put_cpu_in_reset,
+       .out_of_reset   = tegra20_cpu_out_of_reset,
+       .enable_clock   = tegra20_enable_cpu_clock,
+       .disable_clock  = tegra20_disable_cpu_clock,
+};
+
+void __init tegra20_cpu_car_ops_init(void)
+{
+       tegra_cpu_car_ops = &tegra20_cpu_car_ops;
+}
diff --git a/arch/arm/mach-tegra/tegra20_clocks.h b/arch/arm/mach-tegra/tegra20_clocks.h
new file mode 100644 (file)
index 0000000..8bfd31b
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * 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_TEGRA20_CLOCK_H
+#define __MACH_TEGRA20_CLOCK_H
+
+extern struct clk_ops tegra_clk_32k_ops;
+extern struct clk_ops tegra_pll_ops;
+extern struct clk_ops tegra_clk_m_ops;
+extern struct clk_ops tegra_pll_div_ops;
+extern struct clk_ops tegra_pllx_ops;
+extern struct clk_ops tegra_plle_ops;
+extern struct clk_ops tegra_clk_double_ops;
+extern struct clk_ops tegra_cdev_clk_ops;
+extern struct clk_ops tegra_audio_sync_clk_ops;
+extern struct clk_ops tegra_super_ops;
+extern struct clk_ops tegra_cpu_ops;
+extern struct clk_ops tegra_twd_ops;
+extern struct clk_ops tegra_cop_ops;
+extern struct clk_ops tegra_bus_ops;
+extern struct clk_ops tegra_blink_clk_ops;
+extern struct clk_ops tegra_emc_clk_ops;
+extern struct clk_ops tegra_periph_clk_ops;
+extern struct clk_ops tegra_clk_shared_bus_ops;
+
+void tegra2_periph_clk_reset(struct clk_hw *hw, bool assert);
+void tegra2_cop_clk_reset(struct clk_hw *hw, bool assert);
+
+#endif
diff --git a/arch/arm/mach-tegra/tegra20_clocks_data.c b/arch/arm/mach-tegra/tegra20_clocks_data.c
new file mode 100644 (file)
index 0000000..e81dcd2
--- /dev/null
@@ -0,0 +1,1144 @@
+/*
+ * arch/arm/mach-tegra/tegra2_clocks.c
+ *
+ * Copyright (C) 2010 Google, Inc.
+ * Copyright (c) 2012 NVIDIA CORPORATION.  All rights reserved.
+ *
+ * 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/clk-private.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <linux/delay.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+
+#include <mach/iomap.h>
+#include <mach/suspend.h>
+
+#include "clock.h"
+#include "fuse.h"
+#include "tegra2_emc.h"
+#include "tegra20_clocks.h"
+#include "tegra_cpu_car.h"
+
+/* Clock definitions */
+
+#define DEFINE_CLK_TEGRA(_name, _rate, _ops, _flags,           \
+                  _parent_names, _parents, _parent)            \
+       static struct clk tegra_##_name = {                     \
+               .hw = &tegra_##_name##_hw.hw,                   \
+               .name = #_name,                                 \
+               .rate = _rate,                                  \
+               .ops = _ops,                                    \
+               .flags = _flags,                                \
+               .parent_names = _parent_names,                  \
+               .parents = _parents,                            \
+               .num_parents = ARRAY_SIZE(_parent_names),       \
+               .parent = _parent,                              \
+       };
+
+static struct clk tegra_clk_32k;
+static struct clk_tegra tegra_clk_32k_hw = {
+       .hw = {
+               .clk = &tegra_clk_32k,
+       },
+       .fixed_rate = 32768,
+};
+
+static struct clk tegra_clk_32k = {
+       .name = "clk_32k",
+       .rate = 32768,
+       .ops = &tegra_clk_32k_ops,
+       .hw = &tegra_clk_32k_hw.hw,
+       .flags = CLK_IS_ROOT,
+};
+
+static struct clk tegra_clk_m;
+static struct clk_tegra tegra_clk_m_hw = {
+       .hw = {
+               .clk = &tegra_clk_m,
+       },
+       .flags = ENABLE_ON_INIT,
+       .reg = 0x1fc,
+       .reg_shift = 28,
+       .max_rate = 26000000,
+       .fixed_rate = 0,
+};
+
+static struct clk tegra_clk_m = {
+       .name = "clk_m",
+       .ops = &tegra_clk_m_ops,
+       .hw = &tegra_clk_m_hw.hw,
+       .flags = CLK_IS_ROOT,
+};
+
+#define DEFINE_PLL(_name, _flags, _reg, _max_rate, _input_min, \
+                  _input_max, _cf_min, _cf_max, _vco_min,      \
+                  _vco_max, _freq_table, _lock_delay, _ops,    \
+                  _fixed_rate, _parent)                        \
+       static const char *tegra_##_name##_parent_names[] = {   \
+               #_parent,                                       \
+       };                                                      \
+       static struct clk *tegra_##_name##_parents[] = {        \
+               &tegra_##_parent,                               \
+       };                                                      \
+       static struct clk tegra_##_name;                        \
+       static struct clk_tegra tegra_##_name##_hw = {          \
+               .hw = {                                         \
+                       .clk = &tegra_##_name,                  \
+               },                                              \
+               .flags = _flags,                                \
+               .reg = _reg,                                    \
+               .max_rate = _max_rate,                          \
+               .u.pll = {                                      \
+                       .input_min = _input_min,                \
+                       .input_max = _input_max,                \
+                       .cf_min = _cf_min,                      \
+                       .cf_max = _cf_max,                      \
+                       .vco_min = _vco_min,                    \
+                       .vco_max = _vco_max,                    \
+                       .freq_table = _freq_table,              \
+                       .lock_delay = _lock_delay,              \
+                       .fixed_rate = _fixed_rate,              \
+               },                                              \
+       };                                                      \
+       static struct clk tegra_##_name = {                     \
+               .name = #_name,                                 \
+               .ops = &_ops,                                   \
+               .hw = &tegra_##_name##_hw.hw,                   \
+               .parent = &tegra_##_parent,                     \
+               .parent_names = tegra_##_name##_parent_names,   \
+               .parents = tegra_##_name##_parents,             \
+               .num_parents = 1,                               \
+       };
+
+#define DEFINE_PLL_OUT(_name, _flags, _reg, _reg_shift,                \
+               _max_rate, _ops, _parent, _clk_flags)           \
+       static const char *tegra_##_name##_parent_names[] = {   \
+               #_parent,                                       \
+       };                                                      \
+       static struct clk *tegra_##_name##_parents[] = {        \
+               &tegra_##_parent,                               \
+       };                                                      \
+       static struct clk tegra_##_name;                        \
+       static struct clk_tegra tegra_##_name##_hw = {          \
+               .hw = {                                         \
+                       .clk = &tegra_##_name,                  \
+               },                                              \
+               .flags = _flags,                                \
+               .reg = _reg,                                    \
+               .max_rate = _max_rate,                          \
+               .reg_shift = _reg_shift,                        \
+       };                                                      \
+       static struct clk tegra_##_name = {                     \
+               .name = #_name,                                 \
+               .ops = &tegra_pll_div_ops,                      \
+               .hw = &tegra_##_name##_hw.hw,                   \
+               .parent = &tegra_##_parent,                     \
+               .parent_names = tegra_##_name##_parent_names,   \
+               .parents = tegra_##_name##_parents,             \
+               .num_parents = 1,                               \
+               .flags = _clk_flags,                            \
+       };
+
+
+static struct clk_pll_freq_table tegra_pll_s_freq_table[] = {
+       {32768, 12000000, 366, 1, 1, 0},
+       {32768, 13000000, 397, 1, 1, 0},
+       {32768, 19200000, 586, 1, 1, 0},
+       {32768, 26000000, 793, 1, 1, 0},
+       {0, 0, 0, 0, 0, 0},
+};
+
+DEFINE_PLL(pll_s, PLL_ALT_MISC_REG, 0xf0, 26000000, 32768, 32768, 0,
+               0, 12000000, 26000000, tegra_pll_s_freq_table, 300,
+               tegra_pll_ops, 0, clk_32k);
+
+static struct clk_pll_freq_table tegra_pll_c_freq_table[] = {
+       { 12000000, 600000000, 600, 12, 1, 8 },
+       { 13000000, 600000000, 600, 13, 1, 8 },
+       { 19200000, 600000000, 500, 16, 1, 6 },
+       { 26000000, 600000000, 600, 26, 1, 8 },
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_c, PLL_HAS_CPCON, 0x80, 600000000, 2000000, 31000000, 1000000,
+               6000000, 20000000, 1400000000, tegra_pll_c_freq_table, 300,
+               tegra_pll_ops, 0, clk_m);
+
+DEFINE_PLL_OUT(pll_c_out1, DIV_U71, 0x84, 0, 600000000,
+               tegra_pll_div_ops, pll_c, 0);
+
+static struct clk_pll_freq_table tegra_pll_m_freq_table[] = {
+       { 12000000, 666000000, 666, 12, 1, 8},
+       { 13000000, 666000000, 666, 13, 1, 8},
+       { 19200000, 666000000, 555, 16, 1, 8},
+       { 26000000, 666000000, 666, 26, 1, 8},
+       { 12000000, 600000000, 600, 12, 1, 8},
+       { 13000000, 600000000, 600, 13, 1, 8},
+       { 19200000, 600000000, 375, 12, 1, 6},
+       { 26000000, 600000000, 600, 26, 1, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_m, PLL_HAS_CPCON, 0x90, 800000000, 2000000, 31000000, 1000000,
+               6000000, 20000000, 1200000000, tegra_pll_m_freq_table, 300,
+               tegra_pll_ops, 0, clk_m);
+
+DEFINE_PLL_OUT(pll_m_out1, DIV_U71, 0x94, 0, 600000000,
+               tegra_pll_div_ops, pll_m, 0);
+
+static struct clk_pll_freq_table tegra_pll_p_freq_table[] = {
+       { 12000000, 216000000, 432, 12, 2, 8},
+       { 13000000, 216000000, 432, 13, 2, 8},
+       { 19200000, 216000000, 90,   4, 2, 1},
+       { 26000000, 216000000, 432, 26, 2, 8},
+       { 12000000, 432000000, 432, 12, 1, 8},
+       { 13000000, 432000000, 432, 13, 1, 8},
+       { 19200000, 432000000, 90,   4, 1, 1},
+       { 26000000, 432000000, 432, 26, 1, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+
+DEFINE_PLL(pll_p, ENABLE_ON_INIT | PLL_FIXED | PLL_HAS_CPCON, 0xa0, 432000000,
+               2000000, 31000000, 1000000, 6000000, 20000000, 1400000000,
+               tegra_pll_p_freq_table, 300, tegra_pll_ops, 216000000, clk_m);
+
+DEFINE_PLL_OUT(pll_p_out1, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa4, 0,
+               432000000, tegra_pll_div_ops, pll_p, 0);
+DEFINE_PLL_OUT(pll_p_out2, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa4, 16,
+               432000000, tegra_pll_div_ops, pll_p, 0);
+DEFINE_PLL_OUT(pll_p_out3, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa8, 0,
+               432000000, tegra_pll_div_ops, pll_p, 0);
+DEFINE_PLL_OUT(pll_p_out4, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa8, 16,
+               432000000, tegra_pll_div_ops, pll_p, 0);
+
+static struct clk_pll_freq_table tegra_pll_a_freq_table[] = {
+       { 28800000, 56448000, 49, 25, 1, 1},
+       { 28800000, 73728000, 64, 25, 1, 1},
+       { 28800000, 24000000,  5,  6, 1, 1},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_a, PLL_HAS_CPCON, 0xb0, 73728000, 2000000, 31000000, 1000000,
+               6000000, 20000000, 1400000000, tegra_pll_a_freq_table, 300,
+               tegra_pll_ops, 0, pll_p_out1);
+
+DEFINE_PLL_OUT(pll_a_out0, DIV_U71, 0xb4, 0, 73728000,
+               tegra_pll_div_ops, pll_a, 0);
+
+static struct clk_pll_freq_table tegra_pll_d_freq_table[] = {
+       { 12000000, 216000000, 216, 12, 1, 4},
+       { 13000000, 216000000, 216, 13, 1, 4},
+       { 19200000, 216000000, 135, 12, 1, 3},
+       { 26000000, 216000000, 216, 26, 1, 4},
+
+       { 12000000, 594000000, 594, 12, 1, 8},
+       { 13000000, 594000000, 594, 13, 1, 8},
+       { 19200000, 594000000, 495, 16, 1, 8},
+       { 26000000, 594000000, 594, 26, 1, 8},
+
+       { 12000000, 1000000000, 1000, 12, 1, 12},
+       { 13000000, 1000000000, 1000, 13, 1, 12},
+       { 19200000, 1000000000, 625,  12, 1, 8},
+       { 26000000, 1000000000, 1000, 26, 1, 12},
+
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_d, PLL_HAS_CPCON | PLLD, 0xd0, 1000000000, 2000000, 40000000,
+               1000000, 6000000, 40000000, 1000000000, tegra_pll_d_freq_table,
+               1000, tegra_pll_ops, 0, clk_m);
+
+DEFINE_PLL_OUT(pll_d_out0, DIV_2 | PLLD, 0, 0, 500000000,
+               tegra_pll_div_ops, pll_d, CLK_SET_RATE_PARENT);
+
+static struct clk_pll_freq_table tegra_pll_u_freq_table[] = {
+       { 12000000, 480000000, 960, 12, 2, 0},
+       { 13000000, 480000000, 960, 13, 2, 0},
+       { 19200000, 480000000, 200, 4,  2, 0},
+       { 26000000, 480000000, 960, 26, 2, 0},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_u, PLLU, 0xc0, 480000000, 2000000, 40000000, 1000000, 6000000,
+               48000000, 960000000, tegra_pll_u_freq_table, 1000,
+               tegra_pll_ops, 0, clk_m);
+
+static struct clk_pll_freq_table tegra_pll_x_freq_table[] = {
+       /* 1 GHz */
+       { 12000000, 1000000000, 1000, 12, 1, 12},
+       { 13000000, 1000000000, 1000, 13, 1, 12},
+       { 19200000, 1000000000, 625,  12, 1, 8},
+       { 26000000, 1000000000, 1000, 26, 1, 12},
+
+       /* 912 MHz */
+       { 12000000, 912000000,  912,  12, 1, 12},
+       { 13000000, 912000000,  912,  13, 1, 12},
+       { 19200000, 912000000,  760,  16, 1, 8},
+       { 26000000, 912000000,  912,  26, 1, 12},
+
+       /* 816 MHz */
+       { 12000000, 816000000,  816,  12, 1, 12},
+       { 13000000, 816000000,  816,  13, 1, 12},
+       { 19200000, 816000000,  680,  16, 1, 8},
+       { 26000000, 816000000,  816,  26, 1, 12},
+
+       /* 760 MHz */
+       { 12000000, 760000000,  760,  12, 1, 12},
+       { 13000000, 760000000,  760,  13, 1, 12},
+       { 19200000, 760000000,  950,  24, 1, 8},
+       { 26000000, 760000000,  760,  26, 1, 12},
+
+       /* 750 MHz */
+       { 12000000, 750000000,  750,  12, 1, 12},
+       { 13000000, 750000000,  750,  13, 1, 12},
+       { 19200000, 750000000,  625,  16, 1, 8},
+       { 26000000, 750000000,  750,  26, 1, 12},
+
+       /* 608 MHz */
+       { 12000000, 608000000,  608,  12, 1, 12},
+       { 13000000, 608000000,  608,  13, 1, 12},
+       { 19200000, 608000000,  380,  12, 1, 8},
+       { 26000000, 608000000,  608,  26, 1, 12},
+
+       /* 456 MHz */
+       { 12000000, 456000000,  456,  12, 1, 12},
+       { 13000000, 456000000,  456,  13, 1, 12},
+       { 19200000, 456000000,  380,  16, 1, 8},
+       { 26000000, 456000000,  456,  26, 1, 12},
+
+       /* 312 MHz */
+       { 12000000, 312000000,  312,  12, 1, 12},
+       { 13000000, 312000000,  312,  13, 1, 12},
+       { 19200000, 312000000,  260,  16, 1, 8},
+       { 26000000, 312000000,  312,  26, 1, 12},
+
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_x, PLL_HAS_CPCON | PLL_ALT_MISC_REG, 0xe0, 1000000000, 2000000,
+               31000000, 1000000, 6000000, 20000000, 1200000000,
+               tegra_pll_x_freq_table, 300, tegra_pllx_ops, 0, clk_m);
+
+static struct clk_pll_freq_table tegra_pll_e_freq_table[] = {
+       { 12000000, 100000000,  200,  24, 1, 0 },
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_e, PLL_ALT_MISC_REG, 0xe8, 100000000, 12000000, 12000000, 0, 0,
+               0, 0, tegra_pll_e_freq_table, 0, tegra_plle_ops, 0, clk_m);
+
+static const char *tegra_common_parent_names[] = {
+       "clk_m",
+};
+
+static struct clk *tegra_common_parents[] = {
+       &tegra_clk_m,
+};
+
+static struct clk tegra_clk_d;
+static struct clk_tegra tegra_clk_d_hw = {
+       .hw = {
+               .clk = &tegra_clk_d,
+       },
+       .flags = PERIPH_NO_RESET,
+       .reg = 0x34,
+       .reg_shift = 12,
+       .max_rate = 52000000,
+       .u.periph = {
+               .clk_num = 90,
+       },
+};
+
+static struct clk tegra_clk_d = {
+       .name = "clk_d",
+       .hw = &tegra_clk_d_hw.hw,
+       .ops = &tegra_clk_double_ops,
+       .parent = &tegra_clk_m,
+       .parent_names = tegra_common_parent_names,
+       .parents = tegra_common_parents,
+       .num_parents = ARRAY_SIZE(tegra_common_parent_names),
+};
+
+static struct clk tegra_cdev1;
+static struct clk_tegra tegra_cdev1_hw = {
+       .hw = {
+               .clk = &tegra_cdev1,
+       },
+       .fixed_rate = 26000000,
+       .u.periph = {
+               .clk_num = 94,
+       },
+};
+static struct clk tegra_cdev1 = {
+       .name = "cdev1",
+       .hw = &tegra_cdev1_hw.hw,
+       .ops = &tegra_cdev_clk_ops,
+       .flags = CLK_IS_ROOT,
+};
+
+/* dap_mclk2, belongs to the cdev2 pingroup. */
+static struct clk tegra_cdev2;
+static struct clk_tegra tegra_cdev2_hw = {
+       .hw = {
+               .clk = &tegra_cdev2,
+       },
+       .fixed_rate = 26000000,
+       .u.periph = {
+               .clk_num  = 93,
+       },
+};
+static struct clk tegra_cdev2 = {
+       .name = "cdev2",
+       .hw = &tegra_cdev2_hw.hw,
+       .ops = &tegra_cdev_clk_ops,
+       .flags = CLK_IS_ROOT,
+};
+
+/* initialized before peripheral clocks */
+static struct clk_mux_sel mux_audio_sync_clk[8+1];
+static const struct audio_sources {
+       const char *name;
+       int value;
+} mux_audio_sync_clk_sources[] = {
+       { .name = "spdif_in", .value = 0 },
+       { .name = "i2s1", .value = 1 },
+       { .name = "i2s2", .value = 2 },
+       { .name = "pll_a_out0", .value = 4 },
+#if 0 /* FIXME: not implemented */
+       { .name = "ac97", .value = 3 },
+       { .name = "ext_audio_clk2", .value = 5 },
+       { .name = "ext_audio_clk1", .value = 6 },
+       { .name = "ext_vimclk", .value = 7 },
+#endif
+       { NULL, 0 }
+};
+
+static const char *audio_parent_names[] = {
+       "spdif_in",
+       "i2s1",
+       "i2s2",
+       "dummy",
+       "pll_a_out0",
+       "dummy",
+       "dummy",
+       "dummy",
+};
+
+static struct clk *audio_parents[] = {
+       NULL,
+       NULL,
+       NULL,
+       NULL,
+       NULL,
+       NULL,
+       NULL,
+       NULL,
+};
+
+static struct clk tegra_audio;
+static struct clk_tegra tegra_audio_hw = {
+       .hw = {
+               .clk = &tegra_audio,
+       },
+       .reg = 0x38,
+       .max_rate = 73728000,
+};
+DEFINE_CLK_TEGRA(audio, 0, &tegra_audio_sync_clk_ops, 0, audio_parent_names,
+               audio_parents, NULL);
+
+static const char *audio_2x_parent_names[] = {
+       "audio",
+};
+
+static struct clk *audio_2x_parents[] = {
+       &tegra_audio,
+};
+
+static struct clk tegra_audio_2x;
+static struct clk_tegra tegra_audio_2x_hw = {
+       .hw = {
+               .clk = &tegra_audio_2x,
+       },
+       .flags = PERIPH_NO_RESET,
+       .max_rate = 48000000,
+       .reg = 0x34,
+       .reg_shift = 8,
+       .u.periph = {
+               .clk_num = 89,
+       },
+};
+DEFINE_CLK_TEGRA(audio_2x, 0, &tegra_clk_double_ops, 0, audio_2x_parent_names,
+               audio_2x_parents, &tegra_audio);
+
+static struct clk_lookup tegra_audio_clk_lookups[] = {
+       { .con_id = "audio", .clk = &tegra_audio },
+       { .con_id = "audio_2x", .clk = &tegra_audio_2x }
+};
+
+/* This is called after peripheral clocks are initialized, as the
+ * audio_sync clock depends on some of the peripheral clocks.
+ */
+
+static void init_audio_sync_clock_mux(void)
+{
+       int i;
+       struct clk_mux_sel *sel = mux_audio_sync_clk;
+       const struct audio_sources *src = mux_audio_sync_clk_sources;
+       struct clk_lookup *lookup;
+
+       for (i = 0; src->name; i++, sel++, src++) {
+               sel->input = tegra_get_clock_by_name(src->name);
+               if (!sel->input)
+                       pr_err("%s: could not find clk %s\n", __func__,
+                               src->name);
+               audio_parents[src->value] = sel->input;
+               sel->value = src->value;
+       }
+
+       lookup = tegra_audio_clk_lookups;
+       for (i = 0; i < ARRAY_SIZE(tegra_audio_clk_lookups); i++, lookup++) {
+               struct clk *c = lookup->clk;
+               struct clk_tegra *clk = to_clk_tegra(c->hw);
+               __clk_init(NULL, c);
+               INIT_LIST_HEAD(&clk->shared_bus_list);
+               clk->lookup.con_id = lookup->con_id;
+               clk->lookup.clk = c;
+               clkdev_add(&clk->lookup);
+               tegra_clk_add(c);
+       }
+}
+
+static const char *mux_cclk[] = {
+       "clk_m",
+       "pll_c",
+       "clk_32k",
+       "pll_m",
+       "pll_p",
+       "pll_p_out4",
+       "pll_p_out3",
+       "clk_d",
+       "pll_x",
+};
+
+
+static struct clk *mux_cclk_p[] = {
+       &tegra_clk_m,
+       &tegra_pll_c,
+       &tegra_clk_32k,
+       &tegra_pll_m,
+       &tegra_pll_p,
+       &tegra_pll_p_out4,
+       &tegra_pll_p_out3,
+       &tegra_clk_d,
+       &tegra_pll_x,
+};
+
+static const char *mux_sclk[] = {
+       "clk_m",
+       "pll_c_out1",
+       "pll_p_out4",
+       "pllp_p_out3",
+       "pll_p_out2",
+       "clk_d",
+       "clk_32k",
+       "pll_m_out1",
+};
+
+static struct clk *mux_sclk_p[] = {
+       &tegra_clk_m,
+       &tegra_pll_c_out1,
+       &tegra_pll_p_out4,
+       &tegra_pll_p_out3,
+       &tegra_pll_p_out2,
+       &tegra_clk_d,
+       &tegra_clk_32k,
+       &tegra_pll_m_out1,
+};
+
+static struct clk tegra_cclk;
+static struct clk_tegra tegra_cclk_hw = {
+       .hw = {
+               .clk = &tegra_cclk,
+       },
+       .reg = 0x20,
+       .max_rate = 1000000000,
+};
+DEFINE_CLK_TEGRA(cclk, 0, &tegra_super_ops, 0, mux_cclk,
+               mux_cclk_p, NULL);
+
+static const char *mux_twd[] = {
+       "cclk",
+};
+
+static struct clk *mux_twd_p[] = {
+       &tegra_cclk,
+};
+
+static struct clk tegra_clk_twd;
+static struct clk_tegra tegra_clk_twd_hw = {
+       .hw = {
+               .clk = &tegra_clk_twd,
+       },
+       .max_rate = 1000000000,
+       .mul = 1,
+       .div = 4,
+};
+
+static struct clk tegra_clk_twd = {
+       .name = "twd",
+       .ops = &tegra_twd_ops,
+       .hw = &tegra_clk_twd_hw.hw,
+       .parent = &tegra_cclk,
+       .parent_names = mux_twd,
+       .parents = mux_twd_p,
+       .num_parents = ARRAY_SIZE(mux_twd),
+};
+
+static struct clk tegra_sclk;
+static struct clk_tegra tegra_sclk_hw = {
+       .hw = {
+               .clk = &tegra_sclk,
+       },
+       .reg = 0x28,
+       .max_rate = 240000000,
+       .min_rate = 120000000,
+};
+DEFINE_CLK_TEGRA(sclk, 0, &tegra_super_ops, 0, mux_sclk,
+               mux_sclk_p, NULL);
+
+static const char *tegra_cop_parent_names[] = {
+       "tegra_sclk",
+};
+
+static struct clk *tegra_cop_parents[] = {
+       &tegra_sclk,
+};
+
+static struct clk tegra_cop;
+static struct clk_tegra tegra_cop_hw = {
+       .hw = {
+               .clk = &tegra_cop,
+       },
+       .max_rate  = 240000000,
+       .reset = &tegra2_cop_clk_reset,
+};
+DEFINE_CLK_TEGRA(cop, 0, &tegra_cop_ops, CLK_SET_RATE_PARENT,
+               tegra_cop_parent_names, tegra_cop_parents, &tegra_sclk);
+
+static const char *tegra_hclk_parent_names[] = {
+       "tegra_sclk",
+};
+
+static struct clk *tegra_hclk_parents[] = {
+       &tegra_sclk,
+};
+
+static struct clk tegra_hclk;
+static struct clk_tegra tegra_hclk_hw = {
+       .hw = {
+               .clk = &tegra_hclk,
+       },
+       .flags = DIV_BUS,
+       .reg = 0x30,
+       .reg_shift = 4,
+       .max_rate = 240000000,
+};
+DEFINE_CLK_TEGRA(hclk, 0, &tegra_bus_ops, 0, tegra_hclk_parent_names,
+               tegra_hclk_parents, &tegra_sclk);
+
+static const char *tegra_pclk_parent_names[] = {
+       "tegra_hclk",
+};
+
+static struct clk *tegra_pclk_parents[] = {
+       &tegra_hclk,
+};
+
+static struct clk tegra_pclk;
+static struct clk_tegra tegra_pclk_hw = {
+       .hw = {
+               .clk = &tegra_pclk,
+       },
+       .flags = DIV_BUS,
+       .reg = 0x30,
+       .reg_shift = 0,
+       .max_rate = 120000000,
+};
+DEFINE_CLK_TEGRA(pclk, 0, &tegra_bus_ops, 0, tegra_pclk_parent_names,
+               tegra_pclk_parents, &tegra_hclk);
+
+static const char *tegra_blink_parent_names[] = {
+       "clk_32k",
+};
+
+static struct clk *tegra_blink_parents[] = {
+       &tegra_clk_32k,
+};
+
+static struct clk tegra_blink;
+static struct clk_tegra tegra_blink_hw = {
+       .hw = {
+               .clk = &tegra_blink,
+       },
+       .reg = 0x40,
+       .max_rate = 32768,
+};
+DEFINE_CLK_TEGRA(blink, 0, &tegra_blink_clk_ops, 0, tegra_blink_parent_names,
+               tegra_blink_parents, &tegra_clk_32k);
+
+static const char *mux_pllm_pllc_pllp_plla[] = {
+       "pll_m",
+       "pll_c",
+       "pll_p",
+       "pll_a_out0",
+};
+
+static struct clk *mux_pllm_pllc_pllp_plla_p[] = {
+       &tegra_pll_m,
+       &tegra_pll_c,
+       &tegra_pll_p,
+       &tegra_pll_a_out0,
+};
+
+static const char *mux_pllm_pllc_pllp_clkm[] = {
+       "pll_m",
+       "pll_c",
+       "pll_p",
+       "clk_m",
+};
+
+static struct clk *mux_pllm_pllc_pllp_clkm_p[] = {
+       &tegra_pll_m,
+       &tegra_pll_c,
+       &tegra_pll_p,
+       &tegra_clk_m,
+};
+
+static const char *mux_pllp_pllc_pllm_clkm[] = {
+       "pll_p",
+       "pll_c",
+       "pll_m",
+       "clk_m",
+};
+
+static struct clk *mux_pllp_pllc_pllm_clkm_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_c,
+       &tegra_pll_m,
+       &tegra_clk_m,
+};
+
+static const char *mux_pllaout0_audio2x_pllp_clkm[] = {
+       "pll_a_out0",
+       "audio_2x",
+       "pll_p",
+       "clk_m",
+};
+
+static struct clk *mux_pllaout0_audio2x_pllp_clkm_p[] = {
+       &tegra_pll_a_out0,
+       &tegra_audio_2x,
+       &tegra_pll_p,
+       &tegra_clk_m,
+};
+
+static const char *mux_pllp_plld_pllc_clkm[] = {
+       "pllp",
+       "pll_d_out0",
+       "pll_c",
+       "clk_m",
+};
+
+static struct clk *mux_pllp_plld_pllc_clkm_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_d_out0,
+       &tegra_pll_c,
+       &tegra_clk_m,
+};
+
+static const char *mux_pllp_pllc_audio_clkm_clk32[] = {
+       "pll_p",
+       "pll_c",
+       "audio",
+       "clk_m",
+       "clk_32k",
+};
+
+static struct clk *mux_pllp_pllc_audio_clkm_clk32_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_c,
+       &tegra_audio,
+       &tegra_clk_m,
+       &tegra_clk_32k,
+};
+
+static const char *mux_pllp_pllc_pllm[] = {
+       "pll_p",
+       "pll_c",
+       "pll_m"
+};
+
+static struct clk *mux_pllp_pllc_pllm_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_c,
+       &tegra_pll_m,
+};
+
+static const char *mux_clk_m[] = {
+       "clk_m",
+};
+
+static struct clk *mux_clk_m_p[] = {
+       &tegra_clk_m,
+};
+
+static const char *mux_pllp_out3[] = {
+       "pll_p_out3",
+};
+
+static struct clk *mux_pllp_out3_p[] = {
+       &tegra_pll_p_out3,
+};
+
+static const char *mux_plld[] = {
+       "pll_d",
+};
+
+static struct clk *mux_plld_p[] = {
+       &tegra_pll_d,
+};
+
+static const char *mux_clk_32k[] = {
+       "clk_32k",
+};
+
+static struct clk *mux_clk_32k_p[] = {
+       &tegra_clk_32k,
+};
+
+static const char *mux_pclk[] = {
+       "pclk",
+};
+
+static struct clk *mux_pclk_p[] = {
+       &tegra_pclk,
+};
+
+static struct clk tegra_emc;
+static struct clk_tegra tegra_emc_hw = {
+       .hw = {
+               .clk = &tegra_emc,
+       },
+       .reg = 0x19c,
+       .max_rate = 800000000,
+       .flags = MUX | DIV_U71 | PERIPH_EMC_ENB,
+       .reset = &tegra2_periph_clk_reset,
+       .u.periph = {
+               .clk_num = 57,
+       },
+};
+DEFINE_CLK_TEGRA(emc, 0, &tegra_emc_clk_ops, 0, mux_pllm_pllc_pllp_clkm,
+               mux_pllm_pllc_pllp_clkm_p, NULL);
+
+#define PERIPH_CLK(_name, _dev, _con, _clk_num, _reg,  \
+               _max, _inputs, _flags)                  \
+       static struct clk tegra_##_name;                \
+       static struct clk_tegra tegra_##_name##_hw = {  \
+               .hw = {                                 \
+                       .clk = &tegra_##_name,          \
+               },                                      \
+               .lookup = {                             \
+                       .dev_id = _dev,                 \
+                       .con_id = _con,                 \
+               },                                      \
+               .reg = _reg,                            \
+               .flags = _flags,                        \
+               .max_rate = _max,                       \
+               .u.periph = {                           \
+                       .clk_num = _clk_num,            \
+               },                                      \
+               .reset = tegra2_periph_clk_reset,       \
+       };                                              \
+       static struct clk tegra_##_name = {             \
+               .name = #_name,                         \
+               .ops = &tegra_periph_clk_ops,           \
+               .hw = &tegra_##_name##_hw.hw,           \
+               .parent_names = _inputs,                \
+               .parents = _inputs##_p,                 \
+               .num_parents = ARRAY_SIZE(_inputs),     \
+       };
+
+PERIPH_CLK(apbdma,     "tegra-apbdma",         NULL,   34,     0,      108000000, mux_pclk,                    0);
+PERIPH_CLK(rtc,                "rtc-tegra",            NULL,   4,      0,      32768,     mux_clk_32k,                 PERIPH_NO_RESET);
+PERIPH_CLK(timer,      "timer",                NULL,   5,      0,      26000000,  mux_clk_m,                   0);
+PERIPH_CLK(i2s1,       "tegra20-i2s.0",        NULL,   11,     0x100,  26000000,  mux_pllaout0_audio2x_pllp_clkm,      MUX | DIV_U71);
+PERIPH_CLK(i2s2,       "tegra20-i2s.1",        NULL,   18,     0x104,  26000000,  mux_pllaout0_audio2x_pllp_clkm,      MUX | DIV_U71);
+PERIPH_CLK(spdif_out,  "spdif_out",            NULL,   10,     0x108,  100000000, mux_pllaout0_audio2x_pllp_clkm,      MUX | DIV_U71);
+PERIPH_CLK(spdif_in,   "spdif_in",             NULL,   10,     0x10c,  100000000, mux_pllp_pllc_pllm,          MUX | DIV_U71);
+PERIPH_CLK(pwm,                "tegra-pwm",            NULL,   17,     0x110,  432000000, mux_pllp_pllc_audio_clkm_clk32,      MUX | DIV_U71 | MUX_PWM);
+PERIPH_CLK(spi,                "spi",                  NULL,   43,     0x114,  40000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(xio,                "xio",                  NULL,   45,     0x120,  150000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(twc,                "twc",                  NULL,   16,     0x12c,  150000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(sbc1,       "spi_tegra.0",          NULL,   41,     0x134,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(sbc2,       "spi_tegra.1",          NULL,   44,     0x118,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(sbc3,       "spi_tegra.2",          NULL,   46,     0x11c,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(sbc4,       "spi_tegra.3",          NULL,   68,     0x1b4,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(ide,                "ide",                  NULL,   25,     0x144,  100000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(ndflash,    "tegra_nand",           NULL,   13,     0x160,  164000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(vfir,       "vfir",                 NULL,   7,      0x168,  72000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(sdmmc1,     "sdhci-tegra.0",        NULL,   14,     0x150,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(sdmmc2,     "sdhci-tegra.1",        NULL,   9,      0x154,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(sdmmc3,     "sdhci-tegra.2",        NULL,   69,     0x1bc,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(sdmmc4,     "sdhci-tegra.3",        NULL,   15,     0x164,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(vcp,                "tegra-avp",            "vcp",  29,     0,      250000000, mux_clk_m,                   0);
+PERIPH_CLK(bsea,       "tegra-avp",            "bsea", 62,     0,      250000000, mux_clk_m,                   0);
+PERIPH_CLK(bsev,       "tegra-aes",            "bsev", 63,     0,      250000000, mux_clk_m,                   0);
+PERIPH_CLK(vde,                "tegra-avp",            "vde",  61,     0x1c8,  250000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage and process_id */
+PERIPH_CLK(csite,      "csite",                NULL,   73,     0x1d4,  144000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* max rate ??? */
+/* FIXME: what is la? */
+PERIPH_CLK(la,         "la",                   NULL,   76,     0x1f8,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(owr,                "tegra_w1",             NULL,   71,     0x1cc,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(nor,                "nor",                  NULL,   42,     0x1d0,  92000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(mipi,       "mipi",                 NULL,   50,     0x174,  60000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(i2c1,       "tegra-i2c.0",          NULL,   12,     0x124,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16);
+PERIPH_CLK(i2c2,       "tegra-i2c.1",          NULL,   54,     0x198,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16);
+PERIPH_CLK(i2c3,       "tegra-i2c.2",          NULL,   67,     0x1b8,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16);
+PERIPH_CLK(dvc,                "tegra-i2c.3",          NULL,   47,     0x128,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16);
+PERIPH_CLK(i2c1_i2c,   "tegra-i2c.0",          "i2c",  0,      0,      72000000,  mux_pllp_out3,                       0);
+PERIPH_CLK(i2c2_i2c,   "tegra-i2c.1",          "i2c",  0,      0,      72000000,  mux_pllp_out3,                       0);
+PERIPH_CLK(i2c3_i2c,   "tegra-i2c.2",          "i2c",  0,      0,      72000000,  mux_pllp_out3,                       0);
+PERIPH_CLK(dvc_i2c,    "tegra-i2c.3",          "i2c",  0,      0,      72000000,  mux_pllp_out3,                       0);
+PERIPH_CLK(uarta,      "tegra-uart.0",         NULL,   6,      0x178,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
+PERIPH_CLK(uartb,      "tegra-uart.1",         NULL,   7,      0x17c,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
+PERIPH_CLK(uartc,      "tegra-uart.2",         NULL,   55,     0x1a0,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
+PERIPH_CLK(uartd,      "tegra-uart.3",         NULL,   65,     0x1c0,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
+PERIPH_CLK(uarte,      "tegra-uart.4",         NULL,   66,     0x1c4,  600000000, mux_pllp_pllc_pllm_clkm,     MUX);
+PERIPH_CLK(3d,         "3d",                   NULL,   24,     0x158,  300000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | PERIPH_MANUAL_RESET); /* scales with voltage and process_id */
+PERIPH_CLK(2d,         "2d",                   NULL,   21,     0x15c,  300000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
+PERIPH_CLK(vi,         "tegra_camera",         "vi",   20,     0x148,  150000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
+PERIPH_CLK(vi_sensor,  "tegra_camera",         "vi_sensor",    20,     0x1a8,  150000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | PERIPH_NO_RESET); /* scales with voltage and process_id */
+PERIPH_CLK(epp,                "epp",                  NULL,   19,     0x16c,  300000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
+PERIPH_CLK(mpe,                "mpe",                  NULL,   60,     0x170,  250000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
+PERIPH_CLK(host1x,     "host1x",               NULL,   28,     0x180,  166000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71); /* scales with voltage and process_id */
+PERIPH_CLK(cve,                "cve",                  NULL,   49,     0x140,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(tvo,                "tvo",                  NULL,   49,     0x188,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(hdmi,       "hdmi",                 NULL,   51,     0x18c,  600000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(tvdac,      "tvdac",                NULL,   53,     0x194,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(disp1,      "tegradc.0",            NULL,   27,     0x138,  600000000, mux_pllp_plld_pllc_clkm,     MUX); /* scales with voltage and process_id */
+PERIPH_CLK(disp2,      "tegradc.1",            NULL,   26,     0x13c,  600000000, mux_pllp_plld_pllc_clkm,     MUX); /* scales with voltage and process_id */
+PERIPH_CLK(usbd,       "fsl-tegra-udc",        NULL,   22,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
+PERIPH_CLK(usb2,       "tegra-ehci.1",         NULL,   58,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
+PERIPH_CLK(usb3,       "tegra-ehci.2",         NULL,   59,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
+PERIPH_CLK(dsi,                "dsi",                  NULL,   48,     0,      500000000, mux_plld,                    0); /* scales with voltage */
+PERIPH_CLK(csi,                "tegra_camera",         "csi",  52,     0,      72000000,  mux_pllp_out3,               0);
+PERIPH_CLK(isp,                "tegra_camera",         "isp",  23,     0,      150000000, mux_clk_m,                   0); /* same frequency as VI */
+PERIPH_CLK(csus,       "tegra_camera",         "csus", 92,     0,      150000000, mux_clk_m,                   PERIPH_NO_RESET);
+PERIPH_CLK(pex,                NULL,                   "pex",  70,     0,      26000000,  mux_clk_m,                   PERIPH_MANUAL_RESET);
+PERIPH_CLK(afi,                NULL,                   "afi",  72,     0,      26000000,  mux_clk_m,                   PERIPH_MANUAL_RESET);
+PERIPH_CLK(pcie_xclk,  NULL,             "pcie_xclk",  74,     0,      26000000,  mux_clk_m,                   PERIPH_MANUAL_RESET);
+
+static struct clk *tegra_list_clks[] = {
+       &tegra_apbdma,
+       &tegra_rtc,
+       &tegra_i2s1,
+       &tegra_i2s2,
+       &tegra_spdif_out,
+       &tegra_spdif_in,
+       &tegra_pwm,
+       &tegra_spi,
+       &tegra_xio,
+       &tegra_twc,
+       &tegra_sbc1,
+       &tegra_sbc2,
+       &tegra_sbc3,
+       &tegra_sbc4,
+       &tegra_ide,
+       &tegra_ndflash,
+       &tegra_vfir,
+       &tegra_sdmmc1,
+       &tegra_sdmmc2,
+       &tegra_sdmmc3,
+       &tegra_sdmmc4,
+       &tegra_vcp,
+       &tegra_bsea,
+       &tegra_bsev,
+       &tegra_vde,
+       &tegra_csite,
+       &tegra_la,
+       &tegra_owr,
+       &tegra_nor,
+       &tegra_mipi,
+       &tegra_i2c1,
+       &tegra_i2c2,
+       &tegra_i2c3,
+       &tegra_dvc,
+       &tegra_i2c1_i2c,
+       &tegra_i2c2_i2c,
+       &tegra_i2c3_i2c,
+       &tegra_dvc_i2c,
+       &tegra_uarta,
+       &tegra_uartb,
+       &tegra_uartc,
+       &tegra_uartd,
+       &tegra_uarte,
+       &tegra_3d,
+       &tegra_2d,
+       &tegra_vi,
+       &tegra_vi_sensor,
+       &tegra_epp,
+       &tegra_mpe,
+       &tegra_host1x,
+       &tegra_cve,
+       &tegra_tvo,
+       &tegra_hdmi,
+       &tegra_tvdac,
+       &tegra_disp1,
+       &tegra_disp2,
+       &tegra_usbd,
+       &tegra_usb2,
+       &tegra_usb3,
+       &tegra_dsi,
+       &tegra_csi,
+       &tegra_isp,
+       &tegra_csus,
+       &tegra_pex,
+       &tegra_afi,
+       &tegra_pcie_xclk,
+};
+
+#define CLK_DUPLICATE(_name, _dev, _con)       \
+       {                                       \
+               .name   = _name,                \
+               .lookup = {                     \
+                       .dev_id = _dev,         \
+                       .con_id = _con,         \
+               },                              \
+       }
+
+/* Some clocks may be used by different drivers depending on the board
+ * configuration.  List those here to register them twice in the clock lookup
+ * table under two names.
+ */
+static struct clk_duplicate tegra_clk_duplicates[] = {
+       CLK_DUPLICATE("uarta",  "serial8250.0", NULL),
+       CLK_DUPLICATE("uartb",  "serial8250.1", NULL),
+       CLK_DUPLICATE("uartc",  "serial8250.2", NULL),
+       CLK_DUPLICATE("uartd",  "serial8250.3", NULL),
+       CLK_DUPLICATE("uarte",  "serial8250.4", NULL),
+       CLK_DUPLICATE("usbd",   "utmip-pad",    NULL),
+       CLK_DUPLICATE("usbd",   "tegra-ehci.0", NULL),
+       CLK_DUPLICATE("usbd",   "tegra-otg",    NULL),
+       CLK_DUPLICATE("hdmi",   "tegradc.0",    "hdmi"),
+       CLK_DUPLICATE("hdmi",   "tegradc.1",    "hdmi"),
+       CLK_DUPLICATE("host1x", "tegra_grhost", "host1x"),
+       CLK_DUPLICATE("2d",     "tegra_grhost", "gr2d"),
+       CLK_DUPLICATE("3d",     "tegra_grhost", "gr3d"),
+       CLK_DUPLICATE("epp",    "tegra_grhost", "epp"),
+       CLK_DUPLICATE("mpe",    "tegra_grhost", "mpe"),
+       CLK_DUPLICATE("cop",    "tegra-avp",    "cop"),
+       CLK_DUPLICATE("vde",    "tegra-aes",    "vde"),
+       CLK_DUPLICATE("cclk",   NULL,           "cpu"),
+       CLK_DUPLICATE("twd",    "smp_twd",      NULL),
+};
+
+#define CLK(dev, con, ck)      \
+       {                       \
+               .dev_id = dev,  \
+               .con_id = con,  \
+               .clk    = ck,   \
+       }
+
+static struct clk *tegra_ptr_clks[] = {
+       &tegra_clk_32k,
+       &tegra_pll_s,
+       &tegra_clk_m,
+       &tegra_pll_m,
+       &tegra_pll_m_out1,
+       &tegra_pll_c,
+       &tegra_pll_c_out1,
+       &tegra_pll_p,
+       &tegra_pll_p_out1,
+       &tegra_pll_p_out2,
+       &tegra_pll_p_out3,
+       &tegra_pll_p_out4,
+       &tegra_pll_a,
+       &tegra_pll_a_out0,
+       &tegra_pll_d,
+       &tegra_pll_d_out0,
+       &tegra_pll_u,
+       &tegra_pll_x,
+       &tegra_pll_e,
+       &tegra_cclk,
+       &tegra_clk_twd,
+       &tegra_sclk,
+       &tegra_hclk,
+       &tegra_pclk,
+       &tegra_clk_d,
+       &tegra_cdev1,
+       &tegra_cdev2,
+       &tegra_blink,
+       &tegra_cop,
+       &tegra_emc,
+};
+
+static void tegra2_init_one_clock(struct clk *c)
+{
+       struct clk_tegra *clk = to_clk_tegra(c->hw);
+       int ret;
+
+       ret = __clk_init(NULL, c);
+       if (ret)
+               pr_err("clk init failed %s\n", __clk_get_name(c));
+
+       INIT_LIST_HEAD(&clk->shared_bus_list);
+       if (!clk->lookup.dev_id && !clk->lookup.con_id)
+               clk->lookup.con_id = c->name;
+       clk->lookup.clk = c;
+       clkdev_add(&clk->lookup);
+       tegra_clk_add(c);
+}
+
+void __init tegra2_init_clocks(void)
+{
+       int i;
+       struct clk *c;
+
+       for (i = 0; i < ARRAY_SIZE(tegra_ptr_clks); i++)
+               tegra2_init_one_clock(tegra_ptr_clks[i]);
+
+       for (i = 0; i < ARRAY_SIZE(tegra_list_clks); i++)
+               tegra2_init_one_clock(tegra_list_clks[i]);
+
+       for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
+               c = tegra_get_clock_by_name(tegra_clk_duplicates[i].name);
+               if (!c) {
+                       pr_err("%s: Unknown duplicate clock %s\n", __func__,
+                               tegra_clk_duplicates[i].name);
+                       continue;
+               }
+
+               tegra_clk_duplicates[i].lookup.clk = c;
+               clkdev_add(&tegra_clk_duplicates[i].lookup);
+       }
+
+       init_audio_sync_clock_mux();
+       tegra20_cpu_car_ops_init();
+}
diff --git a/arch/arm/mach-tegra/tegra2_clocks.c b/arch/arm/mach-tegra/tegra2_clocks.c
deleted file mode 100644 (file)
index a703844..0000000
+++ /dev/null
@@ -1,2484 +0,0 @@
-/*
- * arch/arm/mach-tegra/tegra2_clocks.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/module.h>
-#include <linux/list.h>
-#include <linux/spinlock.h>
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/clkdev.h>
-#include <linux/clk.h>
-
-#include <mach/iomap.h>
-#include <mach/suspend.h>
-
-#include "clock.h"
-#include "fuse.h"
-#include "tegra2_emc.h"
-
-#define RST_DEVICES                    0x004
-#define RST_DEVICES_SET                        0x300
-#define RST_DEVICES_CLR                        0x304
-#define RST_DEVICES_NUM                        3
-
-#define CLK_OUT_ENB                    0x010
-#define CLK_OUT_ENB_SET                        0x320
-#define CLK_OUT_ENB_CLR                        0x324
-#define CLK_OUT_ENB_NUM                        3
-
-#define CLK_MASK_ARM                   0x44
-#define MISC_CLK_ENB                   0x48
-
-#define OSC_CTRL                       0x50
-#define OSC_CTRL_OSC_FREQ_MASK         (3<<30)
-#define OSC_CTRL_OSC_FREQ_13MHZ                (0<<30)
-#define OSC_CTRL_OSC_FREQ_19_2MHZ      (1<<30)
-#define OSC_CTRL_OSC_FREQ_12MHZ                (2<<30)
-#define OSC_CTRL_OSC_FREQ_26MHZ                (3<<30)
-#define OSC_CTRL_MASK                  (0x3f2 | OSC_CTRL_OSC_FREQ_MASK)
-
-#define OSC_FREQ_DET                   0x58
-#define OSC_FREQ_DET_TRIG              (1<<31)
-
-#define OSC_FREQ_DET_STATUS            0x5C
-#define OSC_FREQ_DET_BUSY              (1<<31)
-#define OSC_FREQ_DET_CNT_MASK          0xFFFF
-
-#define PERIPH_CLK_SOURCE_I2S1         0x100
-#define PERIPH_CLK_SOURCE_EMC          0x19c
-#define PERIPH_CLK_SOURCE_OSC          0x1fc
-#define PERIPH_CLK_SOURCE_NUM \
-       ((PERIPH_CLK_SOURCE_OSC - PERIPH_CLK_SOURCE_I2S1) / 4)
-
-#define PERIPH_CLK_SOURCE_MASK         (3<<30)
-#define PERIPH_CLK_SOURCE_SHIFT                30
-#define PERIPH_CLK_SOURCE_PWM_MASK     (7<<28)
-#define PERIPH_CLK_SOURCE_PWM_SHIFT    28
-#define PERIPH_CLK_SOURCE_ENABLE       (1<<28)
-#define PERIPH_CLK_SOURCE_DIVU71_MASK  0xFF
-#define PERIPH_CLK_SOURCE_DIVU16_MASK  0xFFFF
-#define PERIPH_CLK_SOURCE_DIV_SHIFT    0
-
-#define SDMMC_CLK_INT_FB_SEL           (1 << 23)
-#define SDMMC_CLK_INT_FB_DLY_SHIFT     16
-#define SDMMC_CLK_INT_FB_DLY_MASK      (0xF << SDMMC_CLK_INT_FB_DLY_SHIFT)
-
-#define PLL_BASE                       0x0
-#define PLL_BASE_BYPASS                        (1<<31)
-#define PLL_BASE_ENABLE                        (1<<30)
-#define PLL_BASE_REF_ENABLE            (1<<29)
-#define PLL_BASE_OVERRIDE              (1<<28)
-#define PLL_BASE_DIVP_MASK             (0x7<<20)
-#define PLL_BASE_DIVP_SHIFT            20
-#define PLL_BASE_DIVN_MASK             (0x3FF<<8)
-#define PLL_BASE_DIVN_SHIFT            8
-#define PLL_BASE_DIVM_MASK             (0x1F)
-#define PLL_BASE_DIVM_SHIFT            0
-
-#define PLL_OUT_RATIO_MASK             (0xFF<<8)
-#define PLL_OUT_RATIO_SHIFT            8
-#define PLL_OUT_OVERRIDE               (1<<2)
-#define PLL_OUT_CLKEN                  (1<<1)
-#define PLL_OUT_RESET_DISABLE          (1<<0)
-
-#define PLL_MISC(c)                    (((c)->flags & PLL_ALT_MISC_REG) ? 0x4 : 0xc)
-
-#define PLL_MISC_DCCON_SHIFT           20
-#define PLL_MISC_CPCON_SHIFT           8
-#define PLL_MISC_CPCON_MASK            (0xF<<PLL_MISC_CPCON_SHIFT)
-#define PLL_MISC_LFCON_SHIFT           4
-#define PLL_MISC_LFCON_MASK            (0xF<<PLL_MISC_LFCON_SHIFT)
-#define PLL_MISC_VCOCON_SHIFT          0
-#define PLL_MISC_VCOCON_MASK           (0xF<<PLL_MISC_VCOCON_SHIFT)
-
-#define PLLU_BASE_POST_DIV             (1<<20)
-
-#define PLLD_MISC_CLKENABLE            (1<<30)
-#define PLLD_MISC_DIV_RST              (1<<23)
-#define PLLD_MISC_DCCON_SHIFT          12
-
-#define PLLE_MISC_READY                        (1 << 15)
-
-#define PERIPH_CLK_TO_ENB_REG(c)       ((c->u.periph.clk_num / 32) * 4)
-#define PERIPH_CLK_TO_ENB_SET_REG(c)   ((c->u.periph.clk_num / 32) * 8)
-#define PERIPH_CLK_TO_ENB_BIT(c)       (1 << (c->u.periph.clk_num % 32))
-
-#define SUPER_CLK_MUX                  0x00
-#define SUPER_STATE_SHIFT              28
-#define SUPER_STATE_MASK               (0xF << SUPER_STATE_SHIFT)
-#define SUPER_STATE_STANDBY            (0x0 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_IDLE               (0x1 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_RUN                        (0x2 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_IRQ                        (0x3 << SUPER_STATE_SHIFT)
-#define SUPER_STATE_FIQ                        (0x4 << SUPER_STATE_SHIFT)
-#define SUPER_SOURCE_MASK              0xF
-#define        SUPER_FIQ_SOURCE_SHIFT          12
-#define        SUPER_IRQ_SOURCE_SHIFT          8
-#define        SUPER_RUN_SOURCE_SHIFT          4
-#define        SUPER_IDLE_SOURCE_SHIFT         0
-
-#define SUPER_CLK_DIVIDER              0x04
-
-#define BUS_CLK_DISABLE                        (1<<3)
-#define BUS_CLK_DIV_MASK               0x3
-
-#define PMC_CTRL                       0x0
- #define PMC_CTRL_BLINK_ENB            (1 << 7)
-
-#define PMC_DPD_PADS_ORIDE             0x1c
- #define PMC_DPD_PADS_ORIDE_BLINK_ENB  (1 << 20)
-
-#define PMC_BLINK_TIMER_DATA_ON_SHIFT  0
-#define PMC_BLINK_TIMER_DATA_ON_MASK   0x7fff
-#define PMC_BLINK_TIMER_ENB            (1 << 15)
-#define PMC_BLINK_TIMER_DATA_OFF_SHIFT 16
-#define PMC_BLINK_TIMER_DATA_OFF_MASK  0xffff
-
-static void __iomem *reg_clk_base = IO_ADDRESS(TEGRA_CLK_RESET_BASE);
-static void __iomem *reg_pmc_base = IO_ADDRESS(TEGRA_PMC_BASE);
-
-/*
- * Some clocks share a register with other clocks.  Any clock op that
- * non-atomically modifies a register used by another clock must lock
- * clock_register_lock first.
- */
-static DEFINE_SPINLOCK(clock_register_lock);
-
-/*
- * Some peripheral clocks share an enable bit, so refcount the enable bits
- * in registers CLK_ENABLE_L, CLK_ENABLE_H, and CLK_ENABLE_U
- */
-static int tegra_periph_clk_enable_refcount[3 * 32];
-
-#define clk_writel(value, reg) \
-       __raw_writel(value, reg_clk_base + (reg))
-#define clk_readl(reg) \
-       __raw_readl(reg_clk_base + (reg))
-#define pmc_writel(value, reg) \
-       __raw_writel(value, reg_pmc_base + (reg))
-#define pmc_readl(reg) \
-       __raw_readl(reg_pmc_base + (reg))
-
-static unsigned long clk_measure_input_freq(void)
-{
-       u32 clock_autodetect;
-       clk_writel(OSC_FREQ_DET_TRIG | 1, OSC_FREQ_DET);
-       do {} while (clk_readl(OSC_FREQ_DET_STATUS) & OSC_FREQ_DET_BUSY);
-       clock_autodetect = clk_readl(OSC_FREQ_DET_STATUS);
-       if (clock_autodetect >= 732 - 3 && clock_autodetect <= 732 + 3) {
-               return 12000000;
-       } else if (clock_autodetect >= 794 - 3 && clock_autodetect <= 794 + 3) {
-               return 13000000;
-       } else if (clock_autodetect >= 1172 - 3 && clock_autodetect <= 1172 + 3) {
-               return 19200000;
-       } else if (clock_autodetect >= 1587 - 3 && clock_autodetect <= 1587 + 3) {
-               return 26000000;
-       } else {
-               pr_err("%s: Unexpected clock autodetect value %d", __func__, clock_autodetect);
-               BUG();
-               return 0;
-       }
-}
-
-static int clk_div71_get_divider(unsigned long parent_rate, unsigned long rate)
-{
-       s64 divider_u71 = parent_rate * 2;
-       divider_u71 += rate - 1;
-       do_div(divider_u71, rate);
-
-       if (divider_u71 - 2 < 0)
-               return 0;
-
-       if (divider_u71 - 2 > 255)
-               return -EINVAL;
-
-       return divider_u71 - 2;
-}
-
-static int clk_div16_get_divider(unsigned long parent_rate, unsigned long rate)
-{
-       s64 divider_u16;
-
-       divider_u16 = parent_rate;
-       divider_u16 += rate - 1;
-       do_div(divider_u16, rate);
-
-       if (divider_u16 - 1 < 0)
-               return 0;
-
-       if (divider_u16 - 1 > 255)
-               return -EINVAL;
-
-       return divider_u16 - 1;
-}
-
-/* clk_m functions */
-static unsigned long tegra2_clk_m_autodetect_rate(struct clk *c)
-{
-       u32 auto_clock_control = clk_readl(OSC_CTRL) & ~OSC_CTRL_OSC_FREQ_MASK;
-
-       c->rate = clk_measure_input_freq();
-       switch (c->rate) {
-       case 12000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_12MHZ;
-               break;
-       case 13000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_13MHZ;
-               break;
-       case 19200000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_19_2MHZ;
-               break;
-       case 26000000:
-               auto_clock_control |= OSC_CTRL_OSC_FREQ_26MHZ;
-               break;
-       default:
-               pr_err("%s: Unexpected clock rate %ld", __func__, c->rate);
-               BUG();
-       }
-       clk_writel(auto_clock_control, OSC_CTRL);
-       return c->rate;
-}
-
-static void tegra2_clk_m_init(struct clk *c)
-{
-       pr_debug("%s on clock %s\n", __func__, c->name);
-       tegra2_clk_m_autodetect_rate(c);
-}
-
-static int tegra2_clk_m_enable(struct clk *c)
-{
-       pr_debug("%s on clock %s\n", __func__, c->name);
-       return 0;
-}
-
-static void tegra2_clk_m_disable(struct clk *c)
-{
-       pr_debug("%s on clock %s\n", __func__, c->name);
-       BUG();
-}
-
-static struct clk_ops tegra_clk_m_ops = {
-       .init           = tegra2_clk_m_init,
-       .enable         = tegra2_clk_m_enable,
-       .disable        = tegra2_clk_m_disable,
-};
-
-/* super clock functions */
-/* "super clocks" on tegra have two-stage muxes and a clock skipping
- * super divider.  We will ignore the clock skipping divider, since we
- * can't lower the voltage when using the clock skip, but we can if we
- * lower the PLL frequency.
- */
-static void tegra2_super_clk_init(struct clk *c)
-{
-       u32 val;
-       int source;
-       int shift;
-       const struct clk_mux_sel *sel;
-       val = clk_readl(c->reg + SUPER_CLK_MUX);
-       c->state = ON;
-       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
-               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
-       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
-               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
-       source = (val >> shift) & SUPER_SOURCE_MASK;
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->value == source)
-                       break;
-       }
-       BUG_ON(sel->input == NULL);
-       c->parent = sel->input;
-}
-
-static int tegra2_super_clk_enable(struct clk *c)
-{
-       clk_writel(0, c->reg + SUPER_CLK_DIVIDER);
-       return 0;
-}
-
-static void tegra2_super_clk_disable(struct clk *c)
-{
-       pr_debug("%s on clock %s\n", __func__, c->name);
-
-       /* oops - don't disable the CPU clock! */
-       BUG();
-}
-
-static int tegra2_super_clk_set_parent(struct clk *c, struct clk *p)
-{
-       u32 val;
-       const struct clk_mux_sel *sel;
-       int shift;
-
-       val = clk_readl(c->reg + SUPER_CLK_MUX);
-       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
-               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
-       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
-               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->input == p) {
-                       val &= ~(SUPER_SOURCE_MASK << shift);
-                       val |= sel->value << shift;
-
-                       if (c->refcnt)
-                               clk_enable(p);
-
-                       clk_writel(val, c->reg);
-
-                       if (c->refcnt && c->parent)
-                               clk_disable(c->parent);
-
-                       clk_reparent(c, p);
-                       return 0;
-               }
-       }
-       return -EINVAL;
-}
-
-/*
- * Super clocks have "clock skippers" instead of dividers.  Dividing using
- * a clock skipper does not allow the voltage to be scaled down, so instead
- * adjust the rate of the parent clock.  This requires that the parent of a
- * super clock have no other children, otherwise the rate will change
- * underneath the other children.
- */
-static int tegra2_super_clk_set_rate(struct clk *c, unsigned long rate)
-{
-       return clk_set_rate(c->parent, rate);
-}
-
-static struct clk_ops tegra_super_ops = {
-       .init                   = tegra2_super_clk_init,
-       .enable                 = tegra2_super_clk_enable,
-       .disable                = tegra2_super_clk_disable,
-       .set_parent             = tegra2_super_clk_set_parent,
-       .set_rate               = tegra2_super_clk_set_rate,
-};
-
-/* virtual cpu clock functions */
-/* some clocks can not be stopped (cpu, memory bus) while the SoC is running.
-   To change the frequency of these clocks, the parent pll may need to be
-   reprogrammed, so the clock must be moved off the pll, the pll reprogrammed,
-   and then the clock moved back to the pll.  To hide this sequence, a virtual
-   clock handles it.
- */
-static void tegra2_cpu_clk_init(struct clk *c)
-{
-}
-
-static int tegra2_cpu_clk_enable(struct clk *c)
-{
-       return 0;
-}
-
-static void tegra2_cpu_clk_disable(struct clk *c)
-{
-       pr_debug("%s on clock %s\n", __func__, c->name);
-
-       /* oops - don't disable the CPU clock! */
-       BUG();
-}
-
-static int tegra2_cpu_clk_set_rate(struct clk *c, unsigned long rate)
-{
-       int ret;
-       /*
-        * Take an extra reference to the main pll so it doesn't turn
-        * off when we move the cpu off of it
-        */
-       clk_enable(c->u.cpu.main);
-
-       ret = clk_set_parent(c->parent, c->u.cpu.backup);
-       if (ret) {
-               pr_err("Failed to switch cpu to clock %s\n", c->u.cpu.backup->name);
-               goto out;
-       }
-
-       if (rate == clk_get_rate(c->u.cpu.backup))
-               goto out;
-
-       ret = clk_set_rate(c->u.cpu.main, rate);
-       if (ret) {
-               pr_err("Failed to change cpu pll to %lu\n", rate);
-               goto out;
-       }
-
-       ret = clk_set_parent(c->parent, c->u.cpu.main);
-       if (ret) {
-               pr_err("Failed to switch cpu to clock %s\n", c->u.cpu.main->name);
-               goto out;
-       }
-
-out:
-       clk_disable(c->u.cpu.main);
-       return ret;
-}
-
-static struct clk_ops tegra_cpu_ops = {
-       .init     = tegra2_cpu_clk_init,
-       .enable   = tegra2_cpu_clk_enable,
-       .disable  = tegra2_cpu_clk_disable,
-       .set_rate = tegra2_cpu_clk_set_rate,
-};
-
-/* virtual cop clock functions. Used to acquire the fake 'cop' clock to
- * reset the COP block (i.e. AVP) */
-static void tegra2_cop_clk_reset(struct clk *c, bool assert)
-{
-       unsigned long reg = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
-
-       pr_debug("%s %s\n", __func__, assert ? "assert" : "deassert");
-       clk_writel(1 << 1, reg);
-}
-
-static struct clk_ops tegra_cop_ops = {
-       .reset    = tegra2_cop_clk_reset,
-};
-
-/* bus clock functions */
-static void tegra2_bus_clk_init(struct clk *c)
-{
-       u32 val = clk_readl(c->reg);
-       c->state = ((val >> c->reg_shift) & BUS_CLK_DISABLE) ? OFF : ON;
-       c->div = ((val >> c->reg_shift) & BUS_CLK_DIV_MASK) + 1;
-       c->mul = 1;
-}
-
-static int tegra2_bus_clk_enable(struct clk *c)
-{
-       u32 val;
-       unsigned long flags;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       val = clk_readl(c->reg);
-       val &= ~(BUS_CLK_DISABLE << c->reg_shift);
-       clk_writel(val, c->reg);
-
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-
-       return 0;
-}
-
-static void tegra2_bus_clk_disable(struct clk *c)
-{
-       u32 val;
-       unsigned long flags;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       val = clk_readl(c->reg);
-       val |= BUS_CLK_DISABLE << c->reg_shift;
-       clk_writel(val, c->reg);
-
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-}
-
-static int tegra2_bus_clk_set_rate(struct clk *c, unsigned long rate)
-{
-       u32 val;
-       unsigned long parent_rate = clk_get_rate(c->parent);
-       unsigned long flags;
-       int ret = -EINVAL;
-       int i;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       val = clk_readl(c->reg);
-       for (i = 1; i <= 4; i++) {
-               if (rate == parent_rate / i) {
-                       val &= ~(BUS_CLK_DIV_MASK << c->reg_shift);
-                       val |= (i - 1) << c->reg_shift;
-                       clk_writel(val, c->reg);
-                       c->div = i;
-                       c->mul = 1;
-                       ret = 0;
-                       break;
-               }
-       }
-
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-
-       return ret;
-}
-
-static struct clk_ops tegra_bus_ops = {
-       .init                   = tegra2_bus_clk_init,
-       .enable                 = tegra2_bus_clk_enable,
-       .disable                = tegra2_bus_clk_disable,
-       .set_rate               = tegra2_bus_clk_set_rate,
-};
-
-/* Blink output functions */
-
-static void tegra2_blink_clk_init(struct clk *c)
-{
-       u32 val;
-
-       val = pmc_readl(PMC_CTRL);
-       c->state = (val & PMC_CTRL_BLINK_ENB) ? ON : OFF;
-       c->mul = 1;
-       val = pmc_readl(c->reg);
-
-       if (val & PMC_BLINK_TIMER_ENB) {
-               unsigned int on_off;
-
-               on_off = (val >> PMC_BLINK_TIMER_DATA_ON_SHIFT) &
-                       PMC_BLINK_TIMER_DATA_ON_MASK;
-               val >>= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
-               val &= PMC_BLINK_TIMER_DATA_OFF_MASK;
-               on_off += val;
-               /* each tick in the blink timer is 4 32KHz clocks */
-               c->div = on_off * 4;
-       } else {
-               c->div = 1;
-       }
-}
-
-static int tegra2_blink_clk_enable(struct clk *c)
-{
-       u32 val;
-
-       val = pmc_readl(PMC_DPD_PADS_ORIDE);
-       pmc_writel(val | PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
-
-       val = pmc_readl(PMC_CTRL);
-       pmc_writel(val | PMC_CTRL_BLINK_ENB, PMC_CTRL);
-
-       return 0;
-}
-
-static void tegra2_blink_clk_disable(struct clk *c)
-{
-       u32 val;
-
-       val = pmc_readl(PMC_CTRL);
-       pmc_writel(val & ~PMC_CTRL_BLINK_ENB, PMC_CTRL);
-
-       val = pmc_readl(PMC_DPD_PADS_ORIDE);
-       pmc_writel(val & ~PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
-}
-
-static int tegra2_blink_clk_set_rate(struct clk *c, unsigned long rate)
-{
-       unsigned long parent_rate = clk_get_rate(c->parent);
-       if (rate >= parent_rate) {
-               c->div = 1;
-               pmc_writel(0, c->reg);
-       } else {
-               unsigned int on_off;
-               u32 val;
-
-               on_off = DIV_ROUND_UP(parent_rate / 8, rate);
-               c->div = on_off * 8;
-
-               val = (on_off & PMC_BLINK_TIMER_DATA_ON_MASK) <<
-                       PMC_BLINK_TIMER_DATA_ON_SHIFT;
-               on_off &= PMC_BLINK_TIMER_DATA_OFF_MASK;
-               on_off <<= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
-               val |= on_off;
-               val |= PMC_BLINK_TIMER_ENB;
-               pmc_writel(val, c->reg);
-       }
-
-       return 0;
-}
-
-static struct clk_ops tegra_blink_clk_ops = {
-       .init                   = &tegra2_blink_clk_init,
-       .enable                 = &tegra2_blink_clk_enable,
-       .disable                = &tegra2_blink_clk_disable,
-       .set_rate               = &tegra2_blink_clk_set_rate,
-};
-
-/* PLL Functions */
-static int tegra2_pll_clk_wait_for_lock(struct clk *c)
-{
-       udelay(c->u.pll.lock_delay);
-
-       return 0;
-}
-
-static void tegra2_pll_clk_init(struct clk *c)
-{
-       u32 val = clk_readl(c->reg + PLL_BASE);
-
-       c->state = (val & PLL_BASE_ENABLE) ? ON : OFF;
-
-       if (c->flags & PLL_FIXED && !(val & PLL_BASE_OVERRIDE)) {
-               pr_warning("Clock %s has unknown fixed frequency\n", c->name);
-               c->mul = 1;
-               c->div = 1;
-       } else if (val & PLL_BASE_BYPASS) {
-               c->mul = 1;
-               c->div = 1;
-       } else {
-               c->mul = (val & PLL_BASE_DIVN_MASK) >> PLL_BASE_DIVN_SHIFT;
-               c->div = (val & PLL_BASE_DIVM_MASK) >> PLL_BASE_DIVM_SHIFT;
-               if (c->flags & PLLU)
-                       c->div *= (val & PLLU_BASE_POST_DIV) ? 1 : 2;
-               else
-                       c->div *= (val & PLL_BASE_DIVP_MASK) ? 2 : 1;
-       }
-}
-
-static int tegra2_pll_clk_enable(struct clk *c)
-{
-       u32 val;
-       pr_debug("%s on clock %s\n", __func__, c->name);
-
-       val = clk_readl(c->reg + PLL_BASE);
-       val &= ~PLL_BASE_BYPASS;
-       val |= PLL_BASE_ENABLE;
-       clk_writel(val, c->reg + PLL_BASE);
-
-       tegra2_pll_clk_wait_for_lock(c);
-
-       return 0;
-}
-
-static void tegra2_pll_clk_disable(struct clk *c)
-{
-       u32 val;
-       pr_debug("%s on clock %s\n", __func__, c->name);
-
-       val = clk_readl(c->reg);
-       val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
-       clk_writel(val, c->reg);
-}
-
-static int tegra2_pll_clk_set_rate(struct clk *c, unsigned long rate)
-{
-       u32 val;
-       unsigned long input_rate;
-       const struct clk_pll_freq_table *sel;
-
-       pr_debug("%s: %s %lu\n", __func__, c->name, rate);
-
-       input_rate = clk_get_rate(c->parent);
-       for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
-               if (sel->input_rate == input_rate && sel->output_rate == rate) {
-                       c->mul = sel->n;
-                       c->div = sel->m * sel->p;
-
-                       val = clk_readl(c->reg + PLL_BASE);
-                       if (c->flags & PLL_FIXED)
-                               val |= PLL_BASE_OVERRIDE;
-                       val &= ~(PLL_BASE_DIVP_MASK | PLL_BASE_DIVN_MASK |
-                                PLL_BASE_DIVM_MASK);
-                       val |= (sel->m << PLL_BASE_DIVM_SHIFT) |
-                               (sel->n << PLL_BASE_DIVN_SHIFT);
-                       BUG_ON(sel->p < 1 || sel->p > 2);
-                       if (c->flags & PLLU) {
-                               if (sel->p == 1)
-                                       val |= PLLU_BASE_POST_DIV;
-                       } else {
-                               if (sel->p == 2)
-                                       val |= 1 << PLL_BASE_DIVP_SHIFT;
-                       }
-                       clk_writel(val, c->reg + PLL_BASE);
-
-                       if (c->flags & PLL_HAS_CPCON) {
-                               val = clk_readl(c->reg + PLL_MISC(c));
-                               val &= ~PLL_MISC_CPCON_MASK;
-                               val |= sel->cpcon << PLL_MISC_CPCON_SHIFT;
-                               clk_writel(val, c->reg + PLL_MISC(c));
-                       }
-
-                       if (c->state == ON)
-                               tegra2_pll_clk_enable(c);
-
-                       return 0;
-               }
-       }
-       return -EINVAL;
-}
-
-static struct clk_ops tegra_pll_ops = {
-       .init                   = tegra2_pll_clk_init,
-       .enable                 = tegra2_pll_clk_enable,
-       .disable                = tegra2_pll_clk_disable,
-       .set_rate               = tegra2_pll_clk_set_rate,
-};
-
-static void tegra2_pllx_clk_init(struct clk *c)
-{
-       tegra2_pll_clk_init(c);
-
-       if (tegra_sku_id == 7)
-               c->max_rate = 750000000;
-}
-
-static struct clk_ops tegra_pllx_ops = {
-       .init     = tegra2_pllx_clk_init,
-       .enable   = tegra2_pll_clk_enable,
-       .disable  = tegra2_pll_clk_disable,
-       .set_rate = tegra2_pll_clk_set_rate,
-};
-
-static int tegra2_plle_clk_enable(struct clk *c)
-{
-       u32 val;
-
-       pr_debug("%s on clock %s\n", __func__, c->name);
-
-       mdelay(1);
-
-       val = clk_readl(c->reg + PLL_BASE);
-       if (!(val & PLLE_MISC_READY))
-               return -EBUSY;
-
-       val = clk_readl(c->reg + PLL_BASE);
-       val |= PLL_BASE_ENABLE | PLL_BASE_BYPASS;
-       clk_writel(val, c->reg + PLL_BASE);
-
-       return 0;
-}
-
-static struct clk_ops tegra_plle_ops = {
-       .init       = tegra2_pll_clk_init,
-       .enable     = tegra2_plle_clk_enable,
-       .set_rate   = tegra2_pll_clk_set_rate,
-};
-
-/* Clock divider ops */
-static void tegra2_pll_div_clk_init(struct clk *c)
-{
-       u32 val = clk_readl(c->reg);
-       u32 divu71;
-       val >>= c->reg_shift;
-       c->state = (val & PLL_OUT_CLKEN) ? ON : OFF;
-       if (!(val & PLL_OUT_RESET_DISABLE))
-               c->state = OFF;
-
-       if (c->flags & DIV_U71) {
-               divu71 = (val & PLL_OUT_RATIO_MASK) >> PLL_OUT_RATIO_SHIFT;
-               c->div = (divu71 + 2);
-               c->mul = 2;
-       } else if (c->flags & DIV_2) {
-               c->div = 2;
-               c->mul = 1;
-       } else {
-               c->div = 1;
-               c->mul = 1;
-       }
-}
-
-static int tegra2_pll_div_clk_enable(struct clk *c)
-{
-       u32 val;
-       u32 new_val;
-       unsigned long flags;
-
-       pr_debug("%s: %s\n", __func__, c->name);
-       if (c->flags & DIV_U71) {
-               spin_lock_irqsave(&clock_register_lock, flags);
-               val = clk_readl(c->reg);
-               new_val = val >> c->reg_shift;
-               new_val &= 0xFFFF;
-
-               new_val |= PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE;
-
-               val &= ~(0xFFFF << c->reg_shift);
-               val |= new_val << c->reg_shift;
-               clk_writel(val, c->reg);
-               spin_unlock_irqrestore(&clock_register_lock, flags);
-               return 0;
-       } else if (c->flags & DIV_2) {
-               BUG_ON(!(c->flags & PLLD));
-               spin_lock_irqsave(&clock_register_lock, flags);
-               val = clk_readl(c->reg);
-               val &= ~PLLD_MISC_DIV_RST;
-               clk_writel(val, c->reg);
-               spin_unlock_irqrestore(&clock_register_lock, flags);
-               return 0;
-       }
-       return -EINVAL;
-}
-
-static void tegra2_pll_div_clk_disable(struct clk *c)
-{
-       u32 val;
-       u32 new_val;
-       unsigned long flags;
-
-       pr_debug("%s: %s\n", __func__, c->name);
-       if (c->flags & DIV_U71) {
-               spin_lock_irqsave(&clock_register_lock, flags);
-               val = clk_readl(c->reg);
-               new_val = val >> c->reg_shift;
-               new_val &= 0xFFFF;
-
-               new_val &= ~(PLL_OUT_CLKEN | PLL_OUT_RESET_DISABLE);
-
-               val &= ~(0xFFFF << c->reg_shift);
-               val |= new_val << c->reg_shift;
-               clk_writel(val, c->reg);
-               spin_unlock_irqrestore(&clock_register_lock, flags);
-       } else if (c->flags & DIV_2) {
-               BUG_ON(!(c->flags & PLLD));
-               spin_lock_irqsave(&clock_register_lock, flags);
-               val = clk_readl(c->reg);
-               val |= PLLD_MISC_DIV_RST;
-               clk_writel(val, c->reg);
-               spin_unlock_irqrestore(&clock_register_lock, flags);
-       }
-}
-
-static int tegra2_pll_div_clk_set_rate(struct clk *c, unsigned long rate)
-{
-       u32 val;
-       u32 new_val;
-       int divider_u71;
-       unsigned long parent_rate = clk_get_rate(c->parent);
-       unsigned long flags;
-
-       pr_debug("%s: %s %lu\n", __func__, c->name, rate);
-       if (c->flags & DIV_U71) {
-               divider_u71 = clk_div71_get_divider(parent_rate, rate);
-               if (divider_u71 >= 0) {
-                       spin_lock_irqsave(&clock_register_lock, flags);
-                       val = clk_readl(c->reg);
-                       new_val = val >> c->reg_shift;
-                       new_val &= 0xFFFF;
-                       if (c->flags & DIV_U71_FIXED)
-                               new_val |= PLL_OUT_OVERRIDE;
-                       new_val &= ~PLL_OUT_RATIO_MASK;
-                       new_val |= divider_u71 << PLL_OUT_RATIO_SHIFT;
-
-                       val &= ~(0xFFFF << c->reg_shift);
-                       val |= new_val << c->reg_shift;
-                       clk_writel(val, c->reg);
-                       c->div = divider_u71 + 2;
-                       c->mul = 2;
-                       spin_unlock_irqrestore(&clock_register_lock, flags);
-                       return 0;
-               }
-       } else if (c->flags & DIV_2) {
-               if (parent_rate == rate * 2)
-                       return 0;
-       }
-       return -EINVAL;
-}
-
-static long tegra2_pll_div_clk_round_rate(struct clk *c, unsigned long rate)
-{
-       int divider;
-       unsigned long parent_rate = clk_get_rate(c->parent);
-       pr_debug("%s: %s %lu\n", __func__, c->name, rate);
-
-       if (c->flags & DIV_U71) {
-               divider = clk_div71_get_divider(parent_rate, rate);
-               if (divider < 0)
-                       return divider;
-               return DIV_ROUND_UP(parent_rate * 2, divider + 2);
-       } else if (c->flags & DIV_2) {
-               return DIV_ROUND_UP(parent_rate, 2);
-       }
-       return -EINVAL;
-}
-
-static struct clk_ops tegra_pll_div_ops = {
-       .init                   = tegra2_pll_div_clk_init,
-       .enable                 = tegra2_pll_div_clk_enable,
-       .disable                = tegra2_pll_div_clk_disable,
-       .set_rate               = tegra2_pll_div_clk_set_rate,
-       .round_rate             = tegra2_pll_div_clk_round_rate,
-};
-
-/* Periph clk ops */
-
-static void tegra2_periph_clk_init(struct clk *c)
-{
-       u32 val = clk_readl(c->reg);
-       const struct clk_mux_sel *mux = NULL;
-       const struct clk_mux_sel *sel;
-       u32 shift;
-       u32 mask;
-
-       if (c->flags & MUX_PWM) {
-               shift = PERIPH_CLK_SOURCE_PWM_SHIFT;
-               mask = PERIPH_CLK_SOURCE_PWM_MASK;
-       } else {
-               shift = PERIPH_CLK_SOURCE_SHIFT;
-               mask = PERIPH_CLK_SOURCE_MASK;
-       }
-
-       if (c->flags & MUX) {
-               for (sel = c->inputs; sel->input != NULL; sel++) {
-                       if ((val & mask) >> shift == sel->value)
-                               mux = sel;
-               }
-               BUG_ON(!mux);
-
-               c->parent = mux->input;
-       } else {
-               c->parent = c->inputs[0].input;
-       }
-
-       if (c->flags & DIV_U71) {
-               u32 divu71 = val & PERIPH_CLK_SOURCE_DIVU71_MASK;
-               c->div = divu71 + 2;
-               c->mul = 2;
-       } else if (c->flags & DIV_U16) {
-               u32 divu16 = val & PERIPH_CLK_SOURCE_DIVU16_MASK;
-               c->div = divu16 + 1;
-               c->mul = 1;
-       } else {
-               c->div = 1;
-               c->mul = 1;
-       }
-
-       c->state = ON;
-
-       if (!c->u.periph.clk_num)
-               return;
-
-       if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
-                       PERIPH_CLK_TO_ENB_BIT(c)))
-               c->state = OFF;
-
-       if (!(c->flags & PERIPH_NO_RESET))
-               if (clk_readl(RST_DEVICES + PERIPH_CLK_TO_ENB_REG(c)) &
-                               PERIPH_CLK_TO_ENB_BIT(c))
-                       c->state = OFF;
-}
-
-static int tegra2_periph_clk_enable(struct clk *c)
-{
-       u32 val;
-       unsigned long flags;
-       int refcount;
-       pr_debug("%s on clock %s\n", __func__, c->name);
-
-       if (!c->u.periph.clk_num)
-               return 0;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       refcount = tegra_periph_clk_enable_refcount[c->u.periph.clk_num]++;
-
-       if (refcount > 1)
-               goto out;
-
-       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-               CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
-       if (!(c->flags & PERIPH_NO_RESET) && !(c->flags & PERIPH_MANUAL_RESET))
-               clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-                       RST_DEVICES_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
-       if (c->flags & PERIPH_EMC_ENB) {
-               /* The EMC peripheral clock has 2 extra enable bits */
-               /* FIXME: Do they need to be disabled? */
-               val = clk_readl(c->reg);
-               val |= 0x3 << 24;
-               clk_writel(val, c->reg);
-       }
-
-out:
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-
-       return 0;
-}
-
-static void tegra2_periph_clk_disable(struct clk *c)
-{
-       unsigned long flags;
-
-       pr_debug("%s on clock %s\n", __func__, c->name);
-
-       if (!c->u.periph.clk_num)
-               return;
-
-       spin_lock_irqsave(&clock_register_lock, flags);
-
-       if (c->refcnt)
-               tegra_periph_clk_enable_refcount[c->u.periph.clk_num]--;
-
-       if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] == 0)
-               clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-                       CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
-
-       spin_unlock_irqrestore(&clock_register_lock, flags);
-}
-
-static void tegra2_periph_clk_reset(struct clk *c, bool assert)
-{
-       unsigned long base = assert ? RST_DEVICES_SET : RST_DEVICES_CLR;
-
-       pr_debug("%s %s on clock %s\n", __func__,
-                assert ? "assert" : "deassert", c->name);
-
-       BUG_ON(!c->u.periph.clk_num);
-
-       if (!(c->flags & PERIPH_NO_RESET))
-               clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-                          base + PERIPH_CLK_TO_ENB_SET_REG(c));
-}
-
-static int tegra2_periph_clk_set_parent(struct clk *c, struct clk *p)
-{
-       u32 val;
-       const struct clk_mux_sel *sel;
-       u32 mask, shift;
-
-       pr_debug("%s: %s %s\n", __func__, c->name, p->name);
-
-       if (c->flags & MUX_PWM) {
-               shift = PERIPH_CLK_SOURCE_PWM_SHIFT;
-               mask = PERIPH_CLK_SOURCE_PWM_MASK;
-       } else {
-               shift = PERIPH_CLK_SOURCE_SHIFT;
-               mask = PERIPH_CLK_SOURCE_MASK;
-       }
-
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->input == p) {
-                       val = clk_readl(c->reg);
-                       val &= ~mask;
-                       val |= (sel->value) << shift;
-
-                       if (c->refcnt)
-                               clk_enable(p);
-
-                       clk_writel(val, c->reg);
-
-                       if (c->refcnt && c->parent)
-                               clk_disable(c->parent);
-
-                       clk_reparent(c, p);
-                       return 0;
-               }
-       }
-
-       return -EINVAL;
-}
-
-static int tegra2_periph_clk_set_rate(struct clk *c, unsigned long rate)
-{
-       u32 val;
-       int divider;
-       unsigned long parent_rate = clk_get_rate(c->parent);
-
-       if (c->flags & DIV_U71) {
-               divider = clk_div71_get_divider(parent_rate, rate);
-               if (divider >= 0) {
-                       val = clk_readl(c->reg);
-                       val &= ~PERIPH_CLK_SOURCE_DIVU71_MASK;
-                       val |= divider;
-                       clk_writel(val, c->reg);
-                       c->div = divider + 2;
-                       c->mul = 2;
-                       return 0;
-               }
-       } else if (c->flags & DIV_U16) {
-               divider = clk_div16_get_divider(parent_rate, rate);
-               if (divider >= 0) {
-                       val = clk_readl(c->reg);
-                       val &= ~PERIPH_CLK_SOURCE_DIVU16_MASK;
-                       val |= divider;
-                       clk_writel(val, c->reg);
-                       c->div = divider + 1;
-                       c->mul = 1;
-                       return 0;
-               }
-       } else if (parent_rate <= rate) {
-               c->div = 1;
-               c->mul = 1;
-               return 0;
-       }
-       return -EINVAL;
-}
-
-static long tegra2_periph_clk_round_rate(struct clk *c,
-       unsigned long rate)
-{
-       int divider;
-       unsigned long parent_rate = clk_get_rate(c->parent);
-       pr_debug("%s: %s %lu\n", __func__, c->name, rate);
-
-       if (c->flags & DIV_U71) {
-               divider = clk_div71_get_divider(parent_rate, rate);
-               if (divider < 0)
-                       return divider;
-
-               return DIV_ROUND_UP(parent_rate * 2, divider + 2);
-       } else if (c->flags & DIV_U16) {
-               divider = clk_div16_get_divider(parent_rate, rate);
-               if (divider < 0)
-                       return divider;
-               return DIV_ROUND_UP(parent_rate, divider + 1);
-       }
-       return -EINVAL;
-}
-
-static struct clk_ops tegra_periph_clk_ops = {
-       .init                   = &tegra2_periph_clk_init,
-       .enable                 = &tegra2_periph_clk_enable,
-       .disable                = &tegra2_periph_clk_disable,
-       .set_parent             = &tegra2_periph_clk_set_parent,
-       .set_rate               = &tegra2_periph_clk_set_rate,
-       .round_rate             = &tegra2_periph_clk_round_rate,
-       .reset                  = &tegra2_periph_clk_reset,
-};
-
-/* The SDMMC controllers have extra bits in the clock source register that
- * adjust the delay between the clock and data to compenstate for delays
- * on the PCB. */
-void tegra2_sdmmc_tap_delay(struct clk *c, int delay)
-{
-       u32 reg;
-       unsigned long flags;
-
-       spin_lock_irqsave(&c->spinlock, flags);
-
-       delay = clamp(delay, 0, 15);
-       reg = clk_readl(c->reg);
-       reg &= ~SDMMC_CLK_INT_FB_DLY_MASK;
-       reg |= SDMMC_CLK_INT_FB_SEL;
-       reg |= delay << SDMMC_CLK_INT_FB_DLY_SHIFT;
-       clk_writel(reg, c->reg);
-
-       spin_unlock_irqrestore(&c->spinlock, flags);
-}
-
-/* External memory controller clock ops */
-static void tegra2_emc_clk_init(struct clk *c)
-{
-       tegra2_periph_clk_init(c);
-       c->max_rate = clk_get_rate_locked(c);
-}
-
-static long tegra2_emc_clk_round_rate(struct clk *c, unsigned long rate)
-{
-       long emc_rate;
-       long clk_rate;
-
-       /*
-        * The slowest entry in the EMC clock table that is at least as
-        * fast as rate.
-        */
-       emc_rate = tegra_emc_round_rate(rate);
-       if (emc_rate < 0)
-               return c->max_rate;
-
-       /*
-        * The fastest rate the PLL will generate that is at most the
-        * requested rate.
-        */
-       clk_rate = tegra2_periph_clk_round_rate(c, emc_rate);
-
-       /*
-        * If this fails, and emc_rate > clk_rate, it's because the maximum
-        * rate in the EMC tables is larger than the maximum rate of the EMC
-        * clock. The EMC clock's max rate is the rate it was running when the
-        * kernel booted. Such a mismatch is probably due to using the wrong
-        * BCT, i.e. using a Tegra20 BCT with an EMC table written for Tegra25.
-        */
-       WARN_ONCE(emc_rate != clk_rate,
-               "emc_rate %ld != clk_rate %ld",
-               emc_rate, clk_rate);
-
-       return emc_rate;
-}
-
-static int tegra2_emc_clk_set_rate(struct clk *c, unsigned long rate)
-{
-       int ret;
-       /*
-        * The Tegra2 memory controller has an interlock with the clock
-        * block that allows memory shadowed registers to be updated,
-        * and then transfer them to the main registers at the same
-        * time as the clock update without glitches.
-        */
-       ret = tegra_emc_set_rate(rate);
-       if (ret < 0)
-               return ret;
-
-       ret = tegra2_periph_clk_set_rate(c, rate);
-       udelay(1);
-
-       return ret;
-}
-
-static struct clk_ops tegra_emc_clk_ops = {
-       .init                   = &tegra2_emc_clk_init,
-       .enable                 = &tegra2_periph_clk_enable,
-       .disable                = &tegra2_periph_clk_disable,
-       .set_parent             = &tegra2_periph_clk_set_parent,
-       .set_rate               = &tegra2_emc_clk_set_rate,
-       .round_rate             = &tegra2_emc_clk_round_rate,
-       .reset                  = &tegra2_periph_clk_reset,
-};
-
-/* Clock doubler ops */
-static void tegra2_clk_double_init(struct clk *c)
-{
-       c->mul = 2;
-       c->div = 1;
-       c->state = ON;
-
-       if (!c->u.periph.clk_num)
-               return;
-
-       if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
-                       PERIPH_CLK_TO_ENB_BIT(c)))
-               c->state = OFF;
-};
-
-static int tegra2_clk_double_set_rate(struct clk *c, unsigned long rate)
-{
-       if (rate != 2 * clk_get_rate(c->parent))
-               return -EINVAL;
-       c->mul = 2;
-       c->div = 1;
-       return 0;
-}
-
-static struct clk_ops tegra_clk_double_ops = {
-       .init                   = &tegra2_clk_double_init,
-       .enable                 = &tegra2_periph_clk_enable,
-       .disable                = &tegra2_periph_clk_disable,
-       .set_rate               = &tegra2_clk_double_set_rate,
-};
-
-/* Audio sync clock ops */
-static void tegra2_audio_sync_clk_init(struct clk *c)
-{
-       int source;
-       const struct clk_mux_sel *sel;
-       u32 val = clk_readl(c->reg);
-       c->state = (val & (1<<4)) ? OFF : ON;
-       source = val & 0xf;
-       for (sel = c->inputs; sel->input != NULL; sel++)
-               if (sel->value == source)
-                       break;
-       BUG_ON(sel->input == NULL);
-       c->parent = sel->input;
-}
-
-static int tegra2_audio_sync_clk_enable(struct clk *c)
-{
-       clk_writel(0, c->reg);
-       return 0;
-}
-
-static void tegra2_audio_sync_clk_disable(struct clk *c)
-{
-       clk_writel(1, c->reg);
-}
-
-static int tegra2_audio_sync_clk_set_parent(struct clk *c, struct clk *p)
-{
-       u32 val;
-       const struct clk_mux_sel *sel;
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->input == p) {
-                       val = clk_readl(c->reg);
-                       val &= ~0xf;
-                       val |= sel->value;
-
-                       if (c->refcnt)
-                               clk_enable(p);
-
-                       clk_writel(val, c->reg);
-
-                       if (c->refcnt && c->parent)
-                               clk_disable(c->parent);
-
-                       clk_reparent(c, p);
-                       return 0;
-               }
-       }
-
-       return -EINVAL;
-}
-
-static struct clk_ops tegra_audio_sync_clk_ops = {
-       .init       = tegra2_audio_sync_clk_init,
-       .enable     = tegra2_audio_sync_clk_enable,
-       .disable    = tegra2_audio_sync_clk_disable,
-       .set_parent = tegra2_audio_sync_clk_set_parent,
-};
-
-/* cdev1 and cdev2 (dap_mclk1 and dap_mclk2) ops */
-
-static void tegra2_cdev_clk_init(struct clk *c)
-{
-       /* We could un-tristate the cdev1 or cdev2 pingroup here; this is
-        * currently done in the pinmux code. */
-       c->state = ON;
-
-       BUG_ON(!c->u.periph.clk_num);
-
-       if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
-                       PERIPH_CLK_TO_ENB_BIT(c)))
-               c->state = OFF;
-}
-
-static int tegra2_cdev_clk_enable(struct clk *c)
-{
-       BUG_ON(!c->u.periph.clk_num);
-
-       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-               CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
-       return 0;
-}
-
-static void tegra2_cdev_clk_disable(struct clk *c)
-{
-       BUG_ON(!c->u.periph.clk_num);
-
-       clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
-               CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
-}
-
-static struct clk_ops tegra_cdev_clk_ops = {
-       .init                   = &tegra2_cdev_clk_init,
-       .enable                 = &tegra2_cdev_clk_enable,
-       .disable                = &tegra2_cdev_clk_disable,
-};
-
-/* shared bus ops */
-/*
- * Some clocks may have multiple downstream users that need to request a
- * higher clock rate.  Shared bus clocks provide a unique shared_bus_user
- * clock to each user.  The frequency of the bus is set to the highest
- * enabled shared_bus_user clock, with a minimum value set by the
- * shared bus.
- */
-static int tegra_clk_shared_bus_update(struct clk *bus)
-{
-       struct clk *c;
-       unsigned long rate = bus->min_rate;
-
-       list_for_each_entry(c, &bus->shared_bus_list, u.shared_bus_user.node)
-               if (c->u.shared_bus_user.enabled)
-                       rate = max(c->u.shared_bus_user.rate, rate);
-
-       if (rate == clk_get_rate_locked(bus))
-               return 0;
-
-       return clk_set_rate_locked(bus, rate);
-};
-
-static void tegra_clk_shared_bus_init(struct clk *c)
-{
-       unsigned long flags;
-
-       c->max_rate = c->parent->max_rate;
-       c->u.shared_bus_user.rate = c->parent->max_rate;
-       c->state = OFF;
-       c->set = true;
-
-       spin_lock_irqsave(&c->parent->spinlock, flags);
-
-       list_add_tail(&c->u.shared_bus_user.node,
-               &c->parent->shared_bus_list);
-
-       spin_unlock_irqrestore(&c->parent->spinlock, flags);
-}
-
-static int tegra_clk_shared_bus_set_rate(struct clk *c, unsigned long rate)
-{
-       unsigned long flags;
-       int ret;
-       long new_rate = rate;
-
-       new_rate = clk_round_rate(c->parent, new_rate);
-       if (new_rate < 0)
-               return new_rate;
-
-       spin_lock_irqsave(&c->parent->spinlock, flags);
-
-       c->u.shared_bus_user.rate = new_rate;
-       ret = tegra_clk_shared_bus_update(c->parent);
-
-       spin_unlock_irqrestore(&c->parent->spinlock, flags);
-
-       return ret;
-}
-
-static long tegra_clk_shared_bus_round_rate(struct clk *c, unsigned long rate)
-{
-       return clk_round_rate(c->parent, rate);
-}
-
-static int tegra_clk_shared_bus_enable(struct clk *c)
-{
-       unsigned long flags;
-       int ret;
-
-       spin_lock_irqsave(&c->parent->spinlock, flags);
-
-       c->u.shared_bus_user.enabled = true;
-       ret = tegra_clk_shared_bus_update(c->parent);
-
-       spin_unlock_irqrestore(&c->parent->spinlock, flags);
-
-       return ret;
-}
-
-static void tegra_clk_shared_bus_disable(struct clk *c)
-{
-       unsigned long flags;
-       int ret;
-
-       spin_lock_irqsave(&c->parent->spinlock, flags);
-
-       c->u.shared_bus_user.enabled = false;
-       ret = tegra_clk_shared_bus_update(c->parent);
-       WARN_ON_ONCE(ret);
-
-       spin_unlock_irqrestore(&c->parent->spinlock, flags);
-}
-
-static struct clk_ops tegra_clk_shared_bus_ops = {
-       .init = tegra_clk_shared_bus_init,
-       .enable = tegra_clk_shared_bus_enable,
-       .disable = tegra_clk_shared_bus_disable,
-       .set_rate = tegra_clk_shared_bus_set_rate,
-       .round_rate = tegra_clk_shared_bus_round_rate,
-};
-
-
-/* Clock definitions */
-static struct clk tegra_clk_32k = {
-       .name = "clk_32k",
-       .rate = 32768,
-       .ops  = NULL,
-       .max_rate = 32768,
-};
-
-static struct clk_pll_freq_table tegra_pll_s_freq_table[] = {
-       {32768, 12000000, 366, 1, 1, 0},
-       {32768, 13000000, 397, 1, 1, 0},
-       {32768, 19200000, 586, 1, 1, 0},
-       {32768, 26000000, 793, 1, 1, 0},
-       {0, 0, 0, 0, 0, 0},
-};
-
-static struct clk tegra_pll_s = {
-       .name      = "pll_s",
-       .flags     = PLL_ALT_MISC_REG,
-       .ops       = &tegra_pll_ops,
-       .parent    = &tegra_clk_32k,
-       .max_rate  = 26000000,
-       .reg       = 0xf0,
-       .u.pll = {
-               .input_min = 32768,
-               .input_max = 32768,
-               .cf_min    = 0, /* FIXME */
-               .cf_max    = 0, /* FIXME */
-               .vco_min   = 12000000,
-               .vco_max   = 26000000,
-               .freq_table = tegra_pll_s_freq_table,
-               .lock_delay = 300,
-       },
-};
-
-static struct clk_mux_sel tegra_clk_m_sel[] = {
-       { .input = &tegra_clk_32k, .value = 0},
-       { .input = &tegra_pll_s,  .value = 1},
-       { NULL , 0},
-};
-
-static struct clk tegra_clk_m = {
-       .name      = "clk_m",
-       .flags     = ENABLE_ON_INIT,
-       .ops       = &tegra_clk_m_ops,
-       .inputs    = tegra_clk_m_sel,
-       .reg       = 0x1fc,
-       .reg_shift = 28,
-       .max_rate  = 26000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_c_freq_table[] = {
-       { 12000000, 600000000, 600, 12, 1, 8 },
-       { 13000000, 600000000, 600, 13, 1, 8 },
-       { 19200000, 600000000, 500, 16, 1, 6 },
-       { 26000000, 600000000, 600, 26, 1, 8 },
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_c = {
-       .name      = "pll_c",
-       .flags     = PLL_HAS_CPCON,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0x80,
-       .parent    = &tegra_clk_m,
-       .max_rate  = 600000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1400000000,
-               .freq_table = tegra_pll_c_freq_table,
-               .lock_delay = 300,
-       },
-};
-
-static struct clk tegra_pll_c_out1 = {
-       .name      = "pll_c_out1",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_U71,
-       .parent    = &tegra_pll_c,
-       .reg       = 0x84,
-       .reg_shift = 0,
-       .max_rate  = 600000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_m_freq_table[] = {
-       { 12000000, 666000000, 666, 12, 1, 8},
-       { 13000000, 666000000, 666, 13, 1, 8},
-       { 19200000, 666000000, 555, 16, 1, 8},
-       { 26000000, 666000000, 666, 26, 1, 8},
-       { 12000000, 600000000, 600, 12, 1, 8},
-       { 13000000, 600000000, 600, 13, 1, 8},
-       { 19200000, 600000000, 375, 12, 1, 6},
-       { 26000000, 600000000, 600, 26, 1, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_m = {
-       .name      = "pll_m",
-       .flags     = PLL_HAS_CPCON,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0x90,
-       .parent    = &tegra_clk_m,
-       .max_rate  = 800000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1200000000,
-               .freq_table = tegra_pll_m_freq_table,
-               .lock_delay = 300,
-       },
-};
-
-static struct clk tegra_pll_m_out1 = {
-       .name      = "pll_m_out1",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_U71,
-       .parent    = &tegra_pll_m,
-       .reg       = 0x94,
-       .reg_shift = 0,
-       .max_rate  = 600000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_p_freq_table[] = {
-       { 12000000, 216000000, 432, 12, 2, 8},
-       { 13000000, 216000000, 432, 13, 2, 8},
-       { 19200000, 216000000, 90,   4, 2, 1},
-       { 26000000, 216000000, 432, 26, 2, 8},
-       { 12000000, 432000000, 432, 12, 1, 8},
-       { 13000000, 432000000, 432, 13, 1, 8},
-       { 19200000, 432000000, 90,   4, 1, 1},
-       { 26000000, 432000000, 432, 26, 1, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_p = {
-       .name      = "pll_p",
-       .flags     = ENABLE_ON_INIT | PLL_FIXED | PLL_HAS_CPCON,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0xa0,
-       .parent    = &tegra_clk_m,
-       .max_rate  = 432000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1400000000,
-               .freq_table = tegra_pll_p_freq_table,
-               .lock_delay = 300,
-       },
-};
-
-static struct clk tegra_pll_p_out1 = {
-       .name      = "pll_p_out1",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
-       .parent    = &tegra_pll_p,
-       .reg       = 0xa4,
-       .reg_shift = 0,
-       .max_rate  = 432000000,
-};
-
-static struct clk tegra_pll_p_out2 = {
-       .name      = "pll_p_out2",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
-       .parent    = &tegra_pll_p,
-       .reg       = 0xa4,
-       .reg_shift = 16,
-       .max_rate  = 432000000,
-};
-
-static struct clk tegra_pll_p_out3 = {
-       .name      = "pll_p_out3",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
-       .parent    = &tegra_pll_p,
-       .reg       = 0xa8,
-       .reg_shift = 0,
-       .max_rate  = 432000000,
-};
-
-static struct clk tegra_pll_p_out4 = {
-       .name      = "pll_p_out4",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
-       .parent    = &tegra_pll_p,
-       .reg       = 0xa8,
-       .reg_shift = 16,
-       .max_rate  = 432000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_a_freq_table[] = {
-       { 28800000, 56448000, 49, 25, 1, 1},
-       { 28800000, 73728000, 64, 25, 1, 1},
-       { 28800000, 24000000,  5,  6, 1, 1},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_a = {
-       .name      = "pll_a",
-       .flags     = PLL_HAS_CPCON,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0xb0,
-       .parent    = &tegra_pll_p_out1,
-       .max_rate  = 73728000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1400000000,
-               .freq_table = tegra_pll_a_freq_table,
-               .lock_delay = 300,
-       },
-};
-
-static struct clk tegra_pll_a_out0 = {
-       .name      = "pll_a_out0",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_U71,
-       .parent    = &tegra_pll_a,
-       .reg       = 0xb4,
-       .reg_shift = 0,
-       .max_rate  = 73728000,
-};
-
-static struct clk_pll_freq_table tegra_pll_d_freq_table[] = {
-       { 12000000, 216000000, 216, 12, 1, 4},
-       { 13000000, 216000000, 216, 13, 1, 4},
-       { 19200000, 216000000, 135, 12, 1, 3},
-       { 26000000, 216000000, 216, 26, 1, 4},
-
-       { 12000000, 594000000, 594, 12, 1, 8},
-       { 13000000, 594000000, 594, 13, 1, 8},
-       { 19200000, 594000000, 495, 16, 1, 8},
-       { 26000000, 594000000, 594, 26, 1, 8},
-
-       { 12000000, 1000000000, 1000, 12, 1, 12},
-       { 13000000, 1000000000, 1000, 13, 1, 12},
-       { 19200000, 1000000000, 625,  12, 1, 8},
-       { 26000000, 1000000000, 1000, 26, 1, 12},
-
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_d = {
-       .name      = "pll_d",
-       .flags     = PLL_HAS_CPCON | PLLD,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0xd0,
-       .parent    = &tegra_clk_m,
-       .max_rate  = 1000000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 40000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 40000000,
-               .vco_max   = 1000000000,
-               .freq_table = tegra_pll_d_freq_table,
-               .lock_delay = 1000,
-       },
-};
-
-static struct clk tegra_pll_d_out0 = {
-       .name      = "pll_d_out0",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_2 | PLLD,
-       .parent    = &tegra_pll_d,
-       .max_rate  = 500000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_u_freq_table[] = {
-       { 12000000, 480000000, 960, 12, 2, 0},
-       { 13000000, 480000000, 960, 13, 2, 0},
-       { 19200000, 480000000, 200, 4,  2, 0},
-       { 26000000, 480000000, 960, 26, 2, 0},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_u = {
-       .name      = "pll_u",
-       .flags     = PLLU,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0xc0,
-       .parent    = &tegra_clk_m,
-       .max_rate  = 480000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 40000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 480000000,
-               .vco_max   = 960000000,
-               .freq_table = tegra_pll_u_freq_table,
-               .lock_delay = 1000,
-       },
-};
-
-static struct clk_pll_freq_table tegra_pll_x_freq_table[] = {
-       /* 1 GHz */
-       { 12000000, 1000000000, 1000, 12, 1, 12},
-       { 13000000, 1000000000, 1000, 13, 1, 12},
-       { 19200000, 1000000000, 625,  12, 1, 8},
-       { 26000000, 1000000000, 1000, 26, 1, 12},
-
-       /* 912 MHz */
-       { 12000000, 912000000,  912,  12, 1, 12},
-       { 13000000, 912000000,  912,  13, 1, 12},
-       { 19200000, 912000000,  760,  16, 1, 8},
-       { 26000000, 912000000,  912,  26, 1, 12},
-
-       /* 816 MHz */
-       { 12000000, 816000000,  816,  12, 1, 12},
-       { 13000000, 816000000,  816,  13, 1, 12},
-       { 19200000, 816000000,  680,  16, 1, 8},
-       { 26000000, 816000000,  816,  26, 1, 12},
-
-       /* 760 MHz */
-       { 12000000, 760000000,  760,  12, 1, 12},
-       { 13000000, 760000000,  760,  13, 1, 12},
-       { 19200000, 760000000,  950,  24, 1, 8},
-       { 26000000, 760000000,  760,  26, 1, 12},
-
-       /* 750 MHz */
-       { 12000000, 750000000,  750,  12, 1, 12},
-       { 13000000, 750000000,  750,  13, 1, 12},
-       { 19200000, 750000000,  625,  16, 1, 8},
-       { 26000000, 750000000,  750,  26, 1, 12},
-
-       /* 608 MHz */
-       { 12000000, 608000000,  608,  12, 1, 12},
-       { 13000000, 608000000,  608,  13, 1, 12},
-       { 19200000, 608000000,  380,  12, 1, 8},
-       { 26000000, 608000000,  608,  26, 1, 12},
-
-       /* 456 MHz */
-       { 12000000, 456000000,  456,  12, 1, 12},
-       { 13000000, 456000000,  456,  13, 1, 12},
-       { 19200000, 456000000,  380,  16, 1, 8},
-       { 26000000, 456000000,  456,  26, 1, 12},
-
-       /* 312 MHz */
-       { 12000000, 312000000,  312,  12, 1, 12},
-       { 13000000, 312000000,  312,  13, 1, 12},
-       { 19200000, 312000000,  260,  16, 1, 8},
-       { 26000000, 312000000,  312,  26, 1, 12},
-
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_x = {
-       .name      = "pll_x",
-       .flags     = PLL_HAS_CPCON | PLL_ALT_MISC_REG,
-       .ops       = &tegra_pllx_ops,
-       .reg       = 0xe0,
-       .parent    = &tegra_clk_m,
-       .max_rate  = 1000000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1200000000,
-               .freq_table = tegra_pll_x_freq_table,
-               .lock_delay = 300,
-       },
-};
-
-static struct clk_pll_freq_table tegra_pll_e_freq_table[] = {
-       { 12000000, 100000000,  200,  24, 1, 0 },
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_e = {
-       .name      = "pll_e",
-       .flags     = PLL_ALT_MISC_REG,
-       .ops       = &tegra_plle_ops,
-       .parent    = &tegra_clk_m,
-       .reg       = 0xe8,
-       .max_rate  = 100000000,
-       .u.pll = {
-               .input_min = 12000000,
-               .input_max = 12000000,
-               .freq_table = tegra_pll_e_freq_table,
-       },
-};
-
-static struct clk tegra_clk_d = {
-       .name      = "clk_d",
-       .flags     = PERIPH_NO_RESET,
-       .ops       = &tegra_clk_double_ops,
-       .reg       = 0x34,
-       .reg_shift = 12,
-       .parent    = &tegra_clk_m,
-       .max_rate  = 52000000,
-       .u.periph  = {
-               .clk_num = 90,
-       },
-};
-
-/* dap_mclk1, belongs to the cdev1 pingroup. */
-static struct clk tegra_clk_cdev1 = {
-       .name      = "cdev1",
-       .ops       = &tegra_cdev_clk_ops,
-       .rate      = 26000000,
-       .max_rate  = 26000000,
-       .u.periph  = {
-               .clk_num = 94,
-       },
-};
-
-/* dap_mclk2, belongs to the cdev2 pingroup. */
-static struct clk tegra_clk_cdev2 = {
-       .name      = "cdev2",
-       .ops       = &tegra_cdev_clk_ops,
-       .rate      = 26000000,
-       .max_rate  = 26000000,
-       .u.periph  = {
-               .clk_num   = 93,
-       },
-};
-
-/* initialized before peripheral clocks */
-static struct clk_mux_sel mux_audio_sync_clk[8+1];
-static const struct audio_sources {
-       const char *name;
-       int value;
-} mux_audio_sync_clk_sources[] = {
-       { .name = "spdif_in", .value = 0 },
-       { .name = "i2s1", .value = 1 },
-       { .name = "i2s2", .value = 2 },
-       { .name = "pll_a_out0", .value = 4 },
-#if 0 /* FIXME: not implemented */
-       { .name = "ac97", .value = 3 },
-       { .name = "ext_audio_clk2", .value = 5 },
-       { .name = "ext_audio_clk1", .value = 6 },
-       { .name = "ext_vimclk", .value = 7 },
-#endif
-       { NULL, 0 }
-};
-
-static struct clk tegra_clk_audio = {
-       .name      = "audio",
-       .inputs    = mux_audio_sync_clk,
-       .reg       = 0x38,
-       .max_rate  = 73728000,
-       .ops       = &tegra_audio_sync_clk_ops
-};
-
-static struct clk tegra_clk_audio_2x = {
-       .name      = "audio_2x",
-       .flags     = PERIPH_NO_RESET,
-       .max_rate  = 48000000,
-       .ops       = &tegra_clk_double_ops,
-       .reg       = 0x34,
-       .reg_shift = 8,
-       .parent    = &tegra_clk_audio,
-       .u.periph = {
-               .clk_num = 89,
-       },
-};
-
-static struct clk_lookup tegra_audio_clk_lookups[] = {
-       { .con_id = "audio", .clk = &tegra_clk_audio },
-       { .con_id = "audio_2x", .clk = &tegra_clk_audio_2x }
-};
-
-/* This is called after peripheral clocks are initialized, as the
- * audio_sync clock depends on some of the peripheral clocks.
- */
-
-static void init_audio_sync_clock_mux(void)
-{
-       int i;
-       struct clk_mux_sel *sel = mux_audio_sync_clk;
-       const struct audio_sources *src = mux_audio_sync_clk_sources;
-       struct clk_lookup *lookup;
-
-       for (i = 0; src->name; i++, sel++, src++) {
-               sel->input = tegra_get_clock_by_name(src->name);
-               if (!sel->input)
-                       pr_err("%s: could not find clk %s\n", __func__,
-                               src->name);
-               sel->value = src->value;
-       }
-
-       lookup = tegra_audio_clk_lookups;
-       for (i = 0; i < ARRAY_SIZE(tegra_audio_clk_lookups); i++, lookup++) {
-               clk_init(lookup->clk);
-               clkdev_add(lookup);
-       }
-}
-
-static struct clk_mux_sel mux_cclk[] = {
-       { .input = &tegra_clk_m,        .value = 0},
-       { .input = &tegra_pll_c,        .value = 1},
-       { .input = &tegra_clk_32k,      .value = 2},
-       { .input = &tegra_pll_m,        .value = 3},
-       { .input = &tegra_pll_p,        .value = 4},
-       { .input = &tegra_pll_p_out4,   .value = 5},
-       { .input = &tegra_pll_p_out3,   .value = 6},
-       { .input = &tegra_clk_d,        .value = 7},
-       { .input = &tegra_pll_x,        .value = 8},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_sclk[] = {
-       { .input = &tegra_clk_m,        .value = 0},
-       { .input = &tegra_pll_c_out1,   .value = 1},
-       { .input = &tegra_pll_p_out4,   .value = 2},
-       { .input = &tegra_pll_p_out3,   .value = 3},
-       { .input = &tegra_pll_p_out2,   .value = 4},
-       { .input = &tegra_clk_d,        .value = 5},
-       { .input = &tegra_clk_32k,      .value = 6},
-       { .input = &tegra_pll_m_out1,   .value = 7},
-       { NULL, 0},
-};
-
-static struct clk tegra_clk_cclk = {
-       .name   = "cclk",
-       .inputs = mux_cclk,
-       .reg    = 0x20,
-       .ops    = &tegra_super_ops,
-       .max_rate = 1000000000,
-};
-
-static struct clk tegra_clk_sclk = {
-       .name   = "sclk",
-       .inputs = mux_sclk,
-       .reg    = 0x28,
-       .ops    = &tegra_super_ops,
-       .max_rate = 240000000,
-       .min_rate = 120000000,
-};
-
-static struct clk tegra_clk_virtual_cpu = {
-       .name      = "cpu",
-       .parent    = &tegra_clk_cclk,
-       .ops       = &tegra_cpu_ops,
-       .max_rate  = 1000000000,
-       .u.cpu = {
-               .main      = &tegra_pll_x,
-               .backup    = &tegra_pll_p,
-       },
-};
-
-static struct clk tegra_clk_cop = {
-       .name      = "cop",
-       .parent    = &tegra_clk_sclk,
-       .ops       = &tegra_cop_ops,
-       .max_rate  = 240000000,
-};
-
-static struct clk tegra_clk_hclk = {
-       .name           = "hclk",
-       .flags          = DIV_BUS,
-       .parent         = &tegra_clk_sclk,
-       .reg            = 0x30,
-       .reg_shift      = 4,
-       .ops            = &tegra_bus_ops,
-       .max_rate       = 240000000,
-};
-
-static struct clk tegra_clk_pclk = {
-       .name           = "pclk",
-       .flags          = DIV_BUS,
-       .parent         = &tegra_clk_hclk,
-       .reg            = 0x30,
-       .reg_shift      = 0,
-       .ops            = &tegra_bus_ops,
-       .max_rate       = 120000000,
-};
-
-static struct clk tegra_clk_blink = {
-       .name           = "blink",
-       .parent         = &tegra_clk_32k,
-       .reg            = 0x40,
-       .ops            = &tegra_blink_clk_ops,
-       .max_rate       = 32768,
-};
-
-static struct clk_mux_sel mux_pllm_pllc_pllp_plla[] = {
-       { .input = &tegra_pll_m, .value = 0},
-       { .input = &tegra_pll_c, .value = 1},
-       { .input = &tegra_pll_p, .value = 2},
-       { .input = &tegra_pll_a_out0, .value = 3},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_pllm_pllc_pllp_clkm[] = {
-       { .input = &tegra_pll_m, .value = 0},
-       { .input = &tegra_pll_c, .value = 1},
-       { .input = &tegra_pll_p, .value = 2},
-       { .input = &tegra_clk_m, .value = 3},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_pllp_pllc_pllm_clkm[] = {
-       { .input = &tegra_pll_p, .value = 0},
-       { .input = &tegra_pll_c, .value = 1},
-       { .input = &tegra_pll_m, .value = 2},
-       { .input = &tegra_clk_m, .value = 3},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_pllaout0_audio2x_pllp_clkm[] = {
-       {.input = &tegra_pll_a_out0, .value = 0},
-       {.input = &tegra_clk_audio_2x, .value = 1},
-       {.input = &tegra_pll_p, .value = 2},
-       {.input = &tegra_clk_m, .value = 3},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_pllp_plld_pllc_clkm[] = {
-       {.input = &tegra_pll_p, .value = 0},
-       {.input = &tegra_pll_d_out0, .value = 1},
-       {.input = &tegra_pll_c, .value = 2},
-       {.input = &tegra_clk_m, .value = 3},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_pllp_pllc_audio_clkm_clk32[] = {
-       {.input = &tegra_pll_p,     .value = 0},
-       {.input = &tegra_pll_c,     .value = 1},
-       {.input = &tegra_clk_audio,     .value = 2},
-       {.input = &tegra_clk_m,     .value = 3},
-       {.input = &tegra_clk_32k,   .value = 4},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_pllp_pllc_pllm[] = {
-       {.input = &tegra_pll_p,     .value = 0},
-       {.input = &tegra_pll_c,     .value = 1},
-       {.input = &tegra_pll_m,     .value = 2},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_clk_m[] = {
-       { .input = &tegra_clk_m, .value = 0},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_pllp_out3[] = {
-       { .input = &tegra_pll_p_out3, .value = 0},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_plld[] = {
-       { .input = &tegra_pll_d, .value = 0},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_clk_32k[] = {
-       { .input = &tegra_clk_32k, .value = 0},
-       { NULL, 0},
-};
-
-static struct clk_mux_sel mux_pclk[] = {
-       { .input = &tegra_clk_pclk, .value = 0},
-       { NULL, 0},
-};
-
-static struct clk tegra_clk_emc = {
-       .name = "emc",
-       .ops = &tegra_emc_clk_ops,
-       .reg = 0x19c,
-       .max_rate = 800000000,
-       .inputs = mux_pllm_pllc_pllp_clkm,
-       .flags = MUX | DIV_U71 | PERIPH_EMC_ENB,
-       .u.periph = {
-               .clk_num = 57,
-       },
-};
-
-#define PERIPH_CLK(_name, _dev, _con, _clk_num, _reg, _max, _inputs, _flags) \
-       {                                               \
-               .name      = _name,                     \
-               .lookup    = {                          \
-                       .dev_id    = _dev,              \
-                       .con_id    = _con,              \
-               },                                      \
-               .ops       = &tegra_periph_clk_ops,     \
-               .reg       = _reg,                      \
-               .inputs    = _inputs,                   \
-               .flags     = _flags,                    \
-               .max_rate  = _max,                      \
-               .u.periph = {                           \
-                       .clk_num   = _clk_num,          \
-               },                                      \
-       }
-
-#define SHARED_CLK(_name, _dev, _con, _parent)         \
-       {                                               \
-               .name      = _name,                     \
-               .lookup    = {                          \
-                       .dev_id    = _dev,              \
-                       .con_id    = _con,              \
-               },                                      \
-               .ops       = &tegra_clk_shared_bus_ops, \
-               .parent = _parent,                      \
-       }
-
-static struct clk tegra_list_clks[] = {
-       PERIPH_CLK("apbdma",    "tegra-apbdma",         NULL,   34,     0,      108000000, mux_pclk,                    0),
-       PERIPH_CLK("rtc",       "rtc-tegra",            NULL,   4,      0,      32768,     mux_clk_32k,                 PERIPH_NO_RESET),
-       PERIPH_CLK("timer",     "timer",                NULL,   5,      0,      26000000,  mux_clk_m,                   0),
-       PERIPH_CLK("i2s1",      "tegra20-i2s.0",        NULL,   11,     0x100,  26000000,  mux_pllaout0_audio2x_pllp_clkm,      MUX | DIV_U71),
-       PERIPH_CLK("i2s2",      "tegra20-i2s.1",        NULL,   18,     0x104,  26000000,  mux_pllaout0_audio2x_pllp_clkm,      MUX | DIV_U71),
-       PERIPH_CLK("spdif_out", "spdif_out",            NULL,   10,     0x108,  100000000, mux_pllaout0_audio2x_pllp_clkm,      MUX | DIV_U71),
-       PERIPH_CLK("spdif_in",  "spdif_in",             NULL,   10,     0x10c,  100000000, mux_pllp_pllc_pllm,          MUX | DIV_U71),
-       PERIPH_CLK("pwm",       "tegra-pwm",            NULL,   17,     0x110,  432000000, mux_pllp_pllc_audio_clkm_clk32,      MUX | DIV_U71 | MUX_PWM),
-       PERIPH_CLK("spi",       "spi",                  NULL,   43,     0x114,  40000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("xio",       "xio",                  NULL,   45,     0x120,  150000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("twc",       "twc",                  NULL,   16,     0x12c,  150000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("sbc1",      "spi_tegra.0",          NULL,   41,     0x134,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("sbc2",      "spi_tegra.1",          NULL,   44,     0x118,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("sbc3",      "spi_tegra.2",          NULL,   46,     0x11c,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("sbc4",      "spi_tegra.3",          NULL,   68,     0x1b4,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("ide",       "ide",                  NULL,   25,     0x144,  100000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("ndflash",   "tegra_nand",           NULL,   13,     0x160,  164000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("vfir",      "vfir",                 NULL,   7,      0x168,  72000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("sdmmc1",    "sdhci-tegra.0",        NULL,   14,     0x150,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("sdmmc2",    "sdhci-tegra.1",        NULL,   9,      0x154,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("sdmmc3",    "sdhci-tegra.2",        NULL,   69,     0x1bc,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("sdmmc4",    "sdhci-tegra.3",        NULL,   15,     0x164,  52000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("vcp",       "tegra-avp",            "vcp",  29,     0,      250000000, mux_clk_m,                   0),
-       PERIPH_CLK("bsea",      "tegra-avp",            "bsea", 62,     0,      250000000, mux_clk_m,                   0),
-       PERIPH_CLK("bsev",      "tegra-aes",            "bsev", 63,     0,      250000000, mux_clk_m,                   0),
-       PERIPH_CLK("vde",       "tegra-avp",            "vde",  61,     0x1c8,  250000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage and process_id */
-       PERIPH_CLK("csite",     "csite",                NULL,   73,     0x1d4,  144000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* max rate ??? */
-       /* FIXME: what is la? */
-       PERIPH_CLK("la",        "la",                   NULL,   76,     0x1f8,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("owr",       "tegra_w1",             NULL,   71,     0x1cc,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("nor",       "nor",                  NULL,   42,     0x1d0,  92000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("mipi",      "mipi",                 NULL,   50,     0x174,  60000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("i2c1",      "tegra-i2c.0",          NULL,   12,     0x124,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16),
-       PERIPH_CLK("i2c2",      "tegra-i2c.1",          NULL,   54,     0x198,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16),
-       PERIPH_CLK("i2c3",      "tegra-i2c.2",          NULL,   67,     0x1b8,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16),
-       PERIPH_CLK("dvc",       "tegra-i2c.3",          NULL,   47,     0x128,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U16),
-       PERIPH_CLK("i2c1_i2c",  "tegra-i2c.0",          "i2c",  0,      0,      72000000,  mux_pllp_out3,                       0),
-       PERIPH_CLK("i2c2_i2c",  "tegra-i2c.1",          "i2c",  0,      0,      72000000,  mux_pllp_out3,                       0),
-       PERIPH_CLK("i2c3_i2c",  "tegra-i2c.2",          "i2c",  0,      0,      72000000,  mux_pllp_out3,                       0),
-       PERIPH_CLK("dvc_i2c",   "tegra-i2c.3",          "i2c",  0,      0,      72000000,  mux_pllp_out3,                       0),
-       PERIPH_CLK("uarta",     "tegra-uart.0",         NULL,   6,      0x178,  600000000, mux_pllp_pllc_pllm_clkm,     MUX),
-       PERIPH_CLK("uartb",     "tegra-uart.1",         NULL,   7,      0x17c,  600000000, mux_pllp_pllc_pllm_clkm,     MUX),
-       PERIPH_CLK("uartc",     "tegra-uart.2",         NULL,   55,     0x1a0,  600000000, mux_pllp_pllc_pllm_clkm,     MUX),
-       PERIPH_CLK("uartd",     "tegra-uart.3",         NULL,   65,     0x1c0,  600000000, mux_pllp_pllc_pllm_clkm,     MUX),
-       PERIPH_CLK("uarte",     "tegra-uart.4",         NULL,   66,     0x1c4,  600000000, mux_pllp_pllc_pllm_clkm,     MUX),
-       PERIPH_CLK("3d",        "3d",                   NULL,   24,     0x158,  300000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | PERIPH_MANUAL_RESET), /* scales with voltage and process_id */
-       PERIPH_CLK("2d",        "2d",                   NULL,   21,     0x15c,  300000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71), /* scales with voltage and process_id */
-       PERIPH_CLK("vi",        "tegra_camera",         "vi",   20,     0x148,  150000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71), /* scales with voltage and process_id */
-       PERIPH_CLK("vi_sensor", "tegra_camera",         "vi_sensor",    20,     0x1a8,  150000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | PERIPH_NO_RESET), /* scales with voltage and process_id */
-       PERIPH_CLK("epp",       "epp",                  NULL,   19,     0x16c,  300000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71), /* scales with voltage and process_id */
-       PERIPH_CLK("mpe",       "mpe",                  NULL,   60,     0x170,  250000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71), /* scales with voltage and process_id */
-       PERIPH_CLK("host1x",    "host1x",               NULL,   28,     0x180,  166000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71), /* scales with voltage and process_id */
-       PERIPH_CLK("cve",       "cve",                  NULL,   49,     0x140,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("tvo",       "tvo",                  NULL,   49,     0x188,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("hdmi",      "hdmi",                 NULL,   51,     0x18c,  600000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("tvdac",     "tvdac",                NULL,   53,     0x194,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("disp1",     "tegradc.0",            NULL,   27,     0x138,  600000000, mux_pllp_plld_pllc_clkm,     MUX), /* scales with voltage and process_id */
-       PERIPH_CLK("disp2",     "tegradc.1",            NULL,   26,     0x13c,  600000000, mux_pllp_plld_pllc_clkm,     MUX), /* scales with voltage and process_id */
-       PERIPH_CLK("usbd",      "fsl-tegra-udc",        NULL,   22,     0,      480000000, mux_clk_m,                   0), /* requires min voltage */
-       PERIPH_CLK("usb2",      "tegra-ehci.1",         NULL,   58,     0,      480000000, mux_clk_m,                   0), /* requires min voltage */
-       PERIPH_CLK("usb3",      "tegra-ehci.2",         NULL,   59,     0,      480000000, mux_clk_m,                   0), /* requires min voltage */
-       PERIPH_CLK("dsi",       "dsi",                  NULL,   48,     0,      500000000, mux_plld,                    0), /* scales with voltage */
-       PERIPH_CLK("csi",       "tegra_camera",         "csi",  52,     0,      72000000,  mux_pllp_out3,               0),
-       PERIPH_CLK("isp",       "tegra_camera",         "isp",  23,     0,      150000000, mux_clk_m,                   0), /* same frequency as VI */
-       PERIPH_CLK("csus",      "tegra_camera",         "csus", 92,     0,      150000000, mux_clk_m,                   PERIPH_NO_RESET),
-       PERIPH_CLK("pex",       NULL,                   "pex",  70,     0,      26000000,  mux_clk_m,                   PERIPH_MANUAL_RESET),
-       PERIPH_CLK("afi",       NULL,                   "afi",  72,     0,      26000000,  mux_clk_m,                   PERIPH_MANUAL_RESET),
-       PERIPH_CLK("pcie_xclk", NULL,             "pcie_xclk",  74,     0,      26000000,  mux_clk_m,                   PERIPH_MANUAL_RESET),
-
-       SHARED_CLK("avp.sclk",  "tegra-avp",            "sclk", &tegra_clk_sclk),
-       SHARED_CLK("avp.emc",   "tegra-avp",            "emc",  &tegra_clk_emc),
-       SHARED_CLK("cpu.emc",   "cpu",                  "emc",  &tegra_clk_emc),
-       SHARED_CLK("disp1.emc", "tegradc.0",            "emc",  &tegra_clk_emc),
-       SHARED_CLK("disp2.emc", "tegradc.1",            "emc",  &tegra_clk_emc),
-       SHARED_CLK("hdmi.emc",  "hdmi",                 "emc",  &tegra_clk_emc),
-       SHARED_CLK("host.emc",  "tegra_grhost",         "emc",  &tegra_clk_emc),
-       SHARED_CLK("usbd.emc",  "fsl-tegra-udc",        "emc",  &tegra_clk_emc),
-       SHARED_CLK("usb1.emc",  "tegra-ehci.0",         "emc",  &tegra_clk_emc),
-       SHARED_CLK("usb2.emc",  "tegra-ehci.1",         "emc",  &tegra_clk_emc),
-       SHARED_CLK("usb3.emc",  "tegra-ehci.2",         "emc",  &tegra_clk_emc),
-};
-
-#define CLK_DUPLICATE(_name, _dev, _con)               \
-       {                                               \
-               .name   = _name,                        \
-               .lookup = {                             \
-                       .dev_id = _dev,                 \
-                       .con_id         = _con,         \
-               },                                      \
-       }
-
-/* Some clocks may be used by different drivers depending on the board
- * configuration.  List those here to register them twice in the clock lookup
- * table under two names.
- */
-static struct clk_duplicate tegra_clk_duplicates[] = {
-       CLK_DUPLICATE("uarta",  "serial8250.0", NULL),
-       CLK_DUPLICATE("uartb",  "serial8250.1", NULL),
-       CLK_DUPLICATE("uartc",  "serial8250.2", NULL),
-       CLK_DUPLICATE("uartd",  "serial8250.3", NULL),
-       CLK_DUPLICATE("uarte",  "serial8250.4", NULL),
-       CLK_DUPLICATE("usbd", "utmip-pad", NULL),
-       CLK_DUPLICATE("usbd", "tegra-ehci.0", NULL),
-       CLK_DUPLICATE("usbd", "tegra-otg", NULL),
-       CLK_DUPLICATE("hdmi", "tegradc.0", "hdmi"),
-       CLK_DUPLICATE("hdmi", "tegradc.1", "hdmi"),
-       CLK_DUPLICATE("host1x", "tegra_grhost", "host1x"),
-       CLK_DUPLICATE("2d", "tegra_grhost", "gr2d"),
-       CLK_DUPLICATE("3d", "tegra_grhost", "gr3d"),
-       CLK_DUPLICATE("epp", "tegra_grhost", "epp"),
-       CLK_DUPLICATE("mpe", "tegra_grhost", "mpe"),
-       CLK_DUPLICATE("cop", "tegra-avp", "cop"),
-       CLK_DUPLICATE("vde", "tegra-aes", "vde"),
-};
-
-#define CLK(dev, con, ck)      \
-       {                       \
-               .dev_id = dev,  \
-               .con_id = con,  \
-               .clk = ck,      \
-       }
-
-static struct clk *tegra_ptr_clks[] = {
-       &tegra_clk_32k,
-       &tegra_pll_s,
-       &tegra_clk_m,
-       &tegra_pll_m,
-       &tegra_pll_m_out1,
-       &tegra_pll_c,
-       &tegra_pll_c_out1,
-       &tegra_pll_p,
-       &tegra_pll_p_out1,
-       &tegra_pll_p_out2,
-       &tegra_pll_p_out3,
-       &tegra_pll_p_out4,
-       &tegra_pll_a,
-       &tegra_pll_a_out0,
-       &tegra_pll_d,
-       &tegra_pll_d_out0,
-       &tegra_pll_u,
-       &tegra_pll_x,
-       &tegra_pll_e,
-       &tegra_clk_cclk,
-       &tegra_clk_sclk,
-       &tegra_clk_hclk,
-       &tegra_clk_pclk,
-       &tegra_clk_d,
-       &tegra_clk_cdev1,
-       &tegra_clk_cdev2,
-       &tegra_clk_virtual_cpu,
-       &tegra_clk_blink,
-       &tegra_clk_cop,
-       &tegra_clk_emc,
-};
-
-static void tegra2_init_one_clock(struct clk *c)
-{
-       clk_init(c);
-       INIT_LIST_HEAD(&c->shared_bus_list);
-       if (!c->lookup.dev_id && !c->lookup.con_id)
-               c->lookup.con_id = c->name;
-       c->lookup.clk = c;
-       clkdev_add(&c->lookup);
-}
-
-void __init tegra2_init_clocks(void)
-{
-       int i;
-       struct clk *c;
-
-       for (i = 0; i < ARRAY_SIZE(tegra_ptr_clks); i++)
-               tegra2_init_one_clock(tegra_ptr_clks[i]);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_list_clks); i++)
-               tegra2_init_one_clock(&tegra_list_clks[i]);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
-               c = tegra_get_clock_by_name(tegra_clk_duplicates[i].name);
-               if (!c) {
-                       pr_err("%s: Unknown duplicate clock %s\n", __func__,
-                               tegra_clk_duplicates[i].name);
-                       continue;
-               }
-
-               tegra_clk_duplicates[i].lookup.clk = c;
-               clkdev_add(&tegra_clk_duplicates[i].lookup);
-       }
-
-       init_audio_sync_clock_mux();
-}
-
-#ifdef CONFIG_PM
-static u32 clk_rst_suspend[RST_DEVICES_NUM + CLK_OUT_ENB_NUM +
-                          PERIPH_CLK_SOURCE_NUM + 22];
-
-void tegra_clk_suspend(void)
-{
-       unsigned long off, i;
-       u32 *ctx = clk_rst_suspend;
-
-       *ctx++ = clk_readl(OSC_CTRL) & OSC_CTRL_MASK;
-       *ctx++ = clk_readl(tegra_pll_c.reg + PLL_BASE);
-       *ctx++ = clk_readl(tegra_pll_c.reg + PLL_MISC(&tegra_pll_c));
-       *ctx++ = clk_readl(tegra_pll_a.reg + PLL_BASE);
-       *ctx++ = clk_readl(tegra_pll_a.reg + PLL_MISC(&tegra_pll_a));
-       *ctx++ = clk_readl(tegra_pll_s.reg + PLL_BASE);
-       *ctx++ = clk_readl(tegra_pll_s.reg + PLL_MISC(&tegra_pll_s));
-       *ctx++ = clk_readl(tegra_pll_d.reg + PLL_BASE);
-       *ctx++ = clk_readl(tegra_pll_d.reg + PLL_MISC(&tegra_pll_d));
-       *ctx++ = clk_readl(tegra_pll_u.reg + PLL_BASE);
-       *ctx++ = clk_readl(tegra_pll_u.reg + PLL_MISC(&tegra_pll_u));
-
-       *ctx++ = clk_readl(tegra_pll_m_out1.reg);
-       *ctx++ = clk_readl(tegra_pll_a_out0.reg);
-       *ctx++ = clk_readl(tegra_pll_c_out1.reg);
-
-       *ctx++ = clk_readl(tegra_clk_cclk.reg);
-       *ctx++ = clk_readl(tegra_clk_cclk.reg + SUPER_CLK_DIVIDER);
-
-       *ctx++ = clk_readl(tegra_clk_sclk.reg);
-       *ctx++ = clk_readl(tegra_clk_sclk.reg + SUPER_CLK_DIVIDER);
-       *ctx++ = clk_readl(tegra_clk_pclk.reg);
-
-       *ctx++ = clk_readl(tegra_clk_audio.reg);
-
-       for (off = PERIPH_CLK_SOURCE_I2S1; off <= PERIPH_CLK_SOURCE_OSC;
-                       off += 4) {
-               if (off == PERIPH_CLK_SOURCE_EMC)
-                       continue;
-               *ctx++ = clk_readl(off);
-       }
-
-       off = RST_DEVICES;
-       for (i = 0; i < RST_DEVICES_NUM; i++, off += 4)
-               *ctx++ = clk_readl(off);
-
-       off = CLK_OUT_ENB;
-       for (i = 0; i < CLK_OUT_ENB_NUM; i++, off += 4)
-               *ctx++ = clk_readl(off);
-
-       *ctx++ = clk_readl(MISC_CLK_ENB);
-       *ctx++ = clk_readl(CLK_MASK_ARM);
-
-       BUG_ON(ctx - clk_rst_suspend != ARRAY_SIZE(clk_rst_suspend));
-}
-
-void tegra_clk_resume(void)
-{
-       unsigned long off, i;
-       const u32 *ctx = clk_rst_suspend;
-       u32 val;
-
-       val = clk_readl(OSC_CTRL) & ~OSC_CTRL_MASK;
-       val |= *ctx++;
-       clk_writel(val, OSC_CTRL);
-
-       clk_writel(*ctx++, tegra_pll_c.reg + PLL_BASE);
-       clk_writel(*ctx++, tegra_pll_c.reg + PLL_MISC(&tegra_pll_c));
-       clk_writel(*ctx++, tegra_pll_a.reg + PLL_BASE);
-       clk_writel(*ctx++, tegra_pll_a.reg + PLL_MISC(&tegra_pll_a));
-       clk_writel(*ctx++, tegra_pll_s.reg + PLL_BASE);
-       clk_writel(*ctx++, tegra_pll_s.reg + PLL_MISC(&tegra_pll_s));
-       clk_writel(*ctx++, tegra_pll_d.reg + PLL_BASE);
-       clk_writel(*ctx++, tegra_pll_d.reg + PLL_MISC(&tegra_pll_d));
-       clk_writel(*ctx++, tegra_pll_u.reg + PLL_BASE);
-       clk_writel(*ctx++, tegra_pll_u.reg + PLL_MISC(&tegra_pll_u));
-       udelay(1000);
-
-       clk_writel(*ctx++, tegra_pll_m_out1.reg);
-       clk_writel(*ctx++, tegra_pll_a_out0.reg);
-       clk_writel(*ctx++, tegra_pll_c_out1.reg);
-
-       clk_writel(*ctx++, tegra_clk_cclk.reg);
-       clk_writel(*ctx++, tegra_clk_cclk.reg + SUPER_CLK_DIVIDER);
-
-       clk_writel(*ctx++, tegra_clk_sclk.reg);
-       clk_writel(*ctx++, tegra_clk_sclk.reg + SUPER_CLK_DIVIDER);
-       clk_writel(*ctx++, tegra_clk_pclk.reg);
-
-       clk_writel(*ctx++, tegra_clk_audio.reg);
-
-       /* enable all clocks before configuring clock sources */
-       clk_writel(0xbffffff9ul, CLK_OUT_ENB);
-       clk_writel(0xfefffff7ul, CLK_OUT_ENB + 4);
-       clk_writel(0x77f01bfful, CLK_OUT_ENB + 8);
-       wmb();
-
-       for (off = PERIPH_CLK_SOURCE_I2S1; off <= PERIPH_CLK_SOURCE_OSC;
-                       off += 4) {
-               if (off == PERIPH_CLK_SOURCE_EMC)
-                       continue;
-               clk_writel(*ctx++, off);
-       }
-       wmb();
-
-       off = RST_DEVICES;
-       for (i = 0; i < RST_DEVICES_NUM; i++, off += 4)
-               clk_writel(*ctx++, off);
-       wmb();
-
-       off = CLK_OUT_ENB;
-       for (i = 0; i < CLK_OUT_ENB_NUM; i++, off += 4)
-               clk_writel(*ctx++, off);
-       wmb();
-
-       clk_writel(*ctx++, MISC_CLK_ENB);
-       clk_writel(*ctx++, CLK_MASK_ARM);
-}
-#endif
index 6674f10..5cd502c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * arch/arm/mach-tegra/tegra30_clocks.c
  *
- * Copyright (c) 2010-2011 NVIDIA CORPORATION.  All rights reserved.
+ * Copyright (c) 2010-2012 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 as published by
@@ -35,6 +35,7 @@
 
 #include "clock.h"
 #include "fuse.h"
+#include "tegra_cpu_car.h"
 
 #define USE_PLL_LOCK_BITS 0
 
 /* FIXME: recommended safety delay after lock is detected */
 #define PLL_POST_LOCK_DELAY            100
 
+/* Tegra CPU clock and reset control regs */
+#define TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX         0x4c
+#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET     0x340
+#define TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR     0x344
+#define TEGRA30_CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR   0x34c
+#define TEGRA30_CLK_RST_CONTROLLER_CPU_CMPLX_STATUS    0x470
+
+#define CPU_CLOCK(cpu) (0x1 << (8 + cpu))
+#define CPU_RESET(cpu) (0x1111ul << (cpu))
+
 /**
 * Structure defining the fields for USB UTMI clocks Parameters.
 */
@@ -365,30 +376,32 @@ static void __iomem *misc_gp_hidrev_base = IO_ADDRESS(TEGRA_APB_MISC_BASE);
 static int tegra_periph_clk_enable_refcount[CLK_OUT_ENB_NUM * 32];
 
 #define clk_writel(value, reg) \
-       __raw_writel(value, (u32)reg_clk_base + (reg))
+       __raw_writel(value, reg_clk_base + (reg))
 #define clk_readl(reg) \
-       __raw_readl((u32)reg_clk_base + (reg))
+       __raw_readl(reg_clk_base + (reg))
 #define pmc_writel(value, reg) \
-       __raw_writel(value, (u32)reg_pmc_base + (reg))
+       __raw_writel(value, reg_pmc_base + (reg))
 #define pmc_readl(reg) \
-       __raw_readl((u32)reg_pmc_base + (reg))
+       __raw_readl(reg_pmc_base + (reg))
 #define chipid_readl() \
-       __raw_readl((u32)misc_gp_hidrev_base + MISC_GP_HIDREV)
+       __raw_readl(misc_gp_hidrev_base + MISC_GP_HIDREV)
 
 #define clk_writel_delay(value, reg)                                   \
        do {                                                            \
-               __raw_writel((value), (u32)reg_clk_base + (reg));       \
+               __raw_writel((value), reg_clk_base + (reg));    \
                udelay(2);                                              \
        } while (0)
 
-
-static inline int clk_set_div(struct clk *c, u32 n)
+static inline int clk_set_div(struct clk_tegra *c, u32 n)
 {
-       return clk_set_rate(c, (clk_get_rate(c->parent) + n-1) / n);
+       struct clk *clk = c->hw.clk;
+
+       return clk_set_rate(clk,
+                       (__clk_get_rate(__clk_get_parent(clk)) + n - 1) / n);
 }
 
 static inline u32 periph_clk_to_reg(
-       struct clk *c, u32 reg_L, u32 reg_V, int offs)
+       struct clk_tegra *c, u32 reg_L, u32 reg_V, int offs)
 {
        u32 reg = c->u.periph.clk_num / 32;
        BUG_ON(reg >= RST_DEVICES_NUM);
@@ -470,15 +483,32 @@ static int clk_div16_get_divider(unsigned long parent_rate, unsigned long rate)
        return divider_u16 - 1;
 }
 
+static unsigned long tegra30_clk_fixed_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       return to_clk_tegra(hw)->fixed_rate;
+}
+
+struct clk_ops tegra30_clk_32k_ops = {
+       .recalc_rate = tegra30_clk_fixed_recalc_rate,
+};
+
 /* clk_m functions */
-static unsigned long tegra30_clk_m_autodetect_rate(struct clk *c)
+static unsigned long tegra30_clk_m_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       if (!to_clk_tegra(hw)->fixed_rate)
+               to_clk_tegra(hw)->fixed_rate = clk_measure_input_freq();
+       return to_clk_tegra(hw)->fixed_rate;
+}
+
+static void tegra30_clk_m_init(struct clk_hw *hw)
 {
        u32 osc_ctrl = clk_readl(OSC_CTRL);
        u32 auto_clock_control = osc_ctrl & ~OSC_CTRL_OSC_FREQ_MASK;
        u32 pll_ref_div = osc_ctrl & OSC_CTRL_PLL_REF_DIV_MASK;
 
-       c->rate = clk_measure_input_freq();
-       switch (c->rate) {
+       switch (to_clk_tegra(hw)->fixed_rate) {
        case 12000000:
                auto_clock_control |= OSC_CTRL_OSC_FREQ_12MHZ;
                BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_1);
@@ -508,46 +538,44 @@ static unsigned long tegra30_clk_m_autodetect_rate(struct clk *c)
                BUG_ON(pll_ref_div != OSC_CTRL_PLL_REF_DIV_4);
                break;
        default:
-               pr_err("%s: Unexpected clock rate %ld", __func__, c->rate);
+               pr_err("%s: Unexpected clock rate %ld", __func__,
+                               to_clk_tegra(hw)->fixed_rate);
                BUG();
        }
        clk_writel(auto_clock_control, OSC_CTRL);
-       return c->rate;
 }
 
-static void tegra30_clk_m_init(struct clk *c)
-{
-       pr_debug("%s on clock %s\n", __func__, c->name);
-       tegra30_clk_m_autodetect_rate(c);
-}
+struct clk_ops tegra30_clk_m_ops = {
+       .init = tegra30_clk_m_init,
+       .recalc_rate = tegra30_clk_m_recalc_rate,
+};
 
-static int tegra30_clk_m_enable(struct clk *c)
+static unsigned long tegra30_clk_m_div_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
 {
-       pr_debug("%s on clock %s\n", __func__, c->name);
-       return 0;
-}
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = parent_rate;
 
-static void tegra30_clk_m_disable(struct clk *c)
-{
-       pr_debug("%s on clock %s\n", __func__, c->name);
-       WARN(1, "Attempting to disable main SoC clock\n");
-}
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
 
-static struct clk_ops tegra_clk_m_ops = {
-       .init           = tegra30_clk_m_init,
-       .enable         = tegra30_clk_m_enable,
-       .disable        = tegra30_clk_m_disable,
-};
+       return rate;
+}
 
-static struct clk_ops tegra_clk_m_div_ops = {
-       .enable         = tegra30_clk_m_enable,
+struct clk_ops tegra_clk_m_div_ops = {
+       .recalc_rate = tegra30_clk_m_div_recalc_rate,
 };
 
 /* PLL reference divider functions */
-static void tegra30_pll_ref_init(struct clk *c)
+static unsigned long tegra30_pll_ref_recalc_rate(struct clk_hw *hw,
+                       unsigned long parent_rate)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long rate = parent_rate;
        u32 pll_ref_div = clk_readl(OSC_CTRL) & OSC_CTRL_PLL_REF_DIV_MASK;
-       pr_debug("%s on clock %s\n", __func__, c->name);
 
        switch (pll_ref_div) {
        case OSC_CTRL_PLL_REF_DIV_1:
@@ -564,13 +592,18 @@ static void tegra30_pll_ref_init(struct clk *c)
                BUG();
        }
        c->mul = 1;
-       c->state = ON;
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+
+       return rate;
 }
 
-static struct clk_ops tegra_pll_ref_ops = {
-       .init           = tegra30_pll_ref_init,
-       .enable         = tegra30_clk_m_enable,
-       .disable        = tegra30_clk_m_disable,
+struct clk_ops tegra_pll_ref_ops = {
+       .recalc_rate = tegra30_pll_ref_recalc_rate,
 };
 
 /* super clock functions */
@@ -581,56 +614,50 @@ static struct clk_ops tegra_pll_ref_ops = {
  * only when its parent is a fixed rate PLL, since we can't change PLL rate
  * in this case.
  */
-static void tegra30_super_clk_init(struct clk *c)
+static void tegra30_super_clk_init(struct clk_hw *hw)
 {
-       u32 val;
-       int source;
-       int shift;
-       const struct clk_mux_sel *sel;
-       val = clk_readl(c->reg + SUPER_CLK_MUX);
-       c->state = ON;
-       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
-               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
-       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
-               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
-       source = (val >> shift) & SUPER_SOURCE_MASK;
-       if (c->flags & DIV_2)
-               source |= val & SUPER_LP_DIV2_BYPASS;
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->value == source)
-                       break;
-       }
-       BUG_ON(sel->input == NULL);
-       c->parent = sel->input;
+       struct clk_tegra *c = to_clk_tegra(hw);
+       struct clk_tegra *p =
+                       to_clk_tegra(__clk_get_hw(__clk_get_parent(hw->clk)));
 
+       c->state = ON;
        if (c->flags & DIV_U71) {
                /* Init safe 7.1 divider value (does not affect PLLX path) */
                clk_writel(SUPER_CLOCK_DIV_U71_MIN << SUPER_CLOCK_DIV_U71_SHIFT,
                           c->reg + SUPER_CLK_DIVIDER);
                c->mul = 2;
                c->div = 2;
-               if (!(c->parent->flags & PLLX))
+               if (!(p->flags & PLLX))
                        c->div += SUPER_CLOCK_DIV_U71_MIN;
        } else
                clk_writel(0, c->reg + SUPER_CLK_DIVIDER);
 }
 
-static int tegra30_super_clk_enable(struct clk *c)
+static u8 tegra30_super_clk_get_parent(struct clk_hw *hw)
 {
-       return 0;
-}
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+       int source;
+       int shift;
 
-static void tegra30_super_clk_disable(struct clk *c)
-{
-       /* since tegra 3 has 2 CPU super clocks - low power lp-mode clock and
-          geared up g-mode super clock - mode switch may request to disable
-          either of them; accept request with no affect on h/w */
+       val = clk_readl(c->reg + SUPER_CLK_MUX);
+       BUG_ON(((val & SUPER_STATE_MASK) != SUPER_STATE_RUN) &&
+               ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
+       shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
+               SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
+       source = (val >> shift) & SUPER_SOURCE_MASK;
+       if (c->flags & DIV_2)
+               source |= val & SUPER_LP_DIV2_BYPASS;
+
+       return source;
 }
 
-static int tegra30_super_clk_set_parent(struct clk *c, struct clk *p)
+static int tegra30_super_clk_set_parent(struct clk_hw *hw, u8 index)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+       struct clk_tegra *p =
+                       to_clk_tegra(__clk_get_hw(clk_get_parent(hw->clk)));
        u32 val;
-       const struct clk_mux_sel *sel;
        int shift;
 
        val = clk_readl(c->reg + SUPER_CLK_MUX);
@@ -638,48 +665,36 @@ static int tegra30_super_clk_set_parent(struct clk *c, struct clk *p)
                ((val & SUPER_STATE_MASK) != SUPER_STATE_IDLE));
        shift = ((val & SUPER_STATE_MASK) == SUPER_STATE_IDLE) ?
                SUPER_IDLE_SOURCE_SHIFT : SUPER_RUN_SOURCE_SHIFT;
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->input == p) {
-                       /* For LP mode super-clock switch between PLLX direct
-                          and divided-by-2 outputs is allowed only when other
-                          than PLLX clock source is current parent */
-                       if ((c->flags & DIV_2) && (p->flags & PLLX) &&
-                           ((sel->value ^ val) & SUPER_LP_DIV2_BYPASS)) {
-                               if (c->parent->flags & PLLX)
-                                       return -EINVAL;
-                               val ^= SUPER_LP_DIV2_BYPASS;
-                               clk_writel_delay(val, c->reg);
-                       }
-                       val &= ~(SUPER_SOURCE_MASK << shift);
-                       val |= (sel->value & SUPER_SOURCE_MASK) << shift;
-
-                       /* 7.1 divider for CPU super-clock does not affect
-                          PLLX path */
-                       if (c->flags & DIV_U71) {
-                               u32 div = 0;
-                               if (!(p->flags & PLLX)) {
-                                       div = clk_readl(c->reg +
-                                                       SUPER_CLK_DIVIDER);
-                                       div &= SUPER_CLOCK_DIV_U71_MASK;
-                                       div >>= SUPER_CLOCK_DIV_U71_SHIFT;
-                               }
-                               c->div = div + 2;
-                               c->mul = 2;
-                       }
-
-                       if (c->refcnt)
-                               clk_enable(p);
-
-                       clk_writel_delay(val, c->reg);
 
-                       if (c->refcnt && c->parent)
-                               clk_disable(c->parent);
+       /* For LP mode super-clock switch between PLLX direct
+          and divided-by-2 outputs is allowed only when other
+          than PLLX clock source is current parent */
+       if ((c->flags & DIV_2) && (p->flags & PLLX) &&
+           ((index ^ val) & SUPER_LP_DIV2_BYPASS)) {
+               if (p->flags & PLLX)
+                       return -EINVAL;
+               val ^= SUPER_LP_DIV2_BYPASS;
+               clk_writel_delay(val, c->reg);
+       }
+       val &= ~(SUPER_SOURCE_MASK << shift);
+       val |= (index & SUPER_SOURCE_MASK) << shift;
 
-                       clk_reparent(c, p);
-                       return 0;
+       /* 7.1 divider for CPU super-clock does not affect
+          PLLX path */
+       if (c->flags & DIV_U71) {
+               u32 div = 0;
+               if (!(p->flags & PLLX)) {
+                       div = clk_readl(c->reg +
+                                       SUPER_CLK_DIVIDER);
+                       div &= SUPER_CLOCK_DIV_U71_MASK;
+                       div >>= SUPER_CLOCK_DIV_U71_SHIFT;
                }
+               c->div = div + 2;
+               c->mul = 2;
        }
-       return -EINVAL;
+       clk_writel_delay(val, c->reg);
+
+       return 0;
 }
 
 /*
@@ -691,10 +706,15 @@ static int tegra30_super_clk_set_parent(struct clk *c, struct clk *p)
  * rate of this PLL can't be changed, and it has many other children. In
  * this case use 7.1 fractional divider to adjust the super clock rate.
  */
-static int tegra30_super_clk_set_rate(struct clk *c, unsigned long rate)
+static int tegra30_super_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
 {
-       if ((c->flags & DIV_U71) && (c->parent->flags & PLL_FIXED)) {
-               int div = clk_div71_get_divider(c->parent->u.pll.fixed_rate,
+       struct clk_tegra *c = to_clk_tegra(hw);
+       struct clk *parent = __clk_get_parent(hw->clk);
+       struct clk_tegra *cparent = to_clk_tegra(__clk_get_hw(parent));
+
+       if ((c->flags & DIV_U71) && (cparent->flags & PLL_FIXED)) {
+               int div = clk_div71_get_divider(parent_rate,
                                        rate, c->flags, ROUND_DIVIDER_DOWN);
                div = max(div, SUPER_CLOCK_DIV_U71_MIN);
 
@@ -704,55 +724,86 @@ static int tegra30_super_clk_set_rate(struct clk *c, unsigned long rate)
                c->mul = 2;
                return 0;
        }
-       return clk_set_rate(c->parent, rate);
+       return 0;
+}
+
+static unsigned long tegra30_super_clk_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = parent_rate;
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+
+       return rate;
+}
+
+static long tegra30_super_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       struct clk *parent = __clk_get_parent(hw->clk);
+       struct clk_tegra *cparent = to_clk_tegra(__clk_get_hw(parent));
+       int mul = 2;
+       int div;
+
+       if ((c->flags & DIV_U71) && (cparent->flags & PLL_FIXED)) {
+               div = clk_div71_get_divider(*prate,
+                               rate, c->flags, ROUND_DIVIDER_DOWN);
+               div = max(div, SUPER_CLOCK_DIV_U71_MIN) + 2;
+               rate = *prate * mul;
+               rate += div - 1; /* round up */
+               do_div(rate, c->div);
+
+               return rate;
+       }
+       return *prate;
 }
 
-static struct clk_ops tegra_super_ops = {
-       .init                   = tegra30_super_clk_init,
-       .enable                 = tegra30_super_clk_enable,
-       .disable                = tegra30_super_clk_disable,
-       .set_parent             = tegra30_super_clk_set_parent,
-       .set_rate               = tegra30_super_clk_set_rate,
+struct clk_ops tegra30_super_ops = {
+       .init = tegra30_super_clk_init,
+       .set_parent = tegra30_super_clk_set_parent,
+       .get_parent = tegra30_super_clk_get_parent,
+       .recalc_rate = tegra30_super_clk_recalc_rate,
+       .round_rate = tegra30_super_clk_round_rate,
+       .set_rate = tegra30_super_clk_set_rate,
 };
 
-static int tegra30_twd_clk_set_rate(struct clk *c, unsigned long rate)
+static unsigned long tegra30_twd_clk_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
 {
-       /* The input value 'rate' is the clock rate of the CPU complex. */
-       c->rate = (rate * c->mul) / c->div;
-       return 0;
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = parent_rate;
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+
+       return rate;
 }
 
-static struct clk_ops tegra30_twd_ops = {
-       .set_rate       = tegra30_twd_clk_set_rate,
+struct clk_ops tegra30_twd_ops = {
+       .recalc_rate = tegra30_twd_clk_recalc_rate,
 };
 
 /* Blink output functions */
-
-static void tegra30_blink_clk_init(struct clk *c)
+static int tegra30_blink_clk_is_enabled(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
 
        val = pmc_readl(PMC_CTRL);
        c->state = (val & PMC_CTRL_BLINK_ENB) ? ON : OFF;
-       c->mul = 1;
-       val = pmc_readl(c->reg);
-
-       if (val & PMC_BLINK_TIMER_ENB) {
-               unsigned int on_off;
-
-               on_off = (val >> PMC_BLINK_TIMER_DATA_ON_SHIFT) &
-                       PMC_BLINK_TIMER_DATA_ON_MASK;
-               val >>= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
-               val &= PMC_BLINK_TIMER_DATA_OFF_MASK;
-               on_off += val;
-               /* each tick in the blink timer is 4 32KHz clocks */
-               c->div = on_off * 4;
-       } else {
-               c->div = 1;
-       }
+       return c->state;
 }
 
-static int tegra30_blink_clk_enable(struct clk *c)
+static int tegra30_blink_clk_enable(struct clk_hw *hw)
 {
        u32 val;
 
@@ -765,7 +816,7 @@ static int tegra30_blink_clk_enable(struct clk *c)
        return 0;
 }
 
-static void tegra30_blink_clk_disable(struct clk *c)
+static void tegra30_blink_clk_disable(struct clk_hw *hw)
 {
        u32 val;
 
@@ -776,9 +827,11 @@ static void tegra30_blink_clk_disable(struct clk *c)
        pmc_writel(val & ~PMC_DPD_PADS_ORIDE_BLINK_ENB, PMC_DPD_PADS_ORIDE);
 }
 
-static int tegra30_blink_clk_set_rate(struct clk *c, unsigned long rate)
+static int tegra30_blink_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
 {
-       unsigned long parent_rate = clk_get_rate(c->parent);
+       struct clk_tegra *c = to_clk_tegra(hw);
+
        if (rate >= parent_rate) {
                c->div = 1;
                pmc_writel(0, c->reg);
@@ -801,41 +854,77 @@ static int tegra30_blink_clk_set_rate(struct clk *c, unsigned long rate)
        return 0;
 }
 
-static struct clk_ops tegra_blink_clk_ops = {
-       .init                   = &tegra30_blink_clk_init,
-       .enable                 = &tegra30_blink_clk_enable,
-       .disable                = &tegra30_blink_clk_disable,
-       .set_rate               = &tegra30_blink_clk_set_rate,
-};
+static unsigned long tegra30_blink_clk_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = parent_rate;
+       u32 val;
+       u32 mul;
+       u32 div;
+       u32 on_off;
 
-/* PLL Functions */
-static int tegra30_pll_clk_wait_for_lock(struct clk *c, u32 lock_reg,
-                                        u32 lock_bit)
+       mul = 1;
+       val = pmc_readl(c->reg);
+
+       if (val & PMC_BLINK_TIMER_ENB) {
+               on_off = (val >> PMC_BLINK_TIMER_DATA_ON_SHIFT) &
+                       PMC_BLINK_TIMER_DATA_ON_MASK;
+               val >>= PMC_BLINK_TIMER_DATA_OFF_SHIFT;
+               val &= PMC_BLINK_TIMER_DATA_OFF_MASK;
+               on_off += val;
+               /* each tick in the blink timer is 4 32KHz clocks */
+               div = on_off * 4;
+       } else {
+               div = 1;
+       }
+
+       if (mul != 0 && div != 0) {
+               rate *= mul;
+               rate += div - 1; /* round up */
+               do_div(rate, div);
+       }
+       return rate;
+}
+
+static long tegra30_blink_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
 {
-#if USE_PLL_LOCK_BITS
-       int i;
-       for (i = 0; i < c->u.pll.lock_delay; i++) {
-               if (clk_readl(lock_reg) & lock_bit) {
-                       udelay(PLL_POST_LOCK_DELAY);
-                       return 0;
-               }
-               udelay(2);              /* timeout = 2 * lock time */
+       int div;
+       int mul;
+       long round_rate = *prate;
+
+       mul = 1;
+
+       if (rate >= *prate) {
+               div = 1;
+       } else {
+               div = DIV_ROUND_UP(*prate / 8, rate);
+               div *= 8;
        }
-       pr_err("Timed out waiting for lock bit on pll %s", c->name);
-       return -1;
-#endif
-       udelay(c->u.pll.lock_delay);
 
-       return 0;
+       round_rate *= mul;
+       round_rate += div - 1;
+       do_div(round_rate, div);
+
+       return round_rate;
 }
 
+struct clk_ops tegra30_blink_clk_ops = {
+       .is_enabled = tegra30_blink_clk_is_enabled,
+       .enable = tegra30_blink_clk_enable,
+       .disable = tegra30_blink_clk_disable,
+       .recalc_rate = tegra30_blink_clk_recalc_rate,
+       .round_rate = tegra30_blink_clk_round_rate,
+       .set_rate = tegra30_blink_clk_set_rate,
+};
 
-static void tegra30_utmi_param_configure(struct clk *c)
+static void tegra30_utmi_param_configure(struct clk_hw *hw)
 {
+       unsigned long main_rate =
+               __clk_get_rate(__clk_get_parent(__clk_get_parent(hw->clk)));
        u32 reg;
        int i;
-       unsigned long main_rate =
-               clk_get_rate(c->parent->parent);
 
        for (i = 0; i < ARRAY_SIZE(utmi_parameters); i++) {
                if (main_rate == utmi_parameters[i].osc_frequency)
@@ -886,50 +975,52 @@ static void tegra30_utmi_param_configure(struct clk *c)
        clk_writel(reg, UTMIP_PLL_CFG1);
 }
 
-static void tegra30_pll_clk_init(struct clk *c)
+/* PLL Functions */
+static int tegra30_pll_clk_wait_for_lock(struct clk_tegra *c, u32 lock_reg,
+                                        u32 lock_bit)
+{
+       int ret = 0;
+
+#if USE_PLL_LOCK_BITS
+       int i;
+       for (i = 0; i < c->u.pll.lock_delay; i++) {
+               if (clk_readl(lock_reg) & lock_bit) {
+                       udelay(PLL_POST_LOCK_DELAY);
+                       return 0;
+               }
+               udelay(2);      /* timeout = 2 * lock time */
+       }
+       pr_err("Timed out waiting for lock bit on pll %s",
+                                       __clk_get_name(hw->clk));
+       ret = -1;
+#else
+       udelay(c->u.pll.lock_delay);
+#endif
+       return ret;
+}
+
+static int tegra30_pll_clk_is_enabled(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val = clk_readl(c->reg + PLL_BASE);
 
        c->state = (val & PLL_BASE_ENABLE) ? ON : OFF;
+       return c->state;
+}
 
-       if (c->flags & PLL_FIXED && !(val & PLL_BASE_OVERRIDE)) {
-               const struct clk_pll_freq_table *sel;
-               unsigned long input_rate = clk_get_rate(c->parent);
-               for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
-                       if (sel->input_rate == input_rate &&
-                               sel->output_rate == c->u.pll.fixed_rate) {
-                               c->mul = sel->n;
-                               c->div = sel->m * sel->p;
-                               return;
-                       }
-               }
-               pr_err("Clock %s has unknown fixed frequency\n", c->name);
-               BUG();
-       } else if (val & PLL_BASE_BYPASS) {
-               c->mul = 1;
-               c->div = 1;
-       } else {
-               c->mul = (val & PLL_BASE_DIVN_MASK) >> PLL_BASE_DIVN_SHIFT;
-               c->div = (val & PLL_BASE_DIVM_MASK) >> PLL_BASE_DIVM_SHIFT;
-               if (c->flags & PLLU)
-                       c->div *= (val & PLLU_BASE_POST_DIV) ? 1 : 2;
-               else
-                       c->div *= (0x1 << ((val & PLL_BASE_DIVP_MASK) >>
-                                       PLL_BASE_DIVP_SHIFT));
-               if (c->flags & PLL_FIXED) {
-                       unsigned long rate = clk_get_rate_locked(c);
-                       BUG_ON(rate != c->u.pll.fixed_rate);
-               }
-       }
+static void tegra30_pll_clk_init(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
 
        if (c->flags & PLLU)
-               tegra30_utmi_param_configure(c);
+               tegra30_utmi_param_configure(hw);
 }
 
-static int tegra30_pll_clk_enable(struct clk *c)
+static int tegra30_pll_clk_enable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
-       pr_debug("%s on clock %s\n", __func__, c->name);
+       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
 
 #if USE_PLL_LOCK_BITS
        val = clk_readl(c->reg + PLL_MISC(c));
@@ -952,10 +1043,11 @@ static int tegra30_pll_clk_enable(struct clk *c)
        return 0;
 }
 
-static void tegra30_pll_clk_disable(struct clk *c)
+static void tegra30_pll_clk_disable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
-       pr_debug("%s on clock %s\n", __func__, c->name);
+       pr_debug("%s on clock %s\n", __func__, __clk_get_name(hw->clk));
 
        val = clk_readl(c->reg);
        val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
@@ -968,36 +1060,36 @@ static void tegra30_pll_clk_disable(struct clk *c)
        }
 }
 
-static int tegra30_pll_clk_set_rate(struct clk *c, unsigned long rate)
+static int tegra30_pll_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val, p_div, old_base;
        unsigned long input_rate;
        const struct clk_pll_freq_table *sel;
        struct clk_pll_freq_table cfg;
 
-       pr_debug("%s: %s %lu\n", __func__, c->name, rate);
-
        if (c->flags & PLL_FIXED) {
                int ret = 0;
                if (rate != c->u.pll.fixed_rate) {
                        pr_err("%s: Can not change %s fixed rate %lu to %lu\n",
-                              __func__, c->name, c->u.pll.fixed_rate, rate);
+                              __func__, __clk_get_name(hw->clk),
+                               c->u.pll.fixed_rate, rate);
                        ret = -EINVAL;
                }
                return ret;
        }
 
        if (c->flags & PLLM) {
-               if (rate != clk_get_rate_locked(c)) {
+               if (rate != __clk_get_rate(hw->clk)) {
                        pr_err("%s: Can not change memory %s rate in flight\n",
-                              __func__, c->name);
+                               __func__, __clk_get_name(hw->clk));
                        return -EINVAL;
                }
-               return 0;
        }
 
        p_div = 0;
-       input_rate = clk_get_rate(c->parent);
+       input_rate = parent_rate;
 
        /* Check if the target rate is tabulated */
        for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
@@ -1055,7 +1147,7 @@ static int tegra30_pll_clk_set_rate(struct clk *c, unsigned long rate)
                    (p_div > (PLL_BASE_DIVP_MASK >> PLL_BASE_DIVP_SHIFT)) ||
                    (cfg.output_rate > c->u.pll.vco_max)) {
                        pr_err("%s: Failed to set %s out-of-table rate %lu\n",
-                              __func__, c->name, rate);
+                              __func__, __clk_get_name(hw->clk), rate);
                        return -EINVAL;
                }
                p_div <<= PLL_BASE_DIVP_SHIFT;
@@ -1073,7 +1165,7 @@ static int tegra30_pll_clk_set_rate(struct clk *c, unsigned long rate)
                return 0;
 
        if (c->state == ON) {
-               tegra30_pll_clk_disable(c);
+               tegra30_pll_clk_disable(hw);
                val &= ~(PLL_BASE_BYPASS | PLL_BASE_ENABLE);
        }
        clk_writel(val, c->reg + PLL_BASE);
@@ -1095,87 +1187,201 @@ static int tegra30_pll_clk_set_rate(struct clk *c, unsigned long rate)
        }
 
        if (c->state == ON)
-               tegra30_pll_clk_enable(c);
-
-       return 0;
-}
-
-static struct clk_ops tegra_pll_ops = {
-       .init                   = tegra30_pll_clk_init,
-       .enable                 = tegra30_pll_clk_enable,
-       .disable                = tegra30_pll_clk_disable,
-       .set_rate               = tegra30_pll_clk_set_rate,
-};
-
-static int
-tegra30_plld_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting)
-{
-       u32 val, mask, reg;
+               tegra30_pll_clk_enable(hw);
 
-       switch (p) {
-       case TEGRA_CLK_PLLD_CSI_OUT_ENB:
-               mask = PLLD_BASE_CSI_CLKENABLE;
-               reg = c->reg + PLL_BASE;
-               break;
-       case TEGRA_CLK_PLLD_DSI_OUT_ENB:
-               mask = PLLD_MISC_DSI_CLKENABLE;
-               reg = c->reg + PLL_MISC(c);
-               break;
-       case TEGRA_CLK_PLLD_MIPI_MUX_SEL:
-               if (!(c->flags & PLL_ALT_MISC_REG)) {
-                       mask = PLLD_BASE_DSIB_MUX_MASK;
-                       reg = c->reg + PLL_BASE;
-                       break;
-               }
-       /* fall through - error since PLLD2 does not have MUX_SEL control */
-       default:
-               return -EINVAL;
-       }
+       c->u.pll.fixed_rate = rate;
 
-       val = clk_readl(reg);
-       if (setting)
-               val |= mask;
-       else
-               val &= ~mask;
-       clk_writel(val, reg);
        return 0;
 }
 
-static struct clk_ops tegra_plld_ops = {
-       .init                   = tegra30_pll_clk_init,
-       .enable                 = tegra30_pll_clk_enable,
-       .disable                = tegra30_pll_clk_disable,
-       .set_rate               = tegra30_pll_clk_set_rate,
-       .clk_cfg_ex             = tegra30_plld_clk_cfg_ex,
-};
-
-static void tegra30_plle_clk_init(struct clk *c)
+static long tegra30_pll_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long input_rate = *prate;
+       unsigned long output_rate = *prate;
+       const struct clk_pll_freq_table *sel;
+       struct clk_pll_freq_table cfg;
+       int mul;
+       int div;
+       u32 p_div;
        u32 val;
 
-       val = clk_readl(PLLE_AUX);
-       c->parent = (val & PLLE_AUX_PLLP_SEL) ?
-               tegra_get_clock_by_name("pll_p") :
-               tegra_get_clock_by_name("pll_ref");
+       if (c->flags & PLL_FIXED)
+               return c->u.pll.fixed_rate;
 
-       val = clk_readl(c->reg + PLL_BASE);
-       c->state = (val & PLLE_BASE_ENABLE) ? ON : OFF;
-       c->mul = (val & PLLE_BASE_DIVN_MASK) >> PLLE_BASE_DIVN_SHIFT;
-       c->div = (val & PLLE_BASE_DIVM_MASK) >> PLLE_BASE_DIVM_SHIFT;
-       c->div *= (val & PLLE_BASE_DIVP_MASK) >> PLLE_BASE_DIVP_SHIFT;
-}
+       if (c->flags & PLLM)
+               return __clk_get_rate(hw->clk);
 
-static void tegra30_plle_clk_disable(struct clk *c)
-{
-       u32 val;
-       pr_debug("%s on clock %s\n", __func__, c->name);
+       p_div = 0;
+       /* Check if the target rate is tabulated */
+       for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
+               if (sel->input_rate == input_rate && sel->output_rate == rate) {
+                       if (c->flags & PLLU) {
+                               BUG_ON(sel->p < 1 || sel->p > 2);
+                               if (sel->p == 1)
+                                       p_div = PLLU_BASE_POST_DIV;
+                       } else {
+                               BUG_ON(sel->p < 1);
+                               for (val = sel->p; val > 1; val >>= 1)
+                                       p_div++;
+                               p_div <<= PLL_BASE_DIVP_SHIFT;
+                       }
+                       break;
+               }
+       }
 
-       val = clk_readl(c->reg + PLL_BASE);
-       val &= ~(PLLE_BASE_CML_ENABLE | PLLE_BASE_ENABLE);
-       clk_writel(val, c->reg + PLL_BASE);
-}
+       if (sel->input_rate == 0) {
+               unsigned long cfreq;
+               BUG_ON(c->flags & PLLU);
+               sel = &cfg;
 
-static void tegra30_plle_training(struct clk *c)
+               switch (input_rate) {
+               case 12000000:
+               case 26000000:
+                       cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2000000;
+                       break;
+               case 13000000:
+                       cfreq = (rate <= 1000000 * 1000) ? 1000000 : 2600000;
+                       break;
+               case 16800000:
+               case 19200000:
+                       cfreq = (rate <= 1200000 * 1000) ? 1200000 : 2400000;
+                       break;
+               default:
+                       pr_err("%s: Unexpected reference rate %lu\n",
+                              __func__, input_rate);
+                       BUG();
+               }
+
+               /* Raise VCO to guarantee 0.5% accuracy */
+               for (cfg.output_rate = rate; cfg.output_rate < 200 * cfreq;
+                     cfg.output_rate <<= 1)
+                       p_div++;
+
+               cfg.p = 0x1 << p_div;
+               cfg.m = input_rate / cfreq;
+               cfg.n = cfg.output_rate / cfreq;
+       }
+
+       mul = sel->n;
+       div = sel->m * sel->p;
+
+       output_rate *= mul;
+       output_rate += div - 1; /* round up */
+       do_div(output_rate, div);
+
+       return output_rate;
+}
+
+static unsigned long tegra30_pll_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = parent_rate;
+       u32 val = clk_readl(c->reg + PLL_BASE);
+
+       if (c->flags & PLL_FIXED && !(val & PLL_BASE_OVERRIDE)) {
+               const struct clk_pll_freq_table *sel;
+               for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
+                       if (sel->input_rate == parent_rate &&
+                               sel->output_rate == c->u.pll.fixed_rate) {
+                               c->mul = sel->n;
+                               c->div = sel->m * sel->p;
+                               break;
+                       }
+               }
+               pr_err("Clock %s has unknown fixed frequency\n",
+                                               __clk_get_name(hw->clk));
+               BUG();
+       } else if (val & PLL_BASE_BYPASS) {
+               c->mul = 1;
+               c->div = 1;
+       } else {
+               c->mul = (val & PLL_BASE_DIVN_MASK) >> PLL_BASE_DIVN_SHIFT;
+               c->div = (val & PLL_BASE_DIVM_MASK) >> PLL_BASE_DIVM_SHIFT;
+               if (c->flags & PLLU)
+                       c->div *= (val & PLLU_BASE_POST_DIV) ? 1 : 2;
+               else
+                       c->div *= (0x1 << ((val & PLL_BASE_DIVP_MASK) >>
+                                       PLL_BASE_DIVP_SHIFT));
+       }
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+
+       return rate;
+}
+
+struct clk_ops tegra30_pll_ops = {
+       .is_enabled = tegra30_pll_clk_is_enabled,
+       .init = tegra30_pll_clk_init,
+       .enable = tegra30_pll_clk_enable,
+       .disable = tegra30_pll_clk_disable,
+       .recalc_rate = tegra30_pll_recalc_rate,
+       .round_rate = tegra30_pll_round_rate,
+       .set_rate = tegra30_pll_clk_set_rate,
+};
+
+int tegra30_plld_clk_cfg_ex(struct clk_hw *hw,
+                               enum tegra_clk_ex_param p, u32 setting)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val, mask, reg;
+
+       switch (p) {
+       case TEGRA_CLK_PLLD_CSI_OUT_ENB:
+               mask = PLLD_BASE_CSI_CLKENABLE;
+               reg = c->reg + PLL_BASE;
+               break;
+       case TEGRA_CLK_PLLD_DSI_OUT_ENB:
+               mask = PLLD_MISC_DSI_CLKENABLE;
+               reg = c->reg + PLL_MISC(c);
+               break;
+       case TEGRA_CLK_PLLD_MIPI_MUX_SEL:
+               if (!(c->flags & PLL_ALT_MISC_REG)) {
+                       mask = PLLD_BASE_DSIB_MUX_MASK;
+                       reg = c->reg + PLL_BASE;
+                       break;
+               }
+       /* fall through - error since PLLD2 does not have MUX_SEL control */
+       default:
+               return -EINVAL;
+       }
+
+       val = clk_readl(reg);
+       if (setting)
+               val |= mask;
+       else
+               val &= ~mask;
+       clk_writel(val, reg);
+       return 0;
+}
+
+static int tegra30_plle_clk_is_enabled(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+
+       val = clk_readl(c->reg + PLL_BASE);
+       c->state = (val & PLLE_BASE_ENABLE) ? ON : OFF;
+       return c->state;
+}
+
+static void tegra30_plle_clk_disable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val;
+
+       val = clk_readl(c->reg + PLL_BASE);
+       val &= ~(PLLE_BASE_CML_ENABLE | PLLE_BASE_ENABLE);
+       clk_writel(val, c->reg + PLL_BASE);
+}
+
+static void tegra30_plle_training(struct clk_tegra *c)
 {
        u32 val;
 
@@ -1198,12 +1404,15 @@ static void tegra30_plle_training(struct clk *c)
        } while (!(val & PLLE_MISC_READY));
 }
 
-static int tegra30_plle_configure(struct clk *c, bool force_training)
+static int tegra30_plle_configure(struct clk_hw *hw, bool force_training)
 {
-       u32 val;
+       struct clk_tegra *c = to_clk_tegra(hw);
+       struct clk *parent = __clk_get_parent(hw->clk);
        const struct clk_pll_freq_table *sel;
+       u32 val;
+
        unsigned long rate = c->u.pll.fixed_rate;
-       unsigned long input_rate = clk_get_rate(c->parent);
+       unsigned long input_rate = __clk_get_rate(parent);
 
        for (sel = c->u.pll.freq_table; sel->input_rate != 0; sel++) {
                if (sel->input_rate == input_rate && sel->output_rate == rate)
@@ -1214,7 +1423,7 @@ static int tegra30_plle_configure(struct clk *c, bool force_training)
                return -ENOSYS;
 
        /* disable PLLE, clear setup fiels */
-       tegra30_plle_clk_disable(c);
+       tegra30_plle_clk_disable(hw);
 
        val = clk_readl(c->reg + PLL_MISC(c));
        val &= ~(PLLE_MISC_LOCK_ENABLE | PLLE_MISC_SETUP_MASK);
@@ -1252,52 +1461,64 @@ static int tegra30_plle_configure(struct clk *c, bool force_training)
        return 0;
 }
 
-static int tegra30_plle_clk_enable(struct clk *c)
+static int tegra30_plle_clk_enable(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+
+       return tegra30_plle_configure(hw, !c->set);
+}
+
+static unsigned long tegra30_plle_clk_recalc_rate(struct clk_hw *hw,
+                       unsigned long parent_rate)
 {
-       pr_debug("%s on clock %s\n", __func__, c->name);
-       return tegra30_plle_configure(c, !c->set);
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long rate = parent_rate;
+       u32 val;
+
+       val = clk_readl(c->reg + PLL_BASE);
+       c->mul = (val & PLLE_BASE_DIVN_MASK) >> PLLE_BASE_DIVN_SHIFT;
+       c->div = (val & PLLE_BASE_DIVM_MASK) >> PLLE_BASE_DIVM_SHIFT;
+       c->div *= (val & PLLE_BASE_DIVP_MASK) >> PLLE_BASE_DIVP_SHIFT;
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+       return rate;
 }
 
-static struct clk_ops tegra_plle_ops = {
-       .init                   = tegra30_plle_clk_init,
-       .enable                 = tegra30_plle_clk_enable,
-       .disable                = tegra30_plle_clk_disable,
+struct clk_ops tegra30_plle_ops = {
+       .is_enabled = tegra30_plle_clk_is_enabled,
+       .enable = tegra30_plle_clk_enable,
+       .disable = tegra30_plle_clk_disable,
+       .recalc_rate = tegra30_plle_clk_recalc_rate,
 };
 
 /* Clock divider ops */
-static void tegra30_pll_div_clk_init(struct clk *c)
+static int tegra30_pll_div_clk_is_enabled(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+
        if (c->flags & DIV_U71) {
-               u32 divu71;
                u32 val = clk_readl(c->reg);
                val >>= c->reg_shift;
                c->state = (val & PLL_OUT_CLKEN) ? ON : OFF;
                if (!(val & PLL_OUT_RESET_DISABLE))
                        c->state = OFF;
-
-               divu71 = (val & PLL_OUT_RATIO_MASK) >> PLL_OUT_RATIO_SHIFT;
-               c->div = (divu71 + 2);
-               c->mul = 2;
-       } else if (c->flags & DIV_2) {
-               c->state = ON;
-               if (c->flags & (PLLD | PLLX)) {
-                       c->div = 2;
-                       c->mul = 1;
-               } else
-                       BUG();
        } else {
                c->state = ON;
-               c->div = 1;
-               c->mul = 1;
        }
+       return c->state;
 }
 
-static int tegra30_pll_div_clk_enable(struct clk *c)
+static int tegra30_pll_div_clk_enable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
        u32 new_val;
 
-       pr_debug("%s: %s\n", __func__, c->name);
+       pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
        if (c->flags & DIV_U71) {
                val = clk_readl(c->reg);
                new_val = val >> c->reg_shift;
@@ -1315,12 +1536,13 @@ static int tegra30_pll_div_clk_enable(struct clk *c)
        return -EINVAL;
 }
 
-static void tegra30_pll_div_clk_disable(struct clk *c)
+static void tegra30_pll_div_clk_disable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
        u32 new_val;
 
-       pr_debug("%s: %s\n", __func__, c->name);
+       pr_debug("%s: %s\n", __func__, __clk_get_name(hw->clk));
        if (c->flags & DIV_U71) {
                val = clk_readl(c->reg);
                new_val = val >> c->reg_shift;
@@ -1334,14 +1556,14 @@ static void tegra30_pll_div_clk_disable(struct clk *c)
        }
 }
 
-static int tegra30_pll_div_clk_set_rate(struct clk *c, unsigned long rate)
+static int tegra30_pll_div_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
        u32 new_val;
        int divider_u71;
-       unsigned long parent_rate = clk_get_rate(c->parent);
 
-       pr_debug("%s: %s %lu\n", __func__, c->name, rate);
        if (c->flags & DIV_U71) {
                divider_u71 = clk_div71_get_divider(
                        parent_rate, rate, c->flags, ROUND_DIVIDER_UP);
@@ -1359,19 +1581,59 @@ static int tegra30_pll_div_clk_set_rate(struct clk *c, unsigned long rate)
                        clk_writel_delay(val, c->reg);
                        c->div = divider_u71 + 2;
                        c->mul = 2;
+                       c->fixed_rate = rate;
                        return 0;
                }
-       } else if (c->flags & DIV_2)
-               return clk_set_rate(c->parent, rate * 2);
+       } else if (c->flags & DIV_2) {
+               c->fixed_rate = rate;
+               return 0;
+       }
 
        return -EINVAL;
 }
 
-static long tegra30_pll_div_clk_round_rate(struct clk *c, unsigned long rate)
+static unsigned long tegra30_pll_div_clk_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = parent_rate;
+
+       if (c->flags & DIV_U71) {
+               u32 divu71;
+               u32 val = clk_readl(c->reg);
+               val >>= c->reg_shift;
+
+               divu71 = (val & PLL_OUT_RATIO_MASK) >> PLL_OUT_RATIO_SHIFT;
+               c->div = (divu71 + 2);
+               c->mul = 2;
+       } else if (c->flags & DIV_2) {
+               if (c->flags & (PLLD | PLLX)) {
+                       c->div = 2;
+                       c->mul = 1;
+               } else
+                       BUG();
+       } else {
+               c->div = 1;
+               c->mul = 1;
+       }
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+
+       return rate;
+}
+
+static long tegra30_pll_div_clk_round_rate(struct clk_hw *hw,
+                               unsigned long rate, unsigned long *prate)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long parent_rate = __clk_get_rate(__clk_get_parent(hw->clk));
        int divider;
-       unsigned long parent_rate = clk_get_rate(c->parent);
-       pr_debug("%s: %s %lu\n", __func__, c->name, rate);
+
+       if (prate)
+               parent_rate = *prate;
 
        if (c->flags & DIV_U71) {
                divider = clk_div71_get_divider(
@@ -1379,23 +1641,25 @@ static long tegra30_pll_div_clk_round_rate(struct clk *c, unsigned long rate)
                if (divider < 0)
                        return divider;
                return DIV_ROUND_UP(parent_rate * 2, divider + 2);
-       } else if (c->flags & DIV_2)
-               /* no rounding - fixed DIV_2 dividers pass rate to parent PLL */
+       } else if (c->flags & DIV_2) {
+               *prate = rate * 2;
                return rate;
+       }
 
        return -EINVAL;
 }
 
-static struct clk_ops tegra_pll_div_ops = {
-       .init                   = tegra30_pll_div_clk_init,
-       .enable                 = tegra30_pll_div_clk_enable,
-       .disable                = tegra30_pll_div_clk_disable,
-       .set_rate               = tegra30_pll_div_clk_set_rate,
-       .round_rate             = tegra30_pll_div_clk_round_rate,
+struct clk_ops tegra30_pll_div_ops = {
+       .is_enabled = tegra30_pll_div_clk_is_enabled,
+       .enable = tegra30_pll_div_clk_enable,
+       .disable = tegra30_pll_div_clk_disable,
+       .set_rate = tegra30_pll_div_clk_set_rate,
+       .recalc_rate = tegra30_pll_div_clk_recalc_rate,
+       .round_rate = tegra30_pll_div_clk_round_rate,
 };
 
 /* Periph clk ops */
-static inline u32 periph_clk_source_mask(struct clk *c)
+static inline u32 periph_clk_source_mask(struct clk_tegra *c)
 {
        if (c->flags & MUX8)
                return 7 << 29;
@@ -1409,7 +1673,7 @@ static inline u32 periph_clk_source_mask(struct clk *c)
                return 3 << 30;
 }
 
-static inline u32 periph_clk_source_shift(struct clk *c)
+static inline u32 periph_clk_source_shift(struct clk_tegra *c)
 {
        if (c->flags & MUX8)
                return 29;
@@ -1423,47 +1687,9 @@ static inline u32 periph_clk_source_shift(struct clk *c)
                return 30;
 }
 
-static void tegra30_periph_clk_init(struct clk *c)
+static int tegra30_periph_clk_is_enabled(struct clk_hw *hw)
 {
-       u32 val = clk_readl(c->reg);
-       const struct clk_mux_sel *mux = 0;
-       const struct clk_mux_sel *sel;
-       if (c->flags & MUX) {
-               for (sel = c->inputs; sel->input != NULL; sel++) {
-                       if (((val & periph_clk_source_mask(c)) >>
-                           periph_clk_source_shift(c)) == sel->value)
-                               mux = sel;
-               }
-               BUG_ON(!mux);
-
-               c->parent = mux->input;
-       } else {
-               c->parent = c->inputs[0].input;
-       }
-
-       if (c->flags & DIV_U71) {
-               u32 divu71 = val & PERIPH_CLK_SOURCE_DIVU71_MASK;
-               if ((c->flags & DIV_U71_UART) &&
-                   (!(val & PERIPH_CLK_UART_DIV_ENB))) {
-                       divu71 = 0;
-               }
-               if (c->flags & DIV_U71_IDLE) {
-                       val &= ~(PERIPH_CLK_SOURCE_DIVU71_MASK <<
-                               PERIPH_CLK_SOURCE_DIVIDLE_SHIFT);
-                       val |= (PERIPH_CLK_SOURCE_DIVIDLE_VAL <<
-                               PERIPH_CLK_SOURCE_DIVIDLE_SHIFT);
-                       clk_writel(val, c->reg);
-               }
-               c->div = divu71 + 2;
-               c->mul = 2;
-       } else if (c->flags & DIV_U16) {
-               u32 divu16 = val & PERIPH_CLK_SOURCE_DIVU16_MASK;
-               c->div = divu16 + 1;
-               c->mul = 1;
-       } else {
-               c->div = 1;
-               c->mul = 1;
-       }
+       struct clk_tegra *c = to_clk_tegra(hw);
 
        c->state = ON;
        if (!(clk_readl(PERIPH_CLK_TO_ENB_REG(c)) & PERIPH_CLK_TO_BIT(c)))
@@ -1471,11 +1697,12 @@ static void tegra30_periph_clk_init(struct clk *c)
        if (!(c->flags & PERIPH_NO_RESET))
                if (clk_readl(PERIPH_CLK_TO_RST_REG(c)) & PERIPH_CLK_TO_BIT(c))
                        c->state = OFF;
+       return c->state;
 }
 
-static int tegra30_periph_clk_enable(struct clk *c)
+static int tegra30_periph_clk_enable(struct clk_hw *hw)
 {
-       pr_debug("%s on clock %s\n", __func__, c->name);
+       struct clk_tegra *c = to_clk_tegra(hw);
 
        tegra_periph_clk_enable_refcount[c->u.periph.clk_num]++;
        if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 1)
@@ -1494,31 +1721,29 @@ static int tegra30_periph_clk_enable(struct clk *c)
        return 0;
 }
 
-static void tegra30_periph_clk_disable(struct clk *c)
+static void tegra30_periph_clk_disable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        unsigned long val;
-       pr_debug("%s on clock %s\n", __func__, c->name);
 
-       if (c->refcnt)
-               tegra_periph_clk_enable_refcount[c->u.periph.clk_num]--;
+       tegra_periph_clk_enable_refcount[c->u.periph.clk_num]--;
+
+       if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] > 0)
+               return;
 
-       if (tegra_periph_clk_enable_refcount[c->u.periph.clk_num] == 0) {
-               /* If peripheral is in the APB bus then read the APB bus to
-                * flush the write operation in apb bus. This will avoid the
-                * peripheral access after disabling clock*/
-               if (c->flags & PERIPH_ON_APB)
-                       val = chipid_readl();
+       /* If peripheral is in the APB bus then read the APB bus to
+        * flush the write operation in apb bus. This will avoid the
+        * peripheral access after disabling clock*/
+       if (c->flags & PERIPH_ON_APB)
+               val = chipid_readl();
 
-               clk_writel_delay(
-                       PERIPH_CLK_TO_BIT(c), PERIPH_CLK_TO_ENB_CLR_REG(c));
-       }
+       clk_writel_delay(PERIPH_CLK_TO_BIT(c), PERIPH_CLK_TO_ENB_CLR_REG(c));
 }
 
-static void tegra30_periph_clk_reset(struct clk *c, bool assert)
+void tegra30_periph_clk_reset(struct clk_hw *hw, bool assert)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        unsigned long val;
-       pr_debug("%s %s on clock %s\n", __func__,
-                assert ? "assert" : "deassert", c->name);
 
        if (!(c->flags & PERIPH_NO_RESET)) {
                if (assert) {
@@ -1537,42 +1762,40 @@ static void tegra30_periph_clk_reset(struct clk *c, bool assert)
        }
 }
 
-static int tegra30_periph_clk_set_parent(struct clk *c, struct clk *p)
+static int tegra30_periph_clk_set_parent(struct clk_hw *hw, u8 index)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
-       const struct clk_mux_sel *sel;
-       pr_debug("%s: %s %s\n", __func__, c->name, p->name);
 
        if (!(c->flags & MUX))
-               return (p == c->parent) ? 0 : (-EINVAL);
-
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->input == p) {
-                       val = clk_readl(c->reg);
-                       val &= ~periph_clk_source_mask(c);
-                       val |= (sel->value << periph_clk_source_shift(c));
+               return (index == 0) ? 0 : (-EINVAL);
 
-                       if (c->refcnt)
-                               clk_enable(p);
-
-                       clk_writel_delay(val, c->reg);
+       val = clk_readl(c->reg);
+       val &= ~periph_clk_source_mask(c);
+       val |= (index << periph_clk_source_shift(c));
+       clk_writel_delay(val, c->reg);
+       return 0;
+}
 
-                       if (c->refcnt && c->parent)
-                               clk_disable(c->parent);
+static u8 tegra30_periph_clk_get_parent(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg);
+       int source  = (val & periph_clk_source_mask(c)) >>
+                                       periph_clk_source_shift(c);
 
-                       clk_reparent(c, p);
-                       return 0;
-               }
-       }
+       if (!(c->flags & MUX))
+               return 0;
 
-       return -EINVAL;
+       return source;
 }
 
-static int tegra30_periph_clk_set_rate(struct clk *c, unsigned long rate)
+static int tegra30_periph_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
        int divider;
-       unsigned long parent_rate = clk_get_rate(c->parent);
 
        if (c->flags & DIV_U71) {
                divider = clk_div71_get_divider(
@@ -1611,12 +1834,15 @@ static int tegra30_periph_clk_set_rate(struct clk *c, unsigned long rate)
        return -EINVAL;
 }
 
-static long tegra30_periph_clk_round_rate(struct clk *c,
-       unsigned long rate)
+static long tegra30_periph_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+       unsigned long parent_rate = __clk_get_rate(__clk_get_parent(hw->clk));
        int divider;
-       unsigned long parent_rate = clk_get_rate(c->parent);
-       pr_debug("%s: %s %lu\n", __func__, c->name, rate);
+
+       if (prate)
+               parent_rate = *prate;
 
        if (c->flags & DIV_U71) {
                divider = clk_div71_get_divider(
@@ -1634,21 +1860,85 @@ static long tegra30_periph_clk_round_rate(struct clk *c,
        return -EINVAL;
 }
 
-static struct clk_ops tegra_periph_clk_ops = {
-       .init                   = &tegra30_periph_clk_init,
+static unsigned long tegra30_periph_clk_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = parent_rate;
+       u32 val = clk_readl(c->reg);
+
+       if (c->flags & DIV_U71) {
+               u32 divu71 = val & PERIPH_CLK_SOURCE_DIVU71_MASK;
+               if ((c->flags & DIV_U71_UART) &&
+                   (!(val & PERIPH_CLK_UART_DIV_ENB))) {
+                       divu71 = 0;
+               }
+               if (c->flags & DIV_U71_IDLE) {
+                       val &= ~(PERIPH_CLK_SOURCE_DIVU71_MASK <<
+                               PERIPH_CLK_SOURCE_DIVIDLE_SHIFT);
+                       val |= (PERIPH_CLK_SOURCE_DIVIDLE_VAL <<
+                               PERIPH_CLK_SOURCE_DIVIDLE_SHIFT);
+                       clk_writel(val, c->reg);
+               }
+               c->div = divu71 + 2;
+               c->mul = 2;
+       } else if (c->flags & DIV_U16) {
+               u32 divu16 = val & PERIPH_CLK_SOURCE_DIVU16_MASK;
+               c->div = divu16 + 1;
+               c->mul = 1;
+       } else {
+               c->div = 1;
+               c->mul = 1;
+       }
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+       return rate;
+}
+
+struct clk_ops tegra30_periph_clk_ops = {
+       .is_enabled = tegra30_periph_clk_is_enabled,
+       .enable = tegra30_periph_clk_enable,
+       .disable = tegra30_periph_clk_disable,
+       .set_parent = tegra30_periph_clk_set_parent,
+       .get_parent = tegra30_periph_clk_get_parent,
+       .set_rate = tegra30_periph_clk_set_rate,
+       .round_rate = tegra30_periph_clk_round_rate,
+       .recalc_rate = tegra30_periph_clk_recalc_rate,
+};
+
+static int tegra30_dsib_clk_set_parent(struct clk_hw *hw, u8 index)
+{
+       struct clk *d = clk_get_sys(NULL, "pll_d");
+       /* The DSIB parent selection bit is in PLLD base
+          register - can not do direct r-m-w, must be
+          protected by PLLD lock */
+       tegra_clk_cfg_ex(
+               d, TEGRA_CLK_PLLD_MIPI_MUX_SEL, index);
+
+       return 0;
+}
+
+struct clk_ops tegra30_dsib_clk_ops = {
+       .is_enabled = tegra30_periph_clk_is_enabled,
        .enable                 = &tegra30_periph_clk_enable,
        .disable                = &tegra30_periph_clk_disable,
-       .set_parent             = &tegra30_periph_clk_set_parent,
+       .set_parent             = &tegra30_dsib_clk_set_parent,
+       .get_parent             = &tegra30_periph_clk_get_parent,
        .set_rate               = &tegra30_periph_clk_set_rate,
        .round_rate             = &tegra30_periph_clk_round_rate,
-       .reset                  = &tegra30_periph_clk_reset,
+       .recalc_rate            = &tegra30_periph_clk_recalc_rate,
 };
 
-
 /* Periph extended clock configuration ops */
-static int
-tegra30_vi_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting)
+int tegra30_vi_clk_cfg_ex(struct clk_hw *hw,
+                               enum tegra_clk_ex_param p, u32 setting)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+
        if (p == TEGRA_CLK_VI_INP_SEL) {
                u32 val = clk_readl(c->reg);
                val &= ~PERIPH_CLK_VI_SEL_EX_MASK;
@@ -1660,20 +1950,11 @@ tegra30_vi_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting)
        return -EINVAL;
 }
 
-static struct clk_ops tegra_vi_clk_ops = {
-       .init                   = &tegra30_periph_clk_init,
-       .enable                 = &tegra30_periph_clk_enable,
-       .disable                = &tegra30_periph_clk_disable,
-       .set_parent             = &tegra30_periph_clk_set_parent,
-       .set_rate               = &tegra30_periph_clk_set_rate,
-       .round_rate             = &tegra30_periph_clk_round_rate,
-       .clk_cfg_ex             = &tegra30_vi_clk_cfg_ex,
-       .reset                  = &tegra30_periph_clk_reset,
-};
-
-static int
-tegra30_nand_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting)
+int tegra30_nand_clk_cfg_ex(struct clk_hw *hw,
+                               enum tegra_clk_ex_param p, u32 setting)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+
        if (p == TEGRA_CLK_NAND_PAD_DIV2_ENB) {
                u32 val = clk_readl(c->reg);
                if (setting)
@@ -1686,21 +1967,11 @@ tegra30_nand_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting)
        return -EINVAL;
 }
 
-static struct clk_ops tegra_nand_clk_ops = {
-       .init                   = &tegra30_periph_clk_init,
-       .enable                 = &tegra30_periph_clk_enable,
-       .disable                = &tegra30_periph_clk_disable,
-       .set_parent             = &tegra30_periph_clk_set_parent,
-       .set_rate               = &tegra30_periph_clk_set_rate,
-       .round_rate             = &tegra30_periph_clk_round_rate,
-       .clk_cfg_ex             = &tegra30_nand_clk_cfg_ex,
-       .reset                  = &tegra30_periph_clk_reset,
-};
-
-
-static int
-tegra30_dtv_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting)
+int tegra30_dtv_clk_cfg_ex(struct clk_hw *hw,
+                               enum tegra_clk_ex_param p, u32 setting)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+
        if (p == TEGRA_CLK_DTV_INVERT) {
                u32 val = clk_readl(c->reg);
                if (setting)
@@ -1713,91 +1984,27 @@ tegra30_dtv_clk_cfg_ex(struct clk *c, enum tegra_clk_ex_param p, u32 setting)
        return -EINVAL;
 }
 
-static struct clk_ops tegra_dtv_clk_ops = {
-       .init                   = &tegra30_periph_clk_init,
-       .enable                 = &tegra30_periph_clk_enable,
-       .disable                = &tegra30_periph_clk_disable,
-       .set_parent             = &tegra30_periph_clk_set_parent,
-       .set_rate               = &tegra30_periph_clk_set_rate,
-       .round_rate             = &tegra30_periph_clk_round_rate,
-       .clk_cfg_ex             = &tegra30_dtv_clk_cfg_ex,
-       .reset                  = &tegra30_periph_clk_reset,
-};
-
-static int tegra30_dsib_clk_set_parent(struct clk *c, struct clk *p)
-{
-       const struct clk_mux_sel *sel;
-       struct clk *d = tegra_get_clock_by_name("pll_d");
-
-       pr_debug("%s: %s %s\n", __func__, c->name, p->name);
-
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->input == p) {
-                       if (c->refcnt)
-                               clk_enable(p);
-
-                       /* The DSIB parent selection bit is in PLLD base
-                          register - can not do direct r-m-w, must be
-                          protected by PLLD lock */
-                       tegra_clk_cfg_ex(
-                               d, TEGRA_CLK_PLLD_MIPI_MUX_SEL, sel->value);
-
-                       if (c->refcnt && c->parent)
-                               clk_disable(c->parent);
-
-                       clk_reparent(c, p);
-                       return 0;
-               }
-       }
-
-       return -EINVAL;
-}
-
-static struct clk_ops tegra_dsib_clk_ops = {
-       .init                   = &tegra30_periph_clk_init,
-       .enable                 = &tegra30_periph_clk_enable,
-       .disable                = &tegra30_periph_clk_disable,
-       .set_parent             = &tegra30_dsib_clk_set_parent,
-       .set_rate               = &tegra30_periph_clk_set_rate,
-       .round_rate             = &tegra30_periph_clk_round_rate,
-       .reset                  = &tegra30_periph_clk_reset,
-};
-
-/* pciex clock support only reset function */
-static struct clk_ops tegra_pciex_clk_ops = {
-       .reset    = tegra30_periph_clk_reset,
-};
-
 /* Output clock ops */
 
 static DEFINE_SPINLOCK(clk_out_lock);
 
-static void tegra30_clk_out_init(struct clk *c)
+static int tegra30_clk_out_is_enabled(struct clk_hw *hw)
 {
-       const struct clk_mux_sel *mux = 0;
-       const struct clk_mux_sel *sel;
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val = pmc_readl(c->reg);
 
        c->state = (val & (0x1 << c->u.periph.clk_num)) ? ON : OFF;
        c->mul = 1;
        c->div = 1;
-
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (((val & periph_clk_source_mask(c)) >>
-                    periph_clk_source_shift(c)) == sel->value)
-                       mux = sel;
-       }
-       BUG_ON(!mux);
-       c->parent = mux->input;
+       return c->state;
 }
 
-static int tegra30_clk_out_enable(struct clk *c)
+static int tegra30_clk_out_enable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
        unsigned long flags;
 
-       pr_debug("%s on clock %s\n", __func__, c->name);
-
        spin_lock_irqsave(&clk_out_lock, flags);
        val = pmc_readl(c->reg);
        val |= (0x1 << c->u.periph.clk_num);
@@ -1807,13 +2014,12 @@ static int tegra30_clk_out_enable(struct clk *c)
        return 0;
 }
 
-static void tegra30_clk_out_disable(struct clk *c)
+static void tegra30_clk_out_disable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
        unsigned long flags;
 
-       pr_debug("%s on clock %s\n", __func__, c->name);
-
        spin_lock_irqsave(&clk_out_lock, flags);
        val = pmc_readl(c->reg);
        val &= ~(0x1 << c->u.periph.clk_num);
@@ -1821,59 +2027,59 @@ static void tegra30_clk_out_disable(struct clk *c)
        spin_unlock_irqrestore(&clk_out_lock, flags);
 }
 
-static int tegra30_clk_out_set_parent(struct clk *c, struct clk *p)
+static int tegra30_clk_out_set_parent(struct clk_hw *hw, u8 index)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
        unsigned long flags;
-       const struct clk_mux_sel *sel;
-
-       pr_debug("%s: %s %s\n", __func__, c->name, p->name);
 
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->input == p) {
-                       if (c->refcnt)
-                               clk_enable(p);
+       spin_lock_irqsave(&clk_out_lock, flags);
+       val = pmc_readl(c->reg);
+       val &= ~periph_clk_source_mask(c);
+       val |= (index << periph_clk_source_shift(c));
+       pmc_writel(val, c->reg);
+       spin_unlock_irqrestore(&clk_out_lock, flags);
 
-                       spin_lock_irqsave(&clk_out_lock, flags);
-                       val = pmc_readl(c->reg);
-                       val &= ~periph_clk_source_mask(c);
-                       val |= (sel->value << periph_clk_source_shift(c));
-                       pmc_writel(val, c->reg);
-                       spin_unlock_irqrestore(&clk_out_lock, flags);
+       return 0;
+}
 
-                       if (c->refcnt && c->parent)
-                               clk_disable(c->parent);
+static u8 tegra30_clk_out_get_parent(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = pmc_readl(c->reg);
+       int source;
 
-                       clk_reparent(c, p);
-                       return 0;
-               }
-       }
-       return -EINVAL;
+       source = (val & periph_clk_source_mask(c)) >>
+                               periph_clk_source_shift(c);
+       return source;
 }
 
-static struct clk_ops tegra_clk_out_ops = {
-       .init                   = &tegra30_clk_out_init,
-       .enable                 = &tegra30_clk_out_enable,
-       .disable                = &tegra30_clk_out_disable,
-       .set_parent             = &tegra30_clk_out_set_parent,
+struct clk_ops tegra_clk_out_ops = {
+       .is_enabled = tegra30_clk_out_is_enabled,
+       .enable = tegra30_clk_out_enable,
+       .disable = tegra30_clk_out_disable,
+       .set_parent = tegra30_clk_out_set_parent,
+       .get_parent = tegra30_clk_out_get_parent,
+       .recalc_rate = tegra30_clk_fixed_recalc_rate,
 };
 
-
 /* Clock doubler ops */
-static void tegra30_clk_double_init(struct clk *c)
+static int tegra30_clk_double_is_enabled(struct clk_hw *hw)
 {
-       u32 val = clk_readl(c->reg);
-       c->mul = val & (0x1 << c->reg_shift) ? 1 : 2;
-       c->div = 1;
+       struct clk_tegra *c = to_clk_tegra(hw);
+
        c->state = ON;
        if (!(clk_readl(PERIPH_CLK_TO_ENB_REG(c)) & PERIPH_CLK_TO_BIT(c)))
                c->state = OFF;
+       return c->state;
 };
 
-static int tegra30_clk_double_set_rate(struct clk *c, unsigned long rate)
+static int tegra30_clk_double_set_rate(struct clk_hw *hw, unsigned long rate,
+               unsigned long parent_rate)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
-       unsigned long parent_rate = clk_get_rate(c->parent);
+
        if (rate == parent_rate) {
                val = clk_readl(c->reg) | (0x1 << c->reg_shift);
                clk_writel(val, c->reg);
@@ -1890,1215 +2096,200 @@ static int tegra30_clk_double_set_rate(struct clk *c, unsigned long rate)
        return -EINVAL;
 }
 
-static struct clk_ops tegra_clk_double_ops = {
-       .init                   = &tegra30_clk_double_init,
-       .enable                 = &tegra30_periph_clk_enable,
-       .disable                = &tegra30_periph_clk_disable,
-       .set_rate               = &tegra30_clk_double_set_rate,
-};
+static unsigned long tegra30_clk_double_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u64 rate = parent_rate;
 
-/* Audio sync clock ops */
-static int tegra30_sync_source_set_rate(struct clk *c, unsigned long rate)
+       u32 val = clk_readl(c->reg);
+       c->mul = val & (0x1 << c->reg_shift) ? 1 : 2;
+       c->div = 1;
+
+       if (c->mul != 0 && c->div != 0) {
+               rate *= c->mul;
+               rate += c->div - 1; /* round up */
+               do_div(rate, c->div);
+       }
+
+       return rate;
+}
+
+static long tegra30_clk_double_round_rate(struct clk_hw *hw, unsigned long rate,
+                               unsigned long *prate)
 {
-       c->rate = rate;
-       return 0;
+       unsigned long output_rate = *prate;
+
+       do_div(output_rate, 2);
+       return output_rate;
 }
 
-static struct clk_ops tegra_sync_source_ops = {
-       .set_rate               = &tegra30_sync_source_set_rate,
+struct clk_ops tegra30_clk_double_ops = {
+       .is_enabled = tegra30_clk_double_is_enabled,
+       .enable = tegra30_periph_clk_enable,
+       .disable = tegra30_periph_clk_disable,
+       .recalc_rate = tegra30_clk_double_recalc_rate,
+       .round_rate = tegra30_clk_double_round_rate,
+       .set_rate = tegra30_clk_double_set_rate,
+};
+
+/* Audio sync clock ops */
+struct clk_ops tegra_sync_source_ops = {
+       .recalc_rate = tegra30_clk_fixed_recalc_rate,
 };
 
-static void tegra30_audio_sync_clk_init(struct clk *c)
+static int tegra30_audio_sync_clk_is_enabled(struct clk_hw *hw)
 {
-       int source;
-       const struct clk_mux_sel *sel;
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val = clk_readl(c->reg);
        c->state = (val & AUDIO_SYNC_DISABLE_BIT) ? OFF : ON;
-       source = val & AUDIO_SYNC_SOURCE_MASK;
-       for (sel = c->inputs; sel->input != NULL; sel++)
-               if (sel->value == source)
-                       break;
-       BUG_ON(sel->input == NULL);
-       c->parent = sel->input;
+       return c->state;
 }
 
-static int tegra30_audio_sync_clk_enable(struct clk *c)
+static int tegra30_audio_sync_clk_enable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val = clk_readl(c->reg);
        clk_writel((val & (~AUDIO_SYNC_DISABLE_BIT)), c->reg);
        return 0;
 }
 
-static void tegra30_audio_sync_clk_disable(struct clk *c)
+static void tegra30_audio_sync_clk_disable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val = clk_readl(c->reg);
        clk_writel((val | AUDIO_SYNC_DISABLE_BIT), c->reg);
 }
 
-static int tegra30_audio_sync_clk_set_parent(struct clk *c, struct clk *p)
+static int tegra30_audio_sync_clk_set_parent(struct clk_hw *hw, u8 index)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val;
-       const struct clk_mux_sel *sel;
-       for (sel = c->inputs; sel->input != NULL; sel++) {
-               if (sel->input == p) {
-                       val = clk_readl(c->reg);
-                       val &= ~AUDIO_SYNC_SOURCE_MASK;
-                       val |= sel->value;
 
-                       if (c->refcnt)
-                               clk_enable(p);
-
-                       clk_writel(val, c->reg);
+       val = clk_readl(c->reg);
+       val &= ~AUDIO_SYNC_SOURCE_MASK;
+       val |= index;
 
-                       if (c->refcnt && c->parent)
-                               clk_disable(c->parent);
+       clk_writel(val, c->reg);
+       return 0;
+}
 
-                       clk_reparent(c, p);
-                       return 0;
-               }
-       }
+static u8 tegra30_audio_sync_clk_get_parent(struct clk_hw *hw)
+{
+       struct clk_tegra *c = to_clk_tegra(hw);
+       u32 val = clk_readl(c->reg);
+       int source;
 
-       return -EINVAL;
+       source = val & AUDIO_SYNC_SOURCE_MASK;
+       return source;
 }
 
-static struct clk_ops tegra_audio_sync_clk_ops = {
-       .init       = tegra30_audio_sync_clk_init,
-       .enable     = tegra30_audio_sync_clk_enable,
-       .disable    = tegra30_audio_sync_clk_disable,
+struct clk_ops tegra30_audio_sync_clk_ops = {
+       .is_enabled = tegra30_audio_sync_clk_is_enabled,
+       .enable = tegra30_audio_sync_clk_enable,
+       .disable = tegra30_audio_sync_clk_disable,
        .set_parent = tegra30_audio_sync_clk_set_parent,
+       .get_parent = tegra30_audio_sync_clk_get_parent,
+       .recalc_rate = tegra30_clk_fixed_recalc_rate,
 };
 
 /* cml0 (pcie), and cml1 (sata) clock ops */
-static void tegra30_cml_clk_init(struct clk *c)
+static int tegra30_cml_clk_is_enabled(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
        u32 val = clk_readl(c->reg);
        c->state = val & (0x1 << c->u.periph.clk_num) ? ON : OFF;
+       return c->state;
 }
 
-static int tegra30_cml_clk_enable(struct clk *c)
+static int tegra30_cml_clk_enable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+
        u32 val = clk_readl(c->reg);
        val |= (0x1 << c->u.periph.clk_num);
        clk_writel(val, c->reg);
+
        return 0;
 }
 
-static void tegra30_cml_clk_disable(struct clk *c)
+static void tegra30_cml_clk_disable(struct clk_hw *hw)
 {
+       struct clk_tegra *c = to_clk_tegra(hw);
+
        u32 val = clk_readl(c->reg);
        val &= ~(0x1 << c->u.periph.clk_num);
        clk_writel(val, c->reg);
 }
 
-static struct clk_ops tegra_cml_clk_ops = {
-       .init                   = &tegra30_cml_clk_init,
-       .enable                 = &tegra30_cml_clk_enable,
-       .disable                = &tegra30_cml_clk_disable,
-};
-
-/* Clock definitions */
-static struct clk tegra_clk_32k = {
-       .name = "clk_32k",
-       .rate = 32768,
-       .ops  = NULL,
-       .max_rate = 32768,
-};
-
-static struct clk tegra_clk_m = {
-       .name      = "clk_m",
-       .flags     = ENABLE_ON_INIT,
-       .ops       = &tegra_clk_m_ops,
-       .reg       = 0x1fc,
-       .reg_shift = 28,
-       .max_rate  = 48000000,
-};
-
-static struct clk tegra_clk_m_div2 = {
-       .name      = "clk_m_div2",
-       .ops       = &tegra_clk_m_div_ops,
-       .parent    = &tegra_clk_m,
-       .mul       = 1,
-       .div       = 2,
-       .state     = ON,
-       .max_rate  = 24000000,
-};
-
-static struct clk tegra_clk_m_div4 = {
-       .name      = "clk_m_div4",
-       .ops       = &tegra_clk_m_div_ops,
-       .parent    = &tegra_clk_m,
-       .mul       = 1,
-       .div       = 4,
-       .state     = ON,
-       .max_rate  = 12000000,
-};
-
-static struct clk tegra_pll_ref = {
-       .name      = "pll_ref",
-       .flags     = ENABLE_ON_INIT,
-       .ops       = &tegra_pll_ref_ops,
-       .parent    = &tegra_clk_m,
-       .max_rate  = 26000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_c_freq_table[] = {
-       { 12000000, 1040000000, 520,  6, 1, 8},
-       { 13000000, 1040000000, 480,  6, 1, 8},
-       { 16800000, 1040000000, 495,  8, 1, 8},         /* actual: 1039.5 MHz */
-       { 19200000, 1040000000, 325,  6, 1, 6},
-       { 26000000, 1040000000, 520, 13, 1, 8},
-
-       { 12000000, 832000000, 416,  6, 1, 8},
-       { 13000000, 832000000, 832, 13, 1, 8},
-       { 16800000, 832000000, 396,  8, 1, 8},          /* actual: 831.6 MHz */
-       { 19200000, 832000000, 260,  6, 1, 8},
-       { 26000000, 832000000, 416, 13, 1, 8},
-
-       { 12000000, 624000000, 624, 12, 1, 8},
-       { 13000000, 624000000, 624, 13, 1, 8},
-       { 16800000, 600000000, 520, 14, 1, 8},
-       { 19200000, 624000000, 520, 16, 1, 8},
-       { 26000000, 624000000, 624, 26, 1, 8},
-
-       { 12000000, 600000000, 600, 12, 1, 8},
-       { 13000000, 600000000, 600, 13, 1, 8},
-       { 16800000, 600000000, 500, 14, 1, 8},
-       { 19200000, 600000000, 375, 12, 1, 6},
-       { 26000000, 600000000, 600, 26, 1, 8},
-
-       { 12000000, 520000000, 520, 12, 1, 8},
-       { 13000000, 520000000, 520, 13, 1, 8},
-       { 16800000, 520000000, 495, 16, 1, 8},          /* actual: 519.75 MHz */
-       { 19200000, 520000000, 325, 12, 1, 6},
-       { 26000000, 520000000, 520, 26, 1, 8},
-
-       { 12000000, 416000000, 416, 12, 1, 8},
-       { 13000000, 416000000, 416, 13, 1, 8},
-       { 16800000, 416000000, 396, 16, 1, 8},          /* actual: 415.8 MHz */
-       { 19200000, 416000000, 260, 12, 1, 6},
-       { 26000000, 416000000, 416, 26, 1, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_c = {
-       .name      = "pll_c",
-       .flags     = PLL_HAS_CPCON,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0x80,
-       .parent    = &tegra_pll_ref,
-       .max_rate  = 1400000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1400000000,
-               .freq_table = tegra_pll_c_freq_table,
-               .lock_delay = 300,
-       },
-};
-
-static struct clk tegra_pll_c_out1 = {
-       .name      = "pll_c_out1",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_U71,
-       .parent    = &tegra_pll_c,
-       .reg       = 0x84,
-       .reg_shift = 0,
-       .max_rate  = 700000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_m_freq_table[] = {
-       { 12000000, 666000000, 666, 12, 1, 8},
-       { 13000000, 666000000, 666, 13, 1, 8},
-       { 16800000, 666000000, 555, 14, 1, 8},
-       { 19200000, 666000000, 555, 16, 1, 8},
-       { 26000000, 666000000, 666, 26, 1, 8},
-       { 12000000, 600000000, 600, 12, 1, 8},
-       { 13000000, 600000000, 600, 13, 1, 8},
-       { 16800000, 600000000, 500, 14, 1, 8},
-       { 19200000, 600000000, 375, 12, 1, 6},
-       { 26000000, 600000000, 600, 26, 1, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_m = {
-       .name      = "pll_m",
-       .flags     = PLL_HAS_CPCON | PLLM,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0x90,
-       .parent    = &tegra_pll_ref,
-       .max_rate  = 800000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1200000000,
-               .freq_table = tegra_pll_m_freq_table,
-               .lock_delay = 300,
-       },
-};
-
-static struct clk tegra_pll_m_out1 = {
-       .name      = "pll_m_out1",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_U71,
-       .parent    = &tegra_pll_m,
-       .reg       = 0x94,
-       .reg_shift = 0,
-       .max_rate  = 600000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_p_freq_table[] = {
-       { 12000000, 216000000, 432, 12, 2, 8},
-       { 13000000, 216000000, 432, 13, 2, 8},
-       { 16800000, 216000000, 360, 14, 2, 8},
-       { 19200000, 216000000, 360, 16, 2, 8},
-       { 26000000, 216000000, 432, 26, 2, 8},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_p = {
-       .name      = "pll_p",
-       .flags     = ENABLE_ON_INIT | PLL_FIXED | PLL_HAS_CPCON,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0xa0,
-       .parent    = &tegra_pll_ref,
-       .max_rate  = 432000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1400000000,
-               .freq_table = tegra_pll_p_freq_table,
-               .lock_delay = 300,
-               .fixed_rate = 408000000,
-       },
-};
-
-static struct clk tegra_pll_p_out1 = {
-       .name      = "pll_p_out1",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
-       .parent    = &tegra_pll_p,
-       .reg       = 0xa4,
-       .reg_shift = 0,
-       .max_rate  = 432000000,
-};
-
-static struct clk tegra_pll_p_out2 = {
-       .name      = "pll_p_out2",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
-       .parent    = &tegra_pll_p,
-       .reg       = 0xa4,
-       .reg_shift = 16,
-       .max_rate  = 432000000,
-};
-
-static struct clk tegra_pll_p_out3 = {
-       .name      = "pll_p_out3",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
-       .parent    = &tegra_pll_p,
-       .reg       = 0xa8,
-       .reg_shift = 0,
-       .max_rate  = 432000000,
-};
-
-static struct clk tegra_pll_p_out4 = {
-       .name      = "pll_p_out4",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED,
-       .parent    = &tegra_pll_p,
-       .reg       = 0xa8,
-       .reg_shift = 16,
-       .max_rate  = 432000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_a_freq_table[] = {
-       { 9600000, 564480000, 294, 5, 1, 4},
-       { 9600000, 552960000, 288, 5, 1, 4},
-       { 9600000, 24000000,  5,   2, 1, 1},
-
-       { 28800000, 56448000, 49, 25, 1, 1},
-       { 28800000, 73728000, 64, 25, 1, 1},
-       { 28800000, 24000000,  5,  6, 1, 1},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_a = {
-       .name      = "pll_a",
-       .flags     = PLL_HAS_CPCON,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0xb0,
-       .parent    = &tegra_pll_p_out1,
-       .max_rate  = 700000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1400000000,
-               .freq_table = tegra_pll_a_freq_table,
-               .lock_delay = 300,
-       },
+struct clk_ops tegra_cml_clk_ops = {
+       .is_enabled = tegra30_cml_clk_is_enabled,
+       .enable = tegra30_cml_clk_enable,
+       .disable = tegra30_cml_clk_disable,
+       .recalc_rate = tegra30_clk_fixed_recalc_rate,
 };
 
-static struct clk tegra_pll_a_out0 = {
-       .name      = "pll_a_out0",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_U71,
-       .parent    = &tegra_pll_a,
-       .reg       = 0xb4,
-       .reg_shift = 0,
-       .max_rate  = 100000000,
+struct clk_ops tegra_pciex_clk_ops = {
+       .recalc_rate = tegra30_clk_fixed_recalc_rate,
 };
 
-static struct clk_pll_freq_table tegra_pll_d_freq_table[] = {
-       { 12000000, 216000000, 216, 12, 1, 4},
-       { 13000000, 216000000, 216, 13, 1, 4},
-       { 16800000, 216000000, 180, 14, 1, 4},
-       { 19200000, 216000000, 180, 16, 1, 4},
-       { 26000000, 216000000, 216, 26, 1, 4},
-
-       { 12000000, 594000000, 594, 12, 1, 8},
-       { 13000000, 594000000, 594, 13, 1, 8},
-       { 16800000, 594000000, 495, 14, 1, 8},
-       { 19200000, 594000000, 495, 16, 1, 8},
-       { 26000000, 594000000, 594, 26, 1, 8},
-
-       { 12000000, 1000000000, 1000, 12, 1, 12},
-       { 13000000, 1000000000, 1000, 13, 1, 12},
-       { 19200000, 1000000000, 625,  12, 1, 8},
-       { 26000000, 1000000000, 1000, 26, 1, 12},
-
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_d = {
-       .name      = "pll_d",
-       .flags     = PLL_HAS_CPCON | PLLD,
-       .ops       = &tegra_plld_ops,
-       .reg       = 0xd0,
-       .parent    = &tegra_pll_ref,
-       .max_rate  = 1000000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 40000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 40000000,
-               .vco_max   = 1000000000,
-               .freq_table = tegra_pll_d_freq_table,
-               .lock_delay = 1000,
-       },
-};
-
-static struct clk tegra_pll_d_out0 = {
-       .name      = "pll_d_out0",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_2 | PLLD,
-       .parent    = &tegra_pll_d,
-       .max_rate  = 500000000,
-};
-
-static struct clk tegra_pll_d2 = {
-       .name      = "pll_d2",
-       .flags     = PLL_HAS_CPCON | PLL_ALT_MISC_REG | PLLD,
-       .ops       = &tegra_plld_ops,
-       .reg       = 0x4b8,
-       .parent    = &tegra_pll_ref,
-       .max_rate  = 1000000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 40000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 40000000,
-               .vco_max   = 1000000000,
-               .freq_table = tegra_pll_d_freq_table,
-               .lock_delay = 1000,
-       },
-};
-
-static struct clk tegra_pll_d2_out0 = {
-       .name      = "pll_d2_out0",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_2 | PLLD,
-       .parent    = &tegra_pll_d2,
-       .max_rate  = 500000000,
-};
-
-static struct clk_pll_freq_table tegra_pll_u_freq_table[] = {
-       { 12000000, 480000000, 960, 12, 2, 12},
-       { 13000000, 480000000, 960, 13, 2, 12},
-       { 16800000, 480000000, 400, 7,  2, 5},
-       { 19200000, 480000000, 200, 4,  2, 3},
-       { 26000000, 480000000, 960, 26, 2, 12},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_u = {
-       .name      = "pll_u",
-       .flags     = PLL_HAS_CPCON | PLLU,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0xc0,
-       .parent    = &tegra_pll_ref,
-       .max_rate  = 480000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 40000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 480000000,
-               .vco_max   = 960000000,
-               .freq_table = tegra_pll_u_freq_table,
-               .lock_delay = 1000,
-       },
-};
-
-static struct clk_pll_freq_table tegra_pll_x_freq_table[] = {
-       /* 1.7 GHz */
-       { 12000000, 1700000000, 850,  6,  1, 8},
-       { 13000000, 1700000000, 915,  7,  1, 8},        /* actual: 1699.2 MHz */
-       { 16800000, 1700000000, 708,  7,  1, 8},        /* actual: 1699.2 MHz */
-       { 19200000, 1700000000, 885,  10, 1, 8},        /* actual: 1699.2 MHz */
-       { 26000000, 1700000000, 850,  13, 1, 8},
-
-       /* 1.6 GHz */
-       { 12000000, 1600000000, 800,  6,  1, 8},
-       { 13000000, 1600000000, 738,  6,  1, 8},        /* actual: 1599.0 MHz */
-       { 16800000, 1600000000, 857,  9,  1, 8},        /* actual: 1599.7 MHz */
-       { 19200000, 1600000000, 500,  6,  1, 8},
-       { 26000000, 1600000000, 800,  13, 1, 8},
-
-       /* 1.5 GHz */
-       { 12000000, 1500000000, 750,  6,  1, 8},
-       { 13000000, 1500000000, 923,  8,  1, 8},        /* actual: 1499.8 MHz */
-       { 16800000, 1500000000, 625,  7,  1, 8},
-       { 19200000, 1500000000, 625,  8,  1, 8},
-       { 26000000, 1500000000, 750,  13, 1, 8},
-
-       /* 1.4 GHz */
-       { 12000000, 1400000000, 700,  6,  1, 8},
-       { 13000000, 1400000000, 969,  9,  1, 8},        /* actual: 1399.7 MHz */
-       { 16800000, 1400000000, 1000, 12, 1, 8},
-       { 19200000, 1400000000, 875,  12, 1, 8},
-       { 26000000, 1400000000, 700,  13, 1, 8},
-
-       /* 1.3 GHz */
-       { 12000000, 1300000000, 975,  9,  1, 8},
-       { 13000000, 1300000000, 1000, 10, 1, 8},
-       { 16800000, 1300000000, 928,  12, 1, 8},        /* actual: 1299.2 MHz */
-       { 19200000, 1300000000, 812,  12, 1, 8},        /* actual: 1299.2 MHz */
-       { 26000000, 1300000000, 650,  13, 1, 8},
-
-       /* 1.2 GHz */
-       { 12000000, 1200000000, 1000, 10, 1, 8},
-       { 13000000, 1200000000, 923,  10, 1, 8},        /* actual: 1199.9 MHz */
-       { 16800000, 1200000000, 1000, 14, 1, 8},
-       { 19200000, 1200000000, 1000, 16, 1, 8},
-       { 26000000, 1200000000, 600,  13, 1, 8},
-
-       /* 1.1 GHz */
-       { 12000000, 1100000000, 825,  9,  1, 8},
-       { 13000000, 1100000000, 846,  10, 1, 8},        /* actual: 1099.8 MHz */
-       { 16800000, 1100000000, 982,  15, 1, 8},        /* actual: 1099.8 MHz */
-       { 19200000, 1100000000, 859,  15, 1, 8},        /* actual: 1099.5 MHz */
-       { 26000000, 1100000000, 550,  13, 1, 8},
-
-       /* 1 GHz */
-       { 12000000, 1000000000, 1000, 12, 1, 8},
-       { 13000000, 1000000000, 1000, 13, 1, 8},
-       { 16800000, 1000000000, 833,  14, 1, 8},        /* actual: 999.6 MHz */
-       { 19200000, 1000000000, 625,  12, 1, 8},
-       { 26000000, 1000000000, 1000, 26, 1, 8},
-
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_x = {
-       .name      = "pll_x",
-       .flags     = PLL_HAS_CPCON | PLL_ALT_MISC_REG | PLLX,
-       .ops       = &tegra_pll_ops,
-       .reg       = 0xe0,
-       .parent    = &tegra_pll_ref,
-       .max_rate  = 1700000000,
-       .u.pll = {
-               .input_min = 2000000,
-               .input_max = 31000000,
-               .cf_min    = 1000000,
-               .cf_max    = 6000000,
-               .vco_min   = 20000000,
-               .vco_max   = 1700000000,
-               .freq_table = tegra_pll_x_freq_table,
-               .lock_delay = 300,
-       },
-};
-
-static struct clk tegra_pll_x_out0 = {
-       .name      = "pll_x_out0",
-       .ops       = &tegra_pll_div_ops,
-       .flags     = DIV_2 | PLLX,
-       .parent    = &tegra_pll_x,
-       .max_rate  = 850000000,
-};
-
-
-static struct clk_pll_freq_table tegra_pll_e_freq_table[] = {
-       /* PLLE special case: use cpcon field to store cml divider value */
-       { 12000000,  100000000, 150, 1,  18, 11},
-       { 216000000, 100000000, 200, 18, 24, 13},
-       { 0, 0, 0, 0, 0, 0 },
-};
-
-static struct clk tegra_pll_e = {
-       .name      = "pll_e",
-       .flags     = PLL_ALT_MISC_REG,
-       .ops       = &tegra_plle_ops,
-       .reg       = 0xe8,
-       .max_rate  = 100000000,
-       .u.pll = {
-               .input_min = 12000000,
-               .input_max = 216000000,
-               .cf_min    = 12000000,
-               .cf_max    = 12000000,
-               .vco_min   = 1200000000,
-               .vco_max   = 2400000000U,
-               .freq_table = tegra_pll_e_freq_table,
-               .lock_delay = 300,
-               .fixed_rate = 100000000,
-       },
-};
-
-static struct clk tegra_cml0_clk = {
-       .name      = "cml0",
-       .parent    = &tegra_pll_e,
-       .ops       = &tegra_cml_clk_ops,
-       .reg       = PLLE_AUX,
-       .max_rate  = 100000000,
-       .u.periph  = {
-               .clk_num = 0,
-       },
-};
-
-static struct clk tegra_cml1_clk = {
-       .name      = "cml1",
-       .parent    = &tegra_pll_e,
-       .ops       = &tegra_cml_clk_ops,
-       .reg       = PLLE_AUX,
-       .max_rate  = 100000000,
-       .u.periph  = {
-               .clk_num   = 1,
-       },
-};
-
-static struct clk tegra_pciex_clk = {
-       .name      = "pciex",
-       .parent    = &tegra_pll_e,
-       .ops       = &tegra_pciex_clk_ops,
-       .max_rate  = 100000000,
-       .u.periph  = {
-               .clk_num   = 74,
-       },
-};
-
-/* Audio sync clocks */
-#define SYNC_SOURCE(_id)                               \
-       {                                               \
-               .name      = #_id "_sync",              \
-               .rate      = 24000000,                  \
-               .max_rate  = 24000000,                  \
-               .ops       = &tegra_sync_source_ops     \
-       }
-static struct clk tegra_sync_source_list[] = {
-       SYNC_SOURCE(spdif_in),
-       SYNC_SOURCE(i2s0),
-       SYNC_SOURCE(i2s1),
-       SYNC_SOURCE(i2s2),
-       SYNC_SOURCE(i2s3),
-       SYNC_SOURCE(i2s4),
-       SYNC_SOURCE(vimclk),
-};
-
-static struct clk_mux_sel mux_audio_sync_clk[] = {
-       { .input = &tegra_sync_source_list[0],  .value = 0},
-       { .input = &tegra_sync_source_list[1],  .value = 1},
-       { .input = &tegra_sync_source_list[2],  .value = 2},
-       { .input = &tegra_sync_source_list[3],  .value = 3},
-       { .input = &tegra_sync_source_list[4],  .value = 4},
-       { .input = &tegra_sync_source_list[5],  .value = 5},
-       { .input = &tegra_pll_a_out0,           .value = 6},
-       { .input = &tegra_sync_source_list[6],  .value = 7},
-       { 0, 0 }
-};
-
-#define AUDIO_SYNC_CLK(_id, _index)                    \
-       {                                               \
-               .name      = #_id,                      \
-               .inputs    = mux_audio_sync_clk,        \
-               .reg       = 0x4A0 + (_index) * 4,      \
-               .max_rate  = 24000000,                  \
-               .ops       = &tegra_audio_sync_clk_ops  \
-       }
-static struct clk tegra_clk_audio_list[] = {
-       AUDIO_SYNC_CLK(audio0, 0),
-       AUDIO_SYNC_CLK(audio1, 1),
-       AUDIO_SYNC_CLK(audio2, 2),
-       AUDIO_SYNC_CLK(audio3, 3),
-       AUDIO_SYNC_CLK(audio4, 4),
-       AUDIO_SYNC_CLK(audio, 5),       /* SPDIF */
-};
-
-#define AUDIO_SYNC_2X_CLK(_id, _index)                         \
-       {                                                       \
-               .name      = #_id "_2x",                        \
-               .flags     = PERIPH_NO_RESET,                   \
-               .max_rate  = 48000000,                          \
-               .ops       = &tegra_clk_double_ops,             \
-               .reg       = 0x49C,                             \
-               .reg_shift = 24 + (_index),                     \
-               .parent    = &tegra_clk_audio_list[(_index)],   \
-               .u.periph = {                                   \
-                       .clk_num = 113 + (_index),              \
-               },                                              \
-       }
-static struct clk tegra_clk_audio_2x_list[] = {
-       AUDIO_SYNC_2X_CLK(audio0, 0),
-       AUDIO_SYNC_2X_CLK(audio1, 1),
-       AUDIO_SYNC_2X_CLK(audio2, 2),
-       AUDIO_SYNC_2X_CLK(audio3, 3),
-       AUDIO_SYNC_2X_CLK(audio4, 4),
-       AUDIO_SYNC_2X_CLK(audio, 5),    /* SPDIF */
-};
+/* Tegra30 CPU clock and reset control functions */
+static void tegra30_wait_cpu_in_reset(u32 cpu)
+{
+       unsigned int reg;
 
-#define MUX_I2S_SPDIF(_id, _index)                                     \
-static struct clk_mux_sel mux_pllaout0_##_id##_2x_pllp_clkm[] = {      \
-       {.input = &tegra_pll_a_out0, .value = 0},                       \
-       {.input = &tegra_clk_audio_2x_list[(_index)], .value = 1},      \
-       {.input = &tegra_pll_p, .value = 2},                            \
-       {.input = &tegra_clk_m, .value = 3},                            \
-       { 0, 0},                                                        \
-}
-MUX_I2S_SPDIF(audio0, 0);
-MUX_I2S_SPDIF(audio1, 1);
-MUX_I2S_SPDIF(audio2, 2);
-MUX_I2S_SPDIF(audio3, 3);
-MUX_I2S_SPDIF(audio4, 4);
-MUX_I2S_SPDIF(audio, 5);               /* SPDIF */
-
-/* External clock outputs (through PMC) */
-#define MUX_EXTERN_OUT(_id)                                            \
-static struct clk_mux_sel mux_clkm_clkm2_clkm4_extern##_id[] = {       \
-       {.input = &tegra_clk_m,         .value = 0},                    \
-       {.input = &tegra_clk_m_div2,    .value = 1},                    \
-       {.input = &tegra_clk_m_div4,    .value = 2},                    \
-       {.input = NULL,                 .value = 3}, /* placeholder */  \
-       { 0, 0},                                                        \
-}
-MUX_EXTERN_OUT(1);
-MUX_EXTERN_OUT(2);
-MUX_EXTERN_OUT(3);
-
-static struct clk_mux_sel *mux_extern_out_list[] = {
-       mux_clkm_clkm2_clkm4_extern1,
-       mux_clkm_clkm2_clkm4_extern2,
-       mux_clkm_clkm2_clkm4_extern3,
-};
+       do {
+               reg = readl(reg_clk_base +
+                           TEGRA30_CLK_RST_CONTROLLER_CPU_CMPLX_STATUS);
+               cpu_relax();
+       } while (!(reg & (1 << cpu)));  /* check CPU been reset or not */
 
-#define CLK_OUT_CLK(_id)                                       \
-       {                                                       \
-               .name      = "clk_out_" #_id,                   \
-               .lookup    = {                                  \
-                       .dev_id    = "clk_out_" #_id,           \
-                       .con_id    = "extern" #_id,             \
-               },                                              \
-               .ops       = &tegra_clk_out_ops,                \
-               .reg       = 0x1a8,                             \
-               .inputs    = mux_clkm_clkm2_clkm4_extern##_id,  \
-               .flags     = MUX_CLK_OUT,                       \
-               .max_rate  = 216000000,                         \
-               .u.periph = {                                   \
-                       .clk_num   = (_id - 1) * 8 + 2,         \
-               },                                              \
-       }
-static struct clk tegra_clk_out_list[] = {
-       CLK_OUT_CLK(1),
-       CLK_OUT_CLK(2),
-       CLK_OUT_CLK(3),
-};
+       return;
+}
 
-/* called after peripheral external clocks are initialized */
-static void init_clk_out_mux(void)
+static void tegra30_put_cpu_in_reset(u32 cpu)
 {
-       int i;
-       struct clk *c;
-
-       /* output clock con_id is the name of peripheral
-          external clock connected to input 3 of the output mux */
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_out_list); i++) {
-               c = tegra_get_clock_by_name(
-                       tegra_clk_out_list[i].lookup.con_id);
-               if (!c)
-                       pr_err("%s: could not find clk %s\n", __func__,
-                              tegra_clk_out_list[i].lookup.con_id);
-               mux_extern_out_list[i][3].input = c;
-       }
+       writel(CPU_RESET(cpu),
+              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_SET);
+       dmb();
 }
 
-/* Peripheral muxes */
-static struct clk_mux_sel mux_sclk[] = {
-       { .input = &tegra_clk_m,        .value = 0},
-       { .input = &tegra_pll_c_out1,   .value = 1},
-       { .input = &tegra_pll_p_out4,   .value = 2},
-       { .input = &tegra_pll_p_out3,   .value = 3},
-       { .input = &tegra_pll_p_out2,   .value = 4},
-       /* { .input = &tegra_clk_d,     .value = 5}, - no use on tegra30 */
-       { .input = &tegra_clk_32k,      .value = 6},
-       { .input = &tegra_pll_m_out1,   .value = 7},
-       { 0, 0},
-};
-
-static struct clk tegra_clk_sclk = {
-       .name   = "sclk",
-       .inputs = mux_sclk,
-       .reg    = 0x28,
-       .ops    = &tegra_super_ops,
-       .max_rate = 334000000,
-       .min_rate = 40000000,
-};
-
-static struct clk tegra_clk_blink = {
-       .name           = "blink",
-       .parent         = &tegra_clk_32k,
-       .reg            = 0x40,
-       .ops            = &tegra_blink_clk_ops,
-       .max_rate       = 32768,
-};
-
-static struct clk_mux_sel mux_pllm_pllc_pllp_plla[] = {
-       { .input = &tegra_pll_m, .value = 0},
-       { .input = &tegra_pll_c, .value = 1},
-       { .input = &tegra_pll_p, .value = 2},
-       { .input = &tegra_pll_a_out0, .value = 3},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_pllp_pllc_pllm_clkm[] = {
-       { .input = &tegra_pll_p, .value = 0},
-       { .input = &tegra_pll_c, .value = 1},
-       { .input = &tegra_pll_m, .value = 2},
-       { .input = &tegra_clk_m, .value = 3},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_pllp_clkm[] = {
-       { .input = &tegra_pll_p, .value = 0},
-       { .input = &tegra_clk_m, .value = 3},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_pllp_plld_pllc_clkm[] = {
-       {.input = &tegra_pll_p, .value = 0},
-       {.input = &tegra_pll_d_out0, .value = 1},
-       {.input = &tegra_pll_c, .value = 2},
-       {.input = &tegra_clk_m, .value = 3},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_pllp_pllm_plld_plla_pllc_plld2_clkm[] = {
-       {.input = &tegra_pll_p, .value = 0},
-       {.input = &tegra_pll_m, .value = 1},
-       {.input = &tegra_pll_d_out0, .value = 2},
-       {.input = &tegra_pll_a_out0, .value = 3},
-       {.input = &tegra_pll_c, .value = 4},
-       {.input = &tegra_pll_d2_out0, .value = 5},
-       {.input = &tegra_clk_m, .value = 6},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_plla_pllc_pllp_clkm[] = {
-       { .input = &tegra_pll_a_out0, .value = 0},
-       /* { .input = &tegra_pll_c, .value = 1}, no use on tegra30 */
-       { .input = &tegra_pll_p, .value = 2},
-       { .input = &tegra_clk_m, .value = 3},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_pllp_pllc_clk32_clkm[] = {
-       {.input = &tegra_pll_p,     .value = 0},
-       {.input = &tegra_pll_c,     .value = 1},
-       {.input = &tegra_clk_32k,   .value = 2},
-       {.input = &tegra_clk_m,     .value = 3},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_pllp_pllc_clkm_clk32[] = {
-       {.input = &tegra_pll_p,     .value = 0},
-       {.input = &tegra_pll_c,     .value = 1},
-       {.input = &tegra_clk_m,     .value = 2},
-       {.input = &tegra_clk_32k,   .value = 3},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_pllp_pllc_pllm[] = {
-       {.input = &tegra_pll_p,     .value = 0},
-       {.input = &tegra_pll_c,     .value = 1},
-       {.input = &tegra_pll_m,     .value = 2},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_clk_m[] = {
-       { .input = &tegra_clk_m, .value = 0},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_pllp_out3[] = {
-       { .input = &tegra_pll_p_out3, .value = 0},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_plld_out0[] = {
-       { .input = &tegra_pll_d_out0, .value = 0},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_plld_out0_plld2_out0[] = {
-       { .input = &tegra_pll_d_out0,  .value = 0},
-       { .input = &tegra_pll_d2_out0, .value = 1},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_clk_32k[] = {
-       { .input = &tegra_clk_32k, .value = 0},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_plla_clk32_pllp_clkm_plle[] = {
-       { .input = &tegra_pll_a_out0, .value = 0},
-       { .input = &tegra_clk_32k,    .value = 1},
-       { .input = &tegra_pll_p,      .value = 2},
-       { .input = &tegra_clk_m,      .value = 3},
-       { .input = &tegra_pll_e,      .value = 4},
-       { 0, 0},
-};
-
-static struct clk_mux_sel mux_cclk_g[] = {
-       { .input = &tegra_clk_m,        .value = 0},
-       { .input = &tegra_pll_c,        .value = 1},
-       { .input = &tegra_clk_32k,      .value = 2},
-       { .input = &tegra_pll_m,        .value = 3},
-       { .input = &tegra_pll_p,        .value = 4},
-       { .input = &tegra_pll_p_out4,   .value = 5},
-       { .input = &tegra_pll_p_out3,   .value = 6},
-       { .input = &tegra_pll_x,        .value = 8},
-       { 0, 0},
-};
-
-static struct clk tegra_clk_cclk_g = {
-       .name   = "cclk_g",
-       .flags  = DIV_U71 | DIV_U71_INT,
-       .inputs = mux_cclk_g,
-       .reg    = 0x368,
-       .ops    = &tegra_super_ops,
-       .max_rate = 1700000000,
-};
-
-static struct clk tegra30_clk_twd = {
-       .parent   = &tegra_clk_cclk_g,
-       .name     = "twd",
-       .ops      = &tegra30_twd_ops,
-       .max_rate = 1400000000, /* Same as tegra_clk_cpu_cmplx.max_rate */
-       .mul      = 1,
-       .div      = 2,
-};
-
-#define PERIPH_CLK(_name, _dev, _con, _clk_num, _reg, _max, _inputs, _flags) \
-       {                                               \
-               .name      = _name,                     \
-               .lookup    = {                          \
-                       .dev_id    = _dev,              \
-                       .con_id    = _con,              \
-               },                                      \
-               .ops       = &tegra_periph_clk_ops,     \
-               .reg       = _reg,                      \
-               .inputs    = _inputs,                   \
-               .flags     = _flags,                    \
-               .max_rate  = _max,                      \
-               .u.periph = {                           \
-                       .clk_num   = _clk_num,          \
-               },                                      \
-       }
-
-#define PERIPH_CLK_EX(_name, _dev, _con, _clk_num, _reg, _max, _inputs,        \
-                       _flags, _ops)                                   \
-       {                                               \
-               .name      = _name,                     \
-               .lookup    = {                          \
-                       .dev_id    = _dev,              \
-                       .con_id    = _con,              \
-               },                                      \
-               .ops       = _ops,                      \
-               .reg       = _reg,                      \
-               .inputs    = _inputs,                   \
-               .flags     = _flags,                    \
-               .max_rate  = _max,                      \
-               .u.periph = {                           \
-                       .clk_num   = _clk_num,          \
-               },                                      \
-       }
-
-#define SHARED_CLK(_name, _dev, _con, _parent, _id, _div, _mode)\
-       {                                               \
-               .name      = _name,                     \
-               .lookup    = {                          \
-                       .dev_id    = _dev,              \
-                       .con_id    = _con,              \
-               },                                      \
-               .ops       = &tegra_clk_shared_bus_ops, \
-               .parent = _parent,                      \
-               .u.shared_bus_user = {                  \
-                       .client_id = _id,               \
-                       .client_div = _div,             \
-                       .mode = _mode,                  \
-               },                                      \
-       }
-struct clk tegra_list_clks[] = {
-       PERIPH_CLK("apbdma",    "tegra-apbdma",         NULL,   34,     0,      26000000,  mux_clk_m,                   0),
-       PERIPH_CLK("rtc",       "rtc-tegra",            NULL,   4,      0,      32768,     mux_clk_32k,                 PERIPH_NO_RESET | PERIPH_ON_APB),
-       PERIPH_CLK("kbc",       "tegra-kbc",            NULL,   36,     0,      32768,     mux_clk_32k,                 PERIPH_NO_RESET | PERIPH_ON_APB),
-       PERIPH_CLK("timer",     "timer",                NULL,   5,      0,      26000000,  mux_clk_m,                   0),
-       PERIPH_CLK("kfuse",     "kfuse-tegra",          NULL,   40,     0,      26000000,  mux_clk_m,                   0),
-       PERIPH_CLK("fuse",      "fuse-tegra",           "fuse", 39,     0,      26000000,  mux_clk_m,                   PERIPH_ON_APB),
-       PERIPH_CLK("fuse_burn", "fuse-tegra",           "fuse_burn",    39,     0,      26000000,  mux_clk_m,           PERIPH_ON_APB),
-       PERIPH_CLK("apbif",     "tegra30-ahub",         "apbif", 107,   0,      26000000,  mux_clk_m,                   0),
-       PERIPH_CLK("i2s0",      "tegra30-i2s.0",        NULL,   30,     0x1d8,  26000000,  mux_pllaout0_audio0_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("i2s1",      "tegra30-i2s.1",        NULL,   11,     0x100,  26000000,  mux_pllaout0_audio1_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("i2s2",      "tegra30-i2s.2",        NULL,   18,     0x104,  26000000,  mux_pllaout0_audio2_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("i2s3",      "tegra30-i2s.3",        NULL,   101,    0x3bc,  26000000,  mux_pllaout0_audio3_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("i2s4",      "tegra30-i2s.4",        NULL,   102,    0x3c0,  26000000,  mux_pllaout0_audio4_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("spdif_out", "tegra30-spdif",        "spdif_out",    10,     0x108,  100000000, mux_pllaout0_audio_2x_pllp_clkm,     MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("spdif_in",  "tegra30-spdif",        "spdif_in",     10,     0x10c,  100000000, mux_pllp_pllc_pllm,          MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("pwm",       "tegra-pwm",            NULL,   17,     0x110,  432000000, mux_pllp_pllc_clk32_clkm,    MUX | MUX_PWM | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("d_audio",   "tegra30-ahub",         "d_audio", 106, 0x3d0,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("dam0",      "tegra30-dam.0",        NULL,   108,    0x3d8,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("dam1",      "tegra30-dam.1",        NULL,   109,    0x3dc,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("dam2",      "tegra30-dam.2",        NULL,   110,    0x3e0,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("hda",       "tegra30-hda",          "hda",   125,   0x428,  108000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("hda2codec_2x",      "tegra30-hda",  "hda2codec",   111,     0x3e4,  48000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("hda2hdmi",  "tegra30-hda",          "hda2hdmi",     128,    0,      48000000,  mux_clk_m,                   0),
-       PERIPH_CLK("sbc1",      "spi_tegra.0",          NULL,   41,     0x134,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("sbc2",      "spi_tegra.1",          NULL,   44,     0x118,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("sbc3",      "spi_tegra.2",          NULL,   46,     0x11c,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("sbc4",      "spi_tegra.3",          NULL,   68,     0x1b4,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("sbc5",      "spi_tegra.4",          NULL,   104,    0x3c8,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("sbc6",      "spi_tegra.5",          NULL,   105,    0x3cc,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("sata_oob",  "tegra_sata_oob",       NULL,   123,    0x420,  216000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("sata",      "tegra_sata",           NULL,   124,    0x424,  216000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("sata_cold", "tegra_sata_cold",      NULL,   129,    0,      48000000,  mux_clk_m,                   0),
-       PERIPH_CLK_EX("ndflash", "tegra_nand",          NULL,   13,     0x160,  240000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71,  &tegra_nand_clk_ops),
-       PERIPH_CLK("ndspeed",   "tegra_nand_speed",     NULL,   80,     0x3f8,  240000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("vfir",      "vfir",                 NULL,   7,      0x168,  72000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("sdmmc1",    "sdhci-tegra.0",        NULL,   14,     0x150,  208000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("sdmmc2",    "sdhci-tegra.1",        NULL,   9,      0x154,  104000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("sdmmc3",    "sdhci-tegra.2",        NULL,   69,     0x1bc,  208000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("sdmmc4",    "sdhci-tegra.3",        NULL,   15,     0x164,  104000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* scales with voltage */
-       PERIPH_CLK("vcp",       "tegra-avp",            "vcp",  29,     0,      250000000, mux_clk_m,                   0),
-       PERIPH_CLK("bsea",      "tegra-avp",            "bsea", 62,     0,      250000000, mux_clk_m,                   0),
-       PERIPH_CLK("bsev",      "tegra-aes",            "bsev", 63,     0,      250000000, mux_clk_m,                   0),
-       PERIPH_CLK("vde",       "vde",                  NULL,   61,     0x1c8,  520000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_INT),
-       PERIPH_CLK("csite",     "csite",                NULL,   73,     0x1d4,  144000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* max rate ??? */
-       PERIPH_CLK("la",        "la",                   NULL,   76,     0x1f8,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71),
-       PERIPH_CLK("owr",       "tegra_w1",             NULL,   71,     0x1cc,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("nor",       "nor",                  NULL,   42,     0x1d0,  127000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("mipi",      "mipi",                 NULL,   50,     0x174,  60000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB), /* scales with voltage */
-       PERIPH_CLK("i2c1",      "tegra-i2c.0",          NULL,   12,     0x124,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB),
-       PERIPH_CLK("i2c2",      "tegra-i2c.1",          NULL,   54,     0x198,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB),
-       PERIPH_CLK("i2c3",      "tegra-i2c.2",          NULL,   67,     0x1b8,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB),
-       PERIPH_CLK("i2c4",      "tegra-i2c.3",          NULL,   103,    0x3c4,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB),
-       PERIPH_CLK("i2c5",      "tegra-i2c.4",          NULL,   47,     0x128,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB),
-       PERIPH_CLK("uarta",     "tegra-uart.0",         NULL,   6,      0x178,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB),
-       PERIPH_CLK("uartb",     "tegra-uart.1",         NULL,   7,      0x17c,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB),
-       PERIPH_CLK("uartc",     "tegra-uart.2",         NULL,   55,     0x1a0,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB),
-       PERIPH_CLK("uartd",     "tegra-uart.3",         NULL,   65,     0x1c0,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB),
-       PERIPH_CLK("uarte",     "tegra-uart.4",         NULL,   66,     0x1c4,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB),
-       PERIPH_CLK_EX("vi",     "tegra_camera",         "vi",   20,     0x148,  425000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT,    &tegra_vi_clk_ops),
-       PERIPH_CLK("3d",        "3d",                   NULL,   24,     0x158,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE | PERIPH_MANUAL_RESET),
-       PERIPH_CLK("3d2",       "3d2",                  NULL,   98,     0x3b0,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE | PERIPH_MANUAL_RESET),
-       PERIPH_CLK("2d",        "2d",                   NULL,   21,     0x15c,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE),
-       PERIPH_CLK("vi_sensor", "tegra_camera",         "vi_sensor",    20,     0x1a8,  150000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | PERIPH_NO_RESET),
-       PERIPH_CLK("epp",       "epp",                  NULL,   19,     0x16c,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT),
-       PERIPH_CLK("mpe",       "mpe",                  NULL,   60,     0x170,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT),
-       PERIPH_CLK("host1x",    "host1x",               NULL,   28,     0x180,  260000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT),
-       PERIPH_CLK("cve",       "cve",                  NULL,   49,     0x140,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("tvo",       "tvo",                  NULL,   49,     0x188,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK_EX("dtv",    "dtv",                  NULL,   79,     0x1dc,  250000000, mux_clk_m,                   0,              &tegra_dtv_clk_ops),
-       PERIPH_CLK("hdmi",      "hdmi",                 NULL,   51,     0x18c,  148500000, mux_pllp_pllm_plld_plla_pllc_plld2_clkm,     MUX | MUX8 | DIV_U71),
-       PERIPH_CLK("tvdac",     "tvdac",                NULL,   53,     0x194,  220000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71), /* requires min voltage */
-       PERIPH_CLK("disp1",     "tegradc.0",            NULL,   27,     0x138,  600000000, mux_pllp_pllm_plld_plla_pllc_plld2_clkm,     MUX | MUX8),
-       PERIPH_CLK("disp2",     "tegradc.1",            NULL,   26,     0x13c,  600000000, mux_pllp_pllm_plld_plla_pllc_plld2_clkm,     MUX | MUX8),
-       PERIPH_CLK("usbd",      "fsl-tegra-udc",        NULL,   22,     0,      480000000, mux_clk_m,                   0), /* requires min voltage */
-       PERIPH_CLK("usb2",      "tegra-ehci.1",         NULL,   58,     0,      480000000, mux_clk_m,                   0), /* requires min voltage */
-       PERIPH_CLK("usb3",      "tegra-ehci.2",         NULL,   59,     0,      480000000, mux_clk_m,                   0), /* requires min voltage */
-       PERIPH_CLK("dsia",      "tegradc.0",            "dsia", 48,     0,      500000000, mux_plld_out0,               0),
-       PERIPH_CLK_EX("dsib",   "tegradc.1",            "dsib", 82,     0xd0,   500000000, mux_plld_out0_plld2_out0,    MUX | PLLD,     &tegra_dsib_clk_ops),
-       PERIPH_CLK("csi",       "tegra_camera",         "csi",  52,     0,      102000000, mux_pllp_out3,               0),
-       PERIPH_CLK("isp",       "tegra_camera",         "isp",  23,     0,      150000000, mux_clk_m,                   0), /* same frequency as VI */
-       PERIPH_CLK("csus",      "tegra_camera",         "csus", 92,     0,      150000000, mux_clk_m,                   PERIPH_NO_RESET),
-
-       PERIPH_CLK("tsensor",   "tegra-tsensor",        NULL,   100,    0x3b8,  216000000, mux_pllp_pllc_clkm_clk32,    MUX | DIV_U71),
-       PERIPH_CLK("actmon",    "actmon",               NULL,   119,    0x3e8,  216000000, mux_pllp_pllc_clk32_clkm,    MUX | DIV_U71),
-       PERIPH_CLK("extern1",   "extern1",              NULL,   120,    0x3ec,  216000000, mux_plla_clk32_pllp_clkm_plle,       MUX | MUX8 | DIV_U71),
-       PERIPH_CLK("extern2",   "extern2",              NULL,   121,    0x3f0,  216000000, mux_plla_clk32_pllp_clkm_plle,       MUX | MUX8 | DIV_U71),
-       PERIPH_CLK("extern3",   "extern3",              NULL,   122,    0x3f4,  216000000, mux_plla_clk32_pllp_clkm_plle,       MUX | MUX8 | DIV_U71),
-       PERIPH_CLK("i2cslow",   "i2cslow",              NULL,   81,     0x3fc,  26000000,  mux_pllp_pllc_clk32_clkm,    MUX | DIV_U71 | PERIPH_ON_APB),
-       PERIPH_CLK("pcie",      "tegra-pcie",           "pcie", 70,     0,      250000000, mux_clk_m,                   0),
-       PERIPH_CLK("afi",       "tegra-pcie",           "afi",  72,     0,      250000000, mux_clk_m,                   0),
-       PERIPH_CLK("se",        "se",                   NULL,   127,    0x42c,  520000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_INT),
-};
-
-#define CLK_DUPLICATE(_name, _dev, _con)               \
-       {                                               \
-               .name   = _name,                        \
-               .lookup = {                             \
-                       .dev_id = _dev,                 \
-                       .con_id         = _con,         \
-               },                                      \
-       }
-
-/* Some clocks may be used by different drivers depending on the board
- * configuration.  List those here to register them twice in the clock lookup
- * table under two names.
- */
-struct clk_duplicate tegra_clk_duplicates[] = {
-       CLK_DUPLICATE("uarta",  "serial8250.0", NULL),
-       CLK_DUPLICATE("uartb",  "serial8250.1", NULL),
-       CLK_DUPLICATE("uartc",  "serial8250.2", NULL),
-       CLK_DUPLICATE("uartd",  "serial8250.3", NULL),
-       CLK_DUPLICATE("uarte",  "serial8250.4", NULL),
-       CLK_DUPLICATE("usbd", "utmip-pad", NULL),
-       CLK_DUPLICATE("usbd", "tegra-ehci.0", NULL),
-       CLK_DUPLICATE("usbd", "tegra-otg", NULL),
-       CLK_DUPLICATE("hdmi", "tegradc.0", "hdmi"),
-       CLK_DUPLICATE("hdmi", "tegradc.1", "hdmi"),
-       CLK_DUPLICATE("dsib", "tegradc.0", "dsib"),
-       CLK_DUPLICATE("dsia", "tegradc.1", "dsia"),
-       CLK_DUPLICATE("bsev", "tegra-avp", "bsev"),
-       CLK_DUPLICATE("bsev", "nvavp", "bsev"),
-       CLK_DUPLICATE("vde", "tegra-aes", "vde"),
-       CLK_DUPLICATE("bsea", "tegra-aes", "bsea"),
-       CLK_DUPLICATE("bsea", "nvavp", "bsea"),
-       CLK_DUPLICATE("cml1", "tegra_sata_cml", NULL),
-       CLK_DUPLICATE("cml0", "tegra_pcie", "cml"),
-       CLK_DUPLICATE("pciex", "tegra_pcie", "pciex"),
-       CLK_DUPLICATE("i2c1", "tegra-i2c-slave.0", NULL),
-       CLK_DUPLICATE("i2c2", "tegra-i2c-slave.1", NULL),
-       CLK_DUPLICATE("i2c3", "tegra-i2c-slave.2", NULL),
-       CLK_DUPLICATE("i2c4", "tegra-i2c-slave.3", NULL),
-       CLK_DUPLICATE("i2c5", "tegra-i2c-slave.4", NULL),
-       CLK_DUPLICATE("sbc1", "spi_slave_tegra.0", NULL),
-       CLK_DUPLICATE("sbc2", "spi_slave_tegra.1", NULL),
-       CLK_DUPLICATE("sbc3", "spi_slave_tegra.2", NULL),
-       CLK_DUPLICATE("sbc4", "spi_slave_tegra.3", NULL),
-       CLK_DUPLICATE("sbc5", "spi_slave_tegra.4", NULL),
-       CLK_DUPLICATE("sbc6", "spi_slave_tegra.5", NULL),
-       CLK_DUPLICATE("twd", "smp_twd", NULL),
-       CLK_DUPLICATE("vcp", "nvavp", "vcp"),
-       CLK_DUPLICATE("i2s0", NULL, "i2s0"),
-       CLK_DUPLICATE("i2s1", NULL, "i2s1"),
-       CLK_DUPLICATE("i2s2", NULL, "i2s2"),
-       CLK_DUPLICATE("i2s3", NULL, "i2s3"),
-       CLK_DUPLICATE("i2s4", NULL, "i2s4"),
-       CLK_DUPLICATE("dam0", NULL, "dam0"),
-       CLK_DUPLICATE("dam1", NULL, "dam1"),
-       CLK_DUPLICATE("dam2", NULL, "dam2"),
-       CLK_DUPLICATE("spdif_in", NULL, "spdif_in"),
-};
-
-struct clk *tegra_ptr_clks[] = {
-       &tegra_clk_32k,
-       &tegra_clk_m,
-       &tegra_clk_m_div2,
-       &tegra_clk_m_div4,
-       &tegra_pll_ref,
-       &tegra_pll_m,
-       &tegra_pll_m_out1,
-       &tegra_pll_c,
-       &tegra_pll_c_out1,
-       &tegra_pll_p,
-       &tegra_pll_p_out1,
-       &tegra_pll_p_out2,
-       &tegra_pll_p_out3,
-       &tegra_pll_p_out4,
-       &tegra_pll_a,
-       &tegra_pll_a_out0,
-       &tegra_pll_d,
-       &tegra_pll_d_out0,
-       &tegra_pll_d2,
-       &tegra_pll_d2_out0,
-       &tegra_pll_u,
-       &tegra_pll_x,
-       &tegra_pll_x_out0,
-       &tegra_pll_e,
-       &tegra_clk_cclk_g,
-       &tegra_cml0_clk,
-       &tegra_cml1_clk,
-       &tegra_pciex_clk,
-       &tegra_clk_sclk,
-       &tegra_clk_blink,
-       &tegra30_clk_twd,
-};
-
-
-static void tegra30_init_one_clock(struct clk *c)
+static void tegra30_cpu_out_of_reset(u32 cpu)
 {
-       clk_init(c);
-       INIT_LIST_HEAD(&c->shared_bus_list);
-       if (!c->lookup.dev_id && !c->lookup.con_id)
-               c->lookup.con_id = c->name;
-       c->lookup.clk = c;
-       clkdev_add(&c->lookup);
+       writel(CPU_RESET(cpu),
+              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_RST_CPU_CMPLX_CLR);
+       wmb();
 }
 
-void __init tegra30_init_clocks(void)
+static void tegra30_enable_cpu_clock(u32 cpu)
 {
-       int i;
-       struct clk *c;
+       unsigned int reg;
 
-       for (i = 0; i < ARRAY_SIZE(tegra_ptr_clks); i++)
-               tegra30_init_one_clock(tegra_ptr_clks[i]);
-
-       for (i = 0; i < ARRAY_SIZE(tegra_list_clks); i++)
-               tegra30_init_one_clock(&tegra_list_clks[i]);
+       writel(CPU_CLOCK(cpu),
+              reg_clk_base + TEGRA30_CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR);
+       reg = readl(reg_clk_base +
+                   TEGRA30_CLK_RST_CONTROLLER_CLK_CPU_CMPLX_CLR);
+}
 
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
-               c = tegra_get_clock_by_name(tegra_clk_duplicates[i].name);
-               if (!c) {
-                       pr_err("%s: Unknown duplicate clock %s\n", __func__,
-                               tegra_clk_duplicates[i].name);
-                       continue;
-               }
+static void tegra30_disable_cpu_clock(u32 cpu)
+{
 
-               tegra_clk_duplicates[i].lookup.clk = c;
-               clkdev_add(&tegra_clk_duplicates[i].lookup);
-       }
+       unsigned int reg;
 
-       for (i = 0; i < ARRAY_SIZE(tegra_sync_source_list); i++)
-               tegra30_init_one_clock(&tegra_sync_source_list[i]);
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_list); i++)
-               tegra30_init_one_clock(&tegra_clk_audio_list[i]);
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_2x_list); i++)
-               tegra30_init_one_clock(&tegra_clk_audio_2x_list[i]);
+       reg = readl(reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+       writel(reg | CPU_CLOCK(cpu),
+              reg_clk_base + TEGRA_CLK_RST_CONTROLLER_CLK_CPU_CMPLX);
+}
 
-       init_clk_out_mux();
-       for (i = 0; i < ARRAY_SIZE(tegra_clk_out_list); i++)
-               tegra30_init_one_clock(&tegra_clk_out_list[i]);
+static struct tegra_cpu_car_ops tegra30_cpu_car_ops = {
+       .wait_for_reset = tegra30_wait_cpu_in_reset,
+       .put_in_reset   = tegra30_put_cpu_in_reset,
+       .out_of_reset   = tegra30_cpu_out_of_reset,
+       .enable_clock   = tegra30_enable_cpu_clock,
+       .disable_clock  = tegra30_disable_cpu_clock,
+};
 
+void __init tegra30_cpu_car_ops_init(void)
+{
+       tegra_cpu_car_ops = &tegra30_cpu_car_ops;
 }
diff --git a/arch/arm/mach-tegra/tegra30_clocks.h b/arch/arm/mach-tegra/tegra30_clocks.h
new file mode 100644 (file)
index 0000000..f2f88fe
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * 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_TEGRA30_CLOCK_H
+#define __MACH_TEGRA30_CLOCK_H
+
+extern struct clk_ops tegra30_clk_32k_ops;
+extern struct clk_ops tegra30_clk_m_ops;
+extern struct clk_ops tegra_clk_m_div_ops;
+extern struct clk_ops tegra_pll_ref_ops;
+extern struct clk_ops tegra30_pll_ops;
+extern struct clk_ops tegra30_pll_div_ops;
+extern struct clk_ops tegra_plld_ops;
+extern struct clk_ops tegra30_plle_ops;
+extern struct clk_ops tegra_cml_clk_ops;
+extern struct clk_ops tegra_pciex_clk_ops;
+extern struct clk_ops tegra_sync_source_ops;
+extern struct clk_ops tegra30_audio_sync_clk_ops;
+extern struct clk_ops tegra30_clk_double_ops;
+extern struct clk_ops tegra_clk_out_ops;
+extern struct clk_ops tegra30_super_ops;
+extern struct clk_ops tegra30_blink_clk_ops;
+extern struct clk_ops tegra30_twd_ops;
+extern struct clk_ops tegra30_periph_clk_ops;
+extern struct clk_ops tegra30_dsib_clk_ops;
+extern struct clk_ops tegra_nand_clk_ops;
+extern struct clk_ops tegra_vi_clk_ops;
+extern struct clk_ops tegra_dtv_clk_ops;
+extern struct clk_ops tegra_clk_shared_bus_ops;
+
+int tegra30_plld_clk_cfg_ex(struct clk_hw *hw,
+                               enum tegra_clk_ex_param p, u32 setting);
+void tegra30_periph_clk_reset(struct clk_hw *hw, bool assert);
+int tegra30_vi_clk_cfg_ex(struct clk_hw *hw,
+                               enum tegra_clk_ex_param p, u32 setting);
+int tegra30_nand_clk_cfg_ex(struct clk_hw *hw,
+                               enum tegra_clk_ex_param p, u32 setting);
+int tegra30_dtv_clk_cfg_ex(struct clk_hw *hw,
+                               enum tegra_clk_ex_param p, u32 setting);
+#endif
diff --git a/arch/arm/mach-tegra/tegra30_clocks_data.c b/arch/arm/mach-tegra/tegra30_clocks_data.c
new file mode 100644 (file)
index 0000000..c104496
--- /dev/null
@@ -0,0 +1,1372 @@
+/*
+ * arch/arm/mach-tegra/tegra30_clocks.c
+ *
+ * Copyright (c) 2010-2012 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 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 Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ */
+
+#include <linux/clk-private.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/list.h>
+#include <linux/spinlock.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <linux/cpufreq.h>
+
+#include "clock.h"
+#include "fuse.h"
+#include "tegra30_clocks.h"
+#include "tegra_cpu_car.h"
+
+#define DEFINE_CLK_TEGRA(_name, _rate, _ops, _flags,           \
+                  _parent_names, _parents, _parent)            \
+       static struct clk tegra_##_name = {                     \
+               .hw = &tegra_##_name##_hw.hw,                   \
+               .name = #_name,                                 \
+               .rate = _rate,                                  \
+               .ops = _ops,                                    \
+               .flags = _flags,                                \
+               .parent_names = _parent_names,                  \
+               .parents = _parents,                            \
+               .num_parents = ARRAY_SIZE(_parent_names),       \
+               .parent = _parent,                              \
+       };
+
+static struct clk tegra_clk_32k;
+static struct clk_tegra tegra_clk_32k_hw = {
+       .hw = {
+               .clk = &tegra_clk_32k,
+       },
+       .fixed_rate = 32768,
+};
+static struct clk tegra_clk_32k = {
+       .name = "clk_32k",
+       .hw = &tegra_clk_32k_hw.hw,
+       .ops = &tegra30_clk_32k_ops,
+       .flags = CLK_IS_ROOT,
+};
+
+static struct clk tegra_clk_m;
+static struct clk_tegra tegra_clk_m_hw = {
+       .hw = {
+               .clk = &tegra_clk_m,
+       },
+       .flags = ENABLE_ON_INIT,
+       .reg = 0x1fc,
+       .reg_shift = 28,
+       .max_rate = 48000000,
+};
+static struct clk tegra_clk_m = {
+       .name = "clk_m",
+       .hw = &tegra_clk_m_hw.hw,
+       .ops = &tegra30_clk_m_ops,
+       .flags = CLK_IS_ROOT | CLK_IGNORE_UNUSED,
+};
+
+static const char *clk_m_div_parent_names[] = {
+       "clk_m",
+};
+
+static struct clk *clk_m_div_parents[] = {
+       &tegra_clk_m,
+};
+
+static struct clk tegra_clk_m_div2;
+static struct clk_tegra tegra_clk_m_div2_hw = {
+       .hw = {
+               .clk = &tegra_clk_m_div2,
+       },
+       .mul = 1,
+       .div = 2,
+       .max_rate = 24000000,
+};
+DEFINE_CLK_TEGRA(clk_m_div2, 0, &tegra_clk_m_div_ops, 0,
+               clk_m_div_parent_names, clk_m_div_parents, &tegra_clk_m);
+
+static struct clk tegra_clk_m_div4;
+static struct clk_tegra tegra_clk_m_div4_hw = {
+       .hw = {
+               .clk = &tegra_clk_m_div4,
+       },
+       .mul = 1,
+       .div = 4,
+       .max_rate = 12000000,
+};
+DEFINE_CLK_TEGRA(clk_m_div4, 0, &tegra_clk_m_div_ops, 0,
+               clk_m_div_parent_names, clk_m_div_parents, &tegra_clk_m);
+
+static struct clk tegra_pll_ref;
+static struct clk_tegra tegra_pll_ref_hw = {
+       .hw = {
+               .clk = &tegra_pll_ref,
+       },
+       .flags = ENABLE_ON_INIT,
+       .max_rate = 26000000,
+};
+DEFINE_CLK_TEGRA(pll_ref, 0, &tegra_pll_ref_ops, 0, clk_m_div_parent_names,
+               clk_m_div_parents, &tegra_clk_m);
+
+#define DEFINE_PLL(_name, _flags, _reg, _max_rate, _input_min, \
+                  _input_max, _cf_min, _cf_max, _vco_min,      \
+                  _vco_max, _freq_table, _lock_delay, _ops,    \
+                  _fixed_rate, _clk_cfg_ex, _parent)           \
+       static struct clk tegra_##_name;                        \
+       static const char *_name##_parent_names[] = {           \
+               #_parent,                                       \
+       };                                                      \
+       static struct clk *_name##_parents[] = {                \
+               &tegra_##_parent,                               \
+       };                                                      \
+       static struct clk_tegra tegra_##_name##_hw = {          \
+               .hw = {                                         \
+                       .clk = &tegra_##_name,                  \
+               },                                              \
+               .flags = _flags,                                \
+               .reg = _reg,                                    \
+               .max_rate = _max_rate,                          \
+               .u.pll = {                                      \
+                       .input_min = _input_min,                \
+                       .input_max = _input_max,                \
+                       .cf_min = _cf_min,                      \
+                       .cf_max = _cf_max,                      \
+                       .vco_min = _vco_min,                    \
+                       .vco_max = _vco_max,                    \
+                       .freq_table = _freq_table,              \
+                       .lock_delay = _lock_delay,              \
+                       .fixed_rate = _fixed_rate,              \
+               },                                              \
+               .clk_cfg_ex = _clk_cfg_ex,                      \
+       };                                                      \
+       DEFINE_CLK_TEGRA(_name, 0, &_ops, CLK_IGNORE_UNUSED,    \
+                        _name##_parent_names, _name##_parents, \
+                       &tegra_##_parent);
+
+#define DEFINE_PLL_OUT(_name, _flags, _reg, _reg_shift,                \
+               _max_rate, _ops, _parent, _clk_flags)           \
+       static const char *_name##_parent_names[] = {           \
+               #_parent,                                       \
+       };                                                      \
+       static struct clk *_name##_parents[] = {                \
+               &tegra_##_parent,                               \
+       };                                                      \
+       static struct clk tegra_##_name;                        \
+       static struct clk_tegra tegra_##_name##_hw = {          \
+               .hw = {                                         \
+                       .clk = &tegra_##_name,                  \
+               },                                              \
+               .flags = _flags,                                \
+               .reg = _reg,                                    \
+               .max_rate = _max_rate,                          \
+               .reg_shift = _reg_shift,                        \
+       };                                                      \
+       DEFINE_CLK_TEGRA(_name, 0, &tegra30_pll_div_ops,        \
+               _clk_flags,  _name##_parent_names,              \
+               _name##_parents, &tegra_##_parent);
+
+static struct clk_pll_freq_table tegra_pll_c_freq_table[] = {
+       { 12000000, 1040000000, 520,  6, 1, 8},
+       { 13000000, 1040000000, 480,  6, 1, 8},
+       { 16800000, 1040000000, 495,  8, 1, 8}, /* actual: 1039.5 MHz */
+       { 19200000, 1040000000, 325,  6, 1, 6},
+       { 26000000, 1040000000, 520, 13, 1, 8},
+
+       { 12000000, 832000000, 416,  6, 1, 8},
+       { 13000000, 832000000, 832, 13, 1, 8},
+       { 16800000, 832000000, 396,  8, 1, 8},  /* actual: 831.6 MHz */
+       { 19200000, 832000000, 260,  6, 1, 8},
+       { 26000000, 832000000, 416, 13, 1, 8},
+
+       { 12000000, 624000000, 624, 12, 1, 8},
+       { 13000000, 624000000, 624, 13, 1, 8},
+       { 16800000, 600000000, 520, 14, 1, 8},
+       { 19200000, 624000000, 520, 16, 1, 8},
+       { 26000000, 624000000, 624, 26, 1, 8},
+
+       { 12000000, 600000000, 600, 12, 1, 8},
+       { 13000000, 600000000, 600, 13, 1, 8},
+       { 16800000, 600000000, 500, 14, 1, 8},
+       { 19200000, 600000000, 375, 12, 1, 6},
+       { 26000000, 600000000, 600, 26, 1, 8},
+
+       { 12000000, 520000000, 520, 12, 1, 8},
+       { 13000000, 520000000, 520, 13, 1, 8},
+       { 16800000, 520000000, 495, 16, 1, 8},  /* actual: 519.75 MHz */
+       { 19200000, 520000000, 325, 12, 1, 6},
+       { 26000000, 520000000, 520, 26, 1, 8},
+
+       { 12000000, 416000000, 416, 12, 1, 8},
+       { 13000000, 416000000, 416, 13, 1, 8},
+       { 16800000, 416000000, 396, 16, 1, 8},  /* actual: 415.8 MHz */
+       { 19200000, 416000000, 260, 12, 1, 6},
+       { 26000000, 416000000, 416, 26, 1, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_c, PLL_HAS_CPCON, 0x80, 1400000000, 2000000, 31000000, 1000000,
+               6000000, 20000000, 1400000000, tegra_pll_c_freq_table, 300,
+               tegra30_pll_ops, 0, NULL, pll_ref);
+
+DEFINE_PLL_OUT(pll_c_out1, DIV_U71, 0x84, 0, 700000000,
+               tegra30_pll_div_ops, pll_c, CLK_IGNORE_UNUSED);
+
+static struct clk_pll_freq_table tegra_pll_m_freq_table[] = {
+       { 12000000, 666000000, 666, 12, 1, 8},
+       { 13000000, 666000000, 666, 13, 1, 8},
+       { 16800000, 666000000, 555, 14, 1, 8},
+       { 19200000, 666000000, 555, 16, 1, 8},
+       { 26000000, 666000000, 666, 26, 1, 8},
+       { 12000000, 600000000, 600, 12, 1, 8},
+       { 13000000, 600000000, 600, 13, 1, 8},
+       { 16800000, 600000000, 500, 14, 1, 8},
+       { 19200000, 600000000, 375, 12, 1, 6},
+       { 26000000, 600000000, 600, 26, 1, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_m, PLL_HAS_CPCON | PLLM, 0x90, 800000000, 2000000, 31000000,
+               1000000, 6000000, 20000000, 1200000000, tegra_pll_m_freq_table,
+               300, tegra30_pll_ops, 0, NULL, pll_ref);
+
+DEFINE_PLL_OUT(pll_m_out1, DIV_U71, 0x94, 0, 600000000,
+               tegra30_pll_div_ops, pll_m, CLK_IGNORE_UNUSED);
+
+static struct clk_pll_freq_table tegra_pll_p_freq_table[] = {
+       { 12000000, 216000000, 432, 12, 2, 8},
+       { 13000000, 216000000, 432, 13, 2, 8},
+       { 16800000, 216000000, 360, 14, 2, 8},
+       { 19200000, 216000000, 360, 16, 2, 8},
+       { 26000000, 216000000, 432, 26, 2, 8},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_p, ENABLE_ON_INIT | PLL_FIXED | PLL_HAS_CPCON, 0xa0, 432000000,
+               2000000, 31000000, 1000000, 6000000, 20000000, 1400000000,
+               tegra_pll_p_freq_table, 300, tegra30_pll_ops, 408000000, NULL,
+               pll_ref);
+
+DEFINE_PLL_OUT(pll_p_out1, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa4,
+               0, 432000000, tegra30_pll_div_ops, pll_p, CLK_IGNORE_UNUSED);
+DEFINE_PLL_OUT(pll_p_out2, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa4,
+               16, 432000000, tegra30_pll_div_ops, pll_p, CLK_IGNORE_UNUSED);
+DEFINE_PLL_OUT(pll_p_out3, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa8,
+               0, 432000000, tegra30_pll_div_ops, pll_p, CLK_IGNORE_UNUSED);
+DEFINE_PLL_OUT(pll_p_out4, ENABLE_ON_INIT | DIV_U71 | DIV_U71_FIXED, 0xa8,
+               16, 432000000, tegra30_pll_div_ops, pll_p, CLK_IGNORE_UNUSED);
+
+static struct clk_pll_freq_table tegra_pll_a_freq_table[] = {
+       { 9600000, 564480000, 294, 5, 1, 4},
+       { 9600000, 552960000, 288, 5, 1, 4},
+       { 9600000, 24000000,  5,   2, 1, 1},
+
+       { 28800000, 56448000, 49, 25, 1, 1},
+       { 28800000, 73728000, 64, 25, 1, 1},
+       { 28800000, 24000000,  5,  6, 1, 1},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_a, PLL_HAS_CPCON, 0xb0, 700000000, 2000000, 31000000, 1000000,
+               6000000, 20000000, 1400000000, tegra_pll_a_freq_table,
+               300, tegra30_pll_ops, 0, NULL, pll_p_out1);
+
+DEFINE_PLL_OUT(pll_a_out0, DIV_U71, 0xb4, 0, 100000000, tegra30_pll_div_ops,
+               pll_a, CLK_IGNORE_UNUSED);
+
+static struct clk_pll_freq_table tegra_pll_d_freq_table[] = {
+       { 12000000, 216000000, 216, 12, 1, 4},
+       { 13000000, 216000000, 216, 13, 1, 4},
+       { 16800000, 216000000, 180, 14, 1, 4},
+       { 19200000, 216000000, 180, 16, 1, 4},
+       { 26000000, 216000000, 216, 26, 1, 4},
+
+       { 12000000, 594000000, 594, 12, 1, 8},
+       { 13000000, 594000000, 594, 13, 1, 8},
+       { 16800000, 594000000, 495, 14, 1, 8},
+       { 19200000, 594000000, 495, 16, 1, 8},
+       { 26000000, 594000000, 594, 26, 1, 8},
+
+       { 12000000, 1000000000, 1000, 12, 1, 12},
+       { 13000000, 1000000000, 1000, 13, 1, 12},
+       { 19200000, 1000000000, 625,  12, 1, 8},
+       { 26000000, 1000000000, 1000, 26, 1, 12},
+
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_d, PLL_HAS_CPCON | PLLD, 0xd0, 1000000000, 2000000, 40000000,
+               1000000, 6000000, 40000000, 1000000000, tegra_pll_d_freq_table,
+               1000, tegra30_pll_ops, 0, tegra30_plld_clk_cfg_ex, pll_ref);
+
+DEFINE_PLL_OUT(pll_d_out0, DIV_2 | PLLD, 0, 0, 500000000, tegra30_pll_div_ops,
+               pll_d, CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED);
+
+DEFINE_PLL(pll_d2, PLL_HAS_CPCON | PLL_ALT_MISC_REG | PLLD, 0x4b8, 1000000000,
+               2000000, 40000000, 1000000, 6000000, 40000000, 1000000000,
+               tegra_pll_d_freq_table, 1000, tegra30_pll_ops, 0, NULL,
+               pll_ref);
+
+DEFINE_PLL_OUT(pll_d2_out0, DIV_2 | PLLD, 0, 0, 500000000, tegra30_pll_div_ops,
+               pll_d2, CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED);
+
+static struct clk_pll_freq_table tegra_pll_u_freq_table[] = {
+       { 12000000, 480000000, 960, 12, 2, 12},
+       { 13000000, 480000000, 960, 13, 2, 12},
+       { 16800000, 480000000, 400, 7,  2, 5},
+       { 19200000, 480000000, 200, 4,  2, 3},
+       { 26000000, 480000000, 960, 26, 2, 12},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_u, PLL_HAS_CPCON | PLLU, 0xc0, 480000000, 2000000, 40000000,
+               1000000, 6000000, 48000000, 960000000, tegra_pll_u_freq_table,
+               1000, tegra30_pll_ops, 0, NULL, pll_ref);
+
+static struct clk_pll_freq_table tegra_pll_x_freq_table[] = {
+       /* 1.7 GHz */
+       { 12000000, 1700000000, 850,  6,  1, 8},
+       { 13000000, 1700000000, 915,  7,  1, 8},        /* actual: 1699.2 MHz */
+       { 16800000, 1700000000, 708,  7,  1, 8},        /* actual: 1699.2 MHz */
+       { 19200000, 1700000000, 885,  10, 1, 8},        /* actual: 1699.2 MHz */
+       { 26000000, 1700000000, 850,  13, 1, 8},
+
+       /* 1.6 GHz */
+       { 12000000, 1600000000, 800,  6,  1, 8},
+       { 13000000, 1600000000, 738,  6,  1, 8},        /* actual: 1599.0 MHz */
+       { 16800000, 1600000000, 857,  9,  1, 8},        /* actual: 1599.7 MHz */
+       { 19200000, 1600000000, 500,  6,  1, 8},
+       { 26000000, 1600000000, 800,  13, 1, 8},
+
+       /* 1.5 GHz */
+       { 12000000, 1500000000, 750,  6,  1, 8},
+       { 13000000, 1500000000, 923,  8,  1, 8},        /* actual: 1499.8 MHz */
+       { 16800000, 1500000000, 625,  7,  1, 8},
+       { 19200000, 1500000000, 625,  8,  1, 8},
+       { 26000000, 1500000000, 750,  13, 1, 8},
+
+       /* 1.4 GHz */
+       { 12000000, 1400000000, 700,  6,  1, 8},
+       { 13000000, 1400000000, 969,  9,  1, 8},        /* actual: 1399.7 MHz */
+       { 16800000, 1400000000, 1000, 12, 1, 8},
+       { 19200000, 1400000000, 875,  12, 1, 8},
+       { 26000000, 1400000000, 700,  13, 1, 8},
+
+       /* 1.3 GHz */
+       { 12000000, 1300000000, 975,  9,  1, 8},
+       { 13000000, 1300000000, 1000, 10, 1, 8},
+       { 16800000, 1300000000, 928,  12, 1, 8},        /* actual: 1299.2 MHz */
+       { 19200000, 1300000000, 812,  12, 1, 8},        /* actual: 1299.2 MHz */
+       { 26000000, 1300000000, 650,  13, 1, 8},
+
+       /* 1.2 GHz */
+       { 12000000, 1200000000, 1000, 10, 1, 8},
+       { 13000000, 1200000000, 923,  10, 1, 8},        /* actual: 1199.9 MHz */
+       { 16800000, 1200000000, 1000, 14, 1, 8},
+       { 19200000, 1200000000, 1000, 16, 1, 8},
+       { 26000000, 1200000000, 600,  13, 1, 8},
+
+       /* 1.1 GHz */
+       { 12000000, 1100000000, 825,  9,  1, 8},
+       { 13000000, 1100000000, 846,  10, 1, 8},        /* actual: 1099.8 MHz */
+       { 16800000, 1100000000, 982,  15, 1, 8},        /* actual: 1099.8 MHz */
+       { 19200000, 1100000000, 859,  15, 1, 8},        /* actual: 1099.5 MHz */
+       { 26000000, 1100000000, 550,  13, 1, 8},
+
+       /* 1 GHz */
+       { 12000000, 1000000000, 1000, 12, 1, 8},
+       { 13000000, 1000000000, 1000, 13, 1, 8},
+       { 16800000, 1000000000, 833,  14, 1, 8},        /* actual: 999.6 MHz */
+       { 19200000, 1000000000, 625,  12, 1, 8},
+       { 26000000, 1000000000, 1000, 26, 1, 8},
+
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_x, PLL_HAS_CPCON | PLL_ALT_MISC_REG | PLLX, 0xe0, 1700000000,
+               2000000, 31000000, 1000000, 6000000, 20000000, 1700000000,
+               tegra_pll_x_freq_table, 300, tegra30_pll_ops, 0, NULL, pll_ref);
+
+DEFINE_PLL_OUT(pll_x_out0, DIV_2 | PLLX, 0, 0, 850000000, tegra30_pll_div_ops,
+               pll_x, CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED);
+
+static struct clk_pll_freq_table tegra_pll_e_freq_table[] = {
+       /* PLLE special case: use cpcon field to store cml divider value */
+       { 12000000,  100000000, 150, 1,  18, 11},
+       { 216000000, 100000000, 200, 18, 24, 13},
+       { 0, 0, 0, 0, 0, 0 },
+};
+
+DEFINE_PLL(pll_e, PLL_ALT_MISC_REG, 0xe8, 100000000, 2000000, 216000000,
+               12000000, 12000000, 1200000000, 2400000000U,
+               tegra_pll_e_freq_table, 300, tegra30_plle_ops, 100000000, NULL,
+               pll_ref);
+
+static const char *mux_plle[] = {
+       "pll_e",
+};
+
+static struct clk *mux_plle_p[] = {
+       &tegra_pll_e,
+};
+
+static struct clk tegra_cml0;
+static struct clk_tegra tegra_cml0_hw = {
+       .hw = {
+               .clk = &tegra_cml0,
+       },
+       .reg = 0x48c,
+       .fixed_rate = 100000000,
+       .u.periph = {
+               .clk_num = 0,
+       },
+};
+DEFINE_CLK_TEGRA(cml0, 0, &tegra_cml_clk_ops, 0, mux_plle,
+               mux_plle_p, &tegra_pll_e);
+
+static struct clk tegra_cml1;
+static struct clk_tegra tegra_cml1_hw = {
+       .hw = {
+               .clk = &tegra_cml1,
+       },
+       .reg = 0x48c,
+       .fixed_rate = 100000000,
+       .u.periph = {
+               .clk_num = 1,
+       },
+};
+DEFINE_CLK_TEGRA(cml1, 0, &tegra_cml_clk_ops, 0, mux_plle,
+               mux_plle_p, &tegra_pll_e);
+
+static struct clk tegra_pciex;
+static struct clk_tegra tegra_pciex_hw = {
+       .hw = {
+               .clk = &tegra_pciex,
+       },
+       .reg = 0x48c,
+       .fixed_rate = 100000000,
+       .reset = tegra30_periph_clk_reset,
+       .u.periph = {
+               .clk_num = 74,
+       },
+};
+DEFINE_CLK_TEGRA(pciex, 0, &tegra_pciex_clk_ops, 0, mux_plle,
+               mux_plle_p, &tegra_pll_e);
+
+#define SYNC_SOURCE(_name)                                     \
+       static struct clk tegra_##_name##_sync;                 \
+       static struct clk_tegra tegra_##_name##_sync_hw = {     \
+               .hw = {                                         \
+                       .clk = &tegra_##_name##_sync,           \
+               },                                              \
+               .max_rate = 24000000,                           \
+               .fixed_rate = 24000000,                         \
+       };                                                      \
+       static struct clk tegra_##_name##_sync = {              \
+               .name = #_name "_sync",                         \
+               .hw = &tegra_##_name##_sync_hw.hw,              \
+               .ops = &tegra_sync_source_ops,                  \
+               .flags = CLK_IS_ROOT,                           \
+       };
+
+SYNC_SOURCE(spdif_in);
+SYNC_SOURCE(i2s0);
+SYNC_SOURCE(i2s1);
+SYNC_SOURCE(i2s2);
+SYNC_SOURCE(i2s3);
+SYNC_SOURCE(i2s4);
+SYNC_SOURCE(vimclk);
+
+static struct clk *tegra_sync_source_list[] = {
+       &tegra_spdif_in_sync,
+       &tegra_i2s0_sync,
+       &tegra_i2s1_sync,
+       &tegra_i2s2_sync,
+       &tegra_i2s3_sync,
+       &tegra_i2s4_sync,
+       &tegra_vimclk_sync,
+};
+
+static const char *mux_audio_sync_clk[] = {
+       "spdif_in_sync",
+       "i2s0_sync",
+       "i2s1_sync",
+       "i2s2_sync",
+       "i2s3_sync",
+       "i2s4_sync",
+       "vimclk_sync",
+};
+
+#define AUDIO_SYNC_CLK(_name, _index)                          \
+       static struct clk tegra_##_name;                        \
+       static struct clk_tegra tegra_##_name##_hw = {          \
+               .hw = {                                         \
+                       .clk = &tegra_##_name,                  \
+               },                                              \
+               .max_rate = 24000000,                           \
+               .reg = 0x4A0 + (_index) * 4,                    \
+       };                                                      \
+       static struct clk tegra_##_name = {                     \
+               .name = #_name,                                 \
+               .ops = &tegra30_audio_sync_clk_ops,             \
+               .hw = &tegra_##_name##_hw.hw,                   \
+               .parent_names = mux_audio_sync_clk,             \
+               .parents = tegra_sync_source_list,              \
+               .num_parents = ARRAY_SIZE(mux_audio_sync_clk),  \
+       };
+
+AUDIO_SYNC_CLK(audio0, 0);
+AUDIO_SYNC_CLK(audio1, 1);
+AUDIO_SYNC_CLK(audio2, 2);
+AUDIO_SYNC_CLK(audio3, 3);
+AUDIO_SYNC_CLK(audio4, 4);
+AUDIO_SYNC_CLK(audio5, 5);
+
+static struct clk *tegra_clk_audio_list[] = {
+       &tegra_audio0,
+       &tegra_audio1,
+       &tegra_audio2,
+       &tegra_audio3,
+       &tegra_audio4,
+       &tegra_audio5,  /* SPDIF */
+};
+
+#define AUDIO_SYNC_2X_CLK(_name, _index)                       \
+       static const char *_name##_parent_names[] = {           \
+               "tegra_" #_name,                                \
+       };                                                      \
+       static struct clk *_name##_parents[] = {                \
+               &tegra_##_name,                                 \
+       };                                                      \
+       static struct clk tegra_##_name##_2x;                   \
+       static struct clk_tegra tegra_##_name##_2x_hw = {       \
+               .hw = {                                         \
+                       .clk = &tegra_##_name##_2x,             \
+               },                                              \
+               .flags = PERIPH_NO_RESET,                       \
+               .max_rate = 48000000,                           \
+               .reg = 0x49C,                                   \
+               .reg_shift = 24 + (_index),                     \
+               .u.periph = {                                   \
+                       .clk_num = 113 + (_index),              \
+               },                                              \
+       };                                                      \
+       static struct clk tegra_##_name##_2x = {                \
+               .name = #_name "_2x",                           \
+               .ops = &tegra30_clk_double_ops,                 \
+               .hw = &tegra_##_name##_2x_hw.hw,                \
+               .parent_names = _name##_parent_names,           \
+               .parents = _name##_parents,                     \
+               .parent = &tegra_##_name,                       \
+               .num_parents = 1,                               \
+       };
+
+AUDIO_SYNC_2X_CLK(audio0, 0);
+AUDIO_SYNC_2X_CLK(audio1, 1);
+AUDIO_SYNC_2X_CLK(audio2, 2);
+AUDIO_SYNC_2X_CLK(audio3, 3);
+AUDIO_SYNC_2X_CLK(audio4, 4);
+AUDIO_SYNC_2X_CLK(audio5, 5);  /* SPDIF */
+
+static struct clk *tegra_clk_audio_2x_list[] = {
+       &tegra_audio0_2x,
+       &tegra_audio1_2x,
+       &tegra_audio2_2x,
+       &tegra_audio3_2x,
+       &tegra_audio4_2x,
+       &tegra_audio5_2x,       /* SPDIF */
+};
+
+#define MUX_I2S_SPDIF(_id)                                     \
+static const char *mux_pllaout0_##_id##_2x_pllp_clkm[] = {     \
+       "pll_a_out0",                                           \
+       #_id "_2x",                                             \
+       "pll_p",                                                \
+       "clk_m",                                                \
+};                                                             \
+static struct clk *mux_pllaout0_##_id##_2x_pllp_clkm_p[] = {   \
+       &tegra_pll_a_out0,                                      \
+       &tegra_##_id##_2x,                                      \
+       &tegra_pll_p,                                           \
+       &tegra_clk_m,                                           \
+};
+
+MUX_I2S_SPDIF(audio0);
+MUX_I2S_SPDIF(audio1);
+MUX_I2S_SPDIF(audio2);
+MUX_I2S_SPDIF(audio3);
+MUX_I2S_SPDIF(audio4);
+MUX_I2S_SPDIF(audio5);         /* SPDIF */
+
+static struct clk tegra_extern1;
+static struct clk tegra_extern2;
+static struct clk tegra_extern3;
+
+/* External clock outputs (through PMC) */
+#define MUX_EXTERN_OUT(_id)                                    \
+static const char *mux_clkm_clkm2_clkm4_extern##_id[] = {      \
+       "clk_m",                                                \
+       "clk_m_div2",                                           \
+       "clk_m_div4",                                           \
+       "extern" #_id,                                          \
+};                                                             \
+static struct clk *mux_clkm_clkm2_clkm4_extern##_id##_p[] = {  \
+       &tegra_clk_m,                                           \
+       &tegra_clk_m_div2,                                      \
+       &tegra_clk_m_div4,                                      \
+       &tegra_extern##_id,                                     \
+};
+
+MUX_EXTERN_OUT(1);
+MUX_EXTERN_OUT(2);
+MUX_EXTERN_OUT(3);
+
+#define CLK_OUT_CLK(_name, _index)                                     \
+       static struct clk tegra_##_name;                                \
+       static struct clk_tegra tegra_##_name##_hw = {                  \
+               .hw = {                                                 \
+                       .clk = &tegra_##_name,                          \
+               },                                                      \
+               .lookup = {                                             \
+                       .dev_id = #_name,                               \
+                       .con_id = "extern" #_index,                     \
+               },                                                      \
+               .flags = MUX_CLK_OUT,                                   \
+               .fixed_rate = 216000000,                                        \
+               .reg = 0x1a8,                                           \
+               .u.periph = {                                           \
+                       .clk_num = (_index - 1) * 8 + 2,                \
+               },                                                      \
+       };                                                              \
+       static struct clk tegra_##_name = {                             \
+               .name = #_name,                                         \
+               .ops = &tegra_clk_out_ops,                              \
+               .hw = &tegra_##_name##_hw.hw,                           \
+               .parent_names = mux_clkm_clkm2_clkm4_extern##_index,    \
+               .parents = mux_clkm_clkm2_clkm4_extern##_index##_p,     \
+               .num_parents = ARRAY_SIZE(mux_clkm_clkm2_clkm4_extern##_index),\
+       };
+
+CLK_OUT_CLK(clk_out_1, 1);
+CLK_OUT_CLK(clk_out_2, 2);
+CLK_OUT_CLK(clk_out_3, 3);
+
+static struct clk *tegra_clk_out_list[] = {
+       &tegra_clk_out_1,
+       &tegra_clk_out_2,
+       &tegra_clk_out_3,
+};
+
+static const char *mux_sclk[] = {
+       "clk_m",
+       "pll_c_out1",
+       "pll_p_out4",
+       "pll_p_out3",
+       "pll_p_out2",
+       "dummy",
+       "clk_32k",
+       "pll_m_out1",
+};
+
+static struct clk *mux_sclk_p[] = {
+       &tegra_clk_m,
+       &tegra_pll_c_out1,
+       &tegra_pll_p_out4,
+       &tegra_pll_p_out3,
+       &tegra_pll_p_out2,
+       NULL,
+       &tegra_clk_32k,
+       &tegra_pll_m_out1,
+};
+
+static struct clk tegra_clk_sclk;
+static struct clk_tegra tegra_clk_sclk_hw = {
+       .hw = {
+               .clk = &tegra_clk_sclk,
+       },
+       .reg = 0x28,
+       .max_rate = 334000000,
+       .min_rate = 40000000,
+};
+
+static struct clk tegra_clk_sclk = {
+       .name = "sclk",
+       .ops = &tegra30_super_ops,
+       .hw = &tegra_clk_sclk_hw.hw,
+       .parent_names = mux_sclk,
+       .parents = mux_sclk_p,
+       .num_parents = ARRAY_SIZE(mux_sclk),
+};
+
+static const char *mux_blink[] = {
+       "clk_32k",
+};
+
+static struct clk *mux_blink_p[] = {
+       &tegra_clk_32k,
+};
+
+static struct clk tegra_clk_blink;
+static struct clk_tegra tegra_clk_blink_hw = {
+       .hw = {
+               .clk = &tegra_clk_blink,
+       },
+       .reg = 0x40,
+       .max_rate = 32768,
+};
+static struct clk tegra_clk_blink = {
+       .name = "blink",
+       .ops = &tegra30_blink_clk_ops,
+       .hw = &tegra_clk_blink_hw.hw,
+       .parent = &tegra_clk_32k,
+       .parent_names = mux_blink,
+       .parents = mux_blink_p,
+       .num_parents = ARRAY_SIZE(mux_blink),
+};
+
+static const char *mux_pllm_pllc_pllp_plla[] = {
+       "pll_m",
+       "pll_c",
+       "pll_p",
+       "pll_a_out0",
+};
+
+static const char *mux_pllp_pllc_pllm_clkm[] = {
+       "pll_p",
+       "pll_c",
+       "pll_m",
+       "clk_m",
+};
+
+static const char *mux_pllp_clkm[] = {
+       "pll_p",
+       "dummy",
+       "dummy",
+       "clk_m",
+};
+
+static const char *mux_pllp_plld_pllc_clkm[] = {
+       "pll_p",
+       "pll_d_out0",
+       "pll_c",
+       "clk_m",
+};
+
+static const char *mux_pllp_pllm_plld_plla_pllc_plld2_clkm[] = {
+       "pll_p",
+       "pll_m",
+       "pll_d_out0",
+       "pll_a_out0",
+       "pll_c",
+       "pll_d2_out0",
+       "clk_m",
+};
+
+static const char *mux_plla_pllc_pllp_clkm[] = {
+       "pll_a_out0",
+       "dummy",
+       "pll_p",
+       "clk_m"
+};
+
+static const char *mux_pllp_pllc_clk32_clkm[] = {
+       "pll_p",
+       "pll_c",
+       "clk_32k",
+       "clk_m",
+};
+
+static const char *mux_pllp_pllc_clkm_clk32[] = {
+       "pll_p",
+       "pll_c",
+       "clk_m",
+       "clk_32k",
+};
+
+static const char *mux_pllp_pllc_pllm[] = {
+       "pll_p",
+       "pll_c",
+       "pll_m",
+};
+
+static const char *mux_clk_m[] = {
+       "clk_m",
+};
+
+static const char *mux_pllp_out3[] = {
+       "pll_p_out3",
+};
+
+static const char *mux_plld_out0[] = {
+       "pll_d_out0",
+};
+
+static const char *mux_plld_out0_plld2_out0[] = {
+       "pll_d_out0",
+       "pll_d2_out0",
+};
+
+static const char *mux_clk_32k[] = {
+       "clk_32k",
+};
+
+static const char *mux_plla_clk32_pllp_clkm_plle[] = {
+       "pll_a_out0",
+       "clk_32k",
+       "pll_p",
+       "clk_m",
+       "pll_e",
+};
+
+static const char *mux_cclk_g[] = {
+       "clk_m",
+       "pll_c",
+       "clk_32k",
+       "pll_m",
+       "pll_p",
+       "pll_p_out4",
+       "pll_p_out3",
+       "dummy",
+       "pll_x",
+};
+
+static struct clk *mux_pllm_pllc_pllp_plla_p[] = {
+       &tegra_pll_m,
+       &tegra_pll_c,
+       &tegra_pll_p,
+       &tegra_pll_a_out0,
+};
+
+static struct clk *mux_pllp_pllc_pllm_clkm_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_c,
+       &tegra_pll_m,
+       &tegra_clk_m,
+};
+
+static struct clk *mux_pllp_clkm_p[] = {
+       &tegra_pll_p,
+       NULL,
+       NULL,
+       &tegra_clk_m,
+};
+
+static struct clk *mux_pllp_plld_pllc_clkm_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_d_out0,
+       &tegra_pll_c,
+       &tegra_clk_m,
+};
+
+static struct clk *mux_pllp_pllm_plld_plla_pllc_plld2_clkm_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_m,
+       &tegra_pll_d_out0,
+       &tegra_pll_a_out0,
+       &tegra_pll_c,
+       &tegra_pll_d2_out0,
+       &tegra_clk_m,
+};
+
+static struct clk *mux_plla_pllc_pllp_clkm_p[] = {
+       &tegra_pll_a_out0,
+       NULL,
+       &tegra_pll_p,
+       &tegra_clk_m,
+};
+
+static struct clk *mux_pllp_pllc_clk32_clkm_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_c,
+       &tegra_clk_32k,
+       &tegra_clk_m,
+};
+
+static struct clk *mux_pllp_pllc_clkm_clk32_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_c,
+       &tegra_clk_m,
+       &tegra_clk_32k,
+};
+
+static struct clk *mux_pllp_pllc_pllm_p[] = {
+       &tegra_pll_p,
+       &tegra_pll_c,
+       &tegra_pll_m,
+};
+
+static struct clk *mux_clk_m_p[] = {
+       &tegra_clk_m,
+};
+
+static struct clk *mux_pllp_out3_p[] = {
+       &tegra_pll_p_out3,
+};
+
+static struct clk *mux_plld_out0_p[] = {
+       &tegra_pll_d_out0,
+};
+
+static struct clk *mux_plld_out0_plld2_out0_p[] = {
+       &tegra_pll_d_out0,
+       &tegra_pll_d2_out0,
+};
+
+static struct clk *mux_clk_32k_p[] = {
+       &tegra_clk_32k,
+};
+
+static struct clk *mux_plla_clk32_pllp_clkm_plle_p[] = {
+       &tegra_pll_a_out0,
+       &tegra_clk_32k,
+       &tegra_pll_p,
+       &tegra_clk_m,
+       &tegra_pll_e,
+};
+
+static struct clk *mux_cclk_g_p[] = {
+       &tegra_clk_m,
+       &tegra_pll_c,
+       &tegra_clk_32k,
+       &tegra_pll_m,
+       &tegra_pll_p,
+       &tegra_pll_p_out4,
+       &tegra_pll_p_out3,
+       NULL,
+       &tegra_pll_x,
+};
+
+static struct clk tegra_clk_cclk_g;
+static struct clk_tegra tegra_clk_cclk_g_hw = {
+       .hw = {
+               .clk = &tegra_clk_cclk_g,
+       },
+       .flags = DIV_U71 | DIV_U71_INT,
+       .reg = 0x368,
+       .max_rate = 1700000000,
+};
+static struct clk tegra_clk_cclk_g = {
+       .name = "cclk_g",
+       .ops = &tegra30_super_ops,
+       .hw = &tegra_clk_cclk_g_hw.hw,
+       .parent_names = mux_cclk_g,
+       .parents = mux_cclk_g_p,
+       .num_parents = ARRAY_SIZE(mux_cclk_g),
+};
+
+static const char *mux_twd[] = {
+       "cclk_g",
+};
+
+static struct clk *mux_twd_p[] = {
+       &tegra_clk_cclk_g,
+};
+
+static struct clk tegra30_clk_twd;
+static struct clk_tegra tegra30_clk_twd_hw = {
+       .hw = {
+               .clk = &tegra30_clk_twd,
+       },
+       .max_rate = 1400000000,
+       .mul = 1,
+       .div = 2,
+};
+
+static struct clk tegra30_clk_twd = {
+       .name = "twd",
+       .ops = &tegra30_twd_ops,
+       .hw = &tegra30_clk_twd_hw.hw,
+       .parent = &tegra_clk_cclk_g,
+       .parent_names = mux_twd,
+       .parents = mux_twd_p,
+       .num_parents = ARRAY_SIZE(mux_twd),
+};
+
+#define PERIPH_CLK(_name, _dev, _con, _clk_num, _reg,  \
+               _max, _inputs, _flags)                  \
+       static struct clk tegra_##_name;                \
+       static struct clk_tegra tegra_##_name##_hw = {  \
+               .hw = {                                 \
+                       .clk = &tegra_##_name,          \
+               },                                      \
+               .lookup = {                             \
+                       .dev_id = _dev,                 \
+                       .con_id = _con,                 \
+               },                                      \
+               .reg = _reg,                            \
+               .flags = _flags,                        \
+               .max_rate = _max,                       \
+               .u.periph = {                           \
+                       .clk_num = _clk_num,            \
+               },                                      \
+               .reset = &tegra30_periph_clk_reset,     \
+       };                                              \
+       static struct clk tegra_##_name = {             \
+               .name = #_name,                         \
+               .ops = &tegra30_periph_clk_ops,         \
+               .hw = &tegra_##_name##_hw.hw,           \
+               .parent_names = _inputs,                \
+               .parents = _inputs##_p,                 \
+               .num_parents = ARRAY_SIZE(_inputs),     \
+       };
+
+PERIPH_CLK(apbdma,     "tegra-apbdma",         NULL,   34,     0,      26000000,  mux_clk_m,                   0);
+PERIPH_CLK(rtc,                "rtc-tegra",            NULL,   4,      0,      32768,     mux_clk_32k,                 PERIPH_NO_RESET | PERIPH_ON_APB);
+PERIPH_CLK(kbc,                "tegra-kbc",            NULL,   36,     0,      32768,     mux_clk_32k,                 PERIPH_NO_RESET | PERIPH_ON_APB);
+PERIPH_CLK(timer,      "timer",                NULL,   5,      0,      26000000,  mux_clk_m,                   0);
+PERIPH_CLK(kfuse,      "kfuse-tegra",          NULL,   40,     0,      26000000,  mux_clk_m,                   0);
+PERIPH_CLK(fuse,       "fuse-tegra",           "fuse", 39,     0,      26000000,  mux_clk_m,                   PERIPH_ON_APB);
+PERIPH_CLK(fuse_burn,  "fuse-tegra",           "fuse_burn",    39,     0,      26000000,  mux_clk_m,           PERIPH_ON_APB);
+PERIPH_CLK(apbif,      "tegra30-ahub",         "apbif", 107,   0,      26000000,  mux_clk_m,                   0);
+PERIPH_CLK(i2s0,       "tegra30-i2s.0",        NULL,   30,     0x1d8,  26000000,  mux_pllaout0_audio0_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(i2s1,       "tegra30-i2s.1",        NULL,   11,     0x100,  26000000,  mux_pllaout0_audio1_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(i2s2,       "tegra30-i2s.2",        NULL,   18,     0x104,  26000000,  mux_pllaout0_audio2_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(i2s3,       "tegra30-i2s.3",        NULL,   101,    0x3bc,  26000000,  mux_pllaout0_audio3_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(i2s4,       "tegra30-i2s.4",        NULL,   102,    0x3c0,  26000000,  mux_pllaout0_audio4_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(spdif_out,  "tegra30-spdif",        "spdif_out",    10,     0x108,  100000000, mux_pllaout0_audio5_2x_pllp_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(spdif_in,   "tegra30-spdif",        "spdif_in",     10,     0x10c,  100000000, mux_pllp_pllc_pllm,          MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(pwm,                "tegra-pwm",            NULL,   17,     0x110,  432000000, mux_pllp_pllc_clk32_clkm,    MUX | MUX_PWM | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(d_audio,    "tegra30-ahub",         "d_audio", 106, 0x3d0,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71);
+PERIPH_CLK(dam0,       "tegra30-dam.0",        NULL,   108,    0x3d8,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71);
+PERIPH_CLK(dam1,       "tegra30-dam.1",        NULL,   109,    0x3dc,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71);
+PERIPH_CLK(dam2,       "tegra30-dam.2",        NULL,   110,    0x3e0,  48000000,  mux_plla_pllc_pllp_clkm,     MUX | DIV_U71);
+PERIPH_CLK(hda,                "tegra30-hda",          "hda",  125,    0x428,  108000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(hda2codec_2x,       "tegra30-hda",  "hda2codec",    111,    0x3e4,  48000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(hda2hdmi,   "tegra30-hda",          "hda2hdmi",     128,    0,      48000000,  mux_clk_m,                   0);
+PERIPH_CLK(sbc1,       "spi_tegra.0",          NULL,   41,     0x134,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(sbc2,       "spi_tegra.1",          NULL,   44,     0x118,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(sbc3,       "spi_tegra.2",          NULL,   46,     0x11c,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(sbc4,       "spi_tegra.3",          NULL,   68,     0x1b4,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(sbc5,       "spi_tegra.4",          NULL,   104,    0x3c8,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(sbc6,       "spi_tegra.5",          NULL,   105,    0x3cc,  160000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(sata_oob,   "tegra_sata_oob",       NULL,   123,    0x420,  216000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(sata,       "tegra_sata",           NULL,   124,    0x424,  216000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(sata_cold,  "tegra_sata_cold",      NULL,   129,    0,      48000000,  mux_clk_m,                   0);
+PERIPH_CLK(ndflash,    "tegra_nand",           NULL,   13,     0x160,  240000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(ndspeed,    "tegra_nand_speed",     NULL,   80,     0x3f8,  240000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(vfir,       "vfir",                 NULL,   7,      0x168,  72000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(sdmmc1,     "sdhci-tegra.0",        NULL,   14,     0x150,  208000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(sdmmc2,     "sdhci-tegra.1",        NULL,   9,      0x154,  104000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(sdmmc3,     "sdhci-tegra.2",        NULL,   69,     0x1bc,  208000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(sdmmc4,     "sdhci-tegra.3",        NULL,   15,     0x164,  104000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* scales with voltage */
+PERIPH_CLK(vcp,                "tegra-avp",            "vcp",  29,     0,      250000000, mux_clk_m,                   0);
+PERIPH_CLK(bsea,       "tegra-avp",            "bsea", 62,     0,      250000000, mux_clk_m,                   0);
+PERIPH_CLK(bsev,       "tegra-aes",            "bsev", 63,     0,      250000000, mux_clk_m,                   0);
+PERIPH_CLK(vde,                "vde",                  NULL,   61,     0x1c8,  520000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_INT);
+PERIPH_CLK(csite,      "csite",                NULL,   73,     0x1d4,  144000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* max rate ??? */
+PERIPH_CLK(la,         "la",                   NULL,   76,     0x1f8,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71);
+PERIPH_CLK(owr,                "tegra_w1",             NULL,   71,     0x1cc,  26000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(nor,                "nor",                  NULL,   42,     0x1d0,  127000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(mipi,       "mipi",                 NULL,   50,     0x174,  60000000,  mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | PERIPH_ON_APB); /* scales with voltage */
+PERIPH_CLK(i2c1,       "tegra-i2c.0",          NULL,   12,     0x124,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
+PERIPH_CLK(i2c2,       "tegra-i2c.1",          NULL,   54,     0x198,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
+PERIPH_CLK(i2c3,       "tegra-i2c.2",          NULL,   67,     0x1b8,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
+PERIPH_CLK(i2c4,       "tegra-i2c.3",          NULL,   103,    0x3c4,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
+PERIPH_CLK(i2c5,       "tegra-i2c.4",          NULL,   47,     0x128,  26000000,  mux_pllp_clkm,               MUX | DIV_U16 | PERIPH_ON_APB);
+PERIPH_CLK(uarta,      "tegra-uart.0",         NULL,   6,      0x178,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
+PERIPH_CLK(uartb,      "tegra-uart.1",         NULL,   7,      0x17c,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
+PERIPH_CLK(uartc,      "tegra-uart.2",         NULL,   55,     0x1a0,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
+PERIPH_CLK(uartd,      "tegra-uart.3",         NULL,   65,     0x1c0,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
+PERIPH_CLK(uarte,      "tegra-uart.4",         NULL,   66,     0x1c4,  800000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_UART | PERIPH_ON_APB);
+PERIPH_CLK(vi,         "tegra_camera",         "vi",   20,     0x148,  425000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT);
+PERIPH_CLK(3d,         "3d",                   NULL,   24,     0x158,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE | PERIPH_MANUAL_RESET);
+PERIPH_CLK(3d2,                "3d2",                  NULL,   98,     0x3b0,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE | PERIPH_MANUAL_RESET);
+PERIPH_CLK(2d,         "2d",                   NULL,   21,     0x15c,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT | DIV_U71_IDLE);
+PERIPH_CLK(vi_sensor,  "tegra_camera",         "vi_sensor",    20,     0x1a8,  150000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | PERIPH_NO_RESET);
+PERIPH_CLK(epp,                "epp",                  NULL,   19,     0x16c,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT);
+PERIPH_CLK(mpe,                "mpe",                  NULL,   60,     0x170,  520000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT);
+PERIPH_CLK(host1x,     "host1x",               NULL,   28,     0x180,  260000000, mux_pllm_pllc_pllp_plla,     MUX | DIV_U71 | DIV_U71_INT);
+PERIPH_CLK(cve,                "cve",                  NULL,   49,     0x140,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(tvo,                "tvo",                  NULL,   49,     0x188,  250000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(dtv,                "dtv",                  NULL,   79,     0x1dc,  250000000, mux_clk_m,                   0);
+PERIPH_CLK(hdmi,       "hdmi",                 NULL,   51,     0x18c,  148500000, mux_pllp_pllm_plld_plla_pllc_plld2_clkm,     MUX | MUX8 | DIV_U71);
+PERIPH_CLK(tvdac,      "tvdac",                NULL,   53,     0x194,  220000000, mux_pllp_plld_pllc_clkm,     MUX | DIV_U71); /* requires min voltage */
+PERIPH_CLK(disp1,      "tegradc.0",            NULL,   27,     0x138,  600000000, mux_pllp_pllm_plld_plla_pllc_plld2_clkm,     MUX | MUX8);
+PERIPH_CLK(disp2,      "tegradc.1",            NULL,   26,     0x13c,  600000000, mux_pllp_pllm_plld_plla_pllc_plld2_clkm,     MUX | MUX8);
+PERIPH_CLK(usbd,       "fsl-tegra-udc",        NULL,   22,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
+PERIPH_CLK(usb2,       "tegra-ehci.1",         NULL,   58,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
+PERIPH_CLK(usb3,       "tegra-ehci.2",         NULL,   59,     0,      480000000, mux_clk_m,                   0); /* requires min voltage */
+PERIPH_CLK(dsia,       "tegradc.0",            "dsia", 48,     0,      500000000, mux_plld_out0,               0);
+PERIPH_CLK(csi,                "tegra_camera",         "csi",  52,     0,      102000000, mux_pllp_out3,               0);
+PERIPH_CLK(isp,                "tegra_camera",         "isp",  23,     0,      150000000, mux_clk_m,                   0); /* same frequency as VI */
+PERIPH_CLK(csus,       "tegra_camera",         "csus", 92,     0,      150000000, mux_clk_m,                   PERIPH_NO_RESET);
+PERIPH_CLK(tsensor,    "tegra-tsensor",        NULL,   100,    0x3b8,  216000000, mux_pllp_pllc_clkm_clk32,    MUX | DIV_U71);
+PERIPH_CLK(actmon,     "actmon",               NULL,   119,    0x3e8,  216000000, mux_pllp_pllc_clk32_clkm,    MUX | DIV_U71);
+PERIPH_CLK(extern1,    "extern1",              NULL,   120,    0x3ec,  216000000, mux_plla_clk32_pllp_clkm_plle,       MUX | MUX8 | DIV_U71);
+PERIPH_CLK(extern2,    "extern2",              NULL,   121,    0x3f0,  216000000, mux_plla_clk32_pllp_clkm_plle,       MUX | MUX8 | DIV_U71);
+PERIPH_CLK(extern3,    "extern3",              NULL,   122,    0x3f4,  216000000, mux_plla_clk32_pllp_clkm_plle,       MUX | MUX8 | DIV_U71);
+PERIPH_CLK(i2cslow,    "i2cslow",              NULL,   81,     0x3fc,  26000000,  mux_pllp_pllc_clk32_clkm,    MUX | DIV_U71 | PERIPH_ON_APB);
+PERIPH_CLK(pcie,       "tegra-pcie",           "pcie", 70,     0,      250000000, mux_clk_m,                   0);
+PERIPH_CLK(afi,                "tegra-pcie",           "afi",  72,     0,      250000000, mux_clk_m,                   0);
+PERIPH_CLK(se,         "se",                   NULL,   127,    0x42c,  520000000, mux_pllp_pllc_pllm_clkm,     MUX | DIV_U71 | DIV_U71_INT);
+
+static struct clk tegra_dsib;
+static struct clk_tegra tegra_dsib_hw = {
+       .hw = {
+               .clk = &tegra_dsib,
+       },
+       .lookup = {
+               .dev_id = "tegradc.1",
+               .con_id = "dsib",
+       },
+       .reg = 0xd0,
+       .flags = MUX | PLLD,
+       .max_rate = 500000000,
+       .u.periph = {
+               .clk_num = 82,
+       },
+       .reset = &tegra30_periph_clk_reset,
+};
+static struct clk tegra_dsib = {
+       .name = "dsib",
+       .ops = &tegra30_dsib_clk_ops,
+       .hw = &tegra_dsib_hw.hw,
+       .parent_names = mux_plld_out0_plld2_out0,
+       .parents = mux_plld_out0_plld2_out0_p,
+       .num_parents = ARRAY_SIZE(mux_plld_out0_plld2_out0),
+};
+
+struct clk *tegra_list_clks[] = {
+       &tegra_apbdma,
+       &tegra_rtc,
+       &tegra_kbc,
+       &tegra_kfuse,
+       &tegra_fuse,
+       &tegra_fuse_burn,
+       &tegra_apbif,
+       &tegra_i2s0,
+       &tegra_i2s1,
+       &tegra_i2s2,
+       &tegra_i2s3,
+       &tegra_i2s4,
+       &tegra_spdif_out,
+       &tegra_spdif_in,
+       &tegra_pwm,
+       &tegra_d_audio,
+       &tegra_dam0,
+       &tegra_dam1,
+       &tegra_dam2,
+       &tegra_hda,
+       &tegra_hda2codec_2x,
+       &tegra_hda2hdmi,
+       &tegra_sbc1,
+       &tegra_sbc2,
+       &tegra_sbc3,
+       &tegra_sbc4,
+       &tegra_sbc5,
+       &tegra_sbc6,
+       &tegra_sata_oob,
+       &tegra_sata,
+       &tegra_sata_cold,
+       &tegra_ndflash,
+       &tegra_ndspeed,
+       &tegra_vfir,
+       &tegra_sdmmc1,
+       &tegra_sdmmc2,
+       &tegra_sdmmc3,
+       &tegra_sdmmc4,
+       &tegra_vcp,
+       &tegra_bsea,
+       &tegra_bsev,
+       &tegra_vde,
+       &tegra_csite,
+       &tegra_la,
+       &tegra_owr,
+       &tegra_nor,
+       &tegra_mipi,
+       &tegra_i2c1,
+       &tegra_i2c2,
+       &tegra_i2c3,
+       &tegra_i2c4,
+       &tegra_i2c5,
+       &tegra_uarta,
+       &tegra_uartb,
+       &tegra_uartc,
+       &tegra_uartd,
+       &tegra_uarte,
+       &tegra_vi,
+       &tegra_3d,
+       &tegra_3d2,
+       &tegra_2d,
+       &tegra_vi_sensor,
+       &tegra_epp,
+       &tegra_mpe,
+       &tegra_host1x,
+       &tegra_cve,
+       &tegra_tvo,
+       &tegra_dtv,
+       &tegra_hdmi,
+       &tegra_tvdac,
+       &tegra_disp1,
+       &tegra_disp2,
+       &tegra_usbd,
+       &tegra_usb2,
+       &tegra_usb3,
+       &tegra_dsia,
+       &tegra_dsib,
+       &tegra_csi,
+       &tegra_isp,
+       &tegra_csus,
+       &tegra_tsensor,
+       &tegra_actmon,
+       &tegra_extern1,
+       &tegra_extern2,
+       &tegra_extern3,
+       &tegra_i2cslow,
+       &tegra_pcie,
+       &tegra_afi,
+       &tegra_se,
+};
+
+#define CLK_DUPLICATE(_name, _dev, _con)       \
+       {                                       \
+               .name   = _name,                \
+               .lookup = {                     \
+                       .dev_id = _dev,         \
+                       .con_id = _con,         \
+               },                              \
+       }
+
+/* Some clocks may be used by different drivers depending on the board
+ * configuration.  List those here to register them twice in the clock lookup
+ * table under two names.
+ */
+struct clk_duplicate tegra_clk_duplicates[] = {
+       CLK_DUPLICATE("uarta",  "serial8250.0", NULL),
+       CLK_DUPLICATE("uartb",  "serial8250.1", NULL),
+       CLK_DUPLICATE("uartc",  "serial8250.2", NULL),
+       CLK_DUPLICATE("uartd",  "serial8250.3", NULL),
+       CLK_DUPLICATE("uarte",  "serial8250.4", NULL),
+       CLK_DUPLICATE("usbd", "utmip-pad", NULL),
+       CLK_DUPLICATE("usbd", "tegra-ehci.0", NULL),
+       CLK_DUPLICATE("usbd", "tegra-otg", NULL),
+       CLK_DUPLICATE("hdmi", "tegradc.0", "hdmi"),
+       CLK_DUPLICATE("hdmi", "tegradc.1", "hdmi"),
+       CLK_DUPLICATE("dsib", "tegradc.0", "dsib"),
+       CLK_DUPLICATE("dsia", "tegradc.1", "dsia"),
+       CLK_DUPLICATE("bsev", "tegra-avp", "bsev"),
+       CLK_DUPLICATE("bsev", "nvavp", "bsev"),
+       CLK_DUPLICATE("vde", "tegra-aes", "vde"),
+       CLK_DUPLICATE("bsea", "tegra-aes", "bsea"),
+       CLK_DUPLICATE("bsea", "nvavp", "bsea"),
+       CLK_DUPLICATE("cml1", "tegra_sata_cml", NULL),
+       CLK_DUPLICATE("cml0", "tegra_pcie", "cml"),
+       CLK_DUPLICATE("pciex", "tegra_pcie", "pciex"),
+       CLK_DUPLICATE("i2c1", "tegra-i2c-slave.0", NULL),
+       CLK_DUPLICATE("i2c2", "tegra-i2c-slave.1", NULL),
+       CLK_DUPLICATE("i2c3", "tegra-i2c-slave.2", NULL),
+       CLK_DUPLICATE("i2c4", "tegra-i2c-slave.3", NULL),
+       CLK_DUPLICATE("i2c5", "tegra-i2c-slave.4", NULL),
+       CLK_DUPLICATE("sbc1", "spi_slave_tegra.0", NULL),
+       CLK_DUPLICATE("sbc2", "spi_slave_tegra.1", NULL),
+       CLK_DUPLICATE("sbc3", "spi_slave_tegra.2", NULL),
+       CLK_DUPLICATE("sbc4", "spi_slave_tegra.3", NULL),
+       CLK_DUPLICATE("sbc5", "spi_slave_tegra.4", NULL),
+       CLK_DUPLICATE("sbc6", "spi_slave_tegra.5", NULL),
+       CLK_DUPLICATE("twd", "smp_twd", NULL),
+       CLK_DUPLICATE("vcp", "nvavp", "vcp"),
+       CLK_DUPLICATE("i2s0", NULL, "i2s0"),
+       CLK_DUPLICATE("i2s1", NULL, "i2s1"),
+       CLK_DUPLICATE("i2s2", NULL, "i2s2"),
+       CLK_DUPLICATE("i2s3", NULL, "i2s3"),
+       CLK_DUPLICATE("i2s4", NULL, "i2s4"),
+       CLK_DUPLICATE("dam0", NULL, "dam0"),
+       CLK_DUPLICATE("dam1", NULL, "dam1"),
+       CLK_DUPLICATE("dam2", NULL, "dam2"),
+       CLK_DUPLICATE("spdif_in", NULL, "spdif_in"),
+};
+
+struct clk *tegra_ptr_clks[] = {
+       &tegra_clk_32k,
+       &tegra_clk_m,
+       &tegra_clk_m_div2,
+       &tegra_clk_m_div4,
+       &tegra_pll_ref,
+       &tegra_pll_m,
+       &tegra_pll_m_out1,
+       &tegra_pll_c,
+       &tegra_pll_c_out1,
+       &tegra_pll_p,
+       &tegra_pll_p_out1,
+       &tegra_pll_p_out2,
+       &tegra_pll_p_out3,
+       &tegra_pll_p_out4,
+       &tegra_pll_a,
+       &tegra_pll_a_out0,
+       &tegra_pll_d,
+       &tegra_pll_d_out0,
+       &tegra_pll_d2,
+       &tegra_pll_d2_out0,
+       &tegra_pll_u,
+       &tegra_pll_x,
+       &tegra_pll_x_out0,
+       &tegra_pll_e,
+       &tegra_clk_cclk_g,
+       &tegra_cml0,
+       &tegra_cml1,
+       &tegra_pciex,
+       &tegra_clk_sclk,
+       &tegra_clk_blink,
+       &tegra30_clk_twd,
+};
+
+static void tegra30_init_one_clock(struct clk *c)
+{
+       struct clk_tegra *clk = to_clk_tegra(c->hw);
+       __clk_init(NULL, c);
+       INIT_LIST_HEAD(&clk->shared_bus_list);
+       if (!clk->lookup.dev_id && !clk->lookup.con_id)
+               clk->lookup.con_id = c->name;
+       clk->lookup.clk = c;
+       clkdev_add(&clk->lookup);
+       tegra_clk_add(c);
+}
+
+void __init tegra30_init_clocks(void)
+{
+       int i;
+       struct clk *c;
+
+       for (i = 0; i < ARRAY_SIZE(tegra_ptr_clks); i++)
+               tegra30_init_one_clock(tegra_ptr_clks[i]);
+
+       for (i = 0; i < ARRAY_SIZE(tegra_list_clks); i++)
+               tegra30_init_one_clock(tegra_list_clks[i]);
+
+       for (i = 0; i < ARRAY_SIZE(tegra_clk_duplicates); i++) {
+               c = tegra_get_clock_by_name(tegra_clk_duplicates[i].name);
+               if (!c) {
+                       pr_err("%s: Unknown duplicate clock %s\n", __func__,
+                               tegra_clk_duplicates[i].name);
+                       continue;
+               }
+
+               tegra_clk_duplicates[i].lookup.clk = c;
+               clkdev_add(&tegra_clk_duplicates[i].lookup);
+       }
+
+       for (i = 0; i < ARRAY_SIZE(tegra_sync_source_list); i++)
+               tegra30_init_one_clock(tegra_sync_source_list[i]);
+       for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_list); i++)
+               tegra30_init_one_clock(tegra_clk_audio_list[i]);
+       for (i = 0; i < ARRAY_SIZE(tegra_clk_audio_2x_list); i++)
+               tegra30_init_one_clock(tegra_clk_audio_2x_list[i]);
+
+       for (i = 0; i < ARRAY_SIZE(tegra_clk_out_list); i++)
+               tegra30_init_one_clock(tegra_clk_out_list[i]);
+
+       tegra30_cpu_car_ops_init();
+}
diff --git a/arch/arm/mach-tegra/tegra_cpu_car.h b/arch/arm/mach-tegra/tegra_cpu_car.h
new file mode 100644 (file)
index 0000000..30d063a
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * 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_CPU_CAR_H
+#define __MACH_TEGRA_CPU_CAR_H
+
+/*
+ * Tegra CPU clock and reset control ops
+ *
+ * wait_for_reset:
+ *     keep waiting until the CPU in reset state
+ * put_in_reset:
+ *     put the CPU in reset state
+ * out_of_reset:
+ *     release the CPU from reset state
+ * enable_clock:
+ *     CPU clock un-gate
+ * disable_clock:
+ *     CPU clock gate
+ */
+struct tegra_cpu_car_ops {
+       void (*wait_for_reset)(u32 cpu);
+       void (*put_in_reset)(u32 cpu);
+       void (*out_of_reset)(u32 cpu);
+       void (*enable_clock)(u32 cpu);
+       void (*disable_clock)(u32 cpu);
+};
+
+extern struct tegra_cpu_car_ops *tegra_cpu_car_ops;
+
+static inline void tegra_wait_cpu_in_reset(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->wait_for_reset))
+               return;
+
+       tegra_cpu_car_ops->wait_for_reset(cpu);
+}
+
+static inline void tegra_put_cpu_in_reset(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->put_in_reset))
+               return;
+
+       tegra_cpu_car_ops->put_in_reset(cpu);
+}
+
+static inline void tegra_cpu_out_of_reset(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->out_of_reset))
+               return;
+
+       tegra_cpu_car_ops->out_of_reset(cpu);
+}
+
+static inline void tegra_enable_cpu_clock(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->enable_clock))
+               return;
+
+       tegra_cpu_car_ops->enable_clock(cpu);
+}
+
+static inline void tegra_disable_cpu_clock(u32 cpu)
+{
+       if (WARN_ON(!tegra_cpu_car_ops->disable_clock))
+               return;
+
+       tegra_cpu_car_ops->disable_clock(cpu);
+}
+
+void tegra20_cpu_car_ops_init(void);
+void tegra30_cpu_car_ops_init(void);
+
+#endif /* __MACH_TEGRA_CPU_CAR_H */
index 54d8f34..f7e12ed 100644 (file)
@@ -1,6 +1,6 @@
 if ARCH_U300
 
-menu "ST-Ericsson AB U300/U330/U335/U365 Platform"
+menu "ST-Ericsson AB U300/U335 Platform"
 
 comment "ST-Ericsson Mobile Platform Products"
 
@@ -10,46 +10,7 @@ config MACH_U300
        select PINCTRL_U300
        select PINCTRL_COH901
 
-comment "ST-Ericsson U300/U330/U335/U365 Feature Selections"
-
-choice
-       prompt "U300/U330/U335/U365 system type"
-       default MACH_U300_BS2X
-       ---help---
-       You need to select the target system, i.e. the
-       U300/U330/U335/U365 board that you want to compile your kernel
-       for.
-
-config MACH_U300_BS2X
-       bool "S26/S26/B25/B26 Test Products"
-       depends on MACH_U300
-       help
-               Select this if you're developing on the
-               S26/S25 test products. (Also works on
-               B26/B25 big boards.)
-
-config MACH_U300_BS330
-       bool "S330/B330 Test Products"
-       depends on MACH_U300
-       help
-               Select this if you're developing on the
-               S330/B330 test products.
-
-config MACH_U300_BS335
-       bool "S335/B335 Test Products"
-       depends on MACH_U300
-       help
-               Select this if you're developing on the
-               S335/B335 test products.
-
-config MACH_U300_BS365
-       bool "S365/B365 Test Products"
-       depends on MACH_U300
-       help
-               Select this if you're developing on the
-               S365/B365 test products.
-
-endchoice
+comment "ST-Ericsson U300/U335 Feature Selections"
 
 config U300_DEBUG
        bool "Debug support for U300"
index 7e47d37..5a86c58 100644 (file)
@@ -7,7 +7,6 @@ obj-m           :=
 obj-n          :=
 obj-           :=
 
-obj-$(CONFIG_ARCH_U300)                  += u300.o
 obj-$(CONFIG_SPI_PL022)           += spi.o
 obj-$(CONFIG_MACH_U300_SPIDUMMY)  += dummyspichip.o
 obj-$(CONFIG_I2C_STU300)          += i2c.o
index 03acf18..ef6f602 100644 (file)
@@ -3,7 +3,7 @@
  * arch/arm/mach-u300/core.c
  *
  *
- * Copyright (C) 2007-2010 ST-Ericsson SA
+ * Copyright (C) 2007-2012 ST-Ericsson SA
  * License terms: GNU General Public License (GPL) version 2
  * Core platform support, IRQ handling and device definitions.
  * Author: Linus Walleij <linus.walleij@stericsson.com>
 #include <linux/pinctrl/pinconf-generic.h>
 #include <linux/dma-mapping.h>
 #include <linux/platform_data/clk-u300.h>
+#include <linux/platform_data/pinctrl-coh901.h>
 
 #include <asm/types.h>
 #include <asm/setup.h>
 #include <asm/memory.h>
 #include <asm/hardware/vic.h>
 #include <asm/mach/map.h>
-#include <asm/mach/irq.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
 
 #include <mach/coh901318.h>
 #include <mach/hardware.h>
 #include <mach/syscon.h>
-#include <mach/dma_channels.h>
-#include <mach/gpio-u300.h>
+#include <mach/irqs.h>
 
+#include "timer.h"
 #include "spi.h"
 #include "i2c.h"
 #include "u300-gpio.h"
+#include "dma_channels.h"
 
 /*
  * Static I/O mappings that are needed for booting the U300 platforms. The
@@ -76,7 +79,7 @@ static struct map_desc u300_io_desc[] __initdata = {
        },
 };
 
-void __init u300_map_io(void)
+static void __init u300_map_io(void)
 {
        iotable_init(u300_io_desc, ARRAY_SIZE(u300_io_desc));
        /* We enable a real big DMA buffer if need be. */
@@ -101,7 +104,6 @@ static AMBA_APB_DEVICE(uart0, "uart0", 0, U300_UART0_BASE,
        { IRQ_U300_UART0 }, &uart0_plat_data);
 
 /* The U335 have an additional UART1 on the APP CPU */
-#ifdef CONFIG_MACH_U300_BS335
 static struct amba_pl011_data uart1_plat_data = {
 #ifdef CONFIG_COH901318
        .dma_filter = coh901318_filter_id,
@@ -113,7 +115,6 @@ static struct amba_pl011_data uart1_plat_data = {
 /* Fast device at 0x7000 offset */
 static AMBA_APB_DEVICE(uart1, "uart1", 0, U300_UART1_BASE,
        { IRQ_U300_UART1 }, &uart1_plat_data);
-#endif
 
 /* AHB device at 0x4000 offset */
 static AMBA_APB_DEVICE(pl172, "pl172", 0, U300_EMIF_CFG_BASE, { }, NULL);
@@ -152,9 +153,7 @@ static AMBA_APB_DEVICE(mmcsd, "mmci", 0, U300_MMCSD_BASE,
  */
 static struct amba_device *amba_devs[] __initdata = {
        &uart0_device,
-#ifdef CONFIG_MACH_U300_BS335
        &uart1_device,
-#endif
        &pl022_device,
        &pl172_device,
        &mmcsd_device,
@@ -188,7 +187,6 @@ static struct resource gpio_resources[] = {
                .end   = IRQ_U300_GPIO_PORT2,
                .flags = IORESOURCE_IRQ,
        },
-#if defined(CONFIG_MACH_U300_BS365) || defined(CONFIG_MACH_U300_BS335)
        {
                .name  = "gpio3",
                .start = IRQ_U300_GPIO_PORT3,
@@ -201,8 +199,6 @@ static struct resource gpio_resources[] = {
                .end   = IRQ_U300_GPIO_PORT4,
                .flags = IORESOURCE_IRQ,
        },
-#endif
-#ifdef CONFIG_MACH_U300_BS335
        {
                .name  = "gpio5",
                .start = IRQ_U300_GPIO_PORT5,
@@ -215,7 +211,6 @@ static struct resource gpio_resources[] = {
                .end   = IRQ_U300_GPIO_PORT6,
                .flags = IORESOURCE_IRQ,
        },
-#endif /* CONFIG_MACH_U300_BS335 */
 };
 
 static struct resource keypad_resources[] = {
@@ -323,7 +318,6 @@ static struct resource dma_resource[] = {
        }
 };
 
-#ifdef CONFIG_MACH_U300_BS335
 /* points out all dma slave channels.
  * Syntax is [A1, B1, A2, B2, .... ,-1,-1]
  * Select all channels from A to B, end of list is marked with -1,-1
@@ -336,14 +330,6 @@ static int dma_slave_channels[] = {
 static int dma_memcpy_channels[] = {
        U300_DMA_GENERAL_PURPOSE_0, U300_DMA_GENERAL_PURPOSE_8, -1, -1};
 
-#else /* CONFIG_MACH_U300_BS335 */
-
-static int dma_slave_channels[] = {U300_DMA_MSL_TX_0, U300_DMA_SPI_RX, -1, -1};
-static int dma_memcpy_channels[] = {
-       U300_DMA_GENERAL_PURPOSE_0, U300_DMA_GENERAL_PURPOSE_10, -1, -1};
-
-#endif
-
 /** register dma for memory access
  *
  * active  1 means dma intends to access memory
@@ -1395,7 +1381,6 @@ const struct coh_dma_channel chan_config[U300_DMA_CHANNELS] = {
                .param.ctrl_lli = flags_memcpy_lli,
                .param.ctrl_lli_last = flags_memcpy_lli_last,
        },
-#ifdef CONFIG_MACH_U300_BS335
        {
                .number = U300_DMA_UART1_TX,
                .name = "UART1 TX",
@@ -1406,28 +1391,6 @@ const struct coh_dma_channel chan_config[U300_DMA_CHANNELS] = {
                .name = "UART1 RX",
                .priority_high = 0,
        }
-#else
-       {
-               .number = U300_DMA_GENERAL_PURPOSE_9,
-               .name = "GENERAL 09",
-               .priority_high = 0,
-
-               .param.config = flags_memcpy_config,
-               .param.ctrl_lli_chained = flags_memcpy_lli_chained,
-               .param.ctrl_lli = flags_memcpy_lli,
-               .param.ctrl_lli_last = flags_memcpy_lli_last,
-       },
-       {
-               .number = U300_DMA_GENERAL_PURPOSE_10,
-               .name = "GENERAL 10",
-               .priority_high = 0,
-
-               .param.config = flags_memcpy_config,
-               .param.ctrl_lli_chained = flags_memcpy_lli_chained,
-               .param.ctrl_lli = flags_memcpy_lli,
-               .param.ctrl_lli_last = flags_memcpy_lli_last,
-       }
-#endif
 };
 
 
@@ -1480,18 +1443,7 @@ static struct platform_device pinctrl_device = {
  * GPIO block, with different number of ports.
  */
 static struct u300_gpio_platform u300_gpio_plat = {
-#if defined(CONFIG_MACH_U300_BS2X) || defined(CONFIG_MACH_U300_BS330)
-       .variant = U300_GPIO_COH901335,
-       .ports = 3,
-#endif
-#ifdef CONFIG_MACH_U300_BS335
-       .variant = U300_GPIO_COH901571_3_BS335,
        .ports = 7,
-#endif
-#ifdef CONFIG_MACH_U300_BS365
-       .variant = U300_GPIO_COH901571_3_BS365,
-       .ports = 5,
-#endif
        .gpio_base = 0,
        .gpio_irq_base = IRQ_U300_GPIO_BASE,
        .pinctrl_device = &pinctrl_device,
@@ -1651,7 +1603,7 @@ static struct platform_device *platform_devs[] __initdata = {
  * together so some interrupts are connected to the first one and some
  * to the second one.
  */
-void __init u300_init_irq(void)
+static void __init u300_init_irq(void)
 {
        u32 mask[2] = {0, 0};
        struct clk *clk;
@@ -1756,29 +1708,11 @@ static void __init u300_init_check_chip(void)
        printk(KERN_INFO "Initializing U300 system on %s baseband chip " \
               "(chip ID 0x%04x)\n", chipname, val);
 
-#ifdef CONFIG_MACH_U300_BS330
-       if ((val & 0xFF00U) != 0xd800) {
-               printk(KERN_ERR "Platform configured for BS330 " \
-                      "with DB3200 but %s detected, expect problems!",
-                      chipname);
-       }
-#endif
-#ifdef CONFIG_MACH_U300_BS335
        if ((val & 0xFF00U) != 0xf000 && (val & 0xFF00U) != 0xf100) {
                printk(KERN_ERR "Platform configured for BS335 " \
                       " with DB3350 but %s detected, expect problems!",
                       chipname);
        }
-#endif
-#ifdef CONFIG_MACH_U300_BS365
-       if ((val & 0xFF00U) != 0xe800) {
-               printk(KERN_ERR "Platform configured for BS365 " \
-                      "with DB3210 but %s detected, expect problems!",
-                      chipname);
-       }
-#endif
-
-
 }
 
 /*
@@ -1811,7 +1745,7 @@ static void __init u300_assign_physmem(void)
        }
 }
 
-void __init u300_init_devices(void)
+static void __init u300_init_machine(void)
 {
        int i;
        u16 val;
@@ -1852,7 +1786,7 @@ void __init u300_init_devices(void)
 /* Forward declare this function from the watchdog */
 void coh901327_watchdog_reset(void);
 
-void u300_restart(char mode, const char *cmd)
+static void u300_restart(char mode, const char *cmd)
 {
        switch (mode) {
        case 's':
@@ -1868,3 +1802,15 @@ void u300_restart(char mode, const char *cmd)
        /* Wait for system do die/reset. */
        while (1);
 }
+
+MACHINE_START(U300, "Ericsson AB U335 S335/B335 Prototype Board")
+       /* Maintainer: Linus Walleij <linus.walleij@stericsson.com> */
+       .atag_offset    = 0x100,
+       .map_io         = u300_map_io,
+       .nr_irqs        = NR_IRQS_U300,
+       .init_irq       = u300_init_irq,
+       .handle_irq     = vic_handle_irq,
+       .timer          = &u300_timer,
+       .init_machine   = u300_init_machine,
+       .restart        = u300_restart,
+MACHINE_END
similarity index 88%
rename from arch/arm/mach-u300/include/mach/dma_channels.h
rename to arch/arm/mach-u300/dma_channels.h
index b239149..4e8a88f 100644 (file)
@@ -3,7 +3,7 @@
  * arch/arm/mach-u300/include/mach/dma_channels.h
  *
  *
- * Copyright (C) 2007-2009 ST-Ericsson
+ * Copyright (C) 2007-2012 ST-Ericsson
  * License terms: GNU General Public License (GPL) version 2
  * Map file for the U300 dma driver.
  * Author: Per Friden <per.friden@stericsson.com>
 #define U300_DMA_GENERAL_PURPOSE_6    35
 #define U300_DMA_GENERAL_PURPOSE_7    36
 #define U300_DMA_GENERAL_PURPOSE_8    37
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_DMA_UART1_TX             38
 #define U300_DMA_UART1_RX             39
-#else
-#define U300_DMA_GENERAL_PURPOSE_9    38
-#define U300_DMA_GENERAL_PURPOSE_10   39
-#endif
 
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_DMA_DEVICE_CHANNELS      32
-#else
-#define U300_DMA_DEVICE_CHANNELS      30
-#endif
 #define U300_DMA_CHANNELS             40
 
 
index cb04bd6..0d4620e 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * arch/arm/mach-u300/i2c.c
  *
- * Copyright (C) 2009 ST-Ericsson AB
+ * Copyright (C) 2009-2012 ST-Ericsson AB
  * License terms: GNU General Public License (GPL) version 2
  *
  * Register board i2c devices
@@ -261,7 +261,6 @@ static struct i2c_board_info __initdata bus0_i2c_board_info[] = {
 };
 
 static struct i2c_board_info __initdata bus1_i2c_board_info[] = {
-#ifdef CONFIG_MACH_U300_BS335
        {
                .type = "fwcam",
                .addr = 0x10,
@@ -270,9 +269,6 @@ static struct i2c_board_info __initdata bus1_i2c_board_info[] = {
                .type = "fwcam",
                .addr = 0x5d,
        },
-#else
-       { },
-#endif
 };
 
 void __init u300_i2c_register_board_devices(void)
diff --git a/arch/arm/mach-u300/include/mach/clkdev.h b/arch/arm/mach-u300/include/mach/clkdev.h
deleted file mode 100644 (file)
index 92e3cc8..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef __MACH_CLKDEV_H
-#define __MACH_CLKDEV_H
-
-int __clk_get(struct clk *clk);
-void __clk_put(struct clk *clk);
-
-#endif
index ec09c1e..e27425a 100644 (file)
@@ -3,7 +3,7 @@
  * arch/arm/mach-u300/include/mach/irqs.h
  *
  *
- * Copyright (C) 2006-2009 ST-Ericsson AB
+ * Copyright (C) 2006-2012 ST-Ericsson AB
  * License terms: GNU General Public License (GPL) version 2
  * IRQ channel definitions for the U300 platforms.
  * Author: Linus Walleij <linus.walleij@stericsson.com>
 #define IRQ_U300_XGAM_GAMCON           14
 #define IRQ_U300_XGAM_CDI              15
 #define IRQ_U300_XGAM_CDICON           16
-#if defined(CONFIG_MACH_U300_BS2X) || defined(CONFIG_MACH_U300_BS330)
-/* MMIACC not used on the DB3210 or DB3350 chips */
-#define IRQ_U300_XGAM_MMIACC           17
-#endif
 #define IRQ_U300_XGAM_PDI              18
 #define IRQ_U300_XGAM_PDICON           19
 #define IRQ_U300_XGAM_GAMEACC          20
@@ -55,8 +51,6 @@
 #define IRQ_U300_GPIO_PORT1            34
 #define IRQ_U300_GPIO_PORT2            35
 
-#if defined(CONFIG_MACH_U300_BS2X) || defined(CONFIG_MACH_U300_BS330) || \
-    defined(CONFIG_MACH_U300_BS335)
 /* These are for DB3150, DB3200 and DB3350 */
 #define IRQ_U300_WDOG                  36
 #define IRQ_U300_EVHIST                        37
 #define IRQ_U300_RTC                   43
 #define IRQ_U300_NFIF                  44
 #define IRQ_U300_NFIF2                 45
-#endif
-
-/* DB3150 and DB3200 have only 45 IRQs */
-#if defined(CONFIG_MACH_U300_BS2X) || defined(CONFIG_MACH_U300_BS330)
-#define U300_VIC_IRQS_END              46
-#endif
 
 /* The DB3350-specific interrupt lines */
-#ifdef CONFIG_MACH_U300_BS335
 #define IRQ_U300_ISP_F0                        46
 #define IRQ_U300_ISP_F1                        47
 #define IRQ_U300_ISP_F2                        48
 #define IRQ_U300_GPIO_PORT5            55
 #define IRQ_U300_GPIO_PORT6            56
 #define U300_VIC_IRQS_END              57
-#endif
-
-/* The DB3210-specific interrupt lines */
-#ifdef CONFIG_MACH_U300_BS365
-#define IRQ_U300_GPIO_PORT3            36
-#define IRQ_U300_GPIO_PORT4            37
-#define IRQ_U300_WDOG                  38
-#define IRQ_U300_EVHIST                        39
-#define IRQ_U300_MSPRO                 40
-#define IRQ_U300_MMCSD_MCIINTR0                41
-#define IRQ_U300_MMCSD_MCIINTR1                42
-#define IRQ_U300_I2C0                  43
-#define IRQ_U300_I2C1                  44
-#define IRQ_U300_RTC                   45
-#define IRQ_U300_NFIF                  46
-#define IRQ_U300_NFIF2                 47
-#define IRQ_U300_SYSCON_PLL_LOCK       48
-#define U300_VIC_IRQS_END              49
-#endif
 
 /* Maximum 8*7 GPIO lines */
 #ifdef CONFIG_PINCTRL_COH901
 #define IRQ_U300_GPIO_END              (U300_VIC_IRQS_END)
 #endif
 
-#define NR_IRQS                                (IRQ_U300_GPIO_END - IRQ_U300_INTCON0_START)
+#define NR_IRQS_U300                   (IRQ_U300_GPIO_END - IRQ_U300_INTCON0_START)
 
 #endif
diff --git a/arch/arm/mach-u300/include/mach/platform.h b/arch/arm/mach-u300/include/mach/platform.h
deleted file mode 100644 (file)
index 096333f..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *
- * arch/arm/mach-u300/include/mach/platform.h
- *
- *
- * Copyright (C) 2006-2009 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- * Basic platform init and mapping functions.
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-
-#ifndef __ASSEMBLY__
-
-void u300_map_io(void);
-void u300_init_irq(void);
-void u300_init_devices(void);
-void u300_restart(char, const char *);
-extern struct sys_timer u300_timer;
-
-#endif
index 6e84f07..10bdd0b 100644 (file)
@@ -3,7 +3,7 @@
  * arch/arm/mach-u300/include/mach/syscon.h
  *
  *
- * Copyright (C) 2008 ST-Ericsson AB
+ * Copyright (C) 2008-2012 ST-Ericsson AB
  *
  * Author: Rickard Andersson <rickard.andersson@stericsson.com>
  */
@@ -36,9 +36,7 @@
 #define U300_SYSCON_CSR_PLL13_LOCK_IND                         (0x0001)
 /* Reset lines for SLOW devices 16bit (R/W) */
 #define U300_SYSCON_RSR                                                (0x0014)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_RSR_PPM_RESET_EN                           (0x0200)
-#endif
 #define U300_SYSCON_RSR_ACC_TMR_RESET_EN                       (0x0100)
 #define U300_SYSCON_RSR_APP_TMR_RESET_EN                       (0x0080)
 #define U300_SYSCON_RSR_RTC_RESET_EN                           (0x0040)
@@ -50,9 +48,7 @@
 #define U300_SYSCON_RSR_SLOW_BRIDGE_RESET_EN                   (0x0001)
 /* Reset lines for FAST devices 16bit (R/W) */
 #define U300_SYSCON_RFR                                                (0x0018)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_RFR_UART1_RESET_ENABLE                     (0x0080)
-#endif
 #define U300_SYSCON_RFR_SPI_RESET_ENABLE                       (0x0040)
 #define U300_SYSCON_RFR_MMC_RESET_ENABLE                       (0x0020)
 #define U300_SYSCON_RFR_PCM_I2S1_RESET_ENABLE                  (0x0010)
 #define U300_SYSCON_RFR_FAST_BRIDGE_RESET_ENABLE               (0x0001)
 /* Reset lines for the rest of the peripherals 16bit (R/W) */
 #define U300_SYSCON_RRR                                                (0x001c)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_RRR_CDS_RESET_EN                           (0x4000)
 #define U300_SYSCON_RRR_ISP_RESET_EN                           (0x2000)
-#endif
 #define U300_SYSCON_RRR_INTCON_RESET_EN                                (0x1000)
 #define U300_SYSCON_RRR_MSPRO_RESET_EN                         (0x0800)
 #define U300_SYSCON_RRR_XGAM_RESET_EN                          (0x0100)
@@ -79,9 +73,7 @@
 #define U300_SYSCON_RRR_AAIF_RESET_EN                          (0x0001)
 /* Clock enable for SLOW peripherals 16bit (R/W) */
 #define U300_SYSCON_CESR                                       (0x0020)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_CESR_PPM_CLK_EN                            (0x0200)
-#endif
 #define U300_SYSCON_CESR_ACC_TMR_CLK_EN                                (0x0100)
 #define U300_SYSCON_CESR_APP_TMR_CLK_EN                                (0x0080)
 #define U300_SYSCON_CESR_KEYPAD_CLK_EN                         (0x0040)
 #define U300_SYSCON_CESR_SLOW_BRIDGE_CLK_EN                    (0x0001)
 /* Clock enable for FAST peripherals 16bit (R/W) */
 #define U300_SYSCON_CEFR                                       (0x0024)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_CEFR_UART1_CLK_EN                          (0x0200)
-#endif
 #define U300_SYSCON_CEFR_I2S1_CORE_CLK_EN                      (0x0100)
 #define U300_SYSCON_CEFR_I2S0_CORE_CLK_EN                      (0x0080)
 #define U300_SYSCON_CEFR_SPI_CLK_EN                            (0x0040)
 #define U300_SYSCON_CEFR_MMC_CLK_EN                            (0x0020)
-#define U300_SYSCON_CEFR_I2S1_CLK_EN                           (0x0010)
-#define U300_SYSCON_CEFR_I2S0_CLK_EN                           (0x0008)
-#define U300_SYSCON_CEFR_I2C1_CLK_EN                           (0x0004)
-#define U300_SYSCON_CEFR_I2C0_CLK_EN                           (0x0002)
+#define U300_SYSCON_CEFR_I2S1_CLK_EN                           (0x0010)
+#define U300_SYSCON_CEFR_I2S0_CLK_EN                           (0x0008)
+#define U300_SYSCON_CEFR_I2C1_CLK_EN                           (0x0004)
+#define U300_SYSCON_CEFR_I2C0_CLK_EN                           (0x0002)
 #define U300_SYSCON_CEFR_FAST_BRIDGE_CLK_EN                    (0x0001)
 /* Clock enable for the rest of the peripherals 16bit (R/W) */
 #define U300_SYSCON_CERR                                       (0x0028)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_CERR_CDS_CLK_EN                            (0x2000)
 #define U300_SYSCON_CERR_ISP_CLK_EN                            (0x1000)
-#endif
 #define U300_SYSCON_CERR_MSPRO_CLK_EN                          (0x0800)
 #define U300_SYSCON_CERR_AHB_SUBSYS_BRIDGE_CLK_EN              (0x0400)
 #define U300_SYSCON_CERR_SEMI_CLK_EN                           (0x0200)
 #define U300_SYSCON_CERR_AAIF_CLK_EN                           (0x0001)
 /* Single block clock enable 16bit (-/W) */
 #define U300_SYSCON_SBCER                                      (0x002c)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_SBCER_PPM_CLK_EN                           (0x0009)
-#endif
 #define U300_SYSCON_SBCER_ACC_TMR_CLK_EN                       (0x0008)
 #define U300_SYSCON_SBCER_APP_TMR_CLK_EN                       (0x0007)
 #define U300_SYSCON_SBCER_KEYPAD_CLK_EN                                (0x0006)
 #define U300_SYSCON_SBCER_BTR_CLK_EN                           (0x0002)
 #define U300_SYSCON_SBCER_UART_CLK_EN                          (0x0001)
 #define U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN                   (0x0000)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_SBCER_UART1_CLK_EN                         (0x0019)
-#endif
 #define U300_SYSCON_SBCER_I2S1_CORE_CLK_EN                     (0x0018)
 #define U300_SYSCON_SBCER_I2S0_CORE_CLK_EN                     (0x0017)
 #define U300_SYSCON_SBCER_SPI_CLK_EN                           (0x0016)
 #define U300_SYSCON_SBCER_I2C1_CLK_EN                          (0x0012)
 #define U300_SYSCON_SBCER_I2C0_CLK_EN                          (0x0011)
 #define U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN                   (0x0010)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_SBCER_CDS_CLK_EN                           (0x002D)
 #define U300_SYSCON_SBCER_ISP_CLK_EN                           (0x002C)
-#endif
 #define U300_SYSCON_SBCER_MSPRO_CLK_EN                         (0x002B)
 #define U300_SYSCON_SBCER_AHB_SUBSYS_BRIDGE_CLK_EN             (0x002A)
 #define U300_SYSCON_SBCER_SEMI_CLK_EN                          (0x0029)
 /* Same values as above for SBCER */
 /* Clock force SLOW peripherals 16bit (R/W) */
 #define U300_SYSCON_CFSR                                       (0x003c)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_CFSR_PPM_CLK_FORCE_EN                      (0x0200)
-#endif
 #define U300_SYSCON_CFSR_ACC_TMR_CLK_FORCE_EN                  (0x0100)
 #define U300_SYSCON_CFSR_APP_TMR_CLK_FORCE_EN                  (0x0080)
 #define U300_SYSCON_CFSR_KEYPAD_CLK_FORCE_EN                   (0x0020)
 /* Values not defined. Define if you want to use them. */
 /* Clock force the rest of the peripherals 16bit (R/W) */
 #define U300_SYSCON_CFRR                                       (0x44)
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SYSCON_CFRR_CDS_CLK_FORCE_EN                      (0x2000)
 #define U300_SYSCON_CFRR_ISP_CLK_FORCE_EN                      (0x1000)
-#endif
 #define U300_SYSCON_CFRR_MSPRO_CLK_FORCE_EN                    (0x0800)
 #define U300_SYSCON_CFRR_AHB_SUBSYS_BRIDGE_CLK_FORCE_EN                (0x0400)
 #define U300_SYSCON_CFRR_SEMI_CLK_FORCE_EN                     (0x0200)
index 65f87c5..1e49d90 100644 (file)
@@ -28,7 +28,6 @@
 #define PLAT_NAND_CLE                  (1 << 16)
 #define PLAT_NAND_ALE                  (1 << 17)
 
-
 /* AHB Peripherals */
 #define U300_AHB_PER_PHYS_BASE         0xa0000000
 #define U300_AHB_PER_VIRT_BASE         0xff010000
 #define U300_BOOTROM_VIRT_BASE         0xffff0000
 
 /* SEMI config base */
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_SEMI_CONFIG_BASE          0x2FFE0000
-#else
-#define U300_SEMI_CONFIG_BASE          0x30000000
-#endif
 
 /*
  * AHB peripherals
 /* SPI controller */
 #define U300_SPI_BASE                  (U300_FAST_PER_PHYS_BASE+0x6000)
 
-#ifdef CONFIG_MACH_U300_BS335
 /* Fast UART1 on U335 only */
 #define U300_UART1_BASE                        (U300_SLOW_PER_PHYS_BASE+0x7000)
-#endif
 
 /*
  * SLOW peripherals
  * REST peripherals
  */
 
-/* ISP (image signal processor) is only available in U335 */
-#ifdef CONFIG_MACH_U300_BS335
+/* ISP (image signal processor) */
 #define U300_ISP_BASE                  (0xA0008000)
-#endif
 
 /* DMA Controller base */
 #define U300_DMAC_BASE                 (0xC0020000)
 #define U300_APEX_BASE                 (0xc0030000)
 
 /* Video Encoder Base */
-#ifdef CONFIG_MACH_U300_BS335
 #define U300_VIDEOENC_BASE             (0xc0080000)
-#else
-#define U300_VIDEOENC_BASE             (0xc0040000)
-#endif
 
 /* XGAM Base */
 #define U300_XGAM_BASE                 (0xd0000000)
 
-/*
- * Virtual accessor macros for static devices
- */
-
 #endif
index a1affac..02e6659 100644 (file)
@@ -12,7 +12,7 @@
 #include <linux/amba/pl022.h>
 #include <linux/err.h>
 #include <mach/coh901318.h>
-#include <mach/dma_channels.h>
+#include "dma_channels.h"
 
 /*
  * The following is for the actual devices on the SSP/SPI bus
index 56ac06d..1da10e2 100644 (file)
 #include <linux/io.h>
 #include <linux/clk.h>
 #include <linux/err.h>
+#include <linux/irq.h>
 
 #include <mach/hardware.h>
+#include <mach/irqs.h>
 
 /* Generic stuff */
 #include <asm/sched_clock.h>
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
-#include <asm/mach/irq.h>
+
+#include "timer.h"
 
 /*
  * APP side special timer registers
diff --git a/arch/arm/mach-u300/timer.h b/arch/arm/mach-u300/timer.h
new file mode 100644 (file)
index 0000000..b5e9791
--- /dev/null
@@ -0,0 +1 @@
+extern struct sys_timer u300_timer;
index 847dc25..83f5077 100644 (file)
@@ -1,50 +1,11 @@
 /*
- * Individual pin assignments for the B26/S26. Notice that the
- * actual usage of these pins depends on the PAD MUX settings, that
- * is why the same number can potentially appear several times.
- * In the reference design each pin is only used for one purpose.
- * These were determined by inspecting the B26/S26 schematic:
- * 2/1911-ROA 128 1603
- */
-#ifdef CONFIG_MACH_U300_BS2X
-#define U300_GPIO_PIN_UART_RX          0
-#define U300_GPIO_PIN_UART_TX          1
-#define U300_GPIO_PIN_GPIO02           2  /* Unrouted */
-#define U300_GPIO_PIN_GPIO03           3  /* Unrouted */
-#define U300_GPIO_PIN_CAM_SLEEP                4
-#define U300_GPIO_PIN_CAM_REG_EN       5
-#define U300_GPIO_PIN_GPIO06           6  /* Unrouted */
-#define U300_GPIO_PIN_GPIO07           7  /* Unrouted */
-
-#define U300_GPIO_PIN_GPIO08           8  /* Service point SP2321 */
-#define U300_GPIO_PIN_GPIO09           9  /* Service point SP2322 */
-#define U300_GPIO_PIN_PHFSENSE         10 /* Headphone jack sensing */
-#define U300_GPIO_PIN_MMC_CLKRET       11 /* Clock return from MMC/SD card */
-#define U300_GPIO_PIN_MMC_CD           12 /* MMC Card insertion detection */
-#define U300_GPIO_PIN_FLIPSENSE                13 /* Mechanical flip sensing */
-#define U300_GPIO_PIN_GPIO14           14 /* DSP JTAG Port RTCK */
-#define U300_GPIO_PIN_GPIO15           15 /* Unrouted */
-
-#define U300_GPIO_PIN_GPIO16           16 /* Unrouted */
-#define U300_GPIO_PIN_GPIO17           17 /* Unrouted */
-#define U300_GPIO_PIN_GPIO18           18 /* Unrouted */
-#define U300_GPIO_PIN_GPIO19           19 /* Unrouted */
-#define U300_GPIO_PIN_GPIO20           20 /* Unrouted */
-#define U300_GPIO_PIN_GPIO21           21 /* Unrouted */
-#define U300_GPIO_PIN_GPIO22           22 /* Unrouted */
-#define U300_GPIO_PIN_GPIO23           23 /* Unrouted */
-#endif
-
-/*
- * Individual pin assignments for the B330/S330 and B365/S365.
+ * Individual pin assignments for the B335/S335.
  * Notice that the actual usage of these pins depends on the
  * PAD MUX settings, that is why the same number can potentially
  * appear several times. In the reference design each pin is only
  * used for one purpose. These were determined by inspecting the
  * S365 schematic.
  */
-#if defined(CONFIG_MACH_U300_BS330) || defined(CONFIG_MACH_U300_BS365) || \
-    defined(CONFIG_MACH_U300_BS335)
 #define U300_GPIO_PIN_UART_RX          0
 #define U300_GPIO_PIN_UART_TX          1
 #define U300_GPIO_PIN_UART_CTS         2
@@ -90,8 +51,6 @@
 #define U300_GPIO_PIN_GPIO38           38 /* Unrouted */
 #define U300_GPIO_PIN_GPIO39           39 /* Unrouted */
 
-#ifdef CONFIG_MACH_U300_BS335
-
 #define U300_GPIO_PIN_GPIO40           40 /* Unrouted */
 #define U300_GPIO_PIN_GPIO41           41 /* Unrouted */
 #define U300_GPIO_PIN_GPIO42           42 /* Unrouted */
 #define U300_GPIO_PIN_GPIO53           53 /* Unrouted */
 #define U300_GPIO_PIN_GPIO54           54 /* Unrouted */
 #define U300_GPIO_PIN_GPIO55           55 /* Unrouted */
-#endif
-
-#endif
diff --git a/arch/arm/mach-u300/u300.c b/arch/arm/mach-u300/u300.c
deleted file mode 100644 (file)
index f30c69d..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *
- * arch/arm/mach-u300/u300.c
- *
- *
- * Copyright (C) 2006-2009 ST-Ericsson AB
- * License terms: GNU General Public License (GPL) version 2
- * Platform machine definition.
- * Author: Linus Walleij <linus.walleij@stericsson.com>
- */
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/mm.h>
-#include <linux/sched.h>
-#include <linux/interrupt.h>
-#include <linux/ioport.h>
-#include <linux/memblock.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <mach/hardware.h>
-#include <mach/platform.h>
-#include <asm/hardware/vic.h>
-#include <asm/mach-types.h>
-#include <asm/mach/arch.h>
-#include <asm/memory.h>
-
-static void __init u300_init_machine(void)
-{
-       u300_init_devices();
-}
-
-#ifdef CONFIG_MACH_U300_BS2X
-#define MACH_U300_STRING "Ericsson AB U300 S25/S26/B25/B26 Prototype Board"
-#endif
-
-#ifdef CONFIG_MACH_U300_BS330
-#define MACH_U300_STRING "Ericsson AB U330 S330/B330 Prototype Board"
-#endif
-
-#ifdef CONFIG_MACH_U300_BS335
-#define MACH_U300_STRING "Ericsson AB U335 S335/B335 Prototype Board"
-#endif
-
-#ifdef CONFIG_MACH_U300_BS365
-#define MACH_U300_STRING "Ericsson AB U365 S365/B365 Prototype Board"
-#endif
-
-MACHINE_START(U300, MACH_U300_STRING)
-       /* Maintainer: Linus Walleij <linus.walleij@stericsson.com> */
-       .atag_offset    = 0x100,
-       .map_io         = u300_map_io,
-       .init_irq       = u300_init_irq,
-       .handle_irq     = vic_handle_irq,
-       .timer          = &u300_timer,
-       .init_machine   = u300_init_machine,
-       .restart        = u300_restart,
-MACHINE_END
index 53d3d46..a258996 100644 (file)
@@ -11,6 +11,7 @@ config UX500_SOC_COMMON
        select CACHE_L2X0
        select PINCTRL
        select PINCTRL_NOMADIK
+       select COMMON_CLK
 
 config UX500_SOC_DB8500
        bool
index 026086f..5691ef6 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for the linux kernel, U8500 machine.
 #
 
-obj-y                          := clock.o cpu.o devices.o devices-common.o \
+obj-y                          := cpu.o devices.o devices-common.o \
                                   id.o usb.o timer.o
 obj-$(CONFIG_CPU_IDLE)          += cpuidle.o
 obj-$(CONFIG_CACHE_L2X0)       += cache-l2x0.o
index a534d88..1d2e3c6 100644 (file)
@@ -524,33 +524,12 @@ static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
 };
 #endif
 
-#define PRCC_K_SOFTRST_SET      0x18
-#define PRCC_K_SOFTRST_CLEAR    0x1C
-static void ux500_uart0_reset(void)
-{
-       void __iomem *prcc_rst_set, *prcc_rst_clr;
-
-       prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
-                       PRCC_K_SOFTRST_SET);
-       prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
-                       PRCC_K_SOFTRST_CLEAR);
-
-       /* Activate soft reset PRCC_K_SOFTRST_CLEAR */
-       writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr);
-       udelay(1);
-
-       /* Release soft reset PRCC_K_SOFTRST_SET */
-       writel((readl(prcc_rst_set) | 0x1), prcc_rst_set);
-       udelay(1);
-}
-
 static struct amba_pl011_data uart0_plat = {
 #ifdef CONFIG_STE_DMA40
        .dma_filter = stedma40_filter,
        .dma_rx_param = &uart0_dma_cfg_rx,
        .dma_tx_param = &uart0_dma_cfg_tx,
 #endif
-       .reset = ux500_uart0_reset,
 };
 
 static struct amba_pl011_data uart1_plat = {
index dc12394..75d5b51 100644 (file)
@@ -38,7 +38,7 @@ static int __init ux500_l2x0_init(void)
 {
        u32 aux_val = 0x3e000000;
 
-       if (cpu_is_u8500_family())
+       if (cpu_is_u8500_family() || cpu_is_ux540_family())
                l2x0_base = __io_address(U8500_L2CC_BASE);
        else
                ux500_unknown_soc();
diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c
deleted file mode 100644 (file)
index 8d73b06..0000000
+++ /dev/null
@@ -1,715 +0,0 @@
-/*
- *  Copyright (C) 2009 ST-Ericsson
- *  Copyright (C) 2009 STMicroelectronics
- *
- * 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/module.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/errno.h>
-#include <linux/err.h>
-#include <linux/clk.h>
-#include <linux/io.h>
-#include <linux/clkdev.h>
-#include <linux/cpufreq.h>
-
-#include <plat/mtu.h>
-#include <mach/hardware.h>
-#include "clock.h"
-
-#ifdef CONFIG_DEBUG_FS
-#include <linux/debugfs.h>
-#include <linux/uaccess.h>     /* for copy_from_user */
-static LIST_HEAD(clk_list);
-#endif
-
-#define PRCC_PCKEN             0x00
-#define PRCC_PCKDIS            0x04
-#define PRCC_KCKEN             0x08
-#define PRCC_KCKDIS            0x0C
-
-#define PRCM_YYCLKEN0_MGT_SET  0x510
-#define PRCM_YYCLKEN1_MGT_SET  0x514
-#define PRCM_YYCLKEN0_MGT_CLR  0x518
-#define PRCM_YYCLKEN1_MGT_CLR  0x51C
-#define PRCM_YYCLKEN0_MGT_VAL  0x520
-#define PRCM_YYCLKEN1_MGT_VAL  0x524
-
-#define PRCM_SVAMMDSPCLK_MGT   0x008
-#define PRCM_SIAMMDSPCLK_MGT   0x00C
-#define PRCM_SGACLK_MGT                0x014
-#define PRCM_UARTCLK_MGT       0x018
-#define PRCM_MSP02CLK_MGT      0x01C
-#define PRCM_MSP1CLK_MGT       0x288
-#define PRCM_I2CCLK_MGT                0x020
-#define PRCM_SDMMCCLK_MGT      0x024
-#define PRCM_SLIMCLK_MGT       0x028
-#define PRCM_PER1CLK_MGT       0x02C
-#define PRCM_PER2CLK_MGT       0x030
-#define PRCM_PER3CLK_MGT       0x034
-#define PRCM_PER5CLK_MGT       0x038
-#define PRCM_PER6CLK_MGT       0x03C
-#define PRCM_PER7CLK_MGT       0x040
-#define PRCM_LCDCLK_MGT                0x044
-#define PRCM_BMLCLK_MGT                0x04C
-#define PRCM_HSITXCLK_MGT      0x050
-#define PRCM_HSIRXCLK_MGT      0x054
-#define PRCM_HDMICLK_MGT       0x058
-#define PRCM_APEATCLK_MGT      0x05C
-#define PRCM_APETRACECLK_MGT   0x060
-#define PRCM_MCDECLK_MGT       0x064
-#define PRCM_IPI2CCLK_MGT      0x068
-#define PRCM_DSIALTCLK_MGT     0x06C
-#define PRCM_DMACLK_MGT                0x074
-#define PRCM_B2R2CLK_MGT       0x078
-#define PRCM_TVCLK_MGT         0x07C
-#define PRCM_TCR               0x1C8
-#define PRCM_TCR_STOPPED       (1 << 16)
-#define PRCM_TCR_DOZE_MODE     (1 << 17)
-#define PRCM_UNIPROCLK_MGT     0x278
-#define PRCM_SSPCLK_MGT                0x280
-#define PRCM_RNGCLK_MGT                0x284
-#define PRCM_UICCCLK_MGT       0x27C
-
-#define PRCM_MGT_ENABLE                (1 << 8)
-
-static DEFINE_SPINLOCK(clocks_lock);
-
-static void __clk_enable(struct clk *clk)
-{
-       if (clk->enabled++ == 0) {
-               if (clk->parent_cluster)
-                       __clk_enable(clk->parent_cluster);
-
-               if (clk->parent_periph)
-                       __clk_enable(clk->parent_periph);
-
-               if (clk->ops && clk->ops->enable)
-                       clk->ops->enable(clk);
-       }
-}
-
-int clk_enable(struct clk *clk)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&clocks_lock, flags);
-       __clk_enable(clk);
-       spin_unlock_irqrestore(&clocks_lock, flags);
-
-       return 0;
-}
-EXPORT_SYMBOL(clk_enable);
-
-static void __clk_disable(struct clk *clk)
-{
-       if (--clk->enabled == 0) {
-               if (clk->ops && clk->ops->disable)
-                       clk->ops->disable(clk);
-
-               if (clk->parent_periph)
-                       __clk_disable(clk->parent_periph);
-
-               if (clk->parent_cluster)
-                       __clk_disable(clk->parent_cluster);
-       }
-}
-
-void clk_disable(struct clk *clk)
-{
-       unsigned long flags;
-
-       WARN_ON(!clk->enabled);
-
-       spin_lock_irqsave(&clocks_lock, flags);
-       __clk_disable(clk);
-       spin_unlock_irqrestore(&clocks_lock, flags);
-}
-EXPORT_SYMBOL(clk_disable);
-
-/*
- * The MTU has a separate, rather complex muxing setup
- * with alternative parents (peripheral cluster or
- * ULP or fixed 32768 Hz) depending on settings
- */
-static unsigned long clk_mtu_get_rate(struct clk *clk)
-{
-       void __iomem *addr;
-       u32 tcr;
-       int mtu = (int) clk->data;
-       /*
-        * One of these is selected eventually
-        * TODO: Replace the constant with a reference
-        * to the ULP source once this is modeled.
-        */
-       unsigned long clk32k = 32768;
-       unsigned long mturate;
-       unsigned long retclk;
-
-       if (cpu_is_u8500_family())
-               addr = __io_address(U8500_PRCMU_BASE);
-       else
-               ux500_unknown_soc();
-
-       /*
-        * On a startup, always conifgure the TCR to the doze mode;
-        * bootloaders do it for us. Do this in the kernel too.
-        */
-       writel(PRCM_TCR_DOZE_MODE, addr + PRCM_TCR);
-
-       tcr = readl(addr + PRCM_TCR);
-
-       /* Get the rate from the parent as a default */
-       if (clk->parent_periph)
-               mturate = clk_get_rate(clk->parent_periph);
-       else if (clk->parent_cluster)
-               mturate = clk_get_rate(clk->parent_cluster);
-       else
-               /* We need to be connected SOMEWHERE */
-               BUG();
-
-       /* Return the clock selected for this MTU */
-       if (tcr & (1 << mtu))
-               retclk = clk32k;
-       else
-               retclk = mturate;
-
-       pr_info("MTU%d clock rate: %lu Hz\n", mtu, retclk);
-       return retclk;
-}
-
-unsigned long clk_get_rate(struct clk *clk)
-{
-       unsigned long rate;
-
-       /*
-        * If there is a custom getrate callback for this clock,
-        * it will take precedence.
-        */
-       if (clk->get_rate)
-               return clk->get_rate(clk);
-
-       if (clk->ops && clk->ops->get_rate)
-               return clk->ops->get_rate(clk);
-
-       rate = clk->rate;
-       if (!rate) {
-               if (clk->parent_periph)
-                       rate = clk_get_rate(clk->parent_periph);
-               else if (clk->parent_cluster)
-                       rate = clk_get_rate(clk->parent_cluster);
-       }
-
-       return rate;
-}
-EXPORT_SYMBOL(clk_get_rate);
-
-long clk_round_rate(struct clk *clk, unsigned long rate)
-{
-       /*TODO*/
-       return rate;
-}
-EXPORT_SYMBOL(clk_round_rate);
-
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
-       clk->rate = rate;
-       return 0;
-}
-EXPORT_SYMBOL(clk_set_rate);
-
-int clk_set_parent(struct clk *clk, struct clk *parent)
-{
-       /*TODO*/
-       return -ENOSYS;
-}
-EXPORT_SYMBOL(clk_set_parent);
-
-static void clk_prcmu_enable(struct clk *clk)
-{
-       void __iomem *cg_set_reg = __io_address(U8500_PRCMU_BASE)
-                                  + PRCM_YYCLKEN0_MGT_SET + clk->prcmu_cg_off;
-
-       writel(1 << clk->prcmu_cg_bit, cg_set_reg);
-}
-
-static void clk_prcmu_disable(struct clk *clk)
-{
-       void __iomem *cg_clr_reg = __io_address(U8500_PRCMU_BASE)
-                                  + PRCM_YYCLKEN0_MGT_CLR + clk->prcmu_cg_off;
-
-       writel(1 << clk->prcmu_cg_bit, cg_clr_reg);
-}
-
-static struct clkops clk_prcmu_ops = {
-       .enable = clk_prcmu_enable,
-       .disable = clk_prcmu_disable,
-};
-
-static unsigned int clkrst_base[] = {
-       [1] = U8500_CLKRST1_BASE,
-       [2] = U8500_CLKRST2_BASE,
-       [3] = U8500_CLKRST3_BASE,
-       [5] = U8500_CLKRST5_BASE,
-       [6] = U8500_CLKRST6_BASE,
-};
-
-static void clk_prcc_enable(struct clk *clk)
-{
-       void __iomem *addr = __io_address(clkrst_base[clk->cluster]);
-
-       if (clk->prcc_kernel != -1)
-               writel(1 << clk->prcc_kernel, addr + PRCC_KCKEN);
-
-       if (clk->prcc_bus != -1)
-               writel(1 << clk->prcc_bus, addr + PRCC_PCKEN);
-}
-
-static void clk_prcc_disable(struct clk *clk)
-{
-       void __iomem *addr = __io_address(clkrst_base[clk->cluster]);
-
-       if (clk->prcc_bus != -1)
-               writel(1 << clk->prcc_bus, addr + PRCC_PCKDIS);
-
-       if (clk->prcc_kernel != -1)
-               writel(1 << clk->prcc_kernel, addr + PRCC_KCKDIS);
-}
-
-static struct clkops clk_prcc_ops = {
-       .enable = clk_prcc_enable,
-       .disable = clk_prcc_disable,
-};
-
-static struct clk clk_32khz = {
-       .name =  "clk_32khz",
-       .rate = 32000,
-};
-
-/*
- * PRCMU level clock gating
- */
-
-/* Bank 0 */
-static DEFINE_PRCMU_CLK(svaclk,                0x0, 2, SVAMMDSPCLK);
-static DEFINE_PRCMU_CLK(siaclk,                0x0, 3, SIAMMDSPCLK);
-static DEFINE_PRCMU_CLK(sgaclk,                0x0, 4, SGACLK);
-static DEFINE_PRCMU_CLK_RATE(uartclk,  0x0, 5, UARTCLK, 38400000);
-static DEFINE_PRCMU_CLK(msp02clk,      0x0, 6, MSP02CLK);
-static DEFINE_PRCMU_CLK(msp1clk,       0x0, 7, MSP1CLK); /* v1 */
-static DEFINE_PRCMU_CLK_RATE(i2cclk,   0x0, 8, I2CCLK, 48000000);
-static DEFINE_PRCMU_CLK_RATE(sdmmcclk, 0x0, 9, SDMMCCLK, 100000000);
-static DEFINE_PRCMU_CLK(slimclk,       0x0, 10, SLIMCLK);
-static DEFINE_PRCMU_CLK(per1clk,       0x0, 11, PER1CLK);
-static DEFINE_PRCMU_CLK(per2clk,       0x0, 12, PER2CLK);
-static DEFINE_PRCMU_CLK(per3clk,       0x0, 13, PER3CLK);
-static DEFINE_PRCMU_CLK(per5clk,       0x0, 14, PER5CLK);
-static DEFINE_PRCMU_CLK_RATE(per6clk,  0x0, 15, PER6CLK, 133330000);
-static DEFINE_PRCMU_CLK(lcdclk,                0x0, 17, LCDCLK);
-static DEFINE_PRCMU_CLK(bmlclk,                0x0, 18, BMLCLK);
-static DEFINE_PRCMU_CLK(hsitxclk,      0x0, 19, HSITXCLK);
-static DEFINE_PRCMU_CLK(hsirxclk,      0x0, 20, HSIRXCLK);
-static DEFINE_PRCMU_CLK(hdmiclk,       0x0, 21, HDMICLK);
-static DEFINE_PRCMU_CLK(apeatclk,      0x0, 22, APEATCLK);
-static DEFINE_PRCMU_CLK(apetraceclk,   0x0, 23, APETRACECLK);
-static DEFINE_PRCMU_CLK(mcdeclk,       0x0, 24, MCDECLK);
-static DEFINE_PRCMU_CLK(ipi2clk,       0x0, 25, IPI2CCLK);
-static DEFINE_PRCMU_CLK(dsialtclk,     0x0, 26, DSIALTCLK); /* v1 */
-static DEFINE_PRCMU_CLK(dmaclk,                0x0, 27, DMACLK);
-static DEFINE_PRCMU_CLK(b2r2clk,       0x0, 28, B2R2CLK);
-static DEFINE_PRCMU_CLK(tvclk,         0x0, 29, TVCLK);
-static DEFINE_PRCMU_CLK(uniproclk,     0x0, 30, UNIPROCLK); /* v1 */
-static DEFINE_PRCMU_CLK_RATE(sspclk,   0x0, 31, SSPCLK, 48000000); /* v1 */
-
-/* Bank 1 */
-static DEFINE_PRCMU_CLK(rngclk,                0x4, 0, RNGCLK); /* v1 */
-static DEFINE_PRCMU_CLK(uiccclk,       0x4, 1, UICCCLK); /* v1 */
-
-/*
- * PRCC level clock gating
- * Format: per#, clk, PCKEN bit, KCKEN bit, parent
- */
-
-/* Peripheral Cluster #1 */
-static DEFINE_PRCC_CLK(1, msp3,                11, 10, &clk_msp1clk);
-static DEFINE_PRCC_CLK(1, i2c4,                10, 9, &clk_i2cclk);
-static DEFINE_PRCC_CLK(1, gpio0,       9, -1, NULL);
-static DEFINE_PRCC_CLK(1, slimbus0,    8,  8, &clk_slimclk);
-static DEFINE_PRCC_CLK(1, spi3,                7, -1, NULL);
-static DEFINE_PRCC_CLK(1, i2c2,                6,  6, &clk_i2cclk);
-static DEFINE_PRCC_CLK(1, sdi0,                5,  5, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(1, msp1,                4,  4, &clk_msp1clk);
-static DEFINE_PRCC_CLK(1, msp0,                3,  3, &clk_msp02clk);
-static DEFINE_PRCC_CLK(1, i2c1,                2,  2, &clk_i2cclk);
-static DEFINE_PRCC_CLK(1, uart1,       1,  1, &clk_uartclk);
-static DEFINE_PRCC_CLK(1, uart0,       0,  0, &clk_uartclk);
-
-/* Peripheral Cluster #2 */
-static DEFINE_PRCC_CLK(2, gpio1,       11, -1, NULL);
-static DEFINE_PRCC_CLK(2, ssitx,       10,  7, NULL);
-static DEFINE_PRCC_CLK(2, ssirx,        9,  6, NULL);
-static DEFINE_PRCC_CLK(2, spi0,                8, -1, NULL);
-static DEFINE_PRCC_CLK(2, sdi3,                7,  5, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(2, sdi1,                6,  4, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(2, msp2,                5,  3, &clk_msp02clk);
-static DEFINE_PRCC_CLK(2, sdi4,                4,  2, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(2, pwl,         3,  1, NULL);
-static DEFINE_PRCC_CLK(2, spi1,                2, -1, NULL);
-static DEFINE_PRCC_CLK(2, spi2,                1, -1, NULL);
-static DEFINE_PRCC_CLK(2, i2c3,                0,  0, &clk_i2cclk);
-
-/* Peripheral Cluster #3 */
-static DEFINE_PRCC_CLK(3, gpio2,       8, -1, NULL);
-static DEFINE_PRCC_CLK(3, sdi5,                7,  7, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(3, uart2,       6,  6, &clk_uartclk);
-static DEFINE_PRCC_CLK(3, ske,         5,  5, &clk_32khz);
-static DEFINE_PRCC_CLK(3, sdi2,                4,  4, &clk_sdmmcclk);
-static DEFINE_PRCC_CLK(3, i2c0,                3,  3, &clk_i2cclk);
-static DEFINE_PRCC_CLK(3, ssp1,                2,  2, &clk_sspclk);
-static DEFINE_PRCC_CLK(3, ssp0,                1,  1, &clk_sspclk);
-static DEFINE_PRCC_CLK(3, fsmc,                0, -1, NULL);
-
-/* Peripheral Cluster #4 is in the always on domain */
-
-/* Peripheral Cluster #5 */
-static DEFINE_PRCC_CLK(5, gpio3,       1, -1, NULL);
-static DEFINE_PRCC_CLK(5, usb,         0,  0, NULL);
-
-/* Peripheral Cluster #6 */
-
-/* MTU ID in data */
-static DEFINE_PRCC_CLK_CUSTOM(6, mtu1, 9, -1, NULL, clk_mtu_get_rate, 1);
-static DEFINE_PRCC_CLK_CUSTOM(6, mtu0, 8, -1, NULL, clk_mtu_get_rate, 0);
-static DEFINE_PRCC_CLK(6, cfgreg,      7,  7, NULL);
-static DEFINE_PRCC_CLK(6, hash1,       6, -1, NULL);
-static DEFINE_PRCC_CLK(6, unipro,      5,  1, &clk_uniproclk);
-static DEFINE_PRCC_CLK(6, pka,         4, -1, NULL);
-static DEFINE_PRCC_CLK(6, hash0,       3, -1, NULL);
-static DEFINE_PRCC_CLK(6, cryp0,       2, -1, NULL);
-static DEFINE_PRCC_CLK(6, cryp1,    1, -1, NULL);
-static DEFINE_PRCC_CLK(6, rng, 0,  0, &clk_rngclk);
-
-static struct clk clk_dummy_apb_pclk = {
-       .name = "apb_pclk",
-};
-
-static struct clk_lookup u8500_clks[] = {
-       CLK(dummy_apb_pclk, NULL,       "apb_pclk"),
-
-       /* Peripheral Cluster #1 */
-       CLK(gpio0,      "gpio.0",       NULL),
-       CLK(gpio0,      "gpio.1",       NULL),
-       CLK(slimbus0,   "slimbus0",     NULL),
-       CLK(i2c2,       "nmk-i2c.2",    NULL),
-       CLK(sdi0,       "sdi0",         NULL),
-       CLK(msp0,       "ux500-msp-i2s.0",      NULL),
-       CLK(i2c1,       "nmk-i2c.1",    NULL),
-       CLK(uart1,      "uart1",        NULL),
-       CLK(uart0,      "uart0",        NULL),
-
-       /* Peripheral Cluster #3 */
-       CLK(gpio2,      "gpio.2",       NULL),
-       CLK(gpio2,      "gpio.3",       NULL),
-       CLK(gpio2,      "gpio.4",       NULL),
-       CLK(gpio2,      "gpio.5",       NULL),
-       CLK(sdi5,       "sdi5",         NULL),
-       CLK(uart2,      "uart2",        NULL),
-       CLK(ske,        "ske",          NULL),
-       CLK(ske,        "nmk-ske-keypad",       NULL),
-       CLK(sdi2,       "sdi2",         NULL),
-       CLK(i2c0,       "nmk-i2c.0",    NULL),
-       CLK(fsmc,       "fsmc",         NULL),
-
-       /* Peripheral Cluster #5 */
-       CLK(gpio3,      "gpio.8",       NULL),
-
-       /* Peripheral Cluster #6 */
-       CLK(hash1,      "hash1",        NULL),
-       CLK(pka,        "pka",          NULL),
-       CLK(hash0,      "hash0",        NULL),
-       CLK(cryp0,      "cryp0",        NULL),
-       CLK(cryp1,  "cryp1",    NULL),
-
-       /* PRCMU level clock gating */
-
-       /* Bank 0 */
-       CLK(svaclk,     "sva",          NULL),
-       CLK(siaclk,     "sia",          NULL),
-       CLK(sgaclk,     "sga",          NULL),
-       CLK(slimclk,    "slim",         NULL),
-       CLK(lcdclk,     "lcd",          NULL),
-       CLK(bmlclk,     "bml",          NULL),
-       CLK(hsitxclk,   "stm-hsi.0",    NULL),
-       CLK(hsirxclk,   "stm-hsi.1",    NULL),
-       CLK(hdmiclk,    "hdmi",         NULL),
-       CLK(apeatclk,   "apeat",        NULL),
-       CLK(apetraceclk,        "apetrace",     NULL),
-       CLK(mcdeclk,    "mcde",         NULL),
-       CLK(ipi2clk,    "ipi2",         NULL),
-       CLK(dmaclk,     "dma40.0",      NULL),
-       CLK(b2r2clk,    "b2r2",         NULL),
-       CLK(tvclk,      "tv",           NULL),
-
-       /* Peripheral Cluster #1 */
-       CLK(i2c4,       "nmk-i2c.4",    NULL),
-       CLK(spi3,       "spi3",         NULL),
-       CLK(msp1,       "ux500-msp-i2s.1",      NULL),
-       CLK(msp3,       "ux500-msp-i2s.3",      NULL),
-
-       /* Peripheral Cluster #2 */
-       CLK(gpio1,      "gpio.6",       NULL),
-       CLK(gpio1,      "gpio.7",       NULL),
-       CLK(ssitx,      "ssitx",        NULL),
-       CLK(ssirx,      "ssirx",        NULL),
-       CLK(spi0,       "spi0",         NULL),
-       CLK(sdi3,       "sdi3",         NULL),
-       CLK(sdi1,       "sdi1",         NULL),
-       CLK(msp2,       "ux500-msp-i2s.2",      NULL),
-       CLK(sdi4,       "sdi4",         NULL),
-       CLK(pwl,        "pwl",          NULL),
-       CLK(spi1,       "spi1",         NULL),
-       CLK(spi2,       "spi2",         NULL),
-       CLK(i2c3,       "nmk-i2c.3",    NULL),
-
-       /* Peripheral Cluster #3 */
-       CLK(ssp1,       "ssp1",         NULL),
-       CLK(ssp0,       "ssp0",         NULL),
-
-       /* Peripheral Cluster #5 */
-       CLK(usb,        "musb-ux500.0", "usb"),
-
-       /* Peripheral Cluster #6 */
-       CLK(mtu1,       "mtu1",         NULL),
-       CLK(mtu0,       "mtu0",         NULL),
-       CLK(cfgreg,     "cfgreg",       NULL),
-       CLK(hash1,      "hash1",        NULL),
-       CLK(unipro,     "unipro",       NULL),
-       CLK(rng,        "rng",          NULL),
-
-       /* PRCMU level clock gating */
-
-       /* Bank 0 */
-       CLK(uniproclk,  "uniproclk",    NULL),
-       CLK(dsialtclk,  "dsialt",       NULL),
-
-       /* Bank 1 */
-       CLK(rngclk,     "rng",          NULL),
-       CLK(uiccclk,    "uicc",         NULL),
-};
-
-#ifdef CONFIG_DEBUG_FS
-/*
- *     debugfs support to trace clock tree hierarchy and attributes with
- *     powerdebug
- */
-static struct dentry *clk_debugfs_root;
-
-void __init clk_debugfs_add_table(struct clk_lookup *cl, size_t num)
-{
-       while (num--) {
-               /* Check that the clock has not been already registered */
-               if (!(cl->clk->list.prev != cl->clk->list.next))
-                       list_add_tail(&cl->clk->list, &clk_list);
-
-               cl++;
-       }
-}
-
-static ssize_t usecount_dbg_read(struct file *file, char __user *buf,
-                                                 size_t size, loff_t *off)
-{
-       struct clk *clk = file->f_dentry->d_inode->i_private;
-       char cusecount[128];
-       unsigned int len;
-
-       len = sprintf(cusecount, "%u\n", clk->enabled);
-       return simple_read_from_buffer(buf, size, off, cusecount, len);
-}
-
-static ssize_t rate_dbg_read(struct file *file, char __user *buf,
-                                         size_t size, loff_t *off)
-{
-       struct clk *clk = file->f_dentry->d_inode->i_private;
-       char crate[128];
-       unsigned int rate;
-       unsigned int len;
-
-       rate = clk_get_rate(clk);
-       len = sprintf(crate, "%u\n", rate);
-       return simple_read_from_buffer(buf, size, off, crate, len);
-}
-
-static const struct file_operations usecount_fops = {
-       .read = usecount_dbg_read,
-};
-
-static const struct file_operations set_rate_fops = {
-       .read = rate_dbg_read,
-};
-
-static struct dentry *clk_debugfs_register_dir(struct clk *c,
-                                               struct dentry *p_dentry)
-{
-       struct dentry *d, *clk_d;
-       const char *p = c->name;
-
-       if (!p)
-               p = "BUG";
-
-       clk_d = debugfs_create_dir(p, p_dentry);
-       if (!clk_d)
-               return NULL;
-
-       d = debugfs_create_file("usecount", S_IRUGO,
-                               clk_d, c, &usecount_fops);
-       if (!d)
-               goto err_out;
-       d = debugfs_create_file("rate", S_IRUGO,
-                               clk_d, c, &set_rate_fops);
-       if (!d)
-               goto err_out;
-       /*
-        * TODO : not currently available in ux500
-        * d = debugfs_create_x32("flags", S_IRUGO, clk_d, (u32 *)&c->flags);
-        * if (!d)
-        *      goto err_out;
-        */
-
-       return clk_d;
-
-err_out:
-       debugfs_remove_recursive(clk_d);
-       return NULL;
-}
-
-static int clk_debugfs_register_one(struct clk *c)
-{
-       struct clk *pa = c->parent_periph;
-       struct clk *bpa = c->parent_cluster;
-
-       if (!(bpa && !pa)) {
-               c->dent = clk_debugfs_register_dir(c,
-                               pa ? pa->dent : clk_debugfs_root);
-               if (!c->dent)
-                       return -ENOMEM;
-       }
-
-       if (bpa) {
-               c->dent_bus = clk_debugfs_register_dir(c,
-                               bpa->dent_bus ? bpa->dent_bus : bpa->dent);
-               if ((!c->dent_bus) &&  (c->dent)) {
-                       debugfs_remove_recursive(c->dent);
-                       c->dent = NULL;
-                       return -ENOMEM;
-               }
-       }
-       return 0;
-}
-
-static int clk_debugfs_register(struct clk *c)
-{
-       int err;
-       struct clk *pa = c->parent_periph;
-       struct clk *bpa = c->parent_cluster;
-
-       if (pa && (!pa->dent && !pa->dent_bus)) {
-               err = clk_debugfs_register(pa);
-               if (err)
-                       return err;
-       }
-
-       if (bpa && (!bpa->dent && !bpa->dent_bus)) {
-               err = clk_debugfs_register(bpa);
-               if (err)
-                       return err;
-       }
-
-       if ((!c->dent) && (!c->dent_bus)) {
-               err = clk_debugfs_register_one(c);
-               if (err)
-                       return err;
-       }
-       return 0;
-}
-
-int __init clk_debugfs_init(void)
-{
-       struct clk *c;
-       struct dentry *d;
-       int err;
-
-       d = debugfs_create_dir("clock", NULL);
-       if (!d)
-               return -ENOMEM;
-       clk_debugfs_root = d;
-
-       list_for_each_entry(c, &clk_list, list) {
-               err = clk_debugfs_register(c);
-               if (err)
-                       goto err_out;
-       }
-       return 0;
-err_out:
-       debugfs_remove_recursive(clk_debugfs_root);
-       return err;
-}
-
-#endif /* defined(CONFIG_DEBUG_FS) */
-
-unsigned long clk_smp_twd_rate = 500000000;
-
-unsigned long clk_smp_twd_get_rate(struct clk *clk)
-{
-       return clk_smp_twd_rate;
-}
-
-static struct clk clk_smp_twd = {
-       .get_rate = clk_smp_twd_get_rate,
-       .name =  "smp_twd",
-};
-
-static struct clk_lookup clk_smp_twd_lookup = {
-       .dev_id = "smp_twd",
-       .clk = &clk_smp_twd,
-};
-
-#ifdef CONFIG_CPU_FREQ
-
-static int clk_twd_cpufreq_transition(struct notifier_block *nb,
-                                     unsigned long state, void *data)
-{
-       struct cpufreq_freqs *f = data;
-
-       if (state == CPUFREQ_PRECHANGE) {
-               /* Save frequency in simple Hz */
-               clk_smp_twd_rate = (f->new * 1000) / 2;
-       }
-
-       return NOTIFY_OK;
-}
-
-static struct notifier_block clk_twd_cpufreq_nb = {
-       .notifier_call = clk_twd_cpufreq_transition,
-};
-
-int clk_init_smp_twd_cpufreq(void)
-{
-       return cpufreq_register_notifier(&clk_twd_cpufreq_nb,
-                                 CPUFREQ_TRANSITION_NOTIFIER);
-}
-
-#endif
-
-int __init clk_init(void)
-{
-       clkdev_add_table(u8500_clks, ARRAY_SIZE(u8500_clks));
-       clkdev_add(&clk_smp_twd_lookup);
-
-#ifdef CONFIG_DEBUG_FS
-       clk_debugfs_add_table(u8500_clks, ARRAY_SIZE(u8500_clks));
-#endif
-       return 0;
-}
diff --git a/arch/arm/mach-ux500/clock.h b/arch/arm/mach-ux500/clock.h
deleted file mode 100644 (file)
index 65d27a1..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *  Copyright (C) 2010 ST-Ericsson
- *  Copyright (C) 2009 STMicroelectronics
- *
- * 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 clkops - ux500 clock operations
- * @enable:    function to enable the clock
- * @disable:   function to disable the clock
- * @get_rate:  function to get the current clock rate
- *
- * This structure contains function pointers to functions that will be used to
- * control the clock.  All of these functions are optional.  If get_rate is
- * NULL, the rate in the struct clk will be used.
- */
-struct clkops {
-       void (*enable) (struct clk *);
-       void (*disable) (struct clk *);
-       unsigned long (*get_rate) (struct clk *);
-       int (*set_parent)(struct clk *, struct clk *);
-};
-
-/**
- * struct clk - ux500 clock structure
- * @ops:               pointer to clkops struct used to control this clock
- * @name:              name, for debugging
- * @enabled:           refcount. positive if enabled, zero if disabled
- * @get_rate:          custom callback for getting the clock rate
- * @data:              custom per-clock data for example for the get_rate
- *                     callback
- * @rate:              fixed rate for clocks which don't implement
- *                     ops->getrate
- * @prcmu_cg_off:      address offset of the combined enable/disable register
- *                     (used on u8500v1)
- * @prcmu_cg_bit:      bit in the combined enable/disable register (used on
- *                     u8500v1)
- * @prcmu_cg_mgt:      address of the enable/disable register (used on
- *                     u8500ed)
- * @cluster:           peripheral cluster number
- * @prcc_bus:          bit for the bus clock in the peripheral's CLKRST
- * @prcc_kernel:       bit for the kernel clock in the peripheral's CLKRST.
- *                     -1 if no kernel clock exists.
- * @parent_cluster:    pointer to parent's cluster clk struct
- * @parent_periph:     pointer to parent's peripheral clk struct
- *
- * Peripherals are organised into clusters, and each cluster has an associated
- * bus clock.  Some peripherals also have a parent peripheral clock.
- *
- * In order to enable a clock for a peripheral, we need to enable:
- *     (1) the parent cluster (bus) clock at the PRCMU level
- *     (2) the parent peripheral clock (if any) at the PRCMU level
- *     (3) the peripheral's bus & kernel clock at the PRCC level
- *
- * (1) and (2) are handled by defining clk structs (DEFINE_PRCMU_CLK) for each
- * of the cluster and peripheral clocks, and hooking these as the parents of
- * the individual peripheral clocks.
- *
- * (3) is handled by specifying the bits in the PRCC control registers required
- * to enable these clocks and modifying them in the ->enable and
- * ->disable callbacks of the peripheral clocks (DEFINE_PRCC_CLK).
- *
- * This structure describes both the PRCMU-level clocks and PRCC-level clocks.
- * The prcmu_* fields are only used for the PRCMU clocks, and the cluster,
- * prcc, and parent pointers are only used for the PRCC-level clocks.
- */
-struct clk {
-       const struct clkops     *ops;
-       const char              *name;
-       unsigned int            enabled;
-       unsigned long           (*get_rate)(struct clk *);
-       void                    *data;
-
-       unsigned long           rate;
-       struct list_head        list;
-
-       /* These three are only for PRCMU clks */
-
-       unsigned int            prcmu_cg_off;
-       unsigned int            prcmu_cg_bit;
-       unsigned int            prcmu_cg_mgt;
-
-       /* The rest are only for PRCC clks */
-
-       int                     cluster;
-       unsigned int            prcc_bus;
-       unsigned int            prcc_kernel;
-
-       struct clk              *parent_cluster;
-       struct clk              *parent_periph;
-#if defined(CONFIG_DEBUG_FS)
-       struct dentry           *dent;          /* For visible tree hierarchy */
-       struct dentry           *dent_bus;      /* For visible tree hierarchy */
-#endif
-};
-
-#define DEFINE_PRCMU_CLK(_name, _cg_off, _cg_bit, _reg)                \
-struct clk clk_##_name = {                                     \
-               .name           = #_name,                       \
-               .ops            = &clk_prcmu_ops,               \
-               .prcmu_cg_off   = _cg_off,                      \
-               .prcmu_cg_bit   = _cg_bit,                      \
-               .prcmu_cg_mgt   = PRCM_##_reg##_MGT             \
-       }
-
-#define DEFINE_PRCMU_CLK_RATE(_name, _cg_off, _cg_bit, _reg, _rate)    \
-struct clk clk_##_name = {                                             \
-               .name           = #_name,                               \
-               .ops            = &clk_prcmu_ops,                       \
-               .prcmu_cg_off   = _cg_off,                              \
-               .prcmu_cg_bit   = _cg_bit,                              \
-               .rate           = _rate,                                \
-               .prcmu_cg_mgt   = PRCM_##_reg##_MGT                     \
-       }
-
-#define DEFINE_PRCC_CLK(_pclust, _name, _bus_en, _kernel_en, _kernclk) \
-struct clk clk_##_name = {                                             \
-               .name           = #_name,                               \
-               .ops            = &clk_prcc_ops,                        \
-               .cluster        = _pclust,                              \
-               .prcc_bus       = _bus_en,                              \
-               .prcc_kernel    = _kernel_en,                           \
-               .parent_cluster = &clk_per##_pclust##clk,               \
-               .parent_periph  = _kernclk                              \
-       }
-
-#define DEFINE_PRCC_CLK_CUSTOM(_pclust, _name, _bus_en, _kernel_en, _kernclk, _callback, _data) \
-struct clk clk_##_name = {                                             \
-               .name           = #_name,                               \
-               .ops            = &clk_prcc_ops,                        \
-               .cluster        = _pclust,                              \
-               .prcc_bus       = _bus_en,                              \
-               .prcc_kernel    = _kernel_en,                           \
-               .parent_cluster = &clk_per##_pclust##clk,               \
-               .parent_periph  = _kernclk,                             \
-               .get_rate       = _callback,                            \
-               .data           = (void *) _data                        \
-       }
-
-
-#define CLK(_clk, _devname, _conname)                  \
-       {                                               \
-               .clk    = &clk_##_clk,                  \
-               .dev_id = _devname,                     \
-               .con_id = _conname,                     \
-       }
-
-int __init clk_db8500_ed_fixup(void);
-int __init clk_init(void);
-
-#ifdef CONFIG_DEBUG_FS
-int clk_debugfs_init(void);
-#else
-static inline int clk_debugfs_init(void) { return 0; }
-#endif
-
-#ifdef CONFIG_CPU_FREQ
-int clk_init_smp_twd_cpufreq(void);
-#else
-static inline int clk_init_smp_twd_cpufreq(void) { return 0; }
-#endif
index db3c52d..8169f2c 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/mfd/abx500/ab8500.h>
 
 #include <asm/mach/map.h>
-#include <asm/pmu.h>
 #include <plat/gpio-nomadik.h>
 #include <mach/hardware.h>
 #include <mach/setup.h>
@@ -80,7 +79,7 @@ void __init u8500_map_io(void)
 
        iotable_init(u8500_common_io_desc, ARRAY_SIZE(u8500_common_io_desc));
 
-       if (cpu_is_u9540())
+       if (cpu_is_ux540_family())
                iotable_init(u9540_io_desc, ARRAY_SIZE(u9540_io_desc));
        else
                iotable_init(u8500_io_desc, ARRAY_SIZE(u8500_io_desc));
@@ -122,7 +121,7 @@ struct arm_pmu_platdata db8500_pmu_platdata = {
 
 static struct platform_device db8500_pmu_device = {
        .name                   = "arm-pmu",
-       .id                     = ARM_PMU_DEVICE_CPU,
+       .id                     = -1,
        .num_resources          = ARRAY_SIZE(db8500_pmu_resources),
        .resource               = db8500_pmu_resources,
        .dev.platform_data      = &db8500_pmu_platdata,
index e2360e7..3d62c64 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <linux/platform_device.h>
 #include <linux/io.h>
-#include <linux/clk.h>
 #include <linux/mfd/db8500-prcmu.h>
 #include <linux/clksrc-dbx500-prcmu.h>
 #include <linux/sys_soc.h>
@@ -17,6 +16,7 @@
 #include <linux/stat.h>
 #include <linux/of.h>
 #include <linux/of_irq.h>
+#include <linux/platform_data/clk-ux500.h>
 
 #include <asm/hardware/gic.h>
 #include <asm/mach/map.h>
@@ -25,8 +25,6 @@
 #include <mach/setup.h>
 #include <mach/devices.h>
 
-#include "clock.h"
-
 void __iomem *_PRCMU_BASE;
 
 /*
@@ -51,7 +49,7 @@ void __init ux500_init_irq(void)
        void __iomem *dist_base;
        void __iomem *cpu_base;
 
-       if (cpu_is_u8500_family()) {
+       if (cpu_is_u8500_family() || cpu_is_ux540_family()) {
                dist_base = __io_address(U8500_GIC_DIST_BASE);
                cpu_base = __io_address(U8500_GIC_CPU_BASE);
        } else
@@ -70,13 +68,17 @@ void __init ux500_init_irq(void)
         */
        if (cpu_is_u8500_family())
                db8500_prcmu_early_init();
-       clk_init();
+
+       if (cpu_is_u8500_family())
+               u8500_clk_init();
+       else if (cpu_is_u9540())
+               u9540_clk_init();
+       else if (cpu_is_u8540())
+               u8540_clk_init();
 }
 
 void __init ux500_init_late(void)
 {
-       clk_debugfs_init();
-       clk_init_smp_twd_cpufreq();
 }
 
 static const char * __init ux500_get_machine(void)
index c6e2db9..9c42642 100644 (file)
@@ -41,43 +41,29 @@ static inline bool __attribute_const__ cpu_is_u8500(void)
        return dbx500_partnumber() == 0x8500;
 }
 
-static inline bool __attribute_const__ cpu_is_u9540(void)
+static inline bool __attribute_const__ cpu_is_u8520(void)
 {
-       return dbx500_partnumber() == 0x9540;
+       return dbx500_partnumber() == 0x8520;
 }
 
 static inline bool cpu_is_u8500_family(void)
 {
-       return cpu_is_u8500() || cpu_is_u9540();
-}
-
-static inline bool __attribute_const__ cpu_is_u5500(void)
-{
-       return dbx500_partnumber() == 0x5500;
-}
-
-/*
- * 5500 revisions
- */
-
-static inline bool __attribute_const__ cpu_is_u5500v1(void)
-{
-       return cpu_is_u5500() && (dbx500_revision() & 0xf0) == 0xA0;
+       return cpu_is_u8500() || cpu_is_u8520();
 }
 
-static inline bool __attribute_const__ cpu_is_u5500v2(void)
+static inline bool __attribute_const__ cpu_is_u9540(void)
 {
-       return (dbx500_id.revision & 0xf0) == 0xB0;
+       return dbx500_partnumber() == 0x9540;
 }
 
-static inline bool __attribute_const__ cpu_is_u5500v20(void)
+static inline bool __attribute_const__ cpu_is_u8540(void)
 {
-       return cpu_is_u5500() && ((dbx500_revision() & 0xf0) == 0xB0);
+       return dbx500_partnumber() == 0x8540;
 }
 
-static inline bool __attribute_const__ cpu_is_u5500v21(void)
+static inline bool cpu_is_ux540_family(void)
 {
-       return cpu_is_u5500() && (dbx500_revision() == 0xB1);
+       return cpu_is_u9540() || cpu_is_u8540();
 }
 
 /*
@@ -119,14 +105,14 @@ static inline bool cpu_is_u8500v21(void)
        return cpu_is_u8500() && (dbx500_revision() == 0xB1);
 }
 
+static inline bool cpu_is_u8500v22(void)
+{
+       return cpu_is_u8500() && (dbx500_revision() == 0xB2);
+}
+
 static inline bool cpu_is_u8500v20_or_later(void)
 {
-       /*
-        * U9540 has so much in common with U8500 that is is considered a
-        * U8500 variant.
-        */
-       return cpu_is_u9540() ||
-               (cpu_is_u8500() && !cpu_is_u8500v10() && !cpu_is_u8500v11());
+       return (cpu_is_u8500() && !cpu_is_u8500v10() && !cpu_is_u8500v11());
 }
 
 static inline bool ux500_is_svp(void)
index da1d5ad..a5dda68 100644 (file)
@@ -48,7 +48,7 @@ static void write_pen_release(int val)
 
 static void __iomem *scu_base_addr(void)
 {
-       if (cpu_is_u8500_family())
+       if (cpu_is_u8500_family() || cpu_is_ux540_family())
                return __io_address(U8500_SCU_BASE);
        else
                ux500_unknown_soc();
@@ -118,7 +118,7 @@ static void __init wakeup_secondary(void)
 {
        void __iomem *backupram;
 
-       if (cpu_is_u8500_family())
+       if (cpu_is_u8500_family() || cpu_is_ux540_family())
                backupram = __io_address(U8500_BACKUPRAM0_BASE);
        else
                ux500_unknown_soc();
index 66e7f00..6f39731 100644 (file)
@@ -54,7 +54,7 @@ static void __init ux500_timer_init(void)
        void __iomem *tmp_base;
        struct device_node *np;
 
-       if (cpu_is_u8500_family()) {
+       if (cpu_is_u8500_family() || cpu_is_ux540_family()) {
                mtu_timer_base = __io_address(U8500_MTU0_BASE);
                prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE);
        } else {
index cd8ea35..ca7902c 100644 (file)
@@ -169,11 +169,6 @@ static struct map_desc versatile_io_desc[] __initdata = {
                .pfn            = __phys_to_pfn(VERSATILE_PCI_CFG_BASE),
                .length         = VERSATILE_PCI_CFG_BASE_SIZE,
                .type           = MT_DEVICE
-       }, {
-               .virtual        =  (unsigned long)VERSATILE_PCI_VIRT_MEM_BASE0,
-               .pfn            = __phys_to_pfn(VERSATILE_PCI_MEM_BASE0),
-               .length         = IO_SPACE_LIMIT,
-               .type           = MT_DEVICE
        },
 #endif
 };
index 408e58d..3e5d425 100644 (file)
@@ -29,7 +29,6 @@
  */
 #define VERSATILE_PCI_VIRT_BASE                (void __iomem *)0xe8000000ul
 #define VERSATILE_PCI_CFG_VIRT_BASE    (void __iomem *)0xe9000000ul
-#define VERSATILE_PCI_VIRT_MEM_BASE0   (void __iomem *)PCIO_BASE
 
 /* macro to get at MMIO space when running virtually */
 #define IO_ADDRESS(x)          (((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + 0xf0000000)
index e95bf84..2f84f40 100644 (file)
@@ -169,13 +169,6 @@ static struct pci_ops pci_versatile_ops = {
        .write  = versatile_write_config,
 };
 
-static struct resource io_port = {
-       .name   = "PCI",
-       .start  = 0,
-       .end    = IO_SPACE_LIMIT,
-       .flags  = IORESOURCE_IO,
-};
-
 static struct resource io_mem = {
        .name   = "PCI I/O space",
        .start  = VERSATILE_PCI_MEM_BASE0,
@@ -207,12 +200,6 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys)
                       "memory region (%d)\n", ret);
                goto out;
        }
-       ret = request_resource(&ioport_resource, &io_port);
-       if (ret) {
-               printk(KERN_ERR "PCI: unable to allocate I/O "
-                      "port region (%d)\n", ret);
-               goto out;
-       }
        ret = request_resource(&iomem_resource, &non_mem);
        if (ret) {
                printk(KERN_ERR "PCI: unable to allocate non-prefetchable "
@@ -227,11 +214,9 @@ static int __init pci_versatile_setup_resources(struct pci_sys_data *sys)
        }
 
        /*
-        * the IO resource for this bus
         * the mem resource for this bus
         * the prefetch mem resource for this bus
         */
-       pci_add_resource_offset(&sys->resources, &io_port, sys->io_offset);
        pci_add_resource_offset(&sys->resources, &non_mem, sys->mem_offset);
        pci_add_resource_offset(&sys->resources, &pre_mem, sys->mem_offset);
 
@@ -260,9 +245,11 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys)
                goto out;
        }
 
+       ret = pci_ioremap_io(0, VERSATILE_PCI_MEM_BASE0);
+       if (ret)
+               goto out;
+
        if (nr == 0) {
-               sys->mem_offset = 0;
-               sys->io_offset = 0;
                ret = pci_versatile_setup_resources(sys);
                if (ret < 0) {
                        printk("pci_versatile_setup: resources... oops?\n");
@@ -319,7 +306,6 @@ int __init pci_versatile_setup(int nr, struct pci_sys_data *sys)
 
 void __init pci_versatile_preinit(void)
 {
-       pcibios_min_io = 0x44000000;
        pcibios_min_mem = 0x50000000;
 
        __raw_writel(VERSATILE_PCI_MEM_BASE0 >> 28, PCI_IMAP0);
index 0e770e8..4f471fa 100644 (file)
@@ -13,7 +13,6 @@
 #include <asm/hardware/arm_timer.h>
 #include <asm/hardware/cache-l2x0.h>
 #include <asm/hardware/gic.h>
-#include <asm/pmu.h>
 #include <asm/smp_scu.h>
 #include <asm/smp_twd.h>
 
@@ -145,7 +144,7 @@ static struct resource pmu_resources[] = {
 
 static struct platform_device pmu_device = {
        .name           = "arm-pmu",
-       .id             = ARM_PMU_DEVICE_CPU,
+       .id             = -1,
        .num_resources  = ARRAY_SIZE(pmu_resources),
        .resource       = pmu_resources,
 };
index 23a7643..1be0f4e 100644 (file)
  */
 
 #include <linux/init.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
 #include <asm/cacheflush.h>
 #include <asm/cp15.h>
+#include <asm/cputype.h>
 #include <asm/hardware/cache-tauros2.h>
 
 
@@ -144,25 +147,8 @@ static inline void __init write_extra_features(u32 u)
        __asm__("mcr p15, 1, %0, c15, c1, 0" : : "r" (u));
 }
 
-static void __init disable_l2_prefetch(void)
-{
-       u32 u;
-
-       /*
-        * Read the CPU Extra Features register and verify that the
-        * Disable L2 Prefetch bit is set.
-        */
-       u = read_extra_features();
-       if (!(u & 0x01000000)) {
-               printk(KERN_INFO "Tauros2: Disabling L2 prefetch.\n");
-               write_extra_features(u | 0x01000000);
-       }
-}
-
 static inline int __init cpuid_scheme(void)
 {
-       extern int processor_id;
-
        return !!((processor_id & 0x000f0000) == 0x000f0000);
 }
 
@@ -189,12 +175,36 @@ static inline void __init write_actlr(u32 actlr)
        __asm__("mcr p15, 0, %0, c1, c0, 1\n" : : "r" (actlr));
 }
 
-void __init tauros2_init(void)
+static void enable_extra_feature(unsigned int features)
+{
+       u32 u;
+
+       u = read_extra_features();
+
+       if (features & CACHE_TAUROS2_PREFETCH_ON)
+               u &= ~0x01000000;
+       else
+               u |= 0x01000000;
+       printk(KERN_INFO "Tauros2: %s L2 prefetch.\n",
+                       (features & CACHE_TAUROS2_PREFETCH_ON)
+                       ? "Enabling" : "Disabling");
+
+       if (features & CACHE_TAUROS2_LINEFILL_BURST8)
+               u |= 0x00100000;
+       else
+               u &= ~0x00100000;
+       printk(KERN_INFO "Tauros2: %s line fill burt8.\n",
+                       (features & CACHE_TAUROS2_LINEFILL_BURST8)
+                       ? "Enabling" : "Disabling");
+
+       write_extra_features(u);
+}
+
+static void __init tauros2_internal_init(unsigned int features)
 {
-       extern int processor_id;
-       char *mode;
+       char *mode = NULL;
 
-       disable_l2_prefetch();
+       enable_extra_feature(features);
 
 #ifdef CONFIG_CPU_32v5
        if ((processor_id & 0xff0f0000) == 0x56050000) {
@@ -286,3 +296,34 @@ void __init tauros2_init(void)
        printk(KERN_INFO "Tauros2: L2 cache support initialised "
                         "in %s mode.\n", mode);
 }
+
+#ifdef CONFIG_OF
+static const struct of_device_id tauros2_ids[] __initconst = {
+       { .compatible = "marvell,tauros2-cache"},
+       {}
+};
+#endif
+
+void __init tauros2_init(unsigned int features)
+{
+#ifdef CONFIG_OF
+       struct device_node *node;
+       int ret;
+       unsigned int f;
+
+       node = of_find_matching_node(NULL, tauros2_ids);
+       if (!node) {
+               pr_info("Not found marvell,tauros2-cache, disable it\n");
+               return;
+       }
+
+       ret = of_property_read_u32(node, "marvell,tauros2-cache-features", &f);
+       if (ret) {
+               pr_info("Not found marvell,tauros-cache-features property, "
+                       "disable extra features\n");
+               features = 0;
+       } else
+               features = f;
+#endif
+       tauros2_internal_init(features);
+}
index 119bc52..4e07eec 100644 (file)
@@ -63,10 +63,11 @@ static int contextidr_notifier(struct notifier_block *unused, unsigned long cmd,
        pid = task_pid_nr(thread->task) << ASID_BITS;
        asm volatile(
        "       mrc     p15, 0, %0, c13, c0, 1\n"
-       "       bfi     %1, %0, #0, %2\n"
-       "       mcr     p15, 0, %1, c13, c0, 1\n"
+       "       and     %0, %0, %2\n"
+       "       orr     %0, %0, %1\n"
+       "       mcr     p15, 0, %0, c13, c0, 1\n"
        : "=r" (contextidr), "+r" (pid)
-       : "I" (ASID_BITS));
+       : "I" (~ASID_MASK));
        isb();
 
        return NOTIFY_OK;
index 4e7d118..e59c4ab 100644 (file)
@@ -267,17 +267,19 @@ static void __dma_free_remap(void *cpu_addr, size_t size)
        vunmap(cpu_addr);
 }
 
+#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_256K
+
 struct dma_pool {
        size_t size;
        spinlock_t lock;
        unsigned long *bitmap;
        unsigned long nr_pages;
        void *vaddr;
-       struct page *page;
+       struct page **pages;
 };
 
 static struct dma_pool atomic_pool = {
-       .size = SZ_256K,
+       .size = DEFAULT_DMA_COHERENT_POOL_SIZE,
 };
 
 static int __init early_coherent_pool(char *p)
@@ -287,6 +289,21 @@ static int __init early_coherent_pool(char *p)
 }
 early_param("coherent_pool", early_coherent_pool);
 
+void __init init_dma_coherent_pool_size(unsigned long size)
+{
+       /*
+        * Catch any attempt to set the pool size too late.
+        */
+       BUG_ON(atomic_pool.vaddr);
+
+       /*
+        * Set architecture specific coherent pool size only if
+        * it has not been changed by kernel command line parameter.
+        */
+       if (atomic_pool.size == DEFAULT_DMA_COHERENT_POOL_SIZE)
+               atomic_pool.size = size;
+}
+
 /*
  * Initialise the coherent pool for atomic allocations.
  */
@@ -297,6 +314,7 @@ static int __init atomic_pool_init(void)
        unsigned long nr_pages = pool->size >> PAGE_SHIFT;
        unsigned long *bitmap;
        struct page *page;
+       struct page **pages;
        void *ptr;
        int bitmap_size = BITS_TO_LONGS(nr_pages) * sizeof(long);
 
@@ -304,21 +322,31 @@ static int __init atomic_pool_init(void)
        if (!bitmap)
                goto no_bitmap;
 
+       pages = kzalloc(nr_pages * sizeof(struct page *), GFP_KERNEL);
+       if (!pages)
+               goto no_pages;
+
        if (IS_ENABLED(CONFIG_CMA))
                ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page);
        else
                ptr = __alloc_remap_buffer(NULL, pool->size, GFP_KERNEL, prot,
                                           &page, NULL);
        if (ptr) {
+               int i;
+
+               for (i = 0; i < nr_pages; i++)
+                       pages[i] = page + i;
+
                spin_lock_init(&pool->lock);
                pool->vaddr = ptr;
-               pool->page = page;
+               pool->pages = pages;
                pool->bitmap = bitmap;
                pool->nr_pages = nr_pages;
                pr_info("DMA: preallocated %u KiB pool for atomic coherent allocations\n",
                       (unsigned)pool->size / 1024);
                return 0;
        }
+no_pages:
        kfree(bitmap);
 no_bitmap:
        pr_err("DMA: failed to allocate %u KiB pool for atomic coherent allocation\n",
@@ -443,27 +471,45 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page)
        if (pageno < pool->nr_pages) {
                bitmap_set(pool->bitmap, pageno, count);
                ptr = pool->vaddr + PAGE_SIZE * pageno;
-               *ret_page = pool->page + pageno;
+               *ret_page = pool->pages[pageno];
+       } else {
+               pr_err_once("ERROR: %u KiB atomic DMA coherent pool is too small!\n"
+                           "Please increase it with coherent_pool= kernel parameter!\n",
+                           (unsigned)pool->size / 1024);
        }
        spin_unlock_irqrestore(&pool->lock, flags);
 
        return ptr;
 }
 
+static bool __in_atomic_pool(void *start, size_t size)
+{
+       struct dma_pool *pool = &atomic_pool;
+       void *end = start + size;
+       void *pool_start = pool->vaddr;
+       void *pool_end = pool->vaddr + pool->size;
+
+       if (start < pool_start || start >= pool_end)
+               return false;
+
+       if (end <= pool_end)
+               return true;
+
+       WARN(1, "Wrong coherent size(%p-%p) from atomic pool(%p-%p)\n",
+            start, end - 1, pool_start, pool_end - 1);
+
+       return false;
+}
+
 static int __free_from_pool(void *start, size_t size)
 {
        struct dma_pool *pool = &atomic_pool;
        unsigned long pageno, count;
        unsigned long flags;
 
-       if (start < pool->vaddr || start > pool->vaddr + pool->size)
+       if (!__in_atomic_pool(start, size))
                return 0;
 
-       if (start + size > pool->vaddr + pool->size) {
-               WARN(1, "freeing wrong coherent size from pool\n");
-               return 0;
-       }
-
        pageno = (start - pool->vaddr) >> PAGE_SHIFT;
        count = size >> PAGE_SHIFT;
 
@@ -1090,10 +1136,22 @@ static int __iommu_remove_mapping(struct device *dev, dma_addr_t iova, size_t si
        return 0;
 }
 
+static struct page **__atomic_get_pages(void *addr)
+{
+       struct dma_pool *pool = &atomic_pool;
+       struct page **pages = pool->pages;
+       int offs = (addr - pool->vaddr) >> PAGE_SHIFT;
+
+       return pages + offs;
+}
+
 static struct page **__iommu_get_pages(void *cpu_addr, struct dma_attrs *attrs)
 {
        struct vm_struct *area;
 
+       if (__in_atomic_pool(cpu_addr, PAGE_SIZE))
+               return __atomic_get_pages(cpu_addr);
+
        if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs))
                return cpu_addr;
 
@@ -1103,6 +1161,34 @@ static struct page **__iommu_get_pages(void *cpu_addr, struct dma_attrs *attrs)
        return NULL;
 }
 
+static void *__iommu_alloc_atomic(struct device *dev, size_t size,
+                                 dma_addr_t *handle)
+{
+       struct page *page;
+       void *addr;
+
+       addr = __alloc_from_pool(size, &page);
+       if (!addr)
+               return NULL;
+
+       *handle = __iommu_create_mapping(dev, &page, size);
+       if (*handle == DMA_ERROR_CODE)
+               goto err_mapping;
+
+       return addr;
+
+err_mapping:
+       __free_from_pool(addr, size);
+       return NULL;
+}
+
+static void __iommu_free_atomic(struct device *dev, struct page **pages,
+                               dma_addr_t handle, size_t size)
+{
+       __iommu_remove_mapping(dev, handle, size);
+       __free_from_pool(page_address(pages[0]), size);
+}
+
 static void *arm_iommu_alloc_attrs(struct device *dev, size_t size,
            dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs)
 {
@@ -1113,6 +1199,9 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size,
        *handle = DMA_ERROR_CODE;
        size = PAGE_ALIGN(size);
 
+       if (gfp & GFP_ATOMIC)
+               return __iommu_alloc_atomic(dev, size, handle);
+
        pages = __iommu_alloc_buffer(dev, size, gfp);
        if (!pages)
                return NULL;
@@ -1179,6 +1268,11 @@ void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr,
                return;
        }
 
+       if (__in_atomic_pool(cpu_addr, size)) {
+               __iommu_free_atomic(dev, pages, handle, size);
+               return;
+       }
+
        if (!dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) {
                unmap_kernel_range((unsigned long)cpu_addr, size);
                vunmap(cpu_addr);
index 566750f..9d869f9 100644 (file)
@@ -36,6 +36,7 @@
 #include <asm/system_info.h>
 
 #include <asm/mach/map.h>
+#include <asm/mach/pci.h>
 #include "mm.h"
 
 int ioremap_page(unsigned long virt, unsigned long phys,
@@ -383,3 +384,16 @@ void __arm_iounmap(volatile void __iomem *io_addr)
        arch_iounmap(io_addr);
 }
 EXPORT_SYMBOL(__arm_iounmap);
+
+#ifdef CONFIG_PCI
+int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr)
+{
+       BUG_ON(offset + SZ_64K > IO_SPACE_LIMIT);
+
+       return ioremap_page_range(PCI_IO_VIRT_BASE + offset,
+                                 PCI_IO_VIRT_BASE + offset + SZ_64K,
+                                 phys_addr,
+                                 __pgprot(get_mem_type(MT_DEVICE)->prot_pte));
+}
+EXPORT_SYMBOL_GPL(pci_ioremap_io);
+#endif
index 6776160..a8ee92d 100644 (file)
@@ -55,6 +55,9 @@ extern void __flush_dcache_page(struct address_space *mapping, struct page *page
 /* permanent static mappings from iotable_init() */
 #define VM_ARM_STATIC_MAPPING  0x40000000
 
+/* empty mapping */
+#define VM_ARM_EMPTY_MAPPING   0x20000000
+
 /* mapping type (attributes) for permanent static mappings */
 #define VM_ARM_MTYPE(mt)               ((mt) << 20)
 #define VM_ARM_MTYPE_MASK      (0x1f << 20)
index 4c2d045..18144e6 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
+#include <asm/mach/pci.h>
 
 #include "mm.h"
 
@@ -216,7 +217,7 @@ static struct mem_type mem_types[] = {
                .prot_l1        = PMD_TYPE_TABLE,
                .prot_sect      = PROT_SECT_DEVICE | PMD_SECT_WB,
                .domain         = DOMAIN_IO,
-       },      
+       },
        [MT_DEVICE_WC] = {      /* ioremap_wc */
                .prot_pte       = PROT_PTE_DEVICE | L_PTE_MT_DEV_WC,
                .prot_l1        = PMD_TYPE_TABLE,
@@ -777,14 +778,27 @@ void __init iotable_init(struct map_desc *io_desc, int nr)
                create_mapping(md);
                vm->addr = (void *)(md->virtual & PAGE_MASK);
                vm->size = PAGE_ALIGN(md->length + (md->virtual & ~PAGE_MASK));
-               vm->phys_addr = __pfn_to_phys(md->pfn); 
-               vm->flags = VM_IOREMAP | VM_ARM_STATIC_MAPPING; 
+               vm->phys_addr = __pfn_to_phys(md->pfn);
+               vm->flags = VM_IOREMAP | VM_ARM_STATIC_MAPPING;
                vm->flags |= VM_ARM_MTYPE(md->type);
                vm->caller = iotable_init;
                vm_area_add_early(vm++);
        }
 }
 
+void __init vm_reserve_area_early(unsigned long addr, unsigned long size,
+                                 void *caller)
+{
+       struct vm_struct *vm;
+
+       vm = early_alloc_aligned(sizeof(*vm), __alignof__(*vm));
+       vm->addr = (void *)addr;
+       vm->size = size;
+       vm->flags = VM_IOREMAP | VM_ARM_EMPTY_MAPPING;
+       vm->caller = caller;
+       vm_area_add_early(vm);
+}
+
 #ifndef CONFIG_ARM_LPAE
 
 /*
@@ -802,14 +816,7 @@ void __init iotable_init(struct map_desc *io_desc, int nr)
 
 static void __init pmd_empty_section_gap(unsigned long addr)
 {
-       struct vm_struct *vm;
-
-       vm = early_alloc_aligned(sizeof(*vm), __alignof__(*vm));
-       vm->addr = (void *)addr;
-       vm->size = SECTION_SIZE;
-       vm->flags = VM_IOREMAP | VM_ARM_STATIC_MAPPING;
-       vm->caller = pmd_empty_section_gap;
-       vm_area_add_early(vm);
+       vm_reserve_area_early(addr, SECTION_SIZE, pmd_empty_section_gap);
 }
 
 static void __init fill_pmd_gaps(void)
@@ -820,7 +827,7 @@ static void __init fill_pmd_gaps(void)
 
        /* we're still single threaded hence no lock needed here */
        for (vm = vmlist; vm; vm = vm->next) {
-               if (!(vm->flags & VM_ARM_STATIC_MAPPING))
+               if (!(vm->flags & (VM_ARM_STATIC_MAPPING | VM_ARM_EMPTY_MAPPING)))
                        continue;
                addr = (unsigned long)vm->addr;
                if (addr < next)
@@ -858,6 +865,28 @@ static void __init fill_pmd_gaps(void)
 #define fill_pmd_gaps() do { } while (0)
 #endif
 
+#if defined(CONFIG_PCI) && !defined(CONFIG_NEED_MACH_IO_H)
+static void __init pci_reserve_io(void)
+{
+       struct vm_struct *vm;
+       unsigned long addr;
+
+       /* we're still single threaded hence no lock needed here */
+       for (vm = vmlist; vm; vm = vm->next) {
+               if (!(vm->flags & VM_ARM_STATIC_MAPPING))
+                       continue;
+               addr = (unsigned long)vm->addr;
+               addr &= ~(SZ_2M - 1);
+               if (addr == PCI_IO_VIRT_BASE)
+                       return;
+
+       }
+       vm_reserve_area_early(PCI_IO_VIRT_BASE, SZ_2M, pci_reserve_io);
+}
+#else
+#define pci_reserve_io() do { } while (0)
+#endif
+
 static void * __initdata vmalloc_min =
        (void *)(VMALLOC_END - (240 << 20) - VMALLOC_OFFSET);
 
@@ -961,8 +990,8 @@ void __init sanity_check_meminfo(void)
                 * Check whether this memory bank would partially overlap
                 * the vmalloc area.
                 */
-               if (__va(bank->start + bank->size) > vmalloc_min ||
-                   __va(bank->start + bank->size) < __va(bank->start)) {
+               if (__va(bank->start + bank->size - 1) >= vmalloc_min ||
+                   __va(bank->start + bank->size - 1) <= __va(bank->start)) {
                        unsigned long newsize = vmalloc_min - __va(bank->start);
                        printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx "
                               "to -%.8llx (vmalloc region overlap).\n",
@@ -1141,6 +1170,9 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
                mdesc->map_io();
        fill_pmd_gaps();
 
+       /* Reserve fixed i/o space in VMALLOC region */
+       pci_reserve_io();
+
        /*
         * Finally flush the caches and tlb to ensure that we're in a
         * consistent state wrt the writebuffer.  This also ensures that
index 8daae9b..362474b 100644 (file)
@@ -192,30 +192,24 @@ int iop3xx_pci_setup(int nr, struct pci_sys_data *sys)
        if (nr != 0)
                return 0;
 
-       res = kzalloc(2 * sizeof(struct resource), GFP_KERNEL);
+       res = kzalloc(sizeof(struct resource), GFP_KERNEL);
        if (!res)
                panic("PCI: unable to alloc resources");
 
-       res[0].start = IOP3XX_PCI_LOWER_IO_PA;
-       res[0].end   = IOP3XX_PCI_LOWER_IO_PA + IOP3XX_PCI_IO_WINDOW_SIZE - 1;
-       res[0].name  = "IOP3XX PCI I/O Space";
-       res[0].flags = IORESOURCE_IO;
-       request_resource(&ioport_resource, &res[0]);
-
-       res[1].start = IOP3XX_PCI_LOWER_MEM_PA;
-       res[1].end   = IOP3XX_PCI_LOWER_MEM_PA + IOP3XX_PCI_MEM_WINDOW_SIZE - 1;
-       res[1].name  = "IOP3XX PCI Memory Space";
-       res[1].flags = IORESOURCE_MEM;
-       request_resource(&iomem_resource, &res[1]);
+       res->start = IOP3XX_PCI_LOWER_MEM_PA;
+       res->end   = IOP3XX_PCI_LOWER_MEM_PA + IOP3XX_PCI_MEM_WINDOW_SIZE - 1;
+       res->name  = "IOP3XX PCI Memory Space";
+       res->flags = IORESOURCE_MEM;
+       request_resource(&iomem_resource, res);
 
        /*
         * Use whatever translation is already setup.
         */
        sys->mem_offset = IOP3XX_PCI_LOWER_MEM_PA - *IOP3XX_OMWTVR0;
-       sys->io_offset  = IOP3XX_PCI_LOWER_IO_PA - *IOP3XX_OIOWTVR;
 
-       pci_add_resource_offset(&sys->resources, &res[0], sys->io_offset);
-       pci_add_resource_offset(&sys->resources, &res[1], sys->mem_offset);
+       pci_add_resource_offset(&sys->resources, res, sys->mem_offset);
+
+       pci_ioremap_io(0, IOP3XX_PCI_LOWER_IO_PA);
 
        return 1;
 }
@@ -367,7 +361,6 @@ void __init iop3xx_pci_preinit_cond(void)
 
 void __init iop3xx_pci_preinit(void)
 {
-       pcibios_min_io = 0;
        pcibios_min_mem = 0;
 
        iop3xx_atu_disable();
index a2024b8..ad9f974 100644 (file)
@@ -9,7 +9,6 @@
  */
 
 #include <linux/platform_device.h>
-#include <asm/pmu.h>
 #include <mach/irqs.h>
 
 static struct resource pmu_resource = {
@@ -26,7 +25,7 @@ static struct resource pmu_resource = {
 
 static struct platform_device pmu_device = {
        .name           = "arm-pmu",
-       .id             = ARM_PMU_DEVICE_CPU,
+       .id             = -1,
        .resource       = &pmu_resource,
        .num_resources  = 1,
 };
index bade586..5b217f4 100644 (file)
@@ -25,11 +25,6 @@ static struct map_desc iop3xx_std_desc[] __initdata = {
                .pfn            = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE),
                .length         = IOP3XX_PERIPHERAL_SIZE,
                .type           = MT_UNCACHED,
-        }, {   /* PCI IO space */
-               .virtual        = IOP3XX_PCI_LOWER_IO_VA,
-               .pfn            = __phys_to_pfn(IOP3XX_PCI_LOWER_IO_PA),
-               .length         = IOP3XX_PCI_IO_WINDOW_SIZE,
-               .type           = MT_DEVICE,
         },
 };
 
index 6ac7200..149237e 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 # Common support
-obj-y := clock.o time.o devices.o cpu.o system.o irq-common.o
+obj-y := time.o devices.o cpu.o system.o irq-common.o
 
 obj-$(CONFIG_MXC_TZIC) += tzic.o
 obj-$(CONFIG_MXC_AVIC) += avic.o
diff --git a/arch/arm/plat-mxc/clock.c b/arch/arm/plat-mxc/clock.c
deleted file mode 100644 (file)
index 5079787..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Based on arch/arm/plat-omap/clock.c
- *
- * Copyright (C) 2004 - 2005 Nokia corporation
- * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
- * Modified for omap shared clock framework by Tony Lindgren <tony@atomide.com>
- * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright 2008 Juergen Beisert, 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
- * 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.
- */
-
-/* #define DEBUG */
-
-#include <linux/clk.h>
-#include <linux/err.h>
-#include <linux/errno.h>
-#include <linux/init.h>
-#include <linux/io.h>
-#include <linux/kernel.h>
-#include <linux/list.h>
-#include <linux/module.h>
-#include <linux/mutex.h>
-#include <linux/platform_device.h>
-#include <linux/proc_fs.h>
-#include <linux/semaphore.h>
-#include <linux/string.h>
-
-#include <mach/clock.h>
-#include <mach/hardware.h>
-
-#ifndef CONFIG_COMMON_CLK
-static LIST_HEAD(clocks);
-static DEFINE_MUTEX(clocks_mutex);
-
-/*-------------------------------------------------------------------------
- * Standard clock functions defined in include/linux/clk.h
- *-------------------------------------------------------------------------*/
-
-static void __clk_disable(struct clk *clk)
-{
-       if (clk == NULL || IS_ERR(clk))
-               return;
-       WARN_ON(!clk->usecount);
-
-       if (!(--clk->usecount)) {
-               if (clk->disable)
-                       clk->disable(clk);
-               __clk_disable(clk->parent);
-               __clk_disable(clk->secondary);
-       }
-}
-
-static int __clk_enable(struct clk *clk)
-{
-       if (clk == NULL || IS_ERR(clk))
-               return -EINVAL;
-
-       if (clk->usecount++ == 0) {
-               __clk_enable(clk->parent);
-               __clk_enable(clk->secondary);
-
-               if (clk->enable)
-                       clk->enable(clk);
-       }
-       return 0;
-}
-
-/* This function increments the reference count on the clock and enables the
- * clock if not already enabled. The parent clock tree is recursively enabled
- */
-int clk_enable(struct clk *clk)
-{
-       int ret = 0;
-
-       if (clk == NULL || IS_ERR(clk))
-               return -EINVAL;
-
-       mutex_lock(&clocks_mutex);
-       ret = __clk_enable(clk);
-       mutex_unlock(&clocks_mutex);
-
-       return ret;
-}
-EXPORT_SYMBOL(clk_enable);
-
-/* This function decrements the reference count on the clock and disables
- * the clock when reference count is 0. The parent clock tree is
- * recursively disabled
- */
-void clk_disable(struct clk *clk)
-{
-       if (clk == NULL || IS_ERR(clk))
-               return;
-
-       mutex_lock(&clocks_mutex);
-       __clk_disable(clk);
-       mutex_unlock(&clocks_mutex);
-}
-EXPORT_SYMBOL(clk_disable);
-
-/* Retrieve the *current* clock rate. If the clock itself
- * does not provide a special calculation routine, ask
- * its parent and so on, until one is able to return
- * a valid clock rate
- */
-unsigned long clk_get_rate(struct clk *clk)
-{
-       if (clk == NULL || IS_ERR(clk))
-               return 0UL;
-
-       if (clk->get_rate)
-               return clk->get_rate(clk);
-
-       return clk_get_rate(clk->parent);
-}
-EXPORT_SYMBOL(clk_get_rate);
-
-/* Round the requested clock rate to the nearest supported
- * rate that is less than or equal to the requested rate.
- * This is dependent on the clock's current parent.
- */
-long clk_round_rate(struct clk *clk, unsigned long rate)
-{
-       if (clk == NULL || IS_ERR(clk) || !clk->round_rate)
-               return 0;
-
-       return clk->round_rate(clk, rate);
-}
-EXPORT_SYMBOL(clk_round_rate);
-
-/* Set the clock to the requested clock rate. The rate must
- * match a supported rate exactly based on what clk_round_rate returns
- */
-int clk_set_rate(struct clk *clk, unsigned long rate)
-{
-       int ret = -EINVAL;
-
-       if (clk == NULL || IS_ERR(clk) || clk->set_rate == NULL || rate == 0)
-               return ret;
-
-       mutex_lock(&clocks_mutex);
-       ret = clk->set_rate(clk, rate);
-       mutex_unlock(&clocks_mutex);
-
-       return ret;
-}
-EXPORT_SYMBOL(clk_set_rate);
-
-/* Set the clock's parent to another clock source */
-int clk_set_parent(struct clk *clk, struct clk *parent)
-{
-       int ret = -EINVAL;
-       struct clk *old;
-
-       if (clk == NULL || IS_ERR(clk) || parent == NULL ||
-           IS_ERR(parent) || clk->set_parent == NULL)
-               return ret;
-
-       if (clk->usecount)
-               clk_enable(parent);
-
-       mutex_lock(&clocks_mutex);
-       ret = clk->set_parent(clk, parent);
-       if (ret == 0) {
-               old = clk->parent;
-               clk->parent = parent;
-       } else {
-               old = parent;
-       }
-       mutex_unlock(&clocks_mutex);
-
-       if (clk->usecount)
-               clk_disable(old);
-
-       return ret;
-}
-EXPORT_SYMBOL(clk_set_parent);
-
-/* Retrieve the clock's parent clock source */
-struct clk *clk_get_parent(struct clk *clk)
-{
-       struct clk *ret = NULL;
-
-       if (clk == NULL || IS_ERR(clk))
-               return ret;
-
-       return clk->parent;
-}
-EXPORT_SYMBOL(clk_get_parent);
-
-#else
-
-/*
- * Lock to protect the clock module (ccm) registers. Used
- * on all i.MXs
- */
-DEFINE_SPINLOCK(imx_ccm_lock);
-
-#endif /* CONFIG_COMMON_CLK */
-
-/*
- * Get the resulting clock rate from a PLL register value and the input
- * frequency. PLLs with this register layout can at least be found on
- * MX1, MX21, MX27 and MX31
- *
- *                  mfi + mfn / (mfd + 1)
- *  f = 2 * f_ref * --------------------
- *                        pd + 1
- */
-unsigned long mxc_decode_pll(unsigned int reg_val, u32 freq)
-{
-       long long ll;
-       int mfn_abs;
-       unsigned int mfi, mfn, mfd, pd;
-
-       mfi = (reg_val >> 10) & 0xf;
-       mfn = reg_val & 0x3ff;
-       mfd = (reg_val >> 16) & 0x3ff;
-       pd =  (reg_val >> 26) & 0xf;
-
-       mfi = mfi <= 5 ? 5 : mfi;
-
-       mfn_abs = mfn;
-
-       /* On all i.MXs except i.MX1 and i.MX21 mfn is a 10bit
-        * 2's complements number
-        */
-       if (!cpu_is_mx1() && !cpu_is_mx21() && mfn >= 0x200)
-               mfn_abs = 0x400 - mfn;
-
-       freq *= 2;
-       freq /= pd + 1;
-
-       ll = (unsigned long long)freq * mfn_abs;
-
-       do_div(ll, mfd + 1);
-
-       if (!cpu_is_mx1() && !cpu_is_mx21() && mfn >= 0x200)
-               ll = -ll;
-
-       ll = (freq * mfi) + ll;
-
-       return ll;
-}
index 73db34b..b5b6f80 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/err.h>
 #include <linux/slab.h>
 #include <mach/hardware.h>
-#include <mach/clock.h>
 
 #define CLK32_FREQ     32768
 #define NANOSECOND     (1000 * 1000 * 1000)
index 2020d84..d390f00 100644 (file)
@@ -87,7 +87,7 @@ const struct imx_imx_uart_1irq_data imx31_imx_uart_data[] __initconst = {
 #ifdef CONFIG_SOC_IMX35
 const struct imx_imx_uart_1irq_data imx35_imx_uart_data[] __initconst = {
 #define imx35_imx_uart_data_entry(_id, _hwid)                          \
-       imx_imx_uart_1irq_data_entry(MX31, _id, _hwid, SZ_16K)
+       imx_imx_uart_1irq_data_entry(MX35, _id, _hwid, SZ_16K)
        imx35_imx_uart_data_entry(0, 1),
        imx35_imx_uart_data_entry(1, 2),
        imx35_imx_uart_data_entry(2, 3),
diff --git a/arch/arm/plat-mxc/include/mach/clock.h b/arch/arm/plat-mxc/include/mach/clock.h
deleted file mode 100644 (file)
index bd940c7..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
- * Copyright 2008 Juergen Beisert, 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
- * 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.
- */
-
-#ifndef __ASM_ARCH_MXC_CLOCK_H__
-#define __ASM_ARCH_MXC_CLOCK_H__
-
-#ifndef __ASSEMBLY__
-#include <linux/list.h>
-
-#ifndef CONFIG_COMMON_CLK
-struct module;
-
-struct clk {
-       int id;
-       /* Source clock this clk depends on */
-       struct clk *parent;
-       /* Secondary clock to enable/disable with this clock */
-       struct clk *secondary;
-       /* Reference count of clock enable/disable */
-       __s8 usecount;
-       /* Register bit position for clock's enable/disable control. */
-       u8 enable_shift;
-       /* Register address for clock's enable/disable control. */
-       void __iomem *enable_reg;
-       u32 flags;
-       /* get the current clock rate (always a fresh value) */
-       unsigned long (*get_rate) (struct clk *);
-       /* Function ptr to set the clock to a new rate. The rate must match a
-          supported rate returned from round_rate. Leave blank if clock is not
-          programmable */
-       int (*set_rate) (struct clk *, unsigned long);
-       /* Function ptr to round the requested clock rate to the nearest
-          supported rate that is less than or equal to the requested rate. */
-       unsigned long (*round_rate) (struct clk *, unsigned long);
-       /* Function ptr to enable the clock. Leave blank if clock can not
-          be gated. */
-       int (*enable) (struct clk *);
-       /* Function ptr to disable the clock. Leave blank if clock can not
-          be gated. */
-       void (*disable) (struct clk *);
-       /* Function ptr to set the parent clock of the clock. */
-       int (*set_parent) (struct clk *, struct clk *);
-};
-
-int clk_register(struct clk *clk);
-void clk_unregister(struct clk *clk);
-#endif /* CONFIG_COMMON_CLK */
-
-extern spinlock_t imx_ccm_lock;
-
-unsigned long mxc_decode_pll(unsigned int pll, u32 f_ref);
-
-#endif /* __ASSEMBLY__ */
-#endif /* __ASM_ARCH_MXC_CLOCK_H__ */
index 7128e97..28ba09f 100644 (file)
@@ -52,7 +52,6 @@ extern void imx31_soc_init(void);
 extern void imx35_soc_init(void);
 extern void imx50_soc_init(void);
 extern void imx51_soc_init(void);
-extern void imx53_soc_init(void);
 extern void imx51_init_late(void);
 extern void imx53_init_late(void);
 extern void epit_timer_init(void __iomem *base, int irq);
@@ -137,11 +136,6 @@ extern void imx_src_prepare_restart(void);
 extern void imx_gpc_init(void);
 extern void imx_gpc_pre_suspend(void);
 extern void imx_gpc_post_resume(void);
-extern void imx51_babbage_common_init(void);
-extern void imx53_ard_common_init(void);
-extern void imx53_evk_common_init(void);
-extern void imx53_qsb_common_init(void);
-extern void imx53_smd_common_init(void);
 extern int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode);
 extern void imx6q_clock_map_io(void);
 
index d8b65b5..f79f78a 100644 (file)
@@ -512,12 +512,16 @@ enum iomux_pins {
 #define MX31_PIN_CSPI3_SPI_RDY__CTS3   IOMUX_MODE(MX31_PIN_CSPI3_SPI_RDY, IOMUX_CONFIG_ALT1)
 #define MX31_PIN_CTS1__CTS1            IOMUX_MODE(MX31_PIN_CTS1, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_RTS1__RTS1            IOMUX_MODE(MX31_PIN_RTS1, IOMUX_CONFIG_FUNC)
+#define MX31_PIN_RTS1__SFS             IOMUX_MODE(MX31_PIN_RTS1, IOMUX_CONFIG_ALT2)
 #define MX31_PIN_TXD1__TXD1            IOMUX_MODE(MX31_PIN_TXD1, IOMUX_CONFIG_FUNC)
+#define MX31_PIN_TXD1__SCK             IOMUX_MODE(MX31_PIN_TXD1, IOMUX_CONFIG_ALT2)
 #define MX31_PIN_RXD1__RXD1            IOMUX_MODE(MX31_PIN_RXD1, IOMUX_CONFIG_FUNC)
+#define MX31_PIN_RXD1__STXDA           IOMUX_MODE(MX31_PIN_RXD1, IOMUX_CONFIG_ALT2)
 #define MX31_PIN_DCD_DCE1__DCD_DCE1    IOMUX_MODE(MX31_PIN_DCD_DCE1, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_RI_DCE1__RI_DCE1      IOMUX_MODE(MX31_PIN_RI_DCE1, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_DSR_DCE1__DSR_DCE1    IOMUX_MODE(MX31_PIN_DSR_DCE1, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_DTR_DCE1__DTR_DCE1    IOMUX_MODE(MX31_PIN_DTR_DCE1, IOMUX_CONFIG_FUNC)
+#define MX31_PIN_DTR_DCE1__SRXDA       IOMUX_MODE(MX31_PIN_DTR_DCE1, IOMUX_CONFIG_ALT2)
 #define MX31_PIN_CTS2__CTS2            IOMUX_MODE(MX31_PIN_CTS2, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_RTS2__RTS2            IOMUX_MODE(MX31_PIN_RTS2, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_TXD2__TXD2            IOMUX_MODE(MX31_PIN_TXD2, IOMUX_CONFIG_FUNC)
@@ -721,6 +725,7 @@ enum iomux_pins {
 #define MX31_PIN_KEY_ROW2_KEY_ROW2     IOMUX_MODE(MX31_PIN_KEY_ROW2, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_KEY_ROW3_KEY_ROW3     IOMUX_MODE(MX31_PIN_KEY_ROW3, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_KEY_ROW4_KEY_ROW4     IOMUX_MODE(MX31_PIN_KEY_ROW4, IOMUX_CONFIG_FUNC)
+#define MX31_PIN_KEY_ROW4_GPIO         IOMUX_MODE(MX31_PIN_KEY_ROW4, IOMUX_CONFIG_GPIO)
 #define MX31_PIN_KEY_ROW5_KEY_ROW5     IOMUX_MODE(MX31_PIN_KEY_ROW5, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_KEY_ROW6_KEY_ROW6     IOMUX_MODE(MX31_PIN_KEY_ROW6, IOMUX_CONFIG_FUNC)
 #define MX31_PIN_KEY_ROW7_KEY_ROW7     IOMUX_MODE(MX31_PIN_KEY_ROW7, IOMUX_CONFIG_FUNC)
diff --git a/arch/arm/plat-mxc/include/mach/iomux-mx53.h b/arch/arm/plat-mxc/include/mach/iomux-mx53.h
deleted file mode 100644 (file)
index 9761e00..0000000
+++ /dev/null
@@ -1,1219 +0,0 @@
-/*
- * Copyright (C) 2010-2011 Freescale Semiconductor, Inc. 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 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.
- */
-
-#ifndef __MACH_IOMUX_MX53_H__
-#define __MACH_IOMUX_MX53_H__
-
-#include <mach/iomux-v3.h>
-
-/* These 2 defines are for pins that may not have a mux register, but could
- * have a pad setting register, and vice-versa. */
-#define __NA_  0x00
-
-#define MX53_UART_PAD_CTRL             (PAD_CTL_PKE | PAD_CTL_PUE |    \
-               PAD_CTL_DSE_HIGH | PAD_CTL_SRE_FAST | PAD_CTL_HYS)
-#define MX53_SDHC_PAD_CTRL     (PAD_CTL_HYS | PAD_CTL_PKE | PAD_CTL_PUE | \
-                               PAD_CTL_PUS_47K_UP | PAD_CTL_DSE_HIGH | \
-                               PAD_CTL_SRE_FAST)
-
-
-#define MX53_PAD_GPIO_19__KPP_COL_5                    IOMUX_PAD(0x348, 0x020, 0, 0x840, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_19__GPIO4_5                      IOMUX_PAD(0x348, 0x020, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_19__CCM_CLKO                     IOMUX_PAD(0x348, 0x020, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_19__SPDIF_OUT1                   IOMUX_PAD(0x348, 0x020, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_19__RTC_CE_RTC_EXT_TRIG2         IOMUX_PAD(0x348, 0x020, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_19__ECSPI1_RDY                   IOMUX_PAD(0x348, 0x020, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_19__FEC_TDATA_3                  IOMUX_PAD(0x348, 0x020, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_19__SRC_INT_BOOT                 IOMUX_PAD(0x348, 0x020, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL0__KPP_COL_0                   IOMUX_PAD(0x34C, 0x024, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL0__GPIO4_6                     IOMUX_PAD(0x34C, 0x024, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL0__AUDMUX_AUD5_TXC             IOMUX_PAD(0x34C, 0x024, 2, 0x758, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL0__UART4_TXD_MUX               IOMUX_PAD(0x34C, 0x024, 4, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_KEY_COL0__ECSPI1_SCLK                 IOMUX_PAD(0x34C, 0x024, 5, 0x79C, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL0__FEC_RDATA_3                 IOMUX_PAD(0x34C, 0x024, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL0__SRC_ANY_PU_RST              IOMUX_PAD(0x34C, 0x024, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW0__KPP_ROW_0                   IOMUX_PAD(0x350, 0x028, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW0__GPIO4_7                     IOMUX_PAD(0x350, 0x028, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW0__AUDMUX_AUD5_TXD             IOMUX_PAD(0x350, 0x028, 2, 0x74C, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW0__UART4_RXD_MUX               IOMUX_PAD(0x350, 0x028, 4, 0x890, 1, MX53_UART_PAD_CTRL)
-#define MX53_PAD_KEY_ROW0__ECSPI1_MOSI                 IOMUX_PAD(0x350, 0x028, 5, 0x7A4, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW0__FEC_TX_ER                   IOMUX_PAD(0x350, 0x028, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL1__KPP_COL_1                   IOMUX_PAD(0x354, 0x02C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL1__GPIO4_8                     IOMUX_PAD(0x354, 0x02C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL1__AUDMUX_AUD5_TXFS            IOMUX_PAD(0x354, 0x02C, 2, 0x75C, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL1__UART5_TXD_MUX               IOMUX_PAD(0x354, 0x02C, 4, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_KEY_COL1__ECSPI1_MISO                 IOMUX_PAD(0x354, 0x02C, 5, 0x7A0, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL1__FEC_RX_CLK                  IOMUX_PAD(0x354, 0x02C, 6, 0x808, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL1__USBPHY1_TXREADY             IOMUX_PAD(0x354, 0x02C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW1__KPP_ROW_1                   IOMUX_PAD(0x358, 0x030, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW1__GPIO4_9                     IOMUX_PAD(0x358, 0x030, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW1__AUDMUX_AUD5_RXD             IOMUX_PAD(0x358, 0x030, 2, 0x748, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW1__UART5_RXD_MUX               IOMUX_PAD(0x358, 0x030, 4, 0x898, 1, MX53_UART_PAD_CTRL)
-#define MX53_PAD_KEY_ROW1__ECSPI1_SS0                  IOMUX_PAD(0x358, 0x030, 5, 0x7A8, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW1__FEC_COL                     IOMUX_PAD(0x358, 0x030, 6, 0x800, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW1__USBPHY1_RXVALID             IOMUX_PAD(0x358, 0x030, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL2__KPP_COL_2                   IOMUX_PAD(0x35C, 0x034, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL2__GPIO4_10                    IOMUX_PAD(0x35C, 0x034, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL2__CAN1_TXCAN                  IOMUX_PAD(0x35C, 0x034, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL2__FEC_MDIO                    IOMUX_PAD(0x35C, 0x034, 4, 0x804, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL2__ECSPI1_SS1                  IOMUX_PAD(0x35C, 0x034, 5, 0x7AC, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL2__FEC_RDATA_2                 IOMUX_PAD(0x35C, 0x034, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL2__USBPHY1_RXACTIVE            IOMUX_PAD(0x35C, 0x034, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW2__KPP_ROW_2                   IOMUX_PAD(0x360, 0x038, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW2__GPIO4_11                    IOMUX_PAD(0x360, 0x038, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW2__CAN1_RXCAN                  IOMUX_PAD(0x360, 0x038, 2, 0x760, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW2__FEC_MDC                     IOMUX_PAD(0x360, 0x038, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW2__ECSPI1_SS2                  IOMUX_PAD(0x360, 0x038, 5, 0x7B0, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW2__FEC_TDATA_2                 IOMUX_PAD(0x360, 0x038, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW2__USBPHY1_RXERROR             IOMUX_PAD(0x360, 0x038, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL3__KPP_COL_3                   IOMUX_PAD(0x364, 0x03C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL3__GPIO4_12                    IOMUX_PAD(0x364, 0x03C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL3__USBOH3_H2_DP                        IOMUX_PAD(0x364, 0x03C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL3__SPDIF_IN1                   IOMUX_PAD(0x364, 0x03C, 3, 0x870, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL3__I2C2_SCL                    IOMUX_PAD(0x364, 0x03C, 4 | IOMUX_CONFIG_SION, 0x81C, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL3__ECSPI1_SS3                  IOMUX_PAD(0x364, 0x03C, 5, 0x7B4, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL3__FEC_CRS                     IOMUX_PAD(0x364, 0x03C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL3__USBPHY1_SIECLOCK            IOMUX_PAD(0x364, 0x03C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW3__KPP_ROW_3                   IOMUX_PAD(0x368, 0x040, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW3__GPIO4_13                    IOMUX_PAD(0x368, 0x040, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW3__USBOH3_H2_DM                        IOMUX_PAD(0x368, 0x040, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW3__CCM_ASRC_EXT_CLK            IOMUX_PAD(0x368, 0x040, 3, 0x768, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW3__I2C2_SDA                    IOMUX_PAD(0x368, 0x040, 4 | IOMUX_CONFIG_SION, 0x820, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW3__OSC32K_32K_OUT              IOMUX_PAD(0x368, 0x040, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW3__CCM_PLL4_BYP                        IOMUX_PAD(0x368, 0x040, 6, 0x77C, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW3__USBPHY1_LINESTATE_0         IOMUX_PAD(0x368, 0x040, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL4__KPP_COL_4                   IOMUX_PAD(0x36C, 0x044, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL4__GPIO4_14                    IOMUX_PAD(0x36C, 0x044, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL4__CAN2_TXCAN                  IOMUX_PAD(0x36C, 0x044, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL4__IPU_SISG_4                  IOMUX_PAD(0x36C, 0x044, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL4__UART5_RTS                   IOMUX_PAD(0x36C, 0x044, 4, 0x894, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_KEY_COL4__USBOH3_USBOTG_OC            IOMUX_PAD(0x36C, 0x044, 5, 0x89C, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_COL4__USBPHY1_LINESTATE_1         IOMUX_PAD(0x36C, 0x044, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW4__KPP_ROW_4                   IOMUX_PAD(0x370, 0x048, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW4__GPIO4_15                    IOMUX_PAD(0x370, 0x048, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW4__CAN2_RXCAN                  IOMUX_PAD(0x370, 0x048, 2, 0x764, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW4__IPU_SISG_5                  IOMUX_PAD(0x370, 0x048, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW4__UART5_CTS                   IOMUX_PAD(0x370, 0x048, 4, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_KEY_ROW4__USBOH3_USBOTG_PWR           IOMUX_PAD(0x370, 0x048, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_KEY_ROW4__USBPHY1_VBUSVALID           IOMUX_PAD(0x370, 0x048, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_DISP_CLK__IPU_DI0_DISP_CLK                IOMUX_PAD(0x378, 0x04C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_DISP_CLK__GPIO4_16                        IOMUX_PAD(0x378, 0x04C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_DISP_CLK__USBOH3_USBH2_DIR                IOMUX_PAD(0x378, 0x04C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_DISP_CLK__SDMA_DEBUG_CORE_STATE_0 IOMUX_PAD(0x378, 0x04C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_DISP_CLK__EMI_EMI_DEBUG_0         IOMUX_PAD(0x378, 0x04C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_DISP_CLK__USBPHY1_AVALID          IOMUX_PAD(0x378, 0x04C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN15__IPU_DI0_PIN15              IOMUX_PAD(0x37C, 0x050, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN15__GPIO4_17                   IOMUX_PAD(0x37C, 0x050, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN15__AUDMUX_AUD6_TXC            IOMUX_PAD(0x37C, 0x050, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN15__SDMA_DEBUG_CORE_STATE_1    IOMUX_PAD(0x37C, 0x050, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN15__EMI_EMI_DEBUG_1            IOMUX_PAD(0x37C, 0x050, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN15__USBPHY1_BVALID             IOMUX_PAD(0x37C, 0x050, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN2__IPU_DI0_PIN2                        IOMUX_PAD(0x380, 0x054, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN2__GPIO4_18                    IOMUX_PAD(0x380, 0x054, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN2__AUDMUX_AUD6_TXD             IOMUX_PAD(0x380, 0x054, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN2__SDMA_DEBUG_CORE_STATE_2     IOMUX_PAD(0x380, 0x054, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN2__EMI_EMI_DEBUG_2             IOMUX_PAD(0x380, 0x054, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN2__USBPHY1_ENDSESSION          IOMUX_PAD(0x380, 0x054, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN3__IPU_DI0_PIN3                        IOMUX_PAD(0x384, 0x058, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN3__GPIO4_19                    IOMUX_PAD(0x384, 0x058, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN3__AUDMUX_AUD6_TXFS            IOMUX_PAD(0x384, 0x058, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN3__SDMA_DEBUG_CORE_STATE_3     IOMUX_PAD(0x384, 0x058, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN3__EMI_EMI_DEBUG_3             IOMUX_PAD(0x384, 0x058, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN3__USBPHY1_IDDIG               IOMUX_PAD(0x384, 0x058, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN4__IPU_DI0_PIN4                        IOMUX_PAD(0x388, 0x05C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN4__GPIO4_20                    IOMUX_PAD(0x388, 0x05C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN4__AUDMUX_AUD6_RXD             IOMUX_PAD(0x388, 0x05C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN4__ESDHC1_WP                   IOMUX_PAD(0x388, 0x05C, 3, 0x7FC, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN4__SDMA_DEBUG_YIELD            IOMUX_PAD(0x388, 0x05C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN4__EMI_EMI_DEBUG_4             IOMUX_PAD(0x388, 0x05C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DI0_PIN4__USBPHY1_HOSTDISCONNECT      IOMUX_PAD(0x388, 0x05C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT0__IPU_DISP0_DAT_0           IOMUX_PAD(0x38C, 0x060, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT0__GPIO4_21                  IOMUX_PAD(0x38C, 0x060, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT0__CSPI_SCLK                 IOMUX_PAD(0x38C, 0x060, 2, 0x780, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT0__USBOH3_USBH2_DATA_0       IOMUX_PAD(0x38C, 0x060, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT0__SDMA_DEBUG_CORE_RUN       IOMUX_PAD(0x38C, 0x060, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT0__EMI_EMI_DEBUG_5           IOMUX_PAD(0x38C, 0x060, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT0__USBPHY2_TXREADY           IOMUX_PAD(0x38C, 0x060, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT1__IPU_DISP0_DAT_1           IOMUX_PAD(0x390, 0x064, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT1__GPIO4_22                  IOMUX_PAD(0x390, 0x064, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT1__CSPI_MOSI                 IOMUX_PAD(0x390, 0x064, 2, 0x788, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT1__USBOH3_USBH2_DATA_1       IOMUX_PAD(0x390, 0x064, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT1__SDMA_DEBUG_EVENT_CHANNEL_SEL      \
-                                                       IOMUX_PAD(0x390, 0x064, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT1__EMI_EMI_DEBUG_6           IOMUX_PAD(0x390, 0x064, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT1__USBPHY2_RXVALID           IOMUX_PAD(0x390, 0x064, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT2__IPU_DISP0_DAT_2           IOMUX_PAD(0x394, 0x068, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT2__GPIO4_23                  IOMUX_PAD(0x394, 0x068, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT2__CSPI_MISO                 IOMUX_PAD(0x394, 0x068, 2, 0x784, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT2__USBOH3_USBH2_DATA_2       IOMUX_PAD(0x394, 0x068, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT2__SDMA_DEBUG_MODE           IOMUX_PAD(0x394, 0x068, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT2__EMI_EMI_DEBUG_7           IOMUX_PAD(0x394, 0x068, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT2__USBPHY2_RXACTIVE          IOMUX_PAD(0x394, 0x068, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT3__IPU_DISP0_DAT_3           IOMUX_PAD(0x398, 0x06C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT3__GPIO4_24                  IOMUX_PAD(0x398, 0x06C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT3__CSPI_SS0                  IOMUX_PAD(0x398, 0x06C, 2, 0x78C, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT3__USBOH3_USBH2_DATA_3       IOMUX_PAD(0x398, 0x06C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT3__SDMA_DEBUG_BUS_ERROR      IOMUX_PAD(0x398, 0x06C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT3__EMI_EMI_DEBUG_8           IOMUX_PAD(0x398, 0x06C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT3__USBPHY2_RXERROR           IOMUX_PAD(0x398, 0x06C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT4__IPU_DISP0_DAT_4           IOMUX_PAD(0x39C, 0x070, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT4__GPIO4_25                  IOMUX_PAD(0x39C, 0x070, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT4__CSPI_SS1                  IOMUX_PAD(0x39C, 0x070, 2, 0x790, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT4__USBOH3_USBH2_DATA_4       IOMUX_PAD(0x39C, 0x070, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT4__SDMA_DEBUG_BUS_RWB                IOMUX_PAD(0x39C, 0x070, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT4__EMI_EMI_DEBUG_9           IOMUX_PAD(0x39C, 0x070, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT4__USBPHY2_SIECLOCK          IOMUX_PAD(0x39C, 0x070, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT5__IPU_DISP0_DAT_5           IOMUX_PAD(0x3A0, 0x074, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT5__GPIO4_26                  IOMUX_PAD(0x3A0, 0x074, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT5__CSPI_SS2                  IOMUX_PAD(0x3A0, 0x074, 2, 0x794, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT5__USBOH3_USBH2_DATA_5       IOMUX_PAD(0x3A0, 0x074, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT5__SDMA_DEBUG_MATCHED_DMBUS  IOMUX_PAD(0x3A0, 0x074, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT5__EMI_EMI_DEBUG_10          IOMUX_PAD(0x3A0, 0x074, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT5__USBPHY2_LINESTATE_0       IOMUX_PAD(0x3A0, 0x074, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT6__IPU_DISP0_DAT_6           IOMUX_PAD(0x3A4, 0x078, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT6__GPIO4_27                  IOMUX_PAD(0x3A4, 0x078, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT6__CSPI_SS3                  IOMUX_PAD(0x3A4, 0x078, 2, 0x798, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT6__USBOH3_USBH2_DATA_6       IOMUX_PAD(0x3A4, 0x078, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT6__SDMA_DEBUG_RTBUFFER_WRITE IOMUX_PAD(0x3A4, 0x078, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT6__EMI_EMI_DEBUG_11          IOMUX_PAD(0x3A4, 0x078, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT6__USBPHY2_LINESTATE_1       IOMUX_PAD(0x3A4, 0x078, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT7__IPU_DISP0_DAT_7           IOMUX_PAD(0x3A8, 0x07C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT7__GPIO4_28                  IOMUX_PAD(0x3A8, 0x07C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT7__CSPI_RDY                  IOMUX_PAD(0x3A8, 0x07C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT7__USBOH3_USBH2_DATA_7       IOMUX_PAD(0x3A8, 0x07C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT7__SDMA_DEBUG_EVENT_CHANNEL_0        IOMUX_PAD(0x3A8, 0x07C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT7__EMI_EMI_DEBUG_12          IOMUX_PAD(0x3A8, 0x07C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT7__USBPHY2_VBUSVALID         IOMUX_PAD(0x3A8, 0x07C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT8__IPU_DISP0_DAT_8           IOMUX_PAD(0x3AC, 0x080, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT8__GPIO4_29                  IOMUX_PAD(0x3AC, 0x080, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT8__PWM1_PWMO                 IOMUX_PAD(0x3AC, 0x080, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT8__WDOG1_WDOG_B              IOMUX_PAD(0x3AC, 0x080, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT8__SDMA_DEBUG_EVENT_CHANNEL_1        IOMUX_PAD(0x3AC, 0x080, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT8__EMI_EMI_DEBUG_13          IOMUX_PAD(0x3AC, 0x080, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT8__USBPHY2_AVALID            IOMUX_PAD(0x3AC, 0x080, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT9__IPU_DISP0_DAT_9           IOMUX_PAD(0x3B0, 0x084, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT9__GPIO4_30                  IOMUX_PAD(0x3B0, 0x084, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT9__PWM2_PWMO                 IOMUX_PAD(0x3B0, 0x084, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT9__WDOG2_WDOG_B              IOMUX_PAD(0x3B0, 0x084, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT9__SDMA_DEBUG_EVENT_CHANNEL_2        IOMUX_PAD(0x3B0, 0x084, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT9__EMI_EMI_DEBUG_14          IOMUX_PAD(0x3B0, 0x084, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT9__USBPHY2_VSTATUS_0         IOMUX_PAD(0x3B0, 0x084, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT10__IPU_DISP0_DAT_10         IOMUX_PAD(0x3B4, 0x088, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT10__GPIO4_31                 IOMUX_PAD(0x3B4, 0x088, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT10__USBOH3_USBH2_STP         IOMUX_PAD(0x3B4, 0x088, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT10__SDMA_DEBUG_EVENT_CHANNEL_3       \
-                                                       IOMUX_PAD(0x3B4, 0x088, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT10__EMI_EMI_DEBUG_15         IOMUX_PAD(0x3B4, 0x088, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT10__USBPHY2_VSTATUS_1                IOMUX_PAD(0x3B4, 0x088, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT11__IPU_DISP0_DAT_11         IOMUX_PAD(0x3B8, 0x08C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT11__GPIO5_5                  IOMUX_PAD(0x3B8, 0x08C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT11__USBOH3_USBH2_NXT         IOMUX_PAD(0x3B8, 0x08C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT11__SDMA_DEBUG_EVENT_CHANNEL_4       \
-                                                       IOMUX_PAD(0x3B8, 0x08C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT11__EMI_EMI_DEBUG_16         IOMUX_PAD(0x3B8, 0x08C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT11__USBPHY2_VSTATUS_2                IOMUX_PAD(0x3B8, 0x08C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT12__IPU_DISP0_DAT_12         IOMUX_PAD(0x3BC, 0x090, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT12__GPIO5_6                  IOMUX_PAD(0x3BC, 0x090, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT12__USBOH3_USBH2_CLK         IOMUX_PAD(0x3BC, 0x090, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT12__SDMA_DEBUG_EVENT_CHANNEL_5       \
-                                                       IOMUX_PAD(0x3BC, 0x090, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT12__EMI_EMI_DEBUG_17         IOMUX_PAD(0x3BC, 0x090, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT12__USBPHY2_VSTATUS_3                IOMUX_PAD(0x3BC, 0x090, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT13__IPU_DISP0_DAT_13         IOMUX_PAD(0x3C0, 0x094, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT13__GPIO5_7                  IOMUX_PAD(0x3C0, 0x094, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT13__AUDMUX_AUD5_RXFS         IOMUX_PAD(0x3C0, 0x094, 3, 0x754, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT13__SDMA_DEBUG_EVT_CHN_LINES_0       \
-                                                       IOMUX_PAD(0x3C0, 0x094, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT13__EMI_EMI_DEBUG_18         IOMUX_PAD(0x3C0, 0x094, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT13__USBPHY2_VSTATUS_4                IOMUX_PAD(0x3C0, 0x094, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT14__IPU_DISP0_DAT_14         IOMUX_PAD(0x3C4, 0x098, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT14__GPIO5_8                  IOMUX_PAD(0x3C4, 0x098, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT14__AUDMUX_AUD5_RXC          IOMUX_PAD(0x3C4, 0x098, 3, 0x750, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT14__SDMA_DEBUG_EVT_CHN_LINES_1       \
-                                                       IOMUX_PAD(0x3C4, 0x098, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT14__EMI_EMI_DEBUG_19         IOMUX_PAD(0x3C4, 0x098, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT14__USBPHY2_VSTATUS_5                IOMUX_PAD(0x3C4, 0x098, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT15__IPU_DISP0_DAT_15         IOMUX_PAD(0x3C8, 0x09C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT15__GPIO5_9                  IOMUX_PAD(0x3C8, 0x09C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT15__ECSPI1_SS1               IOMUX_PAD(0x3C8, 0x09C, 2, 0x7AC, 1, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT15__ECSPI2_SS1               IOMUX_PAD(0x3C8, 0x09C, 3, 0x7C8, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT15__SDMA_DEBUG_EVT_CHN_LINES_2       \
-                                                       IOMUX_PAD(0x3C8, 0x09C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT15__EMI_EMI_DEBUG_20         IOMUX_PAD(0x3C8, 0x09C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT15__USBPHY2_VSTATUS_6                IOMUX_PAD(0x3C8, 0x09C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT16__IPU_DISP0_DAT_16         IOMUX_PAD(0x3CC, 0x0A0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT16__GPIO5_10                 IOMUX_PAD(0x3CC, 0x0A0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT16__ECSPI2_MOSI              IOMUX_PAD(0x3CC, 0x0A0, 2, 0x7C0, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT16__AUDMUX_AUD5_TXC          IOMUX_PAD(0x3CC, 0x0A0, 3, 0x758, 1, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT16__SDMA_EXT_EVENT_0         IOMUX_PAD(0x3CC, 0x0A0, 4, 0x868, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT16__SDMA_DEBUG_EVT_CHN_LINES_3       \
-                                                       IOMUX_PAD(0x3CC, 0x0A0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT16__EMI_EMI_DEBUG_21         IOMUX_PAD(0x3CC, 0x0A0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT16__USBPHY2_VSTATUS_7                IOMUX_PAD(0x3CC, 0x0A0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT17__IPU_DISP0_DAT_17         IOMUX_PAD(0x3D0, 0x0A4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT17__GPIO5_11                 IOMUX_PAD(0x3D0, 0x0A4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT17__ECSPI2_MISO              IOMUX_PAD(0x3D0, 0x0A4, 2, 0x7BC, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT17__AUDMUX_AUD5_TXD          IOMUX_PAD(0x3D0, 0x0A4, 3, 0x74C, 1, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT17__SDMA_EXT_EVENT_1         IOMUX_PAD(0x3D0, 0x0A4, 4, 0x86C, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT17__SDMA_DEBUG_EVT_CHN_LINES_4       \
-                                                       IOMUX_PAD(0x3D0, 0x0A4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT17__EMI_EMI_DEBUG_22         IOMUX_PAD(0x3D0, 0x0A4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT18__IPU_DISP0_DAT_18         IOMUX_PAD(0x3D4, 0x0A8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT18__GPIO5_12                 IOMUX_PAD(0x3D4, 0x0A8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT18__ECSPI2_SS0               IOMUX_PAD(0x3D4, 0x0A8, 2, 0x7C4, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT18__AUDMUX_AUD5_TXFS         IOMUX_PAD(0x3D4, 0x0A8, 3, 0x75C, 1, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT18__AUDMUX_AUD4_RXFS         IOMUX_PAD(0x3D4, 0x0A8, 4, 0x73C, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT18__SDMA_DEBUG_EVT_CHN_LINES_5       \
-                                                       IOMUX_PAD(0x3D4, 0x0A8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT18__EMI_EMI_DEBUG_23         IOMUX_PAD(0x3D4, 0x0A8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT18__EMI_WEIM_CS_2            IOMUX_PAD(0x3D4, 0x0A8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT19__IPU_DISP0_DAT_19         IOMUX_PAD(0x3D8, 0x0AC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT19__GPIO5_13                 IOMUX_PAD(0x3D8, 0x0AC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT19__ECSPI2_SCLK              IOMUX_PAD(0x3D8, 0x0AC, 2, 0x7B8, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT19__AUDMUX_AUD5_RXD          IOMUX_PAD(0x3D8, 0x0AC, 3, 0x748, 1, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT19__AUDMUX_AUD4_RXC          IOMUX_PAD(0x3D8, 0x0AC, 4, 0x738, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT19__SDMA_DEBUG_EVT_CHN_LINES_6       \
-                                                       IOMUX_PAD(0x3D8, 0x0AC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT19__EMI_EMI_DEBUG_24         IOMUX_PAD(0x3D8, 0x0AC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT19__EMI_WEIM_CS_3            IOMUX_PAD(0x3D8, 0x0AC, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT20__IPU_DISP0_DAT_20         IOMUX_PAD(0x3DC, 0x0B0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT20__GPIO5_14                 IOMUX_PAD(0x3DC, 0x0B0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT20__ECSPI1_SCLK              IOMUX_PAD(0x3DC, 0x0B0, 2, 0x79C, 1, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT20__AUDMUX_AUD4_TXC          IOMUX_PAD(0x3DC, 0x0B0, 3, 0x740, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT20__SDMA_DEBUG_EVT_CHN_LINES_7       \
-                                                       IOMUX_PAD(0x3DC, 0x0B0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT20__EMI_EMI_DEBUG_25         IOMUX_PAD(0x3DC, 0x0B0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT20__SATA_PHY_TDI             IOMUX_PAD(0x3DC, 0x0B0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT21__IPU_DISP0_DAT_21         IOMUX_PAD(0x3E0, 0x0B4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT21__GPIO5_15                 IOMUX_PAD(0x3E0, 0x0B4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT21__ECSPI1_MOSI              IOMUX_PAD(0x3E0, 0x0B4, 2, 0x7A4, 1, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT21__AUDMUX_AUD4_TXD          IOMUX_PAD(0x3E0, 0x0B4, 3, 0x734, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT21__SDMA_DEBUG_BUS_DEVICE_0  IOMUX_PAD(0x3E0, 0x0B4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT21__EMI_EMI_DEBUG_26         IOMUX_PAD(0x3E0, 0x0B4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT21__SATA_PHY_TDO             IOMUX_PAD(0x3E0, 0x0B4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT22__IPU_DISP0_DAT_22         IOMUX_PAD(0x3E4, 0x0B8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT22__GPIO5_16                 IOMUX_PAD(0x3E4, 0x0B8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT22__ECSPI1_MISO              IOMUX_PAD(0x3E4, 0x0B8, 2, 0x7A0, 1, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT22__AUDMUX_AUD4_TXFS         IOMUX_PAD(0x3E4, 0x0B8, 3, 0x744, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT22__SDMA_DEBUG_BUS_DEVICE_1  IOMUX_PAD(0x3E4, 0x0B8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT22__EMI_EMI_DEBUG_27         IOMUX_PAD(0x3E4, 0x0B8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT22__SATA_PHY_TCK             IOMUX_PAD(0x3E4, 0x0B8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT23__IPU_DISP0_DAT_23         IOMUX_PAD(0x3E8, 0x0BC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT23__GPIO5_17                 IOMUX_PAD(0x3E8, 0x0BC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT23__ECSPI1_SS0               IOMUX_PAD(0x3E8, 0x0BC, 2, 0x7A8, 1, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT23__AUDMUX_AUD4_RXD          IOMUX_PAD(0x3E8, 0x0BC, 3, 0x730, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT23__SDMA_DEBUG_BUS_DEVICE_2  IOMUX_PAD(0x3E8, 0x0BC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT23__EMI_EMI_DEBUG_28         IOMUX_PAD(0x3E8, 0x0BC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_DISP0_DAT23__SATA_PHY_TMS             IOMUX_PAD(0x3E8, 0x0BC, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_PIXCLK__IPU_CSI0_PIXCLK          IOMUX_PAD(0x3EC, 0x0C0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_PIXCLK__GPIO5_18                 IOMUX_PAD(0x3EC, 0x0C0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_PIXCLK__SDMA_DEBUG_PC_0          IOMUX_PAD(0x3EC, 0x0C0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_PIXCLK__EMI_EMI_DEBUG_29         IOMUX_PAD(0x3EC, 0x0C0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_MCLK__IPU_CSI0_HSYNC             IOMUX_PAD(0x3F0, 0x0C4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_MCLK__GPIO5_19                   IOMUX_PAD(0x3F0, 0x0C4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_MCLK__CCM_CSI0_MCLK              IOMUX_PAD(0x3F0, 0x0C4, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_MCLK__SDMA_DEBUG_PC_1            IOMUX_PAD(0x3F0, 0x0C4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_MCLK__EMI_EMI_DEBUG_30           IOMUX_PAD(0x3F0, 0x0C4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_MCLK__TPIU_TRCTL                 IOMUX_PAD(0x3F0, 0x0C4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DATA_EN__IPU_CSI0_DATA_EN                IOMUX_PAD(0x3F4, 0x0C8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DATA_EN__GPIO5_20                        IOMUX_PAD(0x3F4, 0x0C8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DATA_EN__SDMA_DEBUG_PC_2         IOMUX_PAD(0x3F4, 0x0C8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DATA_EN__EMI_EMI_DEBUG_31                IOMUX_PAD(0x3F4, 0x0C8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DATA_EN__TPIU_TRCLK              IOMUX_PAD(0x3F4, 0x0C8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_VSYNC__IPU_CSI0_VSYNC            IOMUX_PAD(0x3F8, 0x0CC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_VSYNC__GPIO5_21                  IOMUX_PAD(0x3F8, 0x0CC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_VSYNC__SDMA_DEBUG_PC_3           IOMUX_PAD(0x3F8, 0x0CC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_VSYNC__EMI_EMI_DEBUG_32          IOMUX_PAD(0x3F8, 0x0CC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_VSYNC__TPIU_TRACE_0              IOMUX_PAD(0x3F8, 0x0CC, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT4__IPU_CSI0_D_4               IOMUX_PAD(0x3FC, 0x0D0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT4__GPIO5_22                   IOMUX_PAD(0x3FC, 0x0D0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT4__KPP_COL_5                  IOMUX_PAD(0x3FC, 0x0D0, 2, 0x840, 1, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT4__ECSPI1_SCLK                        IOMUX_PAD(0x3FC, 0x0D0, 3, 0x79C, 2, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT4__USBOH3_USBH3_STP           IOMUX_PAD(0x3FC, 0x0D0, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT4__AUDMUX_AUD3_TXC            IOMUX_PAD(0x3FC, 0x0D0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT4__EMI_EMI_DEBUG_33           IOMUX_PAD(0x3FC, 0x0D0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT4__TPIU_TRACE_1               IOMUX_PAD(0x3FC, 0x0D0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT5__IPU_CSI0_D_5               IOMUX_PAD(0x400, 0x0D4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT5__GPIO5_23                   IOMUX_PAD(0x400, 0x0D4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT5__KPP_ROW_5                  IOMUX_PAD(0x400, 0x0D4, 2, 0x84C, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT5__ECSPI1_MOSI                        IOMUX_PAD(0x400, 0x0D4, 3, 0x7A4, 2, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT5__USBOH3_USBH3_NXT           IOMUX_PAD(0x400, 0x0D4, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT5__AUDMUX_AUD3_TXD            IOMUX_PAD(0x400, 0x0D4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT5__EMI_EMI_DEBUG_34           IOMUX_PAD(0x400, 0x0D4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT5__TPIU_TRACE_2               IOMUX_PAD(0x400, 0x0D4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT6__IPU_CSI0_D_6               IOMUX_PAD(0x404, 0x0D8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT6__GPIO5_24                   IOMUX_PAD(0x404, 0x0D8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT6__KPP_COL_6                  IOMUX_PAD(0x404, 0x0D8, 2, 0x844, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT6__ECSPI1_MISO                        IOMUX_PAD(0x404, 0x0D8, 3, 0x7A0, 2, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT6__USBOH3_USBH3_CLK           IOMUX_PAD(0x404, 0x0D8, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT6__AUDMUX_AUD3_TXFS           IOMUX_PAD(0x404, 0x0D8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT6__EMI_EMI_DEBUG_35           IOMUX_PAD(0x404, 0x0D8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT6__TPIU_TRACE_3               IOMUX_PAD(0x404, 0x0D8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT7__IPU_CSI0_D_7               IOMUX_PAD(0x408, 0x0DC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT7__GPIO5_25                   IOMUX_PAD(0x408, 0x0DC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT7__KPP_ROW_6                  IOMUX_PAD(0x408, 0x0DC, 2, 0x850, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT7__ECSPI1_SS0                 IOMUX_PAD(0x408, 0x0DC, 3, 0x7A8, 2, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT7__USBOH3_USBH3_DIR           IOMUX_PAD(0x408, 0x0DC, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT7__AUDMUX_AUD3_RXD            IOMUX_PAD(0x408, 0x0DC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT7__EMI_EMI_DEBUG_36           IOMUX_PAD(0x408, 0x0DC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT7__TPIU_TRACE_4               IOMUX_PAD(0x408, 0x0DC, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT8__IPU_CSI0_D_8               IOMUX_PAD(0x40C, 0x0E0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT8__GPIO5_26                   IOMUX_PAD(0x40C, 0x0E0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT8__KPP_COL_7                  IOMUX_PAD(0x40C, 0x0E0, 2, 0x848, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT8__ECSPI2_SCLK                        IOMUX_PAD(0x40C, 0x0E0, 3, 0x7B8, 1, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT8__USBOH3_USBH3_OC            IOMUX_PAD(0x40C, 0x0E0, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT8__I2C1_SDA                   IOMUX_PAD(0x40C, 0x0E0, 5 | IOMUX_CONFIG_SION, 0x818, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT8__EMI_EMI_DEBUG_37           IOMUX_PAD(0x40C, 0x0E0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT8__TPIU_TRACE_5               IOMUX_PAD(0x40C, 0x0E0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT9__IPU_CSI0_D_9               IOMUX_PAD(0x410, 0x0E4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT9__GPIO5_27                   IOMUX_PAD(0x410, 0x0E4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT9__KPP_ROW_7                  IOMUX_PAD(0x410, 0x0E4, 2, 0x854, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT9__ECSPI2_MOSI                        IOMUX_PAD(0x410, 0x0E4, 3, 0x7C0, 1, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT9__USBOH3_USBH3_PWR           IOMUX_PAD(0x410, 0x0E4, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT9__I2C1_SCL                   IOMUX_PAD(0x410, 0x0E4, 5 | IOMUX_CONFIG_SION, 0x814, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT9__EMI_EMI_DEBUG_38           IOMUX_PAD(0x410, 0x0E4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT9__TPIU_TRACE_6               IOMUX_PAD(0x410, 0x0E4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT10__IPU_CSI0_D_10             IOMUX_PAD(0x414, 0x0E8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT10__GPIO5_28                  IOMUX_PAD(0x414, 0x0E8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT10__UART1_TXD_MUX             IOMUX_PAD(0x414, 0x0E8, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT10__ECSPI2_MISO               IOMUX_PAD(0x414, 0x0E8, 3, 0x7BC, 1, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT10__AUDMUX_AUD3_RXC           IOMUX_PAD(0x414, 0x0E8, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT10__SDMA_DEBUG_PC_4           IOMUX_PAD(0x414, 0x0E8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT10__EMI_EMI_DEBUG_39          IOMUX_PAD(0x414, 0x0E8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT10__TPIU_TRACE_7              IOMUX_PAD(0x414, 0x0E8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT11__IPU_CSI0_D_11             IOMUX_PAD(0x418, 0x0EC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT11__GPIO5_29                  IOMUX_PAD(0x418, 0x0EC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT11__UART1_RXD_MUX             IOMUX_PAD(0x418, 0x0EC, 2, 0x878, 1, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT11__ECSPI2_SS0                        IOMUX_PAD(0x418, 0x0EC, 3, 0x7C4, 1, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT11__AUDMUX_AUD3_RXFS          IOMUX_PAD(0x418, 0x0EC, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT11__SDMA_DEBUG_PC_5           IOMUX_PAD(0x418, 0x0EC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT11__EMI_EMI_DEBUG_40          IOMUX_PAD(0x418, 0x0EC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT11__TPIU_TRACE_8              IOMUX_PAD(0x418, 0x0EC, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT12__IPU_CSI0_D_12             IOMUX_PAD(0x41C, 0x0F0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT12__GPIO5_30                  IOMUX_PAD(0x41C, 0x0F0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT12__UART4_TXD_MUX             IOMUX_PAD(0x41C, 0x0F0, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT12__USBOH3_USBH3_DATA_0       IOMUX_PAD(0x41C, 0x0F0, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT12__SDMA_DEBUG_PC_6           IOMUX_PAD(0x41C, 0x0F0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT12__EMI_EMI_DEBUG_41          IOMUX_PAD(0x41C, 0x0F0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT12__TPIU_TRACE_9              IOMUX_PAD(0x41C, 0x0F0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT13__IPU_CSI0_D_13             IOMUX_PAD(0x420, 0x0F4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT13__GPIO5_31                  IOMUX_PAD(0x420, 0x0F4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT13__UART4_RXD_MUX             IOMUX_PAD(0x420, 0x0F4, 2, 0x890, 3, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT13__USBOH3_USBH3_DATA_1       IOMUX_PAD(0x420, 0x0F4, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT13__SDMA_DEBUG_PC_7           IOMUX_PAD(0x420, 0x0F4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT13__EMI_EMI_DEBUG_42          IOMUX_PAD(0x420, 0x0F4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT13__TPIU_TRACE_10             IOMUX_PAD(0x420, 0x0F4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT14__IPU_CSI0_D_14             IOMUX_PAD(0x424, 0x0F8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT14__GPIO6_0                   IOMUX_PAD(0x424, 0x0F8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT14__UART5_TXD_MUX             IOMUX_PAD(0x424, 0x0F8, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT14__USBOH3_USBH3_DATA_2       IOMUX_PAD(0x424, 0x0F8, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT14__SDMA_DEBUG_PC_8           IOMUX_PAD(0x424, 0x0F8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT14__EMI_EMI_DEBUG_43          IOMUX_PAD(0x424, 0x0F8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT14__TPIU_TRACE_11             IOMUX_PAD(0x424, 0x0F8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT15__IPU_CSI0_D_15             IOMUX_PAD(0x428, 0x0FC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT15__GPIO6_1                   IOMUX_PAD(0x428, 0x0FC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT15__UART5_RXD_MUX             IOMUX_PAD(0x428, 0x0FC, 2, 0x898, 3, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT15__USBOH3_USBH3_DATA_3       IOMUX_PAD(0x428, 0x0FC, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT15__SDMA_DEBUG_PC_9           IOMUX_PAD(0x428, 0x0FC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT15__EMI_EMI_DEBUG_44          IOMUX_PAD(0x428, 0x0FC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT15__TPIU_TRACE_12             IOMUX_PAD(0x428, 0x0FC, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT16__IPU_CSI0_D_16             IOMUX_PAD(0x42C, 0x100, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT16__GPIO6_2                   IOMUX_PAD(0x42C, 0x100, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT16__UART4_RTS                 IOMUX_PAD(0x42C, 0x100, 2, 0x88C, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT16__USBOH3_USBH3_DATA_4       IOMUX_PAD(0x42C, 0x100, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT16__SDMA_DEBUG_PC_10          IOMUX_PAD(0x42C, 0x100, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT16__EMI_EMI_DEBUG_45          IOMUX_PAD(0x42C, 0x100, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT16__TPIU_TRACE_13             IOMUX_PAD(0x42C, 0x100, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT17__IPU_CSI0_D_17             IOMUX_PAD(0x430, 0x104, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT17__GPIO6_3                   IOMUX_PAD(0x430, 0x104, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT17__UART4_CTS                 IOMUX_PAD(0x430, 0x104, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT17__USBOH3_USBH3_DATA_5       IOMUX_PAD(0x430, 0x104, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT17__SDMA_DEBUG_PC_11          IOMUX_PAD(0x430, 0x104, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT17__EMI_EMI_DEBUG_46          IOMUX_PAD(0x430, 0x104, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT17__TPIU_TRACE_14             IOMUX_PAD(0x430, 0x104, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT18__IPU_CSI0_D_18             IOMUX_PAD(0x434, 0x108, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT18__GPIO6_4                   IOMUX_PAD(0x434, 0x108, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT18__UART5_RTS                 IOMUX_PAD(0x434, 0x108, 2, 0x894, 2, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT18__USBOH3_USBH3_DATA_6       IOMUX_PAD(0x434, 0x108, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT18__SDMA_DEBUG_PC_12          IOMUX_PAD(0x434, 0x108, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT18__EMI_EMI_DEBUG_47          IOMUX_PAD(0x434, 0x108, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT18__TPIU_TRACE_15             IOMUX_PAD(0x434, 0x108, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT19__IPU_CSI0_D_19             IOMUX_PAD(0x438, 0x10C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT19__GPIO6_5                   IOMUX_PAD(0x438, 0x10C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT19__UART5_CTS                 IOMUX_PAD(0x438, 0x10C, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT19__USBOH3_USBH3_DATA_7       IOMUX_PAD(0x438, 0x10C, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT19__SDMA_DEBUG_PC_13          IOMUX_PAD(0x438, 0x10C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT19__EMI_EMI_DEBUG_48          IOMUX_PAD(0x438, 0x10C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_CSI0_DAT19__USBPHY2_BISTOK            IOMUX_PAD(0x438, 0x10C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A25__EMI_WEIM_A_25                        IOMUX_PAD(0x458, 0x110, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A25__GPIO5_2                      IOMUX_PAD(0x458, 0x110, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A25__ECSPI2_RDY                   IOMUX_PAD(0x458, 0x110, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A25__IPU_DI1_PIN12                        IOMUX_PAD(0x458, 0x110, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A25__CSPI_SS1                     IOMUX_PAD(0x458, 0x110, 4, 0x790, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A25__IPU_DI0_D1_CS                        IOMUX_PAD(0x458, 0x110, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A25__USBPHY1_BISTOK               IOMUX_PAD(0x458, 0x110, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB2__EMI_WEIM_EB_2                        IOMUX_PAD(0x45C, 0x114, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB2__GPIO2_30                     IOMUX_PAD(0x45C, 0x114, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB2__CCM_DI1_EXT_CLK              IOMUX_PAD(0x45C, 0x114, 2, 0x76C, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB2__IPU_SER_DISP1_CS             IOMUX_PAD(0x45C, 0x114, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB2__ECSPI1_SS0                   IOMUX_PAD(0x45C, 0x114, 4, 0x7A8, 3, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB2__I2C2_SCL                     IOMUX_PAD(0x45C, 0x114, 5 | IOMUX_CONFIG_SION, 0x81C, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D16__EMI_WEIM_D_16                        IOMUX_PAD(0x460, 0x118, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D16__GPIO3_16                     IOMUX_PAD(0x460, 0x118, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D16__IPU_DI0_PIN5                 IOMUX_PAD(0x460, 0x118, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D16__IPU_DISPB1_SER_CLK           IOMUX_PAD(0x460, 0x118, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D16__ECSPI1_SCLK                  IOMUX_PAD(0x460, 0x118, 4, 0x79C, 3, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D16__I2C2_SDA                     IOMUX_PAD(0x460, 0x118, 5 | IOMUX_CONFIG_SION, 0x820, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D17__EMI_WEIM_D_17                        IOMUX_PAD(0x464, 0x11C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D17__GPIO3_17                     IOMUX_PAD(0x464, 0x11C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D17__IPU_DI0_PIN6                 IOMUX_PAD(0x464, 0x11C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D17__IPU_DISPB1_SER_DIN           IOMUX_PAD(0x464, 0x11C, 3, 0x830, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D17__ECSPI1_MISO                  IOMUX_PAD(0x464, 0x11C, 4, 0x7A0, 3, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D17__I2C3_SCL                     IOMUX_PAD(0x464, 0x11C, 5 | IOMUX_CONFIG_SION, 0x824, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D18__EMI_WEIM_D_18                        IOMUX_PAD(0x468, 0x120, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D18__GPIO3_18                     IOMUX_PAD(0x468, 0x120, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D18__IPU_DI0_PIN7                 IOMUX_PAD(0x468, 0x120, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D18__IPU_DISPB1_SER_DIO           IOMUX_PAD(0x468, 0x120, 3, 0x830, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D18__ECSPI1_MOSI                  IOMUX_PAD(0x468, 0x120, 4, 0x7A4, 3, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D18__I2C3_SDA                     IOMUX_PAD(0x468, 0x120, 5 | IOMUX_CONFIG_SION, 0x828, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D18__IPU_DI1_D0_CS                        IOMUX_PAD(0x468, 0x120, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D19__EMI_WEIM_D_19                        IOMUX_PAD(0x46C, 0x124, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D19__GPIO3_19                     IOMUX_PAD(0x46C, 0x124, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D19__IPU_DI0_PIN8                 IOMUX_PAD(0x46C, 0x124, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D19__IPU_DISPB1_SER_RS            IOMUX_PAD(0x46C, 0x124, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D19__ECSPI1_SS1                   IOMUX_PAD(0x46C, 0x124, 4, 0x7AC, 2, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D19__EPIT1_EPITO                  IOMUX_PAD(0x46C, 0x124, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D19__UART1_CTS                    IOMUX_PAD(0x46C, 0x124, 6, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D19__USBOH3_USBH2_OC              IOMUX_PAD(0x46C, 0x124, 7, 0x8A4, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D20__EMI_WEIM_D_20                        IOMUX_PAD(0x470, 0x128, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D20__GPIO3_20                     IOMUX_PAD(0x470, 0x128, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D20__IPU_DI0_PIN16                        IOMUX_PAD(0x470, 0x128, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D20__IPU_SER_DISP0_CS             IOMUX_PAD(0x470, 0x128, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D20__CSPI_SS0                     IOMUX_PAD(0x470, 0x128, 4, 0x78C, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D20__EPIT2_EPITO                  IOMUX_PAD(0x470, 0x128, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D20__UART1_RTS                    IOMUX_PAD(0x470, 0x128, 6, 0x874, 1, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D20__USBOH3_USBH2_PWR             IOMUX_PAD(0x470, 0x128, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D21__EMI_WEIM_D_21                        IOMUX_PAD(0x474, 0x12C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D21__GPIO3_21                     IOMUX_PAD(0x474, 0x12C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D21__IPU_DI0_PIN17                        IOMUX_PAD(0x474, 0x12C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D21__IPU_DISPB0_SER_CLK           IOMUX_PAD(0x474, 0x12C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D21__CSPI_SCLK                    IOMUX_PAD(0x474, 0x12C, 4, 0x780, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D21__I2C1_SCL                     IOMUX_PAD(0x474, 0x12C, 5 | IOMUX_CONFIG_SION, 0x814, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D21__USBOH3_USBOTG_OC             IOMUX_PAD(0x474, 0x12C, 6, 0x89C, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D22__EMI_WEIM_D_22                        IOMUX_PAD(0x478, 0x130, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D22__GPIO3_22                     IOMUX_PAD(0x478, 0x130, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D22__IPU_DI0_PIN1                 IOMUX_PAD(0x478, 0x130, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D22__IPU_DISPB0_SER_DIN           IOMUX_PAD(0x478, 0x130, 3, 0x82C, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D22__CSPI_MISO                    IOMUX_PAD(0x478, 0x130, 4, 0x784, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D22__USBOH3_USBOTG_PWR            IOMUX_PAD(0x478, 0x130, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D23__EMI_WEIM_D_23                        IOMUX_PAD(0x47C, 0x134, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D23__GPIO3_23                     IOMUX_PAD(0x47C, 0x134, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D23__UART3_CTS                    IOMUX_PAD(0x47C, 0x134, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D23__UART1_DCD                    IOMUX_PAD(0x47C, 0x134, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D23__IPU_DI0_D0_CS                        IOMUX_PAD(0x47C, 0x134, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D23__IPU_DI1_PIN2                 IOMUX_PAD(0x47C, 0x134, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D23__IPU_CSI1_DATA_EN             IOMUX_PAD(0x47C, 0x134, 6, 0x834, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D23__IPU_DI1_PIN14                        IOMUX_PAD(0x47C, 0x134, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB3__EMI_WEIM_EB_3                        IOMUX_PAD(0x480, 0x138, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB3__GPIO2_31                     IOMUX_PAD(0x480, 0x138, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB3__UART3_RTS                    IOMUX_PAD(0x480, 0x138, 2, 0x884, 1, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_EB3__UART1_RI                     IOMUX_PAD(0x480, 0x138, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB3__IPU_DI1_PIN3                 IOMUX_PAD(0x480, 0x138, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB3__IPU_CSI1_HSYNC               IOMUX_PAD(0x480, 0x138, 6, 0x838, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB3__IPU_DI1_PIN16                        IOMUX_PAD(0x480, 0x138, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D24__EMI_WEIM_D_24                        IOMUX_PAD(0x484, 0x13C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D24__GPIO3_24                     IOMUX_PAD(0x484, 0x13C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D24__UART3_TXD_MUX                        IOMUX_PAD(0x484, 0x13C, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D24__ECSPI1_SS2                   IOMUX_PAD(0x484, 0x13C, 3, 0x7B0, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D24__CSPI_SS2                     IOMUX_PAD(0x484, 0x13C, 4, 0x794, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D24__AUDMUX_AUD5_RXFS             IOMUX_PAD(0x484, 0x13C, 5, 0x754, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D24__ECSPI2_SS2                   IOMUX_PAD(0x484, 0x13C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D24__UART1_DTR                    IOMUX_PAD(0x484, 0x13C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D25__EMI_WEIM_D_25                        IOMUX_PAD(0x488, 0x140, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D25__GPIO3_25                     IOMUX_PAD(0x488, 0x140, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D25__UART3_RXD_MUX                        IOMUX_PAD(0x488, 0x140, 2, 0x888, 1, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D25__ECSPI1_SS3                   IOMUX_PAD(0x488, 0x140, 3, 0x7B4, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D25__CSPI_SS3                     IOMUX_PAD(0x488, 0x140, 4, 0x798, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D25__AUDMUX_AUD5_RXC              IOMUX_PAD(0x488, 0x140, 5, 0x750, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D25__ECSPI2_SS3                   IOMUX_PAD(0x488, 0x140, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D25__UART1_DSR                    IOMUX_PAD(0x488, 0x140, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D26__EMI_WEIM_D_26                        IOMUX_PAD(0x48C, 0x144, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D26__GPIO3_26                     IOMUX_PAD(0x48C, 0x144, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D26__UART2_TXD_MUX                        IOMUX_PAD(0x48C, 0x144, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D26__FIRI_RXD                     IOMUX_PAD(0x48C, 0x144, 3, 0x80C, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D26__IPU_CSI0_D_1                 IOMUX_PAD(0x48C, 0x144, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D26__IPU_DI1_PIN11                        IOMUX_PAD(0x48C, 0x144, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D26__IPU_SISG_2                   IOMUX_PAD(0x48C, 0x144, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D26__IPU_DISP1_DAT_22             IOMUX_PAD(0x48C, 0x144, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D27__EMI_WEIM_D_27                        IOMUX_PAD(0x490, 0x148, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D27__GPIO3_27                     IOMUX_PAD(0x490, 0x148, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D27__UART2_RXD_MUX                        IOMUX_PAD(0x490, 0x148, 2, 0x880, 1, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D27__FIRI_TXD                     IOMUX_PAD(0x490, 0x148, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D27__IPU_CSI0_D_0                 IOMUX_PAD(0x490, 0x148, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D27__IPU_DI1_PIN13                        IOMUX_PAD(0x490, 0x148, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D27__IPU_SISG_3                   IOMUX_PAD(0x490, 0x148, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D27__IPU_DISP1_DAT_23             IOMUX_PAD(0x490, 0x148, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D28__EMI_WEIM_D_28                        IOMUX_PAD(0x494, 0x14C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D28__GPIO3_28                     IOMUX_PAD(0x494, 0x14C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D28__UART2_CTS                    IOMUX_PAD(0x494, 0x14C, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D28__IPU_DISPB0_SER_DIO           IOMUX_PAD(0x494, 0x14C, 3, 0x82C, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D28__CSPI_MOSI                    IOMUX_PAD(0x494, 0x14C, 4, 0x788, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D28__I2C1_SDA                     IOMUX_PAD(0x494, 0x14C, 5 | IOMUX_CONFIG_SION, 0x818, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D28__IPU_EXT_TRIG                 IOMUX_PAD(0x494, 0x14C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D28__IPU_DI0_PIN13                        IOMUX_PAD(0x494, 0x14C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D29__EMI_WEIM_D_29                        IOMUX_PAD(0x498, 0x150, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D29__GPIO3_29                     IOMUX_PAD(0x498, 0x150, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D29__UART2_RTS                    IOMUX_PAD(0x498, 0x150, 2, 0x87C, 1, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D29__IPU_DISPB0_SER_RS            IOMUX_PAD(0x498, 0x150, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D29__CSPI_SS0                     IOMUX_PAD(0x498, 0x150, 4, 0x78C, 2, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D29__IPU_DI1_PIN15                        IOMUX_PAD(0x498, 0x150, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D29__IPU_CSI1_VSYNC               IOMUX_PAD(0x498, 0x150, 6, 0x83C, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D29__IPU_DI0_PIN14                        IOMUX_PAD(0x498, 0x150, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D30__EMI_WEIM_D_30                        IOMUX_PAD(0x49C, 0x154, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D30__GPIO3_30                     IOMUX_PAD(0x49C, 0x154, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D30__UART3_CTS                    IOMUX_PAD(0x49C, 0x154, 2, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D30__IPU_CSI0_D_3                 IOMUX_PAD(0x49C, 0x154, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D30__IPU_DI0_PIN11                        IOMUX_PAD(0x49C, 0x154, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D30__IPU_DISP1_DAT_21             IOMUX_PAD(0x49C, 0x154, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D30__USBOH3_USBH1_OC              IOMUX_PAD(0x49C, 0x154, 6, 0x8A0, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D30__USBOH3_USBH2_OC              IOMUX_PAD(0x49C, 0x154, 7, 0x8A4, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D31__EMI_WEIM_D_31                        IOMUX_PAD(0x4A0, 0x158, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D31__GPIO3_31                     IOMUX_PAD(0x4A0, 0x158, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D31__UART3_RTS                    IOMUX_PAD(0x4A0, 0x158, 2, 0x884, 3, MX53_UART_PAD_CTRL)
-#define MX53_PAD_EIM_D31__IPU_CSI0_D_2                 IOMUX_PAD(0x4A0, 0x158, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D31__IPU_DI0_PIN12                        IOMUX_PAD(0x4A0, 0x158, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D31__IPU_DISP1_DAT_20             IOMUX_PAD(0x4A0, 0x158, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D31__USBOH3_USBH1_PWR             IOMUX_PAD(0x4A0, 0x158, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_D31__USBOH3_USBH2_PWR             IOMUX_PAD(0x4A0, 0x158, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A24__EMI_WEIM_A_24                        IOMUX_PAD(0x4A8, 0x15C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A24__GPIO5_4                      IOMUX_PAD(0x4A8, 0x15C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A24__IPU_DISP1_DAT_19             IOMUX_PAD(0x4A8, 0x15C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A24__IPU_CSI1_D_19                        IOMUX_PAD(0x4A8, 0x15C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A24__IPU_SISG_2                   IOMUX_PAD(0x4A8, 0x15C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A24__USBPHY2_BVALID               IOMUX_PAD(0x4A8, 0x15C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A23__EMI_WEIM_A_23                        IOMUX_PAD(0x4AC, 0x160, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A23__GPIO6_6                      IOMUX_PAD(0x4AC, 0x160, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A23__IPU_DISP1_DAT_18             IOMUX_PAD(0x4AC, 0x160, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A23__IPU_CSI1_D_18                        IOMUX_PAD(0x4AC, 0x160, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A23__IPU_SISG_3                   IOMUX_PAD(0x4AC, 0x160, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A23__USBPHY2_ENDSESSION           IOMUX_PAD(0x4AC, 0x160, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A22__EMI_WEIM_A_22                        IOMUX_PAD(0x4B0, 0x164, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A22__GPIO2_16                     IOMUX_PAD(0x4B0, 0x164, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A22__IPU_DISP1_DAT_17             IOMUX_PAD(0x4B0, 0x164, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A22__IPU_CSI1_D_17                        IOMUX_PAD(0x4B0, 0x164, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A22__SRC_BT_CFG1_7                        IOMUX_PAD(0x4B0, 0x164, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A21__EMI_WEIM_A_21                        IOMUX_PAD(0x4B4, 0x168, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A21__GPIO2_17                     IOMUX_PAD(0x4B4, 0x168, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A21__IPU_DISP1_DAT_16             IOMUX_PAD(0x4B4, 0x168, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A21__IPU_CSI1_D_16                        IOMUX_PAD(0x4B4, 0x168, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A21__SRC_BT_CFG1_6                        IOMUX_PAD(0x4B4, 0x168, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A20__EMI_WEIM_A_20                        IOMUX_PAD(0x4B8, 0x16C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A20__GPIO2_18                     IOMUX_PAD(0x4B8, 0x16C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A20__IPU_DISP1_DAT_15             IOMUX_PAD(0x4B8, 0x16C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A20__IPU_CSI1_D_15                        IOMUX_PAD(0x4B8, 0x16C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A20__SRC_BT_CFG1_5                        IOMUX_PAD(0x4B8, 0x16C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A19__EMI_WEIM_A_19                        IOMUX_PAD(0x4BC, 0x170, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A19__GPIO2_19                     IOMUX_PAD(0x4BC, 0x170, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A19__IPU_DISP1_DAT_14             IOMUX_PAD(0x4BC, 0x170, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A19__IPU_CSI1_D_14                        IOMUX_PAD(0x4BC, 0x170, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A19__SRC_BT_CFG1_4                        IOMUX_PAD(0x4BC, 0x170, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A18__EMI_WEIM_A_18                        IOMUX_PAD(0x4C0, 0x174, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A18__GPIO2_20                     IOMUX_PAD(0x4C0, 0x174, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A18__IPU_DISP1_DAT_13             IOMUX_PAD(0x4C0, 0x174, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A18__IPU_CSI1_D_13                        IOMUX_PAD(0x4C0, 0x174, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A18__SRC_BT_CFG1_3                        IOMUX_PAD(0x4C0, 0x174, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A17__EMI_WEIM_A_17                        IOMUX_PAD(0x4C4, 0x178, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A17__GPIO2_21                     IOMUX_PAD(0x4C4, 0x178, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A17__IPU_DISP1_DAT_12             IOMUX_PAD(0x4C4, 0x178, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A17__IPU_CSI1_D_12                        IOMUX_PAD(0x4C4, 0x178, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A17__SRC_BT_CFG1_2                        IOMUX_PAD(0x4C4, 0x178, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A16__EMI_WEIM_A_16                        IOMUX_PAD(0x4C8, 0x17C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A16__GPIO2_22                     IOMUX_PAD(0x4C8, 0x17C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A16__IPU_DI1_DISP_CLK             IOMUX_PAD(0x4C8, 0x17C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A16__IPU_CSI1_PIXCLK              IOMUX_PAD(0x4C8, 0x17C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_A16__SRC_BT_CFG1_1                        IOMUX_PAD(0x4C8, 0x17C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_CS0__EMI_WEIM_CS_0                        IOMUX_PAD(0x4CC, 0x180, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_CS0__GPIO2_23                     IOMUX_PAD(0x4CC, 0x180, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_CS0__ECSPI2_SCLK                  IOMUX_PAD(0x4CC, 0x180, 2, 0x7B8, 2, NO_PAD_CTRL)
-#define MX53_PAD_EIM_CS0__IPU_DI1_PIN5                 IOMUX_PAD(0x4CC, 0x180, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_CS1__EMI_WEIM_CS_1                        IOMUX_PAD(0x4D0, 0x184, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_CS1__GPIO2_24                     IOMUX_PAD(0x4D0, 0x184, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_CS1__ECSPI2_MOSI                  IOMUX_PAD(0x4D0, 0x184, 2, 0x7C0, 2, NO_PAD_CTRL)
-#define MX53_PAD_EIM_CS1__IPU_DI1_PIN6                 IOMUX_PAD(0x4D0, 0x184, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_OE__EMI_WEIM_OE                   IOMUX_PAD(0x4D4, 0x188, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_OE__GPIO2_25                      IOMUX_PAD(0x4D4, 0x188, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_OE__ECSPI2_MISO                   IOMUX_PAD(0x4D4, 0x188, 2, 0x7BC, 2, NO_PAD_CTRL)
-#define MX53_PAD_EIM_OE__IPU_DI1_PIN7                  IOMUX_PAD(0x4D4, 0x188, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_OE__USBPHY2_IDDIG                 IOMUX_PAD(0x4D4, 0x188, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_RW__EMI_WEIM_RW                   IOMUX_PAD(0x4D8, 0x18C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_RW__GPIO2_26                      IOMUX_PAD(0x4D8, 0x18C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_RW__ECSPI2_SS0                    IOMUX_PAD(0x4D8, 0x18C, 2, 0x7C4, 2, NO_PAD_CTRL)
-#define MX53_PAD_EIM_RW__IPU_DI1_PIN8                  IOMUX_PAD(0x4D8, 0x18C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_RW__USBPHY2_HOSTDISCONNECT                IOMUX_PAD(0x4D8, 0x18C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_LBA__EMI_WEIM_LBA                 IOMUX_PAD(0x4DC, 0x190, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_LBA__GPIO2_27                     IOMUX_PAD(0x4DC, 0x190, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_LBA__ECSPI2_SS1                   IOMUX_PAD(0x4DC, 0x190, 2, 0x7C8, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_LBA__IPU_DI1_PIN17                        IOMUX_PAD(0x4DC, 0x190, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_LBA__SRC_BT_CFG1_0                        IOMUX_PAD(0x4DC, 0x190, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB0__EMI_WEIM_EB_0                        IOMUX_PAD(0x4E4, 0x194, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB0__GPIO2_28                     IOMUX_PAD(0x4E4, 0x194, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB0__IPU_DISP1_DAT_11             IOMUX_PAD(0x4E4, 0x194, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB0__IPU_CSI1_D_11                        IOMUX_PAD(0x4E4, 0x194, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB0__GPC_PMIC_RDY                 IOMUX_PAD(0x4E4, 0x194, 5, 0x810, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB0__SRC_BT_CFG2_7                        IOMUX_PAD(0x4E4, 0x194, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB1__EMI_WEIM_EB_1                        IOMUX_PAD(0x4E8, 0x198, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB1__GPIO2_29                     IOMUX_PAD(0x4E8, 0x198, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB1__IPU_DISP1_DAT_10             IOMUX_PAD(0x4E8, 0x198, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB1__IPU_CSI1_D_10                        IOMUX_PAD(0x4E8, 0x198, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_EB1__SRC_BT_CFG2_6                        IOMUX_PAD(0x4E8, 0x198, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA0__EMI_NAND_WEIM_DA_0           IOMUX_PAD(0x4EC, 0x19C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA0__GPIO3_0                      IOMUX_PAD(0x4EC, 0x19C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA0__IPU_DISP1_DAT_9              IOMUX_PAD(0x4EC, 0x19C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA0__IPU_CSI1_D_9                 IOMUX_PAD(0x4EC, 0x19C, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA0__SRC_BT_CFG2_5                        IOMUX_PAD(0x4EC, 0x19C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA1__EMI_NAND_WEIM_DA_1           IOMUX_PAD(0x4F0, 0x1A0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA1__GPIO3_1                      IOMUX_PAD(0x4F0, 0x1A0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA1__IPU_DISP1_DAT_8              IOMUX_PAD(0x4F0, 0x1A0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA1__IPU_CSI1_D_8                 IOMUX_PAD(0x4F0, 0x1A0, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA1__SRC_BT_CFG2_4                        IOMUX_PAD(0x4F0, 0x1A0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA2__EMI_NAND_WEIM_DA_2           IOMUX_PAD(0x4F4, 0x1A4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA2__GPIO3_2                      IOMUX_PAD(0x4F4, 0x1A4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA2__IPU_DISP1_DAT_7              IOMUX_PAD(0x4F4, 0x1A4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA2__IPU_CSI1_D_7                 IOMUX_PAD(0x4F4, 0x1A4, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA2__SRC_BT_CFG2_3                        IOMUX_PAD(0x4F4, 0x1A4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA3__EMI_NAND_WEIM_DA_3           IOMUX_PAD(0x4F8, 0x1A8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA3__GPIO3_3                      IOMUX_PAD(0x4F8, 0x1A8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA3__IPU_DISP1_DAT_6              IOMUX_PAD(0x4F8, 0x1A8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA3__IPU_CSI1_D_6                 IOMUX_PAD(0x4F8, 0x1A8, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA3__SRC_BT_CFG2_2                        IOMUX_PAD(0x4F8, 0x1A8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA4__EMI_NAND_WEIM_DA_4           IOMUX_PAD(0x4FC, 0x1AC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA4__GPIO3_4                      IOMUX_PAD(0x4FC, 0x1AC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA4__IPU_DISP1_DAT_5              IOMUX_PAD(0x4FC, 0x1AC, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA4__IPU_CSI1_D_5                 IOMUX_PAD(0x4FC, 0x1AC, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA4__SRC_BT_CFG3_7                        IOMUX_PAD(0x4FC, 0x1AC, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA5__EMI_NAND_WEIM_DA_5           IOMUX_PAD(0x500, 0x1B0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA5__GPIO3_5                      IOMUX_PAD(0x500, 0x1B0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA5__IPU_DISP1_DAT_4              IOMUX_PAD(0x500, 0x1B0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA5__IPU_CSI1_D_4                 IOMUX_PAD(0x500, 0x1B0, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA5__SRC_BT_CFG3_6                        IOMUX_PAD(0x500, 0x1B0, 7 | IOMUX_CONFIG_SION, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA6__EMI_NAND_WEIM_DA_6           IOMUX_PAD(0x504, 0x1B4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA6__GPIO3_6                      IOMUX_PAD(0x504, 0x1B4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA6__IPU_DISP1_DAT_3              IOMUX_PAD(0x504, 0x1B4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA6__IPU_CSI1_D_3                 IOMUX_PAD(0x504, 0x1B4, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA6__SRC_BT_CFG3_5                        IOMUX_PAD(0x504, 0x1B4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA7__EMI_NAND_WEIM_DA_7           IOMUX_PAD(0x508, 0x1B8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA7__GPIO3_7                      IOMUX_PAD(0x508, 0x1B8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA7__IPU_DISP1_DAT_2              IOMUX_PAD(0x508, 0x1B8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA7__IPU_CSI1_D_2                 IOMUX_PAD(0x508, 0x1B8, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA7__SRC_BT_CFG3_4                        IOMUX_PAD(0x508, 0x1B8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA8__EMI_NAND_WEIM_DA_8           IOMUX_PAD(0x50C, 0x1BC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA8__GPIO3_8                      IOMUX_PAD(0x50C, 0x1BC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA8__IPU_DISP1_DAT_1              IOMUX_PAD(0x50C, 0x1BC, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA8__IPU_CSI1_D_1                 IOMUX_PAD(0x50C, 0x1BC, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA8__SRC_BT_CFG3_3                        IOMUX_PAD(0x50C, 0x1BC, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA9__EMI_NAND_WEIM_DA_9           IOMUX_PAD(0x510, 0x1C0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA9__GPIO3_9                      IOMUX_PAD(0x510, 0x1C0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA9__IPU_DISP1_DAT_0              IOMUX_PAD(0x510, 0x1C0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA9__IPU_CSI1_D_0                 IOMUX_PAD(0x510, 0x1C0, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA9__SRC_BT_CFG3_2                        IOMUX_PAD(0x510, 0x1C0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA10__EMI_NAND_WEIM_DA_10         IOMUX_PAD(0x514, 0x1C4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA10__GPIO3_10                    IOMUX_PAD(0x514, 0x1C4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA10__IPU_DI1_PIN15               IOMUX_PAD(0x514, 0x1C4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA10__IPU_CSI1_DATA_EN            IOMUX_PAD(0x514, 0x1C4, 4, 0x834, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA10__SRC_BT_CFG3_1               IOMUX_PAD(0x514, 0x1C4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA11__EMI_NAND_WEIM_DA_11         IOMUX_PAD(0x518, 0x1C8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA11__GPIO3_11                    IOMUX_PAD(0x518, 0x1C8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA11__IPU_DI1_PIN2                        IOMUX_PAD(0x518, 0x1C8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA11__IPU_CSI1_HSYNC              IOMUX_PAD(0x518, 0x1C8, 4, 0x838, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA12__EMI_NAND_WEIM_DA_12         IOMUX_PAD(0x51C, 0x1CC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA12__GPIO3_12                    IOMUX_PAD(0x51C, 0x1CC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA12__IPU_DI1_PIN3                        IOMUX_PAD(0x51C, 0x1CC, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA12__IPU_CSI1_VSYNC              IOMUX_PAD(0x51C, 0x1CC, 4, 0x83C, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA13__EMI_NAND_WEIM_DA_13         IOMUX_PAD(0x520, 0x1D0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA13__GPIO3_13                    IOMUX_PAD(0x520, 0x1D0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA13__IPU_DI1_D0_CS               IOMUX_PAD(0x520, 0x1D0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA13__CCM_DI1_EXT_CLK             IOMUX_PAD(0x520, 0x1D0, 4, 0x76C, 1, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA14__EMI_NAND_WEIM_DA_14         IOMUX_PAD(0x524, 0x1D4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA14__GPIO3_14                    IOMUX_PAD(0x524, 0x1D4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA14__IPU_DI1_D1_CS               IOMUX_PAD(0x524, 0x1D4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA14__CCM_DI0_EXT_CLK             IOMUX_PAD(0x524, 0x1D4, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA15__EMI_NAND_WEIM_DA_15         IOMUX_PAD(0x528, 0x1D8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA15__GPIO3_15                    IOMUX_PAD(0x528, 0x1D8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA15__IPU_DI1_PIN1                        IOMUX_PAD(0x528, 0x1D8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_DA15__IPU_DI1_PIN4                        IOMUX_PAD(0x528, 0x1D8, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_WE_B__EMI_NANDF_WE_B            IOMUX_PAD(0x52C, 0x1DC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_WE_B__GPIO6_12                  IOMUX_PAD(0x52C, 0x1DC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_RE_B__EMI_NANDF_RE_B            IOMUX_PAD(0x530, 0x1E0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_RE_B__GPIO6_13                  IOMUX_PAD(0x530, 0x1E0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_WAIT__EMI_WEIM_WAIT               IOMUX_PAD(0x534, 0x1E4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_WAIT__GPIO5_0                     IOMUX_PAD(0x534, 0x1E4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_EIM_WAIT__EMI_WEIM_DTACK_B            IOMUX_PAD(0x534, 0x1E4, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_TX3_P__GPIO6_22                 IOMUX_PAD(__NA_, 0x1EC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_TX3_P__LDB_LVDS1_TX3            IOMUX_PAD(__NA_, 0x1EC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_TX2_P__GPIO6_24                 IOMUX_PAD(__NA_, 0x1F0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_TX2_P__LDB_LVDS1_TX2            IOMUX_PAD(__NA_, 0x1F0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_CLK_P__GPIO6_26                 IOMUX_PAD(__NA_, 0x1F4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_CLK_P__LDB_LVDS1_CLK            IOMUX_PAD(__NA_, 0x1F4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_TX1_P__GPIO6_28                 IOMUX_PAD(__NA_, 0x1F8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_TX1_P__LDB_LVDS1_TX1            IOMUX_PAD(__NA_, 0x1F8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_TX0_P__GPIO6_30                 IOMUX_PAD(__NA_, 0x1FC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS1_TX0_P__LDB_LVDS1_TX0            IOMUX_PAD(__NA_, 0x1FC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_TX3_P__GPIO7_22                 IOMUX_PAD(__NA_, 0x200, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_TX3_P__LDB_LVDS0_TX3            IOMUX_PAD(__NA_, 0x200, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_CLK_P__GPIO7_24                 IOMUX_PAD(__NA_, 0x204, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_CLK_P__LDB_LVDS0_CLK            IOMUX_PAD(__NA_, 0x204, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_TX2_P__GPIO7_26                 IOMUX_PAD(__NA_, 0x208, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_TX2_P__LDB_LVDS0_TX2            IOMUX_PAD(__NA_, 0x208, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_TX1_P__GPIO7_28                 IOMUX_PAD(__NA_, 0x20C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_TX1_P__LDB_LVDS0_TX1            IOMUX_PAD(__NA_, 0x20C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_TX0_P__GPIO7_30                 IOMUX_PAD(__NA_, 0x210, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_LVDS0_TX0_P__LDB_LVDS0_TX0            IOMUX_PAD(__NA_, 0x210, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_10__GPIO4_0                      IOMUX_PAD(0x540, 0x214, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_10__OSC32k_32K_OUT               IOMUX_PAD(0x540, 0x214, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_11__GPIO4_1                      IOMUX_PAD(0x544, 0x218, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_12__GPIO4_2                      IOMUX_PAD(0x548, 0x21C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_13__GPIO4_3                      IOMUX_PAD(0x54C, 0x220, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_14__GPIO4_4                      IOMUX_PAD(0x550, 0x224, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CLE__EMI_NANDF_CLE              IOMUX_PAD(0x5A0, 0x228, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CLE__GPIO6_7                    IOMUX_PAD(0x5A0, 0x228, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CLE__USBPHY1_VSTATUS_0          IOMUX_PAD(0x5A0, 0x228, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_ALE__EMI_NANDF_ALE              IOMUX_PAD(0x5A4, 0x22C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_ALE__GPIO6_8                    IOMUX_PAD(0x5A4, 0x22C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_ALE__USBPHY1_VSTATUS_1          IOMUX_PAD(0x5A4, 0x22C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_WP_B__EMI_NANDF_WP_B            IOMUX_PAD(0x5A8, 0x230, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_WP_B__GPIO6_9                   IOMUX_PAD(0x5A8, 0x230, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_WP_B__USBPHY1_VSTATUS_2         IOMUX_PAD(0x5A8, 0x230, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_RB0__EMI_NANDF_RB_0             IOMUX_PAD(0x5AC, 0x234, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_RB0__GPIO6_10                   IOMUX_PAD(0x5AC, 0x234, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_RB0__USBPHY1_VSTATUS_3          IOMUX_PAD(0x5AC, 0x234, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS0__EMI_NANDF_CS_0             IOMUX_PAD(0x5B0, 0x238, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS0__GPIO6_11                   IOMUX_PAD(0x5B0, 0x238, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS0__USBPHY1_VSTATUS_4          IOMUX_PAD(0x5B0, 0x238, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS1__EMI_NANDF_CS_1             IOMUX_PAD(0x5B4, 0x23C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS1__GPIO6_14                   IOMUX_PAD(0x5B4, 0x23C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS1__MLB_MLBCLK                 IOMUX_PAD(0x5B4, 0x23C, 6, 0x858, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS1__USBPHY1_VSTATUS_5          IOMUX_PAD(0x5B4, 0x23C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS2__EMI_NANDF_CS_2             IOMUX_PAD(0x5B8, 0x240, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS2__GPIO6_15                   IOMUX_PAD(0x5B8, 0x240, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS2__IPU_SISG_0                 IOMUX_PAD(0x5B8, 0x240, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS2__ESAI1_TX0                  IOMUX_PAD(0x5B8, 0x240, 3, 0x7E4, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS2__EMI_WEIM_CRE               IOMUX_PAD(0x5B8, 0x240, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS2__CCM_CSI0_MCLK              IOMUX_PAD(0x5B8, 0x240, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS2__MLB_MLBSIG                 IOMUX_PAD(0x5B8, 0x240, 6, 0x860, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS2__USBPHY1_VSTATUS_6          IOMUX_PAD(0x5B8, 0x240, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS3__EMI_NANDF_CS_3             IOMUX_PAD(0x5BC, 0x244, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS3__GPIO6_16                   IOMUX_PAD(0x5BC, 0x244, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS3__IPU_SISG_1                 IOMUX_PAD(0x5BC, 0x244, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS3__ESAI1_TX1                  IOMUX_PAD(0x5BC, 0x244, 3, 0x7E8, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS3__EMI_WEIM_A_26              IOMUX_PAD(0x5BC, 0x244, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS3__MLB_MLBDAT                 IOMUX_PAD(0x5BC, 0x244, 6, 0x85C, 0, NO_PAD_CTRL)
-#define MX53_PAD_NANDF_CS3__USBPHY1_VSTATUS_7          IOMUX_PAD(0x5BC, 0x244, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDIO__FEC_MDIO                    IOMUX_PAD(0x5C4, 0x248, 0, 0x804, 1, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDIO__GPIO1_22                    IOMUX_PAD(0x5C4, 0x248, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDIO__ESAI1_SCKR                  IOMUX_PAD(0x5C4, 0x248, 2, 0x7DC, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDIO__FEC_COL                     IOMUX_PAD(0x5C4, 0x248, 3, 0x800, 1, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDIO__RTC_CE_RTC_PS2              IOMUX_PAD(0x5C4, 0x248, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDIO__SDMA_DEBUG_BUS_DEVICE_3     IOMUX_PAD(0x5C4, 0x248, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDIO__EMI_EMI_DEBUG_49            IOMUX_PAD(0x5C4, 0x248, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_REF_CLK__FEC_TX_CLK               IOMUX_PAD(0x5C8, 0x24C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_REF_CLK__GPIO1_23                 IOMUX_PAD(0x5C8, 0x24C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_REF_CLK__ESAI1_FSR                        IOMUX_PAD(0x5C8, 0x24C, 2, 0x7CC, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_REF_CLK__SDMA_DEBUG_BUS_DEVICE_4  IOMUX_PAD(0x5C8, 0x24C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_REF_CLK__EMI_EMI_DEBUG_50         IOMUX_PAD(0x5C8, 0x24C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RX_ER__FEC_RX_ER                  IOMUX_PAD(0x5CC, 0x250, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RX_ER__GPIO1_24                   IOMUX_PAD(0x5CC, 0x250, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RX_ER__ESAI1_HCKR                 IOMUX_PAD(0x5CC, 0x250, 2, 0x7D4, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RX_ER__FEC_RX_CLK                 IOMUX_PAD(0x5CC, 0x250, 3, 0x808, 1, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RX_ER__RTC_CE_RTC_PS3             IOMUX_PAD(0x5CC, 0x250, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_CRS_DV__FEC_RX_DV                 IOMUX_PAD(0x5D0, 0x254, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_CRS_DV__GPIO1_25                  IOMUX_PAD(0x5D0, 0x254, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_CRS_DV__ESAI1_SCKT                        IOMUX_PAD(0x5D0, 0x254, 2, 0x7E0, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RXD1__FEC_RDATA_1                 IOMUX_PAD(0x5D4, 0x258, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RXD1__GPIO1_26                    IOMUX_PAD(0x5D4, 0x258, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RXD1__ESAI1_FST                   IOMUX_PAD(0x5D4, 0x258, 2, 0x7D0, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RXD1__MLB_MLBSIG                  IOMUX_PAD(0x5D4, 0x258, 3, 0x860, 1, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RXD1__RTC_CE_RTC_PS1              IOMUX_PAD(0x5D4, 0x258, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RXD0__FEC_RDATA_0                 IOMUX_PAD(0x5D8, 0x25C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RXD0__GPIO1_27                    IOMUX_PAD(0x5D8, 0x25C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RXD0__ESAI1_HCKT                  IOMUX_PAD(0x5D8, 0x25C, 2, 0x7D8, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_RXD0__OSC32k_32K_OUT              IOMUX_PAD(0x5D8, 0x25C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TX_EN__FEC_TX_EN                  IOMUX_PAD(0x5DC, 0x260, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TX_EN__GPIO1_28                   IOMUX_PAD(0x5DC, 0x260, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TX_EN__ESAI1_TX3_RX2              IOMUX_PAD(0x5DC, 0x260, 2, 0x7F0, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TXD1__FEC_TDATA_1                 IOMUX_PAD(0x5E0, 0x264, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TXD1__GPIO1_29                    IOMUX_PAD(0x5E0, 0x264, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TXD1__ESAI1_TX2_RX3               IOMUX_PAD(0x5E0, 0x264, 2, 0x7EC, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TXD1__MLB_MLBCLK                  IOMUX_PAD(0x5E0, 0x264, 3, 0x858, 1, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TXD1__RTC_CE_RTC_PRSC_CLK         IOMUX_PAD(0x5E0, 0x264, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TXD0__FEC_TDATA_0                 IOMUX_PAD(0x5E4, 0x268, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TXD0__GPIO1_30                    IOMUX_PAD(0x5E4, 0x268, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TXD0__ESAI1_TX4_RX1               IOMUX_PAD(0x5E4, 0x268, 2, 0x7F4, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_TXD0__USBPHY2_DATAOUT_0           IOMUX_PAD(0x5E4, 0x268, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDC__FEC_MDC                      IOMUX_PAD(0x5E8, 0x26C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDC__GPIO1_31                     IOMUX_PAD(0x5E8, 0x26C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDC__ESAI1_TX5_RX0                        IOMUX_PAD(0x5E8, 0x26C, 2, 0x7F8, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDC__MLB_MLBDAT                   IOMUX_PAD(0x5E8, 0x26C, 3, 0x85C, 1, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDC__RTC_CE_RTC_ALARM1_TRIG       IOMUX_PAD(0x5E8, 0x26C, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_FEC_MDC__USBPHY2_DATAOUT_1            IOMUX_PAD(0x5E8, 0x26C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DIOW__PATA_DIOW                  IOMUX_PAD(0x5F0, 0x270, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DIOW__GPIO6_17                   IOMUX_PAD(0x5F0, 0x270, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DIOW__UART1_TXD_MUX              IOMUX_PAD(0x5F0, 0x270, 3, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_DIOW__USBPHY2_DATAOUT_2          IOMUX_PAD(0x5F0, 0x270, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DMACK__PATA_DMACK                        IOMUX_PAD(0x5F4, 0x274, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DMACK__GPIO6_18                  IOMUX_PAD(0x5F4, 0x274, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DMACK__UART1_RXD_MUX             IOMUX_PAD(0x5F4, 0x274, 3, 0x878, 3, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_DMACK__USBPHY2_DATAOUT_3         IOMUX_PAD(0x5F4, 0x274, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DMARQ__PATA_DMARQ                        IOMUX_PAD(0x5F8, 0x278, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DMARQ__GPIO7_0                   IOMUX_PAD(0x5F8, 0x278, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DMARQ__UART2_TXD_MUX             IOMUX_PAD(0x5F8, 0x278, 3, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_DMARQ__CCM_CCM_OUT_0             IOMUX_PAD(0x5F8, 0x278, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DMARQ__USBPHY2_DATAOUT_4         IOMUX_PAD(0x5F8, 0x278, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_BUFFER_EN__PATA_BUFFER_EN                IOMUX_PAD(0x5FC, 0x27C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_BUFFER_EN__GPIO7_1               IOMUX_PAD(0x5FC, 0x27C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_BUFFER_EN__UART2_RXD_MUX         IOMUX_PAD(0x5FC, 0x27C, 3, 0x880, 3, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_BUFFER_EN__CCM_CCM_OUT_1         IOMUX_PAD(0x5FC, 0x27C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_BUFFER_EN__USBPHY2_DATAOUT_5     IOMUX_PAD(0x5FC, 0x27C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_INTRQ__PATA_INTRQ                        IOMUX_PAD(0x600, 0x280, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_INTRQ__GPIO7_2                   IOMUX_PAD(0x600, 0x280, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_INTRQ__UART2_CTS                 IOMUX_PAD(0x600, 0x280, 3, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_INTRQ__CAN1_TXCAN                        IOMUX_PAD(0x600, 0x280, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_INTRQ__CCM_CCM_OUT_2             IOMUX_PAD(0x600, 0x280, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_INTRQ__USBPHY2_DATAOUT_6         IOMUX_PAD(0x600, 0x280, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DIOR__PATA_DIOR                  IOMUX_PAD(0x604, 0x284, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DIOR__GPIO7_3                    IOMUX_PAD(0x604, 0x284, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DIOR__UART2_RTS                  IOMUX_PAD(0x604, 0x284, 3, 0x87C, 3, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_DIOR__CAN1_RXCAN                 IOMUX_PAD(0x604, 0x284, 4, 0x760, 1, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DIOR__USBPHY2_DATAOUT_7          IOMUX_PAD(0x604, 0x284, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_RESET_B__PATA_PATA_RESET_B       IOMUX_PAD(0x608, 0x288, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_RESET_B__GPIO7_4                 IOMUX_PAD(0x608, 0x288, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_RESET_B__ESDHC3_CMD              IOMUX_PAD(0x608, 0x288, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_RESET_B__UART1_CTS               IOMUX_PAD(0x608, 0x288, 3, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_RESET_B__CAN2_TXCAN              IOMUX_PAD(0x608, 0x288, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_RESET_B__USBPHY1_DATAOUT_0       IOMUX_PAD(0x608, 0x288, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_IORDY__PATA_IORDY                        IOMUX_PAD(0x60C, 0x28C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_IORDY__GPIO7_5                   IOMUX_PAD(0x60C, 0x28C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_IORDY__ESDHC3_CLK                        IOMUX_PAD(0x60C, 0x28C, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_IORDY__UART1_RTS                 IOMUX_PAD(0x60C, 0x28C, 3, 0x874, 3, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_IORDY__CAN2_RXCAN                        IOMUX_PAD(0x60C, 0x28C, 4, 0x764, 1, NO_PAD_CTRL)
-#define MX53_PAD_PATA_IORDY__USBPHY1_DATAOUT_1         IOMUX_PAD(0x60C, 0x28C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_0__PATA_DA_0                  IOMUX_PAD(0x610, 0x290, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_0__GPIO7_6                    IOMUX_PAD(0x610, 0x290, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_0__ESDHC3_RST                 IOMUX_PAD(0x610, 0x290, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_0__OWIRE_LINE                 IOMUX_PAD(0x610, 0x290, 4, 0x864, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_0__USBPHY1_DATAOUT_2          IOMUX_PAD(0x610, 0x290, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_1__PATA_DA_1                  IOMUX_PAD(0x614, 0x294, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_1__GPIO7_7                    IOMUX_PAD(0x614, 0x294, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_1__ESDHC4_CMD                 IOMUX_PAD(0x614, 0x294, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DA_1__UART3_CTS                  IOMUX_PAD(0x614, 0x294, 4, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_DA_1__USBPHY1_DATAOUT_3          IOMUX_PAD(0x614, 0x294, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_2__PATA_DA_2                  IOMUX_PAD(0x618, 0x298, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_2__GPIO7_8                    IOMUX_PAD(0x618, 0x298, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DA_2__ESDHC4_CLK                 IOMUX_PAD(0x618, 0x298, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DA_2__UART3_RTS                  IOMUX_PAD(0x618, 0x298, 4, 0x884, 5, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_DA_2__USBPHY1_DATAOUT_4          IOMUX_PAD(0x618, 0x298, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_CS_0__PATA_CS_0                  IOMUX_PAD(0x61C, 0x29C, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_CS_0__GPIO7_9                    IOMUX_PAD(0x61C, 0x29C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_CS_0__UART3_TXD_MUX              IOMUX_PAD(0x61C, 0x29C, 4, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_CS_0__USBPHY1_DATAOUT_5          IOMUX_PAD(0x61C, 0x29C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_CS_1__PATA_CS_1                  IOMUX_PAD(0x620, 0x2A0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_CS_1__GPIO7_10                   IOMUX_PAD(0x620, 0x2A0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_CS_1__UART3_RXD_MUX              IOMUX_PAD(0x620, 0x2A0, 4, 0x888, 3, MX53_UART_PAD_CTRL)
-#define MX53_PAD_PATA_CS_1__USBPHY1_DATAOUT_6          IOMUX_PAD(0x620, 0x2A0, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA0__PATA_DATA_0               IOMUX_PAD(0x628, 0x2A4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA0__GPIO2_0                   IOMUX_PAD(0x628, 0x2A4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA0__EMI_NANDF_D_0             IOMUX_PAD(0x628, 0x2A4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA0__ESDHC3_DAT4               IOMUX_PAD(0x628, 0x2A4, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA0__GPU3d_GPU_DEBUG_OUT_0     IOMUX_PAD(0x628, 0x2A4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA0__IPU_DIAG_BUS_0            IOMUX_PAD(0x628, 0x2A4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA0__USBPHY1_DATAOUT_7         IOMUX_PAD(0x628, 0x2A4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA1__PATA_DATA_1               IOMUX_PAD(0x62C, 0x2A8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA1__GPIO2_1                   IOMUX_PAD(0x62C, 0x2A8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA1__EMI_NANDF_D_1             IOMUX_PAD(0x62C, 0x2A8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA1__ESDHC3_DAT5               IOMUX_PAD(0x62C, 0x2A8, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA1__GPU3d_GPU_DEBUG_OUT_1     IOMUX_PAD(0x62C, 0x2A8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA1__IPU_DIAG_BUS_1            IOMUX_PAD(0x62C, 0x2A8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA2__PATA_DATA_2               IOMUX_PAD(0x630, 0x2AC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA2__GPIO2_2                   IOMUX_PAD(0x630, 0x2AC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA2__EMI_NANDF_D_2             IOMUX_PAD(0x630, 0x2AC, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA2__ESDHC3_DAT6               IOMUX_PAD(0x630, 0x2AC, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA2__GPU3d_GPU_DEBUG_OUT_2     IOMUX_PAD(0x630, 0x2AC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA2__IPU_DIAG_BUS_2            IOMUX_PAD(0x630, 0x2AC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA3__PATA_DATA_3               IOMUX_PAD(0x634, 0x2B0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA3__GPIO2_3                   IOMUX_PAD(0x634, 0x2B0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA3__EMI_NANDF_D_3             IOMUX_PAD(0x634, 0x2B0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA3__ESDHC3_DAT7               IOMUX_PAD(0x634, 0x2B0, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA3__GPU3d_GPU_DEBUG_OUT_3     IOMUX_PAD(0x634, 0x2B0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA3__IPU_DIAG_BUS_3            IOMUX_PAD(0x634, 0x2B0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA4__PATA_DATA_4               IOMUX_PAD(0x638, 0x2B4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA4__GPIO2_4                   IOMUX_PAD(0x638, 0x2B4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA4__EMI_NANDF_D_4             IOMUX_PAD(0x638, 0x2B4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA4__ESDHC4_DAT4               IOMUX_PAD(0x638, 0x2B4, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA4__GPU3d_GPU_DEBUG_OUT_4     IOMUX_PAD(0x638, 0x2B4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA4__IPU_DIAG_BUS_4            IOMUX_PAD(0x638, 0x2B4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA5__PATA_DATA_5               IOMUX_PAD(0x63C, 0x2B8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA5__GPIO2_5                   IOMUX_PAD(0x63C, 0x2B8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA5__EMI_NANDF_D_5             IOMUX_PAD(0x63C, 0x2B8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA5__ESDHC4_DAT5               IOMUX_PAD(0x63C, 0x2B8, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA5__GPU3d_GPU_DEBUG_OUT_5     IOMUX_PAD(0x63C, 0x2B8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA5__IPU_DIAG_BUS_5            IOMUX_PAD(0x63C, 0x2B8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA6__PATA_DATA_6               IOMUX_PAD(0x640, 0x2BC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA6__GPIO2_6                   IOMUX_PAD(0x640, 0x2BC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA6__EMI_NANDF_D_6             IOMUX_PAD(0x640, 0x2BC, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA6__ESDHC4_DAT6               IOMUX_PAD(0x640, 0x2BC, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA6__GPU3d_GPU_DEBUG_OUT_6     IOMUX_PAD(0x640, 0x2BC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA6__IPU_DIAG_BUS_6            IOMUX_PAD(0x640, 0x2BC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA7__PATA_DATA_7               IOMUX_PAD(0x644, 0x2C0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA7__GPIO2_7                   IOMUX_PAD(0x644, 0x2C0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA7__EMI_NANDF_D_7             IOMUX_PAD(0x644, 0x2C0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA7__ESDHC4_DAT7               IOMUX_PAD(0x644, 0x2C0, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA7__GPU3d_GPU_DEBUG_OUT_7     IOMUX_PAD(0x644, 0x2C0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA7__IPU_DIAG_BUS_7            IOMUX_PAD(0x644, 0x2C0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA8__PATA_DATA_8               IOMUX_PAD(0x648, 0x2C4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA8__GPIO2_8                   IOMUX_PAD(0x648, 0x2C4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA8__ESDHC1_DAT4               IOMUX_PAD(0x648, 0x2C4, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA8__EMI_NANDF_D_8             IOMUX_PAD(0x648, 0x2C4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA8__ESDHC3_DAT0               IOMUX_PAD(0x648, 0x2C4, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA8__GPU3d_GPU_DEBUG_OUT_8     IOMUX_PAD(0x648, 0x2C4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA8__IPU_DIAG_BUS_8            IOMUX_PAD(0x648, 0x2C4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA9__PATA_DATA_9               IOMUX_PAD(0x64C, 0x2C8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA9__GPIO2_9                   IOMUX_PAD(0x64C, 0x2C8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA9__ESDHC1_DAT5               IOMUX_PAD(0x64C, 0x2C8, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA9__EMI_NANDF_D_9             IOMUX_PAD(0x64C, 0x2C8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA9__ESDHC3_DAT1               IOMUX_PAD(0x64C, 0x2C8, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA9__GPU3d_GPU_DEBUG_OUT_9     IOMUX_PAD(0x64C, 0x2C8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA9__IPU_DIAG_BUS_9            IOMUX_PAD(0x64C, 0x2C8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA10__PATA_DATA_10             IOMUX_PAD(0x650, 0x2CC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA10__GPIO2_10                 IOMUX_PAD(0x650, 0x2CC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA10__ESDHC1_DAT6              IOMUX_PAD(0x650, 0x2CC, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA10__EMI_NANDF_D_10           IOMUX_PAD(0x650, 0x2CC, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA10__ESDHC3_DAT2              IOMUX_PAD(0x650, 0x2CC, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA10__GPU3d_GPU_DEBUG_OUT_10   IOMUX_PAD(0x650, 0x2CC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA10__IPU_DIAG_BUS_10          IOMUX_PAD(0x650, 0x2CC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA11__PATA_DATA_11             IOMUX_PAD(0x654, 0x2D0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA11__GPIO2_11                 IOMUX_PAD(0x654, 0x2D0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA11__ESDHC1_DAT7              IOMUX_PAD(0x654, 0x2D0, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA11__EMI_NANDF_D_11           IOMUX_PAD(0x654, 0x2D0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA11__ESDHC3_DAT3              IOMUX_PAD(0x654, 0x2D0, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA11__GPU3d_GPU_DEBUG_OUT_11   IOMUX_PAD(0x654, 0x2D0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA11__IPU_DIAG_BUS_11          IOMUX_PAD(0x654, 0x2D0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA12__PATA_DATA_12             IOMUX_PAD(0x658, 0x2D4, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA12__GPIO2_12                 IOMUX_PAD(0x658, 0x2D4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA12__ESDHC2_DAT4              IOMUX_PAD(0x658, 0x2D4, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA12__EMI_NANDF_D_12           IOMUX_PAD(0x658, 0x2D4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA12__ESDHC4_DAT0              IOMUX_PAD(0x658, 0x2D4, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA12__GPU3d_GPU_DEBUG_OUT_12   IOMUX_PAD(0x658, 0x2D4, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA12__IPU_DIAG_BUS_12          IOMUX_PAD(0x658, 0x2D4, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA13__PATA_DATA_13             IOMUX_PAD(0x65C, 0x2D8, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA13__GPIO2_13                 IOMUX_PAD(0x65C, 0x2D8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA13__ESDHC2_DAT5              IOMUX_PAD(0x65C, 0x2D8, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA13__EMI_NANDF_D_13           IOMUX_PAD(0x65C, 0x2D8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA13__ESDHC4_DAT1              IOMUX_PAD(0x65C, 0x2D8, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA13__GPU3d_GPU_DEBUG_OUT_13   IOMUX_PAD(0x65C, 0x2D8, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA13__IPU_DIAG_BUS_13          IOMUX_PAD(0x65C, 0x2D8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA14__PATA_DATA_14             IOMUX_PAD(0x660, 0x2DC, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA14__GPIO2_14                 IOMUX_PAD(0x660, 0x2DC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA14__ESDHC2_DAT6              IOMUX_PAD(0x660, 0x2DC, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA14__EMI_NANDF_D_14           IOMUX_PAD(0x660, 0x2DC, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA14__ESDHC4_DAT2              IOMUX_PAD(0x660, 0x2DC, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA14__GPU3d_GPU_DEBUG_OUT_14   IOMUX_PAD(0x660, 0x2DC, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA14__IPU_DIAG_BUS_14          IOMUX_PAD(0x660, 0x2DC, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA15__PATA_DATA_15             IOMUX_PAD(0x664, 0x2E0, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA15__GPIO2_15                 IOMUX_PAD(0x664, 0x2E0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA15__ESDHC2_DAT7              IOMUX_PAD(0x664, 0x2E0, 2, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA15__EMI_NANDF_D_15           IOMUX_PAD(0x664, 0x2E0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA15__ESDHC4_DAT3              IOMUX_PAD(0x664, 0x2E0, 4, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_PATA_DATA15__GPU3d_GPU_DEBUG_OUT_15   IOMUX_PAD(0x664, 0x2E0, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_PATA_DATA15__IPU_DIAG_BUS_15          IOMUX_PAD(0x664, 0x2E0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA0__ESDHC1_DAT0                        IOMUX_PAD(0x66C, 0x2E4, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD1_DATA0__GPIO1_16                   IOMUX_PAD(0x66C, 0x2E4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA0__GPT_CAPIN1                 IOMUX_PAD(0x66C, 0x2E4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA0__CSPI_MISO                  IOMUX_PAD(0x66C, 0x2E4, 5, 0x784, 2, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA0__CCM_PLL3_BYP               IOMUX_PAD(0x66C, 0x2E4, 7, 0x778, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA1__ESDHC1_DAT1                        IOMUX_PAD(0x670, 0x2E8, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD1_DATA1__GPIO1_17                   IOMUX_PAD(0x670, 0x2E8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA1__GPT_CAPIN2                 IOMUX_PAD(0x670, 0x2E8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA1__CSPI_SS0                   IOMUX_PAD(0x670, 0x2E8, 5, 0x78C, 3, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA1__CCM_PLL4_BYP               IOMUX_PAD(0x670, 0x2E8, 7, 0x77C, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD1_CMD__ESDHC1_CMD                   IOMUX_PAD(0x674, 0x2EC, 0 | IOMUX_CONFIG_SION, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD1_CMD__GPIO1_18                     IOMUX_PAD(0x674, 0x2EC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_CMD__GPT_CMPOUT1                  IOMUX_PAD(0x674, 0x2EC, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_CMD__CSPI_MOSI                    IOMUX_PAD(0x674, 0x2EC, 5, 0x788, 2, NO_PAD_CTRL)
-#define MX53_PAD_SD1_CMD__CCM_PLL1_BYP                 IOMUX_PAD(0x674, 0x2EC, 7, 0x770, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA2__ESDHC1_DAT2                        IOMUX_PAD(0x678, 0x2F0, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD1_DATA2__GPIO1_19                   IOMUX_PAD(0x678, 0x2F0, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA2__GPT_CMPOUT2                        IOMUX_PAD(0x678, 0x2F0, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA2__PWM2_PWMO                  IOMUX_PAD(0x678, 0x2F0, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA2__WDOG1_WDOG_B               IOMUX_PAD(0x678, 0x2F0, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA2__CSPI_SS1                   IOMUX_PAD(0x678, 0x2F0, 5, 0x790, 2, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA2__WDOG1_WDOG_RST_B_DEB       IOMUX_PAD(0x678, 0x2F0, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA2__CCM_PLL2_BYP               IOMUX_PAD(0x678, 0x2F0, 7, 0x774, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_CLK__ESDHC1_CLK                   IOMUX_PAD(0x67C, 0x2F4, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD1_CLK__GPIO1_20                     IOMUX_PAD(0x67C, 0x2F4, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_CLK__OSC32k_32K_OUT               IOMUX_PAD(0x67C, 0x2F4, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_CLK__GPT_CLKIN                    IOMUX_PAD(0x67C, 0x2F4, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_CLK__CSPI_SCLK                    IOMUX_PAD(0x67C, 0x2F4, 5, 0x780, 2, NO_PAD_CTRL)
-#define MX53_PAD_SD1_CLK__SATA_PHY_DTB_0               IOMUX_PAD(0x67C, 0x2F4, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA3__ESDHC1_DAT3                        IOMUX_PAD(0x680, 0x2F8, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD1_DATA3__GPIO1_21                   IOMUX_PAD(0x680, 0x2F8, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA3__GPT_CMPOUT3                        IOMUX_PAD(0x680, 0x2F8, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA3__PWM1_PWMO                  IOMUX_PAD(0x680, 0x2F8, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA3__WDOG2_WDOG_B               IOMUX_PAD(0x680, 0x2F8, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA3__CSPI_SS2                   IOMUX_PAD(0x680, 0x2F8, 5, 0x794, 2, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA3__WDOG2_WDOG_RST_B_DEB       IOMUX_PAD(0x680, 0x2F8, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD1_DATA3__SATA_PHY_DTB_1             IOMUX_PAD(0x680, 0x2F8, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CLK__ESDHC2_CLK                   IOMUX_PAD(0x688, 0x2FC, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD2_CLK__GPIO1_10                     IOMUX_PAD(0x688, 0x2FC, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CLK__KPP_COL_5                    IOMUX_PAD(0x688, 0x2FC, 2, 0x840, 2, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CLK__AUDMUX_AUD4_RXFS             IOMUX_PAD(0x688, 0x2FC, 3, 0x73C, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CLK__CSPI_SCLK                    IOMUX_PAD(0x688, 0x2FC, 5, 0x780, 3, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CLK__SCC_RANDOM_V                 IOMUX_PAD(0x688, 0x2FC, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CMD__ESDHC2_CMD                   IOMUX_PAD(0x68C, 0x300, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD2_CMD__GPIO1_11                     IOMUX_PAD(0x68C, 0x300, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CMD__KPP_ROW_5                    IOMUX_PAD(0x68C, 0x300, 2, 0x84C, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CMD__AUDMUX_AUD4_RXC              IOMUX_PAD(0x68C, 0x300, 3, 0x738, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CMD__CSPI_MOSI                    IOMUX_PAD(0x68C, 0x300, 5, 0x788, 3, NO_PAD_CTRL)
-#define MX53_PAD_SD2_CMD__SCC_RANDOM                   IOMUX_PAD(0x68C, 0x300, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA3__ESDHC2_DAT3                        IOMUX_PAD(0x690, 0x304, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD2_DATA3__GPIO1_12                   IOMUX_PAD(0x690, 0x304, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA3__KPP_COL_6                  IOMUX_PAD(0x690, 0x304, 2, 0x844, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA3__AUDMUX_AUD4_TXC            IOMUX_PAD(0x690, 0x304, 3, 0x740, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA3__CSPI_SS2                   IOMUX_PAD(0x690, 0x304, 5, 0x794, 3, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA3__SJC_DONE                   IOMUX_PAD(0x690, 0x304, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA2__ESDHC2_DAT2                        IOMUX_PAD(0x694, 0x308, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD2_DATA2__GPIO1_13                   IOMUX_PAD(0x694, 0x308, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA2__KPP_ROW_6                  IOMUX_PAD(0x694, 0x308, 2, 0x850, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA2__AUDMUX_AUD4_TXD            IOMUX_PAD(0x694, 0x308, 3, 0x734, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA2__CSPI_SS1                   IOMUX_PAD(0x694, 0x308, 5, 0x790, 3, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA2__SJC_FAIL                   IOMUX_PAD(0x694, 0x308, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA1__ESDHC2_DAT1                        IOMUX_PAD(0x698, 0x30C, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD2_DATA1__GPIO1_14                   IOMUX_PAD(0x698, 0x30C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA1__KPP_COL_7                  IOMUX_PAD(0x698, 0x30C, 2, 0x848, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA1__AUDMUX_AUD4_TXFS           IOMUX_PAD(0x698, 0x30C, 3, 0x744, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA1__CSPI_SS0                   IOMUX_PAD(0x698, 0x30C, 5, 0x78C, 4, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA1__RTIC_SEC_VIO               IOMUX_PAD(0x698, 0x30C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA0__ESDHC2_DAT0                        IOMUX_PAD(0x69C, 0x310, 0, __NA_, 0, MX53_SDHC_PAD_CTRL)
-#define MX53_PAD_SD2_DATA0__GPIO1_15                   IOMUX_PAD(0x69C, 0x310, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA0__KPP_ROW_7                  IOMUX_PAD(0x69C, 0x310, 2, 0x854, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA0__AUDMUX_AUD4_RXD            IOMUX_PAD(0x69C, 0x310, 3, 0x730, 1, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA0__CSPI_MISO                  IOMUX_PAD(0x69C, 0x310, 5, 0x784, 3, NO_PAD_CTRL)
-#define MX53_PAD_SD2_DATA0__RTIC_DONE_INT              IOMUX_PAD(0x69C, 0x310, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_0__CCM_CLKO                      IOMUX_PAD(0x6A4, 0x314, 0, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_0__GPIO1_0                       IOMUX_PAD(0x6A4, 0x314, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_0__KPP_COL_5                     IOMUX_PAD(0x6A4, 0x314, 2, 0x840, 3, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_0__CCM_SSI_EXT1_CLK              IOMUX_PAD(0x6A4, 0x314, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_0__EPIT1_EPITO                   IOMUX_PAD(0x6A4, 0x314, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_0__SRTC_ALARM_DEB                        IOMUX_PAD(0x6A4, 0x314, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_0__USBOH3_USBH1_PWR              IOMUX_PAD(0x6A4, 0x314, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_0__CSU_TD                                IOMUX_PAD(0x6A4, 0x314, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_1__ESAI1_SCKR                    IOMUX_PAD(0x6A8, 0x318, 0, 0x7DC, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_1__GPIO1_1                       IOMUX_PAD(0x6A8, 0x318, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_1__KPP_ROW_5                     IOMUX_PAD(0x6A8, 0x318, 2, 0x84C, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_1__CCM_SSI_EXT2_CLK              IOMUX_PAD(0x6A8, 0x318, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_1__PWM2_PWMO                     IOMUX_PAD(0x6A8, 0x318, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_1__WDOG2_WDOG_B                  IOMUX_PAD(0x6A8, 0x318, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_1__ESDHC1_CD                     IOMUX_PAD(0x6A8, 0x318, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_1__SRC_TESTER_ACK                        IOMUX_PAD(0x6A8, 0x318, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_9__ESAI1_FSR                     IOMUX_PAD(0x6AC, 0x31C, 0, 0x7CC, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_9__GPIO1_9                       IOMUX_PAD(0x6AC, 0x31C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_9__KPP_COL_6                     IOMUX_PAD(0x6AC, 0x31C, 2, 0x844, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_9__CCM_REF_EN_B                  IOMUX_PAD(0x6AC, 0x31C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_9__PWM1_PWMO                     IOMUX_PAD(0x6AC, 0x31C, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_9__WDOG1_WDOG_B                  IOMUX_PAD(0x6AC, 0x31C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_9__ESDHC1_WP                     IOMUX_PAD(0x6AC, 0x31C, 6, 0x7FC, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_9__SCC_FAIL_STATE                        IOMUX_PAD(0x6AC, 0x31C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_3__ESAI1_HCKR                    IOMUX_PAD(0x6B0, 0x320, 0, 0x7D4, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_3__GPIO1_3                       IOMUX_PAD(0x6B0, 0x320, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_3__I2C3_SCL                      IOMUX_PAD(0x6B0, 0x320, 2 | IOMUX_CONFIG_SION, 0x824, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_3__DPLLIP1_TOG_EN                        IOMUX_PAD(0x6B0, 0x320, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_3__CCM_CLKO2                     IOMUX_PAD(0x6B0, 0x320, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_3__OBSERVE_MUX_OBSRV_INT_OUT0    IOMUX_PAD(0x6B0, 0x320, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_3__USBOH3_USBH1_OC               IOMUX_PAD(0x6B0, 0x320, 6, 0x8A0, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_3__MLB_MLBCLK                    IOMUX_PAD(0x6B0, 0x320, 7, 0x858, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_6__ESAI1_SCKT                    IOMUX_PAD(0x6B4, 0x324, 0, 0x7E0, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_6__GPIO1_6                       IOMUX_PAD(0x6B4, 0x324, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_6__I2C3_SDA                      IOMUX_PAD(0x6B4, 0x324, 2 | IOMUX_CONFIG_SION, 0x828, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_6__CCM_CCM_OUT_0                 IOMUX_PAD(0x6B4, 0x324, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_6__CSU_CSU_INT_DEB               IOMUX_PAD(0x6B4, 0x324, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_6__OBSERVE_MUX_OBSRV_INT_OUT1    IOMUX_PAD(0x6B4, 0x324, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_6__ESDHC2_LCTL                   IOMUX_PAD(0x6B4, 0x324, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_6__MLB_MLBSIG                    IOMUX_PAD(0x6B4, 0x324, 7, 0x860, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_2__ESAI1_FST                     IOMUX_PAD(0x6B8, 0x328, 0, 0x7D0, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_2__GPIO1_2                       IOMUX_PAD(0x6B8, 0x328, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_2__KPP_ROW_6                     IOMUX_PAD(0x6B8, 0x328, 2, 0x850, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_2__CCM_CCM_OUT_1                 IOMUX_PAD(0x6B8, 0x328, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_2__CSU_CSU_ALARM_AUT_0           IOMUX_PAD(0x6B8, 0x328, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_2__OBSERVE_MUX_OBSRV_INT_OUT2    IOMUX_PAD(0x6B8, 0x328, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_2__ESDHC2_WP                     IOMUX_PAD(0x6B8, 0x328, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_2__MLB_MLBDAT                    IOMUX_PAD(0x6B8, 0x328, 7, 0x85C, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_4__ESAI1_HCKT                    IOMUX_PAD(0x6BC, 0x32C, 0, 0x7D8, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_4__GPIO1_4                       IOMUX_PAD(0x6BC, 0x32C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_4__KPP_COL_7                     IOMUX_PAD(0x6BC, 0x32C, 2, 0x848, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_4__CCM_CCM_OUT_2                 IOMUX_PAD(0x6BC, 0x32C, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_4__CSU_CSU_ALARM_AUT_1           IOMUX_PAD(0x6BC, 0x32C, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_4__OBSERVE_MUX_OBSRV_INT_OUT3    IOMUX_PAD(0x6BC, 0x32C, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_4__ESDHC2_CD                     IOMUX_PAD(0x6BC, 0x32C, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_4__SCC_SEC_STATE                 IOMUX_PAD(0x6BC, 0x32C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_5__ESAI1_TX2_RX3                 IOMUX_PAD(0x6C0, 0x330, 0, 0x7EC, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_5__GPIO1_5                       IOMUX_PAD(0x6C0, 0x330, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_5__KPP_ROW_7                     IOMUX_PAD(0x6C0, 0x330, 2, 0x854, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_5__CCM_CLKO                      IOMUX_PAD(0x6C0, 0x330, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_5__CSU_CSU_ALARM_AUT_2           IOMUX_PAD(0x6C0, 0x330, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_5__OBSERVE_MUX_OBSRV_INT_OUT4    IOMUX_PAD(0x6C0, 0x330, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_5__I2C3_SCL                      IOMUX_PAD(0x6C0, 0x330, 6 | IOMUX_CONFIG_SION, 0x824, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_5__CCM_PLL1_BYP                  IOMUX_PAD(0x6C0, 0x330, 7, 0x770, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_7__ESAI1_TX4_RX1                 IOMUX_PAD(0x6C4, 0x334, 0, 0x7F4, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_7__GPIO1_7                       IOMUX_PAD(0x6C4, 0x334, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_7__EPIT1_EPITO                   IOMUX_PAD(0x6C4, 0x334, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_7__CAN1_TXCAN                    IOMUX_PAD(0x6C4, 0x334, 3, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_7__UART2_TXD_MUX                 IOMUX_PAD(0x6C4, 0x334, 4, __NA_, 0, MX53_UART_PAD_CTRL)
-#define MX53_PAD_GPIO_7__FIRI_RXD                      IOMUX_PAD(0x6C4, 0x334, 5, 0x80C, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_7__SPDIF_PLOCK                   IOMUX_PAD(0x6C4, 0x334, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_7__CCM_PLL2_BYP                  IOMUX_PAD(0x6C4, 0x334, 7, 0x774, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_8__ESAI1_TX5_RX0                 IOMUX_PAD(0x6C8, 0x338, 0, 0x7F8, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_8__GPIO1_8                       IOMUX_PAD(0x6C8, 0x338, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_8__EPIT2_EPITO                   IOMUX_PAD(0x6C8, 0x338, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_8__CAN1_RXCAN                    IOMUX_PAD(0x6C8, 0x338, 3, 0x760, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_8__UART2_RXD_MUX                 IOMUX_PAD(0x6C8, 0x338, 4, 0x880, 5, MX53_UART_PAD_CTRL)
-#define MX53_PAD_GPIO_8__FIRI_TXD                      IOMUX_PAD(0x6C8, 0x338, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_8__SPDIF_SRCLK                   IOMUX_PAD(0x6C8, 0x338, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_8__CCM_PLL3_BYP                  IOMUX_PAD(0x6C8, 0x338, 7, 0x778, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_16__ESAI1_TX3_RX2                        IOMUX_PAD(0x6CC, 0x33C, 0, 0x7F0, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_16__GPIO7_11                     IOMUX_PAD(0x6CC, 0x33C, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_16__TZIC_PWRFAIL_INT             IOMUX_PAD(0x6CC, 0x33C, 2, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_16__RTC_CE_RTC_EXT_TRIG1         IOMUX_PAD(0x6CC, 0x33C, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_16__SPDIF_IN1                    IOMUX_PAD(0x6CC, 0x33C, 5, 0x870, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_16__I2C3_SDA                     IOMUX_PAD(0x6CC, 0x33C, 6 | IOMUX_CONFIG_SION, 0x828, 2, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_16__SJC_DE_B                     IOMUX_PAD(0x6CC, 0x33C, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_17__ESAI1_TX0                    IOMUX_PAD(0x6D0, 0x340, 0, 0x7E4, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_17__GPIO7_12                     IOMUX_PAD(0x6D0, 0x340, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_17__SDMA_EXT_EVENT_0             IOMUX_PAD(0x6D0, 0x340, 2, 0x868, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_17__GPC_PMIC_RDY                 IOMUX_PAD(0x6D0, 0x340, 3, 0x810, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_17__RTC_CE_RTC_FSV_TRIG          IOMUX_PAD(0x6D0, 0x340, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_17__SPDIF_OUT1                   IOMUX_PAD(0x6D0, 0x340, 5, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_17__IPU_SNOOP2                   IOMUX_PAD(0x6D0, 0x340, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_17__SJC_JTAG_ACT                 IOMUX_PAD(0x6D0, 0x340, 7, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_18__ESAI1_TX1                    IOMUX_PAD(0x6D4, 0x344, 0, 0x7E8, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_18__GPIO7_13                     IOMUX_PAD(0x6D4, 0x344, 1, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_18__SDMA_EXT_EVENT_1             IOMUX_PAD(0x6D4, 0x344, 2, 0x86C, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_18__OWIRE_LINE                   IOMUX_PAD(0x6D4, 0x344, 3, 0x864, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_18__RTC_CE_RTC_ALARM2_TRIG       IOMUX_PAD(0x6D4, 0x344, 4, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_18__CCM_ASRC_EXT_CLK             IOMUX_PAD(0x6D4, 0x344, 5, 0x768, 1, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_18__ESDHC1_LCTL                  IOMUX_PAD(0x6D4, 0x344, 6, __NA_, 0, NO_PAD_CTRL)
-#define MX53_PAD_GPIO_18__SRC_SYSTEM_RST               IOMUX_PAD(0x6D4, 0x344, 7, __NA_, 0, NO_PAD_CTRL)
-
-#endif /* __MACH_IOMUX_MX53_H__ */
index 3c080a3..7ded6f1 100644 (file)
@@ -23,7 +23,6 @@
 #ifndef __MACH_MX2_CAM_H_
 #define __MACH_MX2_CAM_H_
 
-#define MX2_CAMERA_SWAP16              (1 << 0)
 #define MX2_CAMERA_EXT_VSYNC           (1 << 1)
 #define MX2_CAMERA_CCIR                        (1 << 2)
 #define MX2_CAMERA_CCIR_INTERLACE      (1 << 3)
@@ -31,7 +30,6 @@
 #define MX2_CAMERA_GATED_CLOCK         (1 << 5)
 #define MX2_CAMERA_INV_DATA            (1 << 6)
 #define MX2_CAMERA_PCLK_SAMPLE_RISING  (1 << 7)
-#define MX2_CAMERA_PACK_DIR_MSB                (1 << 8)
 
 /**
  * struct mx2_camera_platform_data - optional platform data for mx2_camera
index 8397a2d..a8b93c5 100644 (file)
                .global imx_ssi_fiq_rx_buffer
                .global imx_ssi_fiq_tx_buffer
 
+/*
+ * imx_ssi_fiq_start is _intentionally_ not marked as a function symbol
+ * using ENDPROC().  imx_ssi_fiq_start and imx_ssi_fiq_end are used to
+ * mark the function body so that it can be copied to the FIQ vector in
+ * the vectors page.  imx_ssi_fiq_start should only be called as the result
+ * of an FIQ: calling it directly will not work.
+ */
 imx_ssi_fiq_start:
-               ldr r12, imx_ssi_fiq_base
+               ldr r12, .L_imx_ssi_fiq_base
 
                /* TX */
-               ldr r11, imx_ssi_fiq_tx_buffer
+               ldr r13, .L_imx_ssi_fiq_tx_buffer
 
                /* shall we send? */
-               ldr r13, [r12, #SSI_SIER]
-               tst r13, #SSI_SIER_TFE0_EN
+               ldr r11, [r12, #SSI_SIER]
+               tst r11, #SSI_SIER_TFE0_EN
                beq 1f
 
                /* TX FIFO empty? */
-               ldr r13, [r12, #SSI_SISR]
-               tst r13, #SSI_SISR_TFE0
+               ldr r11, [r12, #SSI_SISR]
+               tst r11, #SSI_SISR_TFE0
                beq 1f
 
                mov r10, #0x10000
                sub r10, #1
                and r10, r10, r8        /* r10: current buffer offset */
 
-               add r11, r11, r10
+               add r13, r13, r10
 
-               ldrh r13, [r11]
-               strh r13, [r12, #SSI_STX0]
+               ldrh r11, [r13]
+               strh r11, [r12, #SSI_STX0]
 
-               ldrh r13, [r11, #2]
-               strh r13, [r12, #SSI_STX0]
+               ldrh r11, [r13, #2]
+               strh r11, [r12, #SSI_STX0]
 
-               ldrh r13, [r11, #4]
-               strh r13, [r12, #SSI_STX0]
+               ldrh r11, [r13, #4]
+               strh r11, [r12, #SSI_STX0]
 
-               ldrh r13, [r11, #6]
-               strh r13, [r12, #SSI_STX0]
+               ldrh r11, [r13, #6]
+               strh r11, [r12, #SSI_STX0]
 
                add r10, #8
-               lsr r13, r8, #16        /* r13: buffer size */
-               cmp r10, r13
-               lslgt r8, r13, #16
+               lsr r11, r8, #16        /* r11: buffer size */
+               cmp r10, r11
+               lslgt r8, r11, #16
                addle r8, #8
 1:
                /* RX */
 
                /* shall we receive? */
-               ldr r13, [r12, #SSI_SIER]
-               tst r13, #SSI_SIER_RFF0_EN
+               ldr r11, [r12, #SSI_SIER]
+               tst r11, #SSI_SIER_RFF0_EN
                beq 1f
 
                /* RX FIFO full? */
-               ldr r13, [r12, #SSI_SISR]
-               tst r13, #SSI_SISR_RFF0
+               ldr r11, [r12, #SSI_SISR]
+               tst r11, #SSI_SISR_RFF0
                beq 1f
 
-               ldr r11, imx_ssi_fiq_rx_buffer
+               ldr r13, .L_imx_ssi_fiq_rx_buffer
 
                mov r10, #0x10000
                sub r10, #1
                and r10, r10, r9        /* r10: current buffer offset */
 
-               add r11, r11, r10
+               add r13, r13, r10
 
-               ldr r13, [r12, #SSI_SACNT]
-               tst r13, #SSI_SACNT_AC97EN
+               ldr r11, [r12, #SSI_SACNT]
+               tst r11, #SSI_SACNT_AC97EN
 
-               ldr r13, [r12, #SSI_SRX0]
-               strh r13, [r11]
+               ldr r11, [r12, #SSI_SRX0]
+               strh r11, [r13]
 
-               ldr r13, [r12, #SSI_SRX0]
-               strh r13, [r11, #2]
+               ldr r11, [r12, #SSI_SRX0]
+               strh r11, [r13, #2]
 
                /* dummy read to skip slot 12 */
-               ldrne r13, [r12, #SSI_SRX0]
+               ldrne r11, [r12, #SSI_SRX0]
 
-               ldr r13, [r12, #SSI_SRX0]
-               strh r13, [r11, #4]
+               ldr r11, [r12, #SSI_SRX0]
+               strh r11, [r13, #4]
 
-               ldr r13, [r12, #SSI_SRX0]
-               strh r13, [r11, #6]
+               ldr r11, [r12, #SSI_SRX0]
+               strh r11, [r13, #6]
 
                /* dummy read to skip slot 12 */
-               ldrne r13, [r12, #SSI_SRX0]
+               ldrne r11, [r12, #SSI_SRX0]
 
                add r10, #8
-               lsr r13, r9, #16        /* r13: buffer size */
-               cmp r10, r13
-               lslgt r9, r13, #16
+               lsr r11, r9, #16        /* r11: buffer size */
+               cmp r10, r11
+               lslgt r9, r11, #16
                addle r9, #8
 
 1:
@@ -126,11 +133,15 @@ imx_ssi_fiq_start:
                subs    pc, lr, #4
 
                .align
+.L_imx_ssi_fiq_base:
 imx_ssi_fiq_base:
                .word 0x0
+.L_imx_ssi_fiq_rx_buffer:
 imx_ssi_fiq_rx_buffer:
                .word 0x0
+.L_imx_ssi_fiq_tx_buffer:
 imx_ssi_fiq_tx_buffer:
                .word 0x0
+.L_imx_ssi_fiq_end:
 imx_ssi_fiq_end:
 
index 1996c3e..3da78cf 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/io.h>
 #include <linux/err.h>
 #include <linux/delay.h>
-#include <linux/module.h>
 
 #include <mach/hardware.h>
 #include <mach/common.h>
@@ -29,9 +28,6 @@
 #include <asm/proc-fns.h>
 #include <asm/mach-types.h>
 
-void __iomem *(*imx_ioremap)(unsigned long, size_t, unsigned int) = NULL;
-EXPORT_SYMBOL_GPL(imx_ioremap);
-
 static void __iomem *wdog_base;
 
 /*
index dd36eba..d15a4a6 100644 (file)
@@ -25,6 +25,7 @@ config ARCH_OMAP2PLUS
        bool "TI OMAP2/3/4"
        select CLKDEV_LOOKUP
        select GENERIC_IRQ_CHIP
+       select SPARSE_IRQ
        select OMAP_DM_TIMER
        select USE_OF
        select PROC_DEVICETREE if PROC_FS
index 961bf85..dacaee0 100644 (file)
@@ -3,8 +3,7 @@
 #
 
 # Common support
-obj-y := common.o sram.o clock.o devices.o dma.o mux.o \
-        fb.o counter_32k.o
+obj-y := common.o sram.o clock.o dma.o fb.o counter_32k.o
 obj-m :=
 obj-n :=
 obj-  :=
index 89a3723..111315a 100644 (file)
 #include <linux/dma-mapping.h>
 
 #include <plat/common.h>
-#include <plat/board.h>
 #include <plat/vram.h>
-#include <plat/dsp.h>
+#include <linux/platform_data/dsp-omap.h>
 #include <plat/dma.h>
 
 #include <plat/omap-secure.h>
 
-
-#define NO_LENGTH_CHECK 0xffffffff
-
-struct omap_board_config_kernel *omap_board_config __initdata;
-int omap_board_config_size;
-
-static const void *__init get_config(u16 tag, size_t len,
-               int skip, size_t *len_out)
-{
-       struct omap_board_config_kernel *kinfo = NULL;
-       int i;
-
-       /* Try to find the config from the board-specific structures
-        * in the kernel. */
-       for (i = 0; i < omap_board_config_size; i++) {
-               if (omap_board_config[i].tag == tag) {
-                       if (skip == 0) {
-                               kinfo = &omap_board_config[i];
-                               break;
-                       } else {
-                               skip--;
-                       }
-               }
-       }
-       if (kinfo == NULL)
-               return NULL;
-       return kinfo->data;
-}
-
-const void *__init __omap_get_config(u16 tag, size_t len, int nr)
-{
-        return get_config(tag, len, nr, NULL);
-}
-
-const void *__init omap_get_var_config(u16 tag, size_t *len)
-{
-        return get_config(tag, NO_LENGTH_CHECK, 0, len);
-}
-
 void __init omap_reserve(void)
 {
        omap_vram_reserve_sdram_memblock();
index dbf1e03..2e826f1 100644 (file)
 #include <asm/mach/time.h>
 #include <asm/sched_clock.h>
 
-#include <plat/hardware.h>
 #include <plat/common.h>
-#include <plat/board.h>
-
 #include <plat/clock.h>
 
 /* OMAP2_32KSYNCNT_CR_OFF: offset of 32ksync counter register */
index caa1f7b..c7a4c09 100644 (file)
@@ -17,9 +17,6 @@
 
 #include <mach/hardware.h>
 
-#include <plat/board.h>
-
-
 /* Many OMAP development platforms reuse the same "debug board"; these
  * platforms include H2, H3, H4, and Perseus2.
  */
index 39407cb..195aaae 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/platform_device.h>
 #include <linux/leds.h>
 #include <linux/io.h>
+#include <linux/platform_data/gpio-omap.h>
 
 #include <mach/hardware.h>
 #include <asm/leds.h>
diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c
deleted file mode 100644 (file)
index 1cba927..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * linux/arch/arm/plat-omap/devices.c
- *
- * Common platform device setup/initialization for OMAP1 and OMAP2
- *
- * 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 <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/io.h>
-#include <linux/slab.h>
-#include <linux/memblock.h>
-
-#include <mach/hardware.h>
-#include <asm/mach-types.h>
-#include <asm/mach/map.h>
-#include <asm/memblock.h>
-
-#include <plat/tc.h>
-#include <plat/board.h>
-#include <plat/mmc.h>
-#include <plat/menelaus.h>
-#include <plat/omap44xx.h>
-
-/*-------------------------------------------------------------------------*/
-
-#if defined(CONFIG_HW_RANDOM_OMAP) || defined(CONFIG_HW_RANDOM_OMAP_MODULE)
-
-#ifdef CONFIG_ARCH_OMAP2
-#define        OMAP_RNG_BASE           0x480A0000
-#else
-#define        OMAP_RNG_BASE           0xfffe5000
-#endif
-
-static struct resource rng_resources[] = {
-       {
-               .start          = OMAP_RNG_BASE,
-               .end            = OMAP_RNG_BASE + 0x4f,
-               .flags          = IORESOURCE_MEM,
-       },
-};
-
-static struct platform_device omap_rng_device = {
-       .name           = "omap_rng",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(rng_resources),
-       .resource       = rng_resources,
-};
-
-static void omap_init_rng(void)
-{
-       (void) platform_device_register(&omap_rng_device);
-}
-#else
-static inline void omap_init_rng(void) {}
-#endif
-
-/*
- * This gets called after board-specific INIT_MACHINE, and initializes most
- * on-chip peripherals accessible on this board (except for few like USB):
- *
- *  (a) Does any "standard config" pin muxing needed.  Board-specific
- *     code will have muxed GPIO pins and done "nonstandard" setup;
- *     that code could live in the boot loader.
- *  (b) Populating board-specific platform_data with the data drivers
- *     rely on to handle wiring variations.
- *  (c) Creating platform devices as meaningful on this board and
- *     with this kernel configuration.
- *
- * Claiming GPIOs, and setting their direction and initial values, is the
- * responsibility of the device drivers.  So is responding to probe().
- *
- * Board-specific knowledge like creating devices or pin setup is to be
- * kept out of drivers as much as possible.  In particular, pin setup
- * may be handled by the boot loader, and drivers should expect it will
- * normally have been done by the time they're probed.
- */
-static int __init omap_init_devices(void)
-{
-       /* please keep these calls, and their implementations above,
-        * in alphabetical order so they're easier to sort through.
-        */
-       omap_init_rng();
-       return 0;
-}
-arch_initcall(omap_init_devices);
index 7fe6267..c76ed8b 100644 (file)
@@ -36,9 +36,8 @@
 #include <linux/slab.h>
 #include <linux/delay.h>
 
-#include <mach/hardware.h>
+#include <plat/cpu.h>
 #include <plat/dma.h>
-
 #include <plat/tc.h>
 
 /*
@@ -969,8 +968,7 @@ void omap_stop_dma(int lch)
                        l = p->dma_read(CCR, lch);
                }
                if (i >= 100)
-                       printk(KERN_ERR "DMA drain did not complete on "
-                                       "lch %d\n", lch);
+                       pr_err("DMA drain did not complete on lch %d\n", lch);
                /* Restore OCP_SYSCONFIG */
                p->dma_write(sys_cf, OCP_SYSCONFIG, lch);
        } else {
@@ -1154,8 +1152,7 @@ void omap_dma_link_lch(int lch_head, int lch_queue)
 
        if ((dma_chan[lch_head].dev_id == -1) ||
            (dma_chan[lch_queue].dev_id == -1)) {
-               printk(KERN_ERR "omap_dma: trying to link "
-                      "non requested channels\n");
+               pr_err("omap_dma: trying to link non requested channels\n");
                dump_stack();
        }
 
@@ -1181,15 +1178,13 @@ void omap_dma_unlink_lch(int lch_head, int lch_queue)
 
        if (dma_chan[lch_head].next_lch != lch_queue ||
            dma_chan[lch_head].next_lch == -1) {
-               printk(KERN_ERR "omap_dma: trying to unlink "
-                      "non linked channels\n");
+               pr_err("omap_dma: trying to unlink non linked channels\n");
                dump_stack();
        }
 
        if ((dma_chan[lch_head].flags & OMAP_DMA_ACTIVE) ||
            (dma_chan[lch_queue].flags & OMAP_DMA_ACTIVE)) {
-               printk(KERN_ERR "omap_dma: You need to stop the DMA channels "
-                      "before unlinking\n");
+               pr_err("omap_dma: You need to stop the DMA channels before unlinking\n");
                dump_stack();
        }
 
@@ -1831,16 +1826,15 @@ static int omap1_dma_handle_ch(int ch)
        if ((csr & 0x3f) == 0)
                return 0;
        if (unlikely(dma_chan[ch].dev_id == -1)) {
-               printk(KERN_WARNING "Spurious interrupt from DMA channel "
-                      "%d (CSR %04x)\n", ch, csr);
+               pr_warn("Spurious interrupt from DMA channel %d (CSR %04x)\n",
+                       ch, csr);
                return 0;
        }
        if (unlikely(csr & OMAP1_DMA_TOUT_IRQ))
-               printk(KERN_WARNING "DMA timeout with device %d\n",
-                      dma_chan[ch].dev_id);
+               pr_warn("DMA timeout with device %d\n", dma_chan[ch].dev_id);
        if (unlikely(csr & OMAP_DMA_DROP_IRQ))
-               printk(KERN_WARNING "DMA synchronization event drop occurred "
-                      "with device %d\n", dma_chan[ch].dev_id);
+               pr_warn("DMA synchronization event drop occurred with device %d\n",
+                       dma_chan[ch].dev_id);
        if (likely(csr & OMAP_DMA_BLOCK_IRQ))
                dma_chan[ch].flags &= ~OMAP_DMA_ACTIVE;
        if (likely(dma_chan[ch].callback != NULL))
@@ -1880,21 +1874,19 @@ static int omap2_dma_handle_ch(int ch)
 
        if (!status) {
                if (printk_ratelimit())
-                       printk(KERN_WARNING "Spurious DMA IRQ for lch %d\n",
-                               ch);
+                       pr_warn("Spurious DMA IRQ for lch %d\n", ch);
                p->dma_write(1 << ch, IRQSTATUS_L0, ch);
                return 0;
        }
        if (unlikely(dma_chan[ch].dev_id == -1)) {
                if (printk_ratelimit())
-                       printk(KERN_WARNING "IRQ %04x for non-allocated DMA"
-                                       "channel %d\n", status, ch);
+                       pr_warn("IRQ %04x for non-allocated DMA channel %d\n",
+                               status, ch);
                return 0;
        }
        if (unlikely(status & OMAP_DMA_DROP_IRQ))
-               printk(KERN_INFO
-                      "DMA synchronization event drop occurred with device "
-                      "%d\n", dma_chan[ch].dev_id);
+               pr_info("DMA synchronization event drop occurred with device %d\n",
+                       dma_chan[ch].dev_id);
        if (unlikely(status & OMAP2_DMA_TRANS_ERR_IRQ)) {
                printk(KERN_INFO "DMA transaction error with device %d\n",
                       dma_chan[ch].dev_id);
@@ -2014,8 +2006,9 @@ static int __devinit omap_system_dma_probe(struct platform_device *pdev)
 
        p = pdev->dev.platform_data;
        if (!p) {
-               dev_err(&pdev->dev, "%s: System DMA initialized without"
-                       "platform data\n", __func__);
+               dev_err(&pdev->dev,
+                       "%s: System DMA initialized without platform data\n",
+                       __func__);
                return -EINVAL;
        }
 
@@ -2090,8 +2083,8 @@ static int __devinit omap_system_dma_probe(struct platform_device *pdev)
                }
                ret = setup_irq(dma_irq, &omap24xx_dma_irq);
                if (ret) {
-                       dev_err(&pdev->dev, "set_up failed for IRQ %d"
-                               "for DMA (error %d)\n", dma_irq, ret);
+                       dev_err(&pdev->dev, "set_up failed for IRQ %d for DMA (error %d)\n",
+                               dma_irq, ret);
                        goto exit_dma_lch_fail;
                }
        }
@@ -2099,8 +2092,7 @@ static int __devinit omap_system_dma_probe(struct platform_device *pdev)
        /* reserve dma channels 0 and 1 in high security devices */
        if (cpu_is_omap34xx() &&
                (omap_type() != OMAP2_DEVICE_TYPE_GP)) {
-               printk(KERN_INFO "Reserving DMA channels 0 and 1 for "
-                               "HS ROM code\n");
+               pr_info("Reserving DMA channels 0 and 1 for HS ROM code\n");
                dma_chan[0].dev_id = 0;
                dma_chan[1].dev_id = 1;
        }
@@ -2108,8 +2100,8 @@ static int __devinit omap_system_dma_probe(struct platform_device *pdev)
        return 0;
 
 exit_dma_irq_fail:
-       dev_err(&pdev->dev, "unable to request IRQ %d"
-                       "for DMA (error %d)\n", dma_irq, ret);
+       dev_err(&pdev->dev, "unable to request IRQ %d for DMA (error %d)\n",
+               dma_irq, ret);
        for (irq_rel = 0; irq_rel < ch; irq_rel++) {
                dma_irq = platform_get_irq(pdev, irq_rel);
                free_irq(dma_irq, (void *)(irq_rel + 1));
index dd6f92c..bcbb9d5 100644 (file)
@@ -33,8 +33,6 @@
 #include <mach/hardware.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
-
 #if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE)
 
 static bool omapfb_lcd_configured;
index db071bc..6013831 100644 (file)
 #include <linux/clk.h>
 
 #include <mach/irqs.h>
-#include <plat/mux.h>
 #include <plat/i2c.h>
 #include <plat/omap-pm.h>
 #include <plat/omap_device.h>
 
 #define OMAP_I2C_SIZE          0x3f
 #define OMAP1_I2C_BASE         0xfffb3800
+#define OMAP1_INT_I2C          (32 + 4)
 
 static const char name[] = "omap_i2c";
 
@@ -105,7 +105,7 @@ static inline int omap1_i2c_add_bus(int bus_id)
        res = pdev->resource;
        res[0].start = OMAP1_I2C_BASE;
        res[0].end = res[0].start + OMAP_I2C_SIZE;
-       res[1].start = INT_I2C;
+       res[1].start = OMAP1_INT_I2C;
        pdata = &i2c_pdata[bus_id - 1];
 
        /* all OMAP1 have IP version 1 register set */
diff --git a/arch/arm/plat-omap/include/plat/board.h b/arch/arm/plat-omap/include/plat/board.h
deleted file mode 100644 (file)
index e62f20a..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  arch/arm/plat-omap/include/mach/board.h
- *
- *  Information structures for board-specific data
- *
- *  Copyright (C) 2004 Nokia Corporation
- *  Written by Juha Yrjölä <juha.yrjola@nokia.com>
- */
-
-#ifndef _OMAP_BOARD_H
-#define _OMAP_BOARD_H
-
-#include <linux/types.h>
-
-#include <plat/gpio-switch.h>
-
-/*
- * OMAP35x EVM revision
- * Run time detection of EVM revision is done by reading Ethernet
- * PHY ID -
- *     GEN_1   = 0x01150000
- *     GEN_2   = 0x92200000
- */
-enum {
-       OMAP3EVM_BOARD_GEN_1 = 0,       /* EVM Rev between  A - D */
-       OMAP3EVM_BOARD_GEN_2,           /* EVM Rev >= Rev E */
-};
-
-/* Different peripheral ids */
-#define OMAP_TAG_CLOCK         0x4f01
-#define OMAP_TAG_GPIO_SWITCH   0x4f06
-#define OMAP_TAG_STI_CONSOLE   0x4f09
-#define OMAP_TAG_CAMERA_SENSOR 0x4f0a
-
-#define OMAP_TAG_BOOT_REASON    0x4f80
-#define OMAP_TAG_FLASH_PART    0x4f81
-#define OMAP_TAG_VERSION_STR   0x4f82
-
-struct omap_clock_config {
-       /* 0 for 12 MHz, 1 for 13 MHz and 2 for 19.2 MHz */
-       u8 system_clock_type;
-};
-
-struct omap_serial_console_config {
-       u8 console_uart;
-       u32 console_speed;
-};
-
-struct omap_sti_console_config {
-       unsigned enable:1;
-       u8 channel;
-};
-
-struct omap_camera_sensor_config {
-       u16 reset_gpio;
-       int (*power_on)(void * data);
-       int (*power_off)(void * data);
-};
-
-struct omap_lcd_config {
-       char panel_name[16];
-       char ctrl_name[16];
-       s16  nreset_gpio;
-       u8   data_lines;
-};
-
-struct device;
-struct fb_info;
-struct omap_backlight_config {
-       int default_intensity;
-       int (*set_power)(struct device *dev, int state);
-};
-
-struct omap_fbmem_config {
-       u32 start;
-       u32 size;
-};
-
-struct omap_pwm_led_platform_data {
-       const char *name;
-       int intensity_timer;
-       int blink_timer;
-       void (*set_power)(struct omap_pwm_led_platform_data *self, int on_off);
-};
-
-struct omap_uart_config {
-       /* Bit field of UARTs present; bit 0 --> UART1 */
-       unsigned int enabled_uarts;
-};
-
-
-struct omap_flash_part_config {
-       char part_table[0];
-};
-
-struct omap_boot_reason_config {
-       char reason_str[12];
-};
-
-struct omap_version_config {
-       char component[12];
-       char version[12];
-};
-
-struct omap_board_config_entry {
-       u16 tag;
-       u16 len;
-       u8  data[0];
-};
-
-struct omap_board_config_kernel {
-       u16 tag;
-       const void *data;
-};
-
-extern const void *__init __omap_get_config(u16 tag, size_t len, int nr);
-
-#define omap_get_config(tag, type) \
-       ((const type *) __omap_get_config((tag), sizeof(type), 0))
-#define omap_get_nr_config(tag, type, nr) \
-       ((const type *) __omap_get_config((tag), sizeof(type), (nr)))
-
-extern const void *__init omap_get_var_config(u16 tag, size_t *len);
-
-extern struct omap_board_config_kernel *omap_board_config;
-extern int omap_board_config_size;
-
-
-/* for TI reference platforms sharing the same debug card */
-extern int debug_card_init(u32 addr, unsigned gpio);
-
-/* OMAP3EVM revision */
-#if defined(CONFIG_MACH_OMAP3EVM)
-u8 get_omap3_evm_rev(void);
-#else
-#define get_omap3_evm_rev() (-EINVAL)
-#endif
-#endif
index bb5d08a..67da857 100644 (file)
@@ -30,6 +30,8 @@
 #ifndef __ASM_ARCH_OMAP_CPU_H
 #define __ASM_ARCH_OMAP_CPU_H
 
+#ifndef __ASSEMBLY__
+
 #include <linux/bitops.h>
 #include <plat/multi.h>
 
@@ -493,4 +495,5 @@ OMAP4_HAS_FEATURE(mpu_1ghz, MPU_1GHZ)
 OMAP4_HAS_FEATURE(mpu_1_2ghz, MPU_1_2GHZ)
 OMAP4_HAS_FEATURE(mpu_1_5ghz, MPU_1_5GHZ)
 
+#endif /* __ASSEMBLY__ */
 #endif
index c5811d4..0a87b05 100644 (file)
@@ -31,6 +31,8 @@
 /* Move omap4 specific defines to dma-44xx.h */
 #include "dma-44xx.h"
 
+#define INT_DMA_LCD                    25
+
 /* DMA channels for omap1 */
 #define OMAP_DMA_NO_DEVICE             0
 #define OMAP_DMA_MCSI1_TX              1
diff --git a/arch/arm/plat-omap/include/plat/gpio-switch.h b/arch/arm/plat-omap/include/plat/gpio-switch.h
deleted file mode 100644 (file)
index 10da0e0..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * GPIO switch definitions
- *
- * Copyright (C) 2006 Nokia 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 __ASM_ARCH_OMAP_GPIO_SWITCH_H
-#define __ASM_ARCH_OMAP_GPIO_SWITCH_H
-
-#include <linux/types.h>
-
-/* Cover:
- *     high -> closed
- *     low  -> open
- * Connection:
- *     high -> connected
- *     low  -> disconnected
- * Activity:
- *     high -> active
- *     low  -> inactive
- *
- */
-#define OMAP_GPIO_SWITCH_TYPE_COVER            0x0000
-#define OMAP_GPIO_SWITCH_TYPE_CONNECTION       0x0001
-#define OMAP_GPIO_SWITCH_TYPE_ACTIVITY         0x0002
-#define OMAP_GPIO_SWITCH_FLAG_INVERTED         0x0001
-#define OMAP_GPIO_SWITCH_FLAG_OUTPUT           0x0002
-
-struct omap_gpio_switch {
-       const char *name;
-       s16 gpio;
-       unsigned flags:4;
-       unsigned type:4;
-
-       /* Time in ms to debounce when transitioning from
-        * inactive state to active state. */
-       u16 debounce_rising;
-       /* Same for transition from active to inactive state. */
-       u16 debounce_falling;
-
-       /* notify board-specific code about state changes */
-       void (* notify)(void *data, int state);
-       void *notify_data;
-};
-
-/* Call at init time only */
-extern void omap_register_gpio_switches(const struct omap_gpio_switch *tbl,
-                                       int count);
-
-#endif
index f37764a..2e6e259 100644 (file)
@@ -133,6 +133,25 @@ struct gpmc_timings {
        u16 wr_data_mux_bus;    /* WRDATAONADMUXBUS */
 };
 
+struct gpmc_nand_regs {
+       void __iomem    *gpmc_status;
+       void __iomem    *gpmc_nand_command;
+       void __iomem    *gpmc_nand_address;
+       void __iomem    *gpmc_nand_data;
+       void __iomem    *gpmc_prefetch_config1;
+       void __iomem    *gpmc_prefetch_config2;
+       void __iomem    *gpmc_prefetch_control;
+       void __iomem    *gpmc_prefetch_status;
+       void __iomem    *gpmc_ecc_config;
+       void __iomem    *gpmc_ecc_control;
+       void __iomem    *gpmc_ecc_size_config;
+       void __iomem    *gpmc_ecc1_result;
+       void __iomem    *gpmc_bch_result0;
+};
+
+extern void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs);
+extern int gpmc_get_client_irq(unsigned irq_config);
+
 extern unsigned int gpmc_ns_to_ticks(unsigned int time_ns);
 extern unsigned int gpmc_ps_to_ticks(unsigned int time_ps);
 extern unsigned int gpmc_ticks_to_ns(unsigned int ticks);
diff --git a/arch/arm/plat-omap/include/plat/hardware.h b/arch/arm/plat-omap/include/plat/hardware.h
deleted file mode 100644 (file)
index ddbde38..0000000
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * arch/arm/plat-omap/include/mach/hardware.h
- *
- * Hardware definitions for TI OMAP processors and boards
- *
- * NOTE: Please put device driver specific defines into a separate header
- *      file for each driver.
- *
- * Copyright (C) 2001 RidgeRun, Inc.
- * Author: RidgeRun, Inc. Greg Lonnon <glonnon@ridgerun.com>
- *
- * Reorganized for Linux-2.6 by Tony Lindgren <tony@atomide.com>
- *                          and Dirk Behme <dirk.behme@de.bosch.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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
- * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * 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 __ASM_ARCH_OMAP_HARDWARE_H
-#define __ASM_ARCH_OMAP_HARDWARE_H
-
-#include <asm/sizes.h>
-#ifndef __ASSEMBLER__
-#include <asm/types.h>
-#include <plat/cpu.h>
-#endif
-#include <plat/serial.h>
-
-/*
- * ---------------------------------------------------------------------------
- * Common definitions for all OMAP processors
- * NOTE: Put all processor or board specific parts to the special header
- *      files.
- * ---------------------------------------------------------------------------
- */
-
-/*
- * ----------------------------------------------------------------------------
- * Timers
- * ----------------------------------------------------------------------------
- */
-#define OMAP_MPU_TIMER1_BASE   (0xfffec500)
-#define OMAP_MPU_TIMER2_BASE   (0xfffec600)
-#define OMAP_MPU_TIMER3_BASE   (0xfffec700)
-#define MPU_TIMER_FREE         (1 << 6)
-#define MPU_TIMER_CLOCK_ENABLE (1 << 5)
-#define MPU_TIMER_AR           (1 << 1)
-#define MPU_TIMER_ST           (1 << 0)
-
-/*
- * ----------------------------------------------------------------------------
- * Clocks
- * ----------------------------------------------------------------------------
- */
-#define CLKGEN_REG_BASE                (0xfffece00)
-#define ARM_CKCTL              (CLKGEN_REG_BASE + 0x0)
-#define ARM_IDLECT1            (CLKGEN_REG_BASE + 0x4)
-#define ARM_IDLECT2            (CLKGEN_REG_BASE + 0x8)
-#define ARM_EWUPCT             (CLKGEN_REG_BASE + 0xC)
-#define ARM_RSTCT1             (CLKGEN_REG_BASE + 0x10)
-#define ARM_RSTCT2             (CLKGEN_REG_BASE + 0x14)
-#define ARM_SYSST              (CLKGEN_REG_BASE + 0x18)
-#define ARM_IDLECT3            (CLKGEN_REG_BASE + 0x24)
-
-#define CK_RATEF               1
-#define CK_IDLEF               2
-#define CK_ENABLEF             4
-#define CK_SELECTF             8
-#define SETARM_IDLE_SHIFT
-
-/* DPLL control registers */
-#define DPLL_CTL               (0xfffecf00)
-
-/* DSP clock control. Must use __raw_readw() and __raw_writew() with these */
-#define DSP_CONFIG_REG_BASE     IOMEM(0xe1008000)
-#define DSP_CKCTL              (DSP_CONFIG_REG_BASE + 0x0)
-#define DSP_IDLECT1            (DSP_CONFIG_REG_BASE + 0x4)
-#define DSP_IDLECT2            (DSP_CONFIG_REG_BASE + 0x8)
-#define DSP_RSTCT2             (DSP_CONFIG_REG_BASE + 0x14)
-
-/*
- * ---------------------------------------------------------------------------
- * UPLD
- * ---------------------------------------------------------------------------
- */
-#define ULPD_REG_BASE          (0xfffe0800)
-#define ULPD_IT_STATUS         (ULPD_REG_BASE + 0x14)
-#define ULPD_SETUP_ANALOG_CELL_3       (ULPD_REG_BASE + 0x24)
-#define ULPD_CLOCK_CTRL                (ULPD_REG_BASE + 0x30)
-#      define DIS_USB_PVCI_CLK         (1 << 5)        /* no USB/FAC synch */
-#      define USB_MCLK_EN              (1 << 4)        /* enable W4_USB_CLKO */
-#define ULPD_SOFT_REQ          (ULPD_REG_BASE + 0x34)
-#      define SOFT_UDC_REQ             (1 << 4)
-#      define SOFT_USB_CLK_REQ         (1 << 3)
-#      define SOFT_DPLL_REQ            (1 << 0)
-#define ULPD_DPLL_CTRL         (ULPD_REG_BASE + 0x3c)
-#define ULPD_STATUS_REQ                (ULPD_REG_BASE + 0x40)
-#define ULPD_APLL_CTRL         (ULPD_REG_BASE + 0x4c)
-#define ULPD_POWER_CTRL                (ULPD_REG_BASE + 0x50)
-#define ULPD_SOFT_DISABLE_REQ_REG      (ULPD_REG_BASE + 0x68)
-#      define DIS_MMC2_DPLL_REQ        (1 << 11)
-#      define DIS_MMC1_DPLL_REQ        (1 << 10)
-#      define DIS_UART3_DPLL_REQ       (1 << 9)
-#      define DIS_UART2_DPLL_REQ       (1 << 8)
-#      define DIS_UART1_DPLL_REQ       (1 << 7)
-#      define DIS_USB_HOST_DPLL_REQ    (1 << 6)
-#define ULPD_SDW_CLK_DIV_CTRL_SEL      (ULPD_REG_BASE + 0x74)
-#define ULPD_CAM_CLK_CTRL      (ULPD_REG_BASE + 0x7c)
-
-/*
- * ---------------------------------------------------------------------------
- * Watchdog timer
- * ---------------------------------------------------------------------------
- */
-
-/* Watchdog timer within the OMAP3.2 gigacell */
-#define OMAP_MPU_WATCHDOG_BASE (0xfffec800)
-#define OMAP_WDT_TIMER         (OMAP_MPU_WATCHDOG_BASE + 0x0)
-#define OMAP_WDT_LOAD_TIM      (OMAP_MPU_WATCHDOG_BASE + 0x4)
-#define OMAP_WDT_READ_TIM      (OMAP_MPU_WATCHDOG_BASE + 0x4)
-#define OMAP_WDT_TIMER_MODE    (OMAP_MPU_WATCHDOG_BASE + 0x8)
-
-/*
- * ---------------------------------------------------------------------------
- * Interrupts
- * ---------------------------------------------------------------------------
- */
-#ifdef CONFIG_ARCH_OMAP1
-
-/*
- * XXX: These probably want to be moved to arch/arm/mach-omap/omap1/irq.c
- * or something similar.. -- PFM.
- */
-
-#define OMAP_IH1_BASE          0xfffecb00
-#define OMAP_IH2_BASE          0xfffe0000
-
-#define OMAP_IH1_ITR           (OMAP_IH1_BASE + 0x00)
-#define OMAP_IH1_MIR           (OMAP_IH1_BASE + 0x04)
-#define OMAP_IH1_SIR_IRQ       (OMAP_IH1_BASE + 0x10)
-#define OMAP_IH1_SIR_FIQ       (OMAP_IH1_BASE + 0x14)
-#define OMAP_IH1_CONTROL       (OMAP_IH1_BASE + 0x18)
-#define OMAP_IH1_ILR0          (OMAP_IH1_BASE + 0x1c)
-#define OMAP_IH1_ISR           (OMAP_IH1_BASE + 0x9c)
-
-#define OMAP_IH2_ITR           (OMAP_IH2_BASE + 0x00)
-#define OMAP_IH2_MIR           (OMAP_IH2_BASE + 0x04)
-#define OMAP_IH2_SIR_IRQ       (OMAP_IH2_BASE + 0x10)
-#define OMAP_IH2_SIR_FIQ       (OMAP_IH2_BASE + 0x14)
-#define OMAP_IH2_CONTROL       (OMAP_IH2_BASE + 0x18)
-#define OMAP_IH2_ILR0          (OMAP_IH2_BASE + 0x1c)
-#define OMAP_IH2_ISR           (OMAP_IH2_BASE + 0x9c)
-
-#define IRQ_ITR_REG_OFFSET     0x00
-#define IRQ_MIR_REG_OFFSET     0x04
-#define IRQ_SIR_IRQ_REG_OFFSET 0x10
-#define IRQ_SIR_FIQ_REG_OFFSET 0x14
-#define IRQ_CONTROL_REG_OFFSET 0x18
-#define IRQ_ISR_REG_OFFSET     0x9c
-#define IRQ_ILR0_REG_OFFSET    0x1c
-#define IRQ_GMR_REG_OFFSET     0xa0
-
-#endif
-
-/*
- * ----------------------------------------------------------------------------
- * System control registers
- * ----------------------------------------------------------------------------
- */
-#define MOD_CONF_CTRL_0                0xfffe1080
-#define MOD_CONF_CTRL_1                0xfffe1110
-
-/*
- * ----------------------------------------------------------------------------
- * Pin multiplexing registers
- * ----------------------------------------------------------------------------
- */
-#define FUNC_MUX_CTRL_0                0xfffe1000
-#define FUNC_MUX_CTRL_1                0xfffe1004
-#define FUNC_MUX_CTRL_2                0xfffe1008
-#define COMP_MODE_CTRL_0       0xfffe100c
-#define FUNC_MUX_CTRL_3                0xfffe1010
-#define FUNC_MUX_CTRL_4                0xfffe1014
-#define FUNC_MUX_CTRL_5                0xfffe1018
-#define FUNC_MUX_CTRL_6                0xfffe101C
-#define FUNC_MUX_CTRL_7                0xfffe1020
-#define FUNC_MUX_CTRL_8                0xfffe1024
-#define FUNC_MUX_CTRL_9                0xfffe1028
-#define FUNC_MUX_CTRL_A                0xfffe102C
-#define FUNC_MUX_CTRL_B                0xfffe1030
-#define FUNC_MUX_CTRL_C                0xfffe1034
-#define FUNC_MUX_CTRL_D                0xfffe1038
-#define PULL_DWN_CTRL_0                0xfffe1040
-#define PULL_DWN_CTRL_1                0xfffe1044
-#define PULL_DWN_CTRL_2                0xfffe1048
-#define PULL_DWN_CTRL_3                0xfffe104c
-#define PULL_DWN_CTRL_4                0xfffe10ac
-
-/* OMAP-1610 specific multiplexing registers */
-#define FUNC_MUX_CTRL_E                0xfffe1090
-#define FUNC_MUX_CTRL_F                0xfffe1094
-#define FUNC_MUX_CTRL_10       0xfffe1098
-#define FUNC_MUX_CTRL_11       0xfffe109c
-#define FUNC_MUX_CTRL_12       0xfffe10a0
-#define PU_PD_SEL_0            0xfffe10b4
-#define PU_PD_SEL_1            0xfffe10b8
-#define PU_PD_SEL_2            0xfffe10bc
-#define PU_PD_SEL_3            0xfffe10c0
-#define PU_PD_SEL_4            0xfffe10c4
-
-/* Timer32K for 1610 and 1710*/
-#define OMAP_TIMER32K_BASE     0xFFFBC400
-
-/*
- * ---------------------------------------------------------------------------
- * TIPB bus interface
- * ---------------------------------------------------------------------------
- */
-#define TIPB_PUBLIC_CNTL_BASE          0xfffed300
-#define MPU_PUBLIC_TIPB_CNTL           (TIPB_PUBLIC_CNTL_BASE + 0x8)
-#define TIPB_PRIVATE_CNTL_BASE         0xfffeca00
-#define MPU_PRIVATE_TIPB_CNTL          (TIPB_PRIVATE_CNTL_BASE + 0x8)
-
-/*
- * ----------------------------------------------------------------------------
- * MPUI interface
- * ----------------------------------------------------------------------------
- */
-#define MPUI_BASE                      (0xfffec900)
-#define MPUI_CTRL                      (MPUI_BASE + 0x0)
-#define MPUI_DEBUG_ADDR                        (MPUI_BASE + 0x4)
-#define MPUI_DEBUG_DATA                        (MPUI_BASE + 0x8)
-#define MPUI_DEBUG_FLAG                        (MPUI_BASE + 0xc)
-#define MPUI_STATUS_REG                        (MPUI_BASE + 0x10)
-#define MPUI_DSP_STATUS                        (MPUI_BASE + 0x14)
-#define MPUI_DSP_BOOT_CONFIG           (MPUI_BASE + 0x18)
-#define MPUI_DSP_API_CONFIG            (MPUI_BASE + 0x1c)
-
-/*
- * ----------------------------------------------------------------------------
- * LED Pulse Generator
- * ----------------------------------------------------------------------------
- */
-#define OMAP_LPG1_BASE                 0xfffbd000
-#define OMAP_LPG2_BASE                 0xfffbd800
-#define OMAP_LPG1_LCR                  (OMAP_LPG1_BASE + 0x00)
-#define OMAP_LPG1_PMR                  (OMAP_LPG1_BASE + 0x04)
-#define OMAP_LPG2_LCR                  (OMAP_LPG2_BASE + 0x00)
-#define OMAP_LPG2_PMR                  (OMAP_LPG2_BASE + 0x04)
-
-/*
- * ----------------------------------------------------------------------------
- * Pulse-Width Light
- * ----------------------------------------------------------------------------
- */
-#define OMAP_PWL_BASE                  0xfffb5800
-#define OMAP_PWL_ENABLE                        (OMAP_PWL_BASE + 0x00)
-#define OMAP_PWL_CLK_ENABLE            (OMAP_PWL_BASE + 0x04)
-
-/*
- * ---------------------------------------------------------------------------
- * Processor specific defines
- * ---------------------------------------------------------------------------
- */
-
-#include <plat/omap7xx.h>
-#include <plat/omap1510.h>
-#include <plat/omap16xx.h>
-#include <plat/omap24xx.h>
-#include <plat/omap34xx.h>
-#include <plat/omap44xx.h>
-#include <plat/ti81xx.h>
-#include <plat/am33xx.h>
-#include <plat/omap54xx.h>
-
-#endif /* __ASM_ARCH_OMAP_HARDWARE_H */
diff --git a/arch/arm/plat-omap/include/plat/irqs-44xx.h b/arch/arm/plat-omap/include/plat/irqs-44xx.h
deleted file mode 100644 (file)
index 518322c..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * OMAP4 Interrupt lines definitions
- *
- * Copyright (C) 2009-2010 Texas Instruments, Inc.
- *
- * Santosh Shilimkar (santosh.shilimkar@ti.com)
- * Benoit Cousson (b-cousson@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_OMAP44XX_IRQS_H
-#define __ARCH_ARM_MACH_OMAP2_OMAP44XX_IRQS_H
-
-/* OMAP44XX IRQs numbers definitions */
-#define OMAP44XX_IRQ_LOCALTIMER                        29
-#define OMAP44XX_IRQ_LOCALWDT                  30
-
-#define OMAP44XX_IRQ_GIC_START                 32
-
-#define OMAP44XX_IRQ_PL310                     (0 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_CTI0                      (1 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_CTI1                      (2 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_ELM                       (4 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SYS_1N                    (7 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SECURITY_EVENTS           (8 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_L3_DBG                    (9 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_L3_APP                    (10 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_PRCM                      (11 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SDMA_0                    (12 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SDMA_1                    (13 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SDMA_2                    (14 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SDMA_3                    (15 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MCBSP4                    (16 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MCBSP1                    (17 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SR_MCU                    (18 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SR_CORE                   (19 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPMC                      (20 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GFX                       (21 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MCBSP2                    (22 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MCBSP3                    (23 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_ISS_5                     (24 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_DSS_DISPC                 (25 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MAIL_U0                   (26 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_C2C_SSCM_0                        (27 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_TESLA_MMU                 (28 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPIO1                     (29 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPIO2                     (30 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPIO3                     (31 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPIO4                     (32 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPIO5                     (33 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPIO6                     (34 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_USIM                      (35 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_WDT3                      (36 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT1                      (37 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT2                      (38 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT3                      (39 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT4                      (40 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT5                      (41 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT6                      (42 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT7                      (43 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT8                      (44 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT9                      (45 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT10                     (46 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT11                     (47 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SPI4                      (48 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SHA1_S                    (49 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_FPKA_SINTREQUEST_S                (50 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SHA1_P                    (51 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_RNG                       (52 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_DSS_DSI1                  (53 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_I2C1                      (56 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_I2C2                      (57 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_HDQ                       (58 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MMC5                      (59 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_I2C3                      (61 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_I2C4                      (62 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_AES2_S                    (63 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_AES2_P                    (64 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SPI1                      (65 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SPI2                      (66 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_HSI_P1                    (67 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_HSI_P2                    (68 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_FDIF_3                    (69 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_UART4                     (70 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_HSI_DMA                   (71 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_UART1                     (72 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_UART2                     (73 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_UART3                     (74 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_PBIAS                     (75 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_OHCI                      (76 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_EHCI                      (77 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_TLL                       (78 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_AES1_S                    (79 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_WDT2                      (80 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_DES_S                     (81 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_DES_P                     (82 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MMC1                      (83 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_DSS_DSI2                  (84 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_AES1_P                    (85 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MMC2                      (86 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MPU_ICR                   (87 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_C2C_SSCM_1                        (88 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_FSUSB                     (89 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_FSUSB_SMI                 (90 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SPI3                      (91 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_HS_USB_MC_N               (92 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_HS_USB_DMA_N              (93 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MMC3                      (94 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_GPT12                     (95 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MMC4                      (96 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SLIMBUS1                  (97 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SLIMBUS2                  (98 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_ABE                       (99 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_DUCATI_MMU                        (100 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_DSS_HDMI                  (101 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SR_IVA                    (102 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_IVA_HD_POSYNCITRPEND_1    (103 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_IVA_HD_POSYNCITRPEND_0    (104 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_IVA_HD_POMBINTRPEND_0     (107 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MCASP1_AR                 (108 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MCASP1_AX                 (109 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_EMIF4_1                   (110 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_EMIF4_2                   (111 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_MCPDM                     (112 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_DMM                       (113 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_DMIC                      (114 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_CDMA_0                    (115 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_CDMA_1                    (116 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_CDMA_2                    (117 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_CDMA_3                    (118 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_SYS_2N                    (119 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_KBD_CTL                   (120 + OMAP44XX_IRQ_GIC_START)
-#define OMAP44XX_IRQ_UNIPRO1                   (124 + OMAP44XX_IRQ_GIC_START)
-
-#endif
diff --git a/arch/arm/plat-omap/include/plat/irqs.h b/arch/arm/plat-omap/include/plat/irqs.h
deleted file mode 100644 (file)
index 37bbbbb..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- *  arch/arm/plat-omap/include/mach/irqs.h
- *
- *  Copyright (C) Greg Lonnon 2001
- *  Updated for OMAP-1610 by Tony Lindgren <tony@atomide.com>
- *
- * Copyright (C) 2009 Texas Instruments
- * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.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
- *
- * NOTE: The interrupt vectors for the OMAP-1509, OMAP-1510, and OMAP-1610
- *      are different.
- */
-
-#ifndef __ASM_ARCH_OMAP15XX_IRQS_H
-#define __ASM_ARCH_OMAP15XX_IRQS_H
-
-/* All OMAP4 specific defines are moved to irqs-44xx.h */
-#include "irqs-44xx.h"
-
-/*
- * IRQ numbers for interrupt handler 1
- *
- * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
- *
- */
-#define INT_CAMERA             1
-#define INT_FIQ                        3
-#define INT_RTDX               6
-#define INT_DSP_MMU_ABORT      7
-#define INT_HOST               8
-#define INT_ABORT              9
-#define INT_BRIDGE_PRIV                13
-#define INT_GPIO_BANK1         14
-#define INT_UART3              15
-#define INT_TIMER3             16
-#define INT_DMA_CH0_6          19
-#define INT_DMA_CH1_7          20
-#define INT_DMA_CH2_8          21
-#define INT_DMA_CH3            22
-#define INT_DMA_CH4            23
-#define INT_DMA_CH5            24
-#define INT_DMA_LCD            25
-#define INT_TIMER1             26
-#define INT_WD_TIMER           27
-#define INT_BRIDGE_PUB         28
-#define INT_TIMER2             30
-#define INT_LCD_CTRL           31
-
-/*
- * OMAP-1510 specific IRQ numbers for interrupt handler 1
- */
-#define INT_1510_IH2_IRQ       0
-#define INT_1510_RES2          2
-#define INT_1510_SPI_TX                4
-#define INT_1510_SPI_RX                5
-#define INT_1510_DSP_MAILBOX1  10
-#define INT_1510_DSP_MAILBOX2  11
-#define INT_1510_RES12         12
-#define INT_1510_LB_MMU                17
-#define INT_1510_RES18         18
-#define INT_1510_LOCAL_BUS     29
-
-/*
- * OMAP-1610 specific IRQ numbers for interrupt handler 1
- */
-#define INT_1610_IH2_IRQ       INT_1510_IH2_IRQ
-#define INT_1610_IH2_FIQ       2
-#define INT_1610_McBSP2_TX     4
-#define INT_1610_McBSP2_RX     5
-#define INT_1610_DSP_MAILBOX1  10
-#define INT_1610_DSP_MAILBOX2  11
-#define INT_1610_LCD_LINE      12
-#define INT_1610_GPTIMER1      17
-#define INT_1610_GPTIMER2      18
-#define INT_1610_SSR_FIFO_0    29
-
-/*
- * OMAP-7xx specific IRQ numbers for interrupt handler 1
- */
-#define INT_7XX_IH2_FIQ                0
-#define INT_7XX_IH2_IRQ                1
-#define INT_7XX_USB_NON_ISO    2
-#define INT_7XX_USB_ISO                3
-#define INT_7XX_ICR            4
-#define INT_7XX_EAC            5
-#define INT_7XX_GPIO_BANK1     6
-#define INT_7XX_GPIO_BANK2     7
-#define INT_7XX_GPIO_BANK3     8
-#define INT_7XX_McBSP2TX       10
-#define INT_7XX_McBSP2RX       11
-#define INT_7XX_McBSP2RX_OVF   12
-#define INT_7XX_LCD_LINE       14
-#define INT_7XX_GSM_PROTECT    15
-#define INT_7XX_TIMER3         16
-#define INT_7XX_GPIO_BANK5     17
-#define INT_7XX_GPIO_BANK6     18
-#define INT_7XX_SPGIO_WR       29
-
-/*
- * IRQ numbers for interrupt handler 2
- *
- * NOTE: See also the OMAP-1510 and 1610 specific IRQ numbers below
- */
-#define IH2_BASE               32
-
-#define INT_KEYBOARD           (1 + IH2_BASE)
-#define INT_uWireTX            (2 + IH2_BASE)
-#define INT_uWireRX            (3 + IH2_BASE)
-#define INT_I2C                        (4 + IH2_BASE)
-#define INT_MPUIO              (5 + IH2_BASE)
-#define INT_USB_HHC_1          (6 + IH2_BASE)
-#define INT_McBSP3TX           (10 + IH2_BASE)
-#define INT_McBSP3RX           (11 + IH2_BASE)
-#define INT_McBSP1TX           (12 + IH2_BASE)
-#define INT_McBSP1RX           (13 + IH2_BASE)
-#define INT_UART1              (14 + IH2_BASE)
-#define INT_UART2              (15 + IH2_BASE)
-#define INT_BT_MCSI1TX         (16 + IH2_BASE)
-#define INT_BT_MCSI1RX         (17 + IH2_BASE)
-#define INT_SOSSI_MATCH                (19 + IH2_BASE)
-#define INT_USB_W2FC           (20 + IH2_BASE)
-#define INT_1WIRE              (21 + IH2_BASE)
-#define INT_OS_TIMER           (22 + IH2_BASE)
-#define INT_MMC                        (23 + IH2_BASE)
-#define INT_GAUGE_32K          (24 + IH2_BASE)
-#define INT_RTC_TIMER          (25 + IH2_BASE)
-#define INT_RTC_ALARM          (26 + IH2_BASE)
-#define INT_MEM_STICK          (27 + IH2_BASE)
-
-/*
- * OMAP-1510 specific IRQ numbers for interrupt handler 2
- */
-#define INT_1510_DSP_MMU       (28 + IH2_BASE)
-#define INT_1510_COM_SPI_RO    (31 + IH2_BASE)
-
-/*
- * OMAP-1610 specific IRQ numbers for interrupt handler 2
- */
-#define INT_1610_FAC           (0 + IH2_BASE)
-#define INT_1610_USB_HHC_2     (7 + IH2_BASE)
-#define INT_1610_USB_OTG       (8 + IH2_BASE)
-#define INT_1610_SoSSI         (9 + IH2_BASE)
-#define INT_1610_SoSSI_MATCH   (19 + IH2_BASE)
-#define INT_1610_DSP_MMU       (28 + IH2_BASE)
-#define INT_1610_McBSP2RX_OF   (31 + IH2_BASE)
-#define INT_1610_STI           (32 + IH2_BASE)
-#define INT_1610_STI_WAKEUP    (33 + IH2_BASE)
-#define INT_1610_GPTIMER3      (34 + IH2_BASE)
-#define INT_1610_GPTIMER4      (35 + IH2_BASE)
-#define INT_1610_GPTIMER5      (36 + IH2_BASE)
-#define INT_1610_GPTIMER6      (37 + IH2_BASE)
-#define INT_1610_GPTIMER7      (38 + IH2_BASE)
-#define INT_1610_GPTIMER8      (39 + IH2_BASE)
-#define INT_1610_GPIO_BANK2    (40 + IH2_BASE)
-#define INT_1610_GPIO_BANK3    (41 + IH2_BASE)
-#define INT_1610_MMC2          (42 + IH2_BASE)
-#define INT_1610_CF            (43 + IH2_BASE)
-#define INT_1610_WAKE_UP_REQ   (46 + IH2_BASE)
-#define INT_1610_GPIO_BANK4    (48 + IH2_BASE)
-#define INT_1610_SPI           (49 + IH2_BASE)
-#define INT_1610_DMA_CH6       (53 + IH2_BASE)
-#define INT_1610_DMA_CH7       (54 + IH2_BASE)
-#define INT_1610_DMA_CH8       (55 + IH2_BASE)
-#define INT_1610_DMA_CH9       (56 + IH2_BASE)
-#define INT_1610_DMA_CH10      (57 + IH2_BASE)
-#define INT_1610_DMA_CH11      (58 + IH2_BASE)
-#define INT_1610_DMA_CH12      (59 + IH2_BASE)
-#define INT_1610_DMA_CH13      (60 + IH2_BASE)
-#define INT_1610_DMA_CH14      (61 + IH2_BASE)
-#define INT_1610_DMA_CH15      (62 + IH2_BASE)
-#define INT_1610_NAND          (63 + IH2_BASE)
-#define INT_1610_SHA1MD5       (91 + IH2_BASE)
-
-/*
- * OMAP-7xx specific IRQ numbers for interrupt handler 2
- */
-#define INT_7XX_HW_ERRORS      (0 + IH2_BASE)
-#define INT_7XX_NFIQ_PWR_FAIL  (1 + IH2_BASE)
-#define INT_7XX_CFCD           (2 + IH2_BASE)
-#define INT_7XX_CFIREQ         (3 + IH2_BASE)
-#define INT_7XX_I2C            (4 + IH2_BASE)
-#define INT_7XX_PCC            (5 + IH2_BASE)
-#define INT_7XX_MPU_EXT_NIRQ   (6 + IH2_BASE)
-#define INT_7XX_SPI_100K_1     (7 + IH2_BASE)
-#define INT_7XX_SYREN_SPI      (8 + IH2_BASE)
-#define INT_7XX_VLYNQ          (9 + IH2_BASE)
-#define INT_7XX_GPIO_BANK4     (10 + IH2_BASE)
-#define INT_7XX_McBSP1TX       (11 + IH2_BASE)
-#define INT_7XX_McBSP1RX       (12 + IH2_BASE)
-#define INT_7XX_McBSP1RX_OF    (13 + IH2_BASE)
-#define INT_7XX_UART_MODEM_IRDA_2 (14 + IH2_BASE)
-#define INT_7XX_UART_MODEM_1   (15 + IH2_BASE)
-#define INT_7XX_MCSI           (16 + IH2_BASE)
-#define INT_7XX_uWireTX                (17 + IH2_BASE)
-#define INT_7XX_uWireRX                (18 + IH2_BASE)
-#define INT_7XX_SMC_CD         (19 + IH2_BASE)
-#define INT_7XX_SMC_IREQ       (20 + IH2_BASE)
-#define INT_7XX_HDQ_1WIRE      (21 + IH2_BASE)
-#define INT_7XX_TIMER32K       (22 + IH2_BASE)
-#define INT_7XX_MMC_SDIO       (23 + IH2_BASE)
-#define INT_7XX_UPLD           (24 + IH2_BASE)
-#define INT_7XX_USB_HHC_1      (27 + IH2_BASE)
-#define INT_7XX_USB_HHC_2      (28 + IH2_BASE)
-#define INT_7XX_USB_GENI       (29 + IH2_BASE)
-#define INT_7XX_USB_OTG                (30 + IH2_BASE)
-#define INT_7XX_CAMERA_IF      (31 + IH2_BASE)
-#define INT_7XX_RNG            (32 + IH2_BASE)
-#define INT_7XX_DUAL_MODE_TIMER (33 + IH2_BASE)
-#define INT_7XX_DBB_RF_EN      (34 + IH2_BASE)
-#define INT_7XX_MPUIO_KEYPAD   (35 + IH2_BASE)
-#define INT_7XX_SHA1_MD5       (36 + IH2_BASE)
-#define INT_7XX_SPI_100K_2     (37 + IH2_BASE)
-#define INT_7XX_RNG_IDLE       (38 + IH2_BASE)
-#define INT_7XX_MPUIO          (39 + IH2_BASE)
-#define INT_7XX_LLPC_LCD_CTRL_CAN_BE_OFF       (40 + IH2_BASE)
-#define INT_7XX_LLPC_OE_FALLING (41 + IH2_BASE)
-#define INT_7XX_LLPC_OE_RISING (42 + IH2_BASE)
-#define INT_7XX_LLPC_VSYNC     (43 + IH2_BASE)
-#define INT_7XX_WAKE_UP_REQ    (46 + IH2_BASE)
-#define INT_7XX_DMA_CH6                (53 + IH2_BASE)
-#define INT_7XX_DMA_CH7                (54 + IH2_BASE)
-#define INT_7XX_DMA_CH8                (55 + IH2_BASE)
-#define INT_7XX_DMA_CH9                (56 + IH2_BASE)
-#define INT_7XX_DMA_CH10       (57 + IH2_BASE)
-#define INT_7XX_DMA_CH11       (58 + IH2_BASE)
-#define INT_7XX_DMA_CH12       (59 + IH2_BASE)
-#define INT_7XX_DMA_CH13       (60 + IH2_BASE)
-#define INT_7XX_DMA_CH14       (61 + IH2_BASE)
-#define INT_7XX_DMA_CH15       (62 + IH2_BASE)
-#define INT_7XX_NAND           (63 + IH2_BASE)
-
-#define INT_24XX_SYS_NIRQ      7
-#define INT_24XX_SDMA_IRQ0     12
-#define INT_24XX_SDMA_IRQ1     13
-#define INT_24XX_SDMA_IRQ2     14
-#define INT_24XX_SDMA_IRQ3     15
-#define INT_24XX_CAM_IRQ       24
-#define INT_24XX_DSS_IRQ       25
-#define INT_24XX_MAIL_U0_MPU   26
-#define INT_24XX_DSP_UMA       27
-#define INT_24XX_DSP_MMU       28
-#define INT_24XX_GPIO_BANK1    29
-#define INT_24XX_GPIO_BANK2    30
-#define INT_24XX_GPIO_BANK3    31
-#define INT_24XX_GPIO_BANK4    32
-#define INT_24XX_GPIO_BANK5    33
-#define INT_24XX_MAIL_U3_MPU   34
-#define INT_24XX_GPTIMER1      37
-#define INT_24XX_GPTIMER2      38
-#define INT_24XX_GPTIMER3      39
-#define INT_24XX_GPTIMER4      40
-#define INT_24XX_GPTIMER5      41
-#define INT_24XX_GPTIMER6      42
-#define INT_24XX_GPTIMER7      43
-#define INT_24XX_GPTIMER8      44
-#define INT_24XX_GPTIMER9      45
-#define INT_24XX_GPTIMER10     46
-#define INT_24XX_GPTIMER11     47
-#define INT_24XX_GPTIMER12     48
-#define INT_24XX_SHA1MD5       51
-#define INT_24XX_MCBSP4_IRQ_TX 54
-#define INT_24XX_MCBSP4_IRQ_RX 55
-#define INT_24XX_I2C1_IRQ      56
-#define INT_24XX_I2C2_IRQ      57
-#define INT_24XX_HDQ_IRQ       58
-#define INT_24XX_MCBSP1_IRQ_TX 59
-#define INT_24XX_MCBSP1_IRQ_RX 60
-#define INT_24XX_MCBSP2_IRQ_TX 62
-#define INT_24XX_MCBSP2_IRQ_RX 63
-#define INT_24XX_SPI1_IRQ      65
-#define INT_24XX_SPI2_IRQ      66
-#define INT_24XX_UART1_IRQ     72
-#define INT_24XX_UART2_IRQ     73
-#define INT_24XX_UART3_IRQ     74
-#define INT_24XX_USB_IRQ_GEN   75
-#define INT_24XX_USB_IRQ_NISO  76
-#define INT_24XX_USB_IRQ_ISO   77
-#define INT_24XX_USB_IRQ_HGEN  78
-#define INT_24XX_USB_IRQ_HSOF  79
-#define INT_24XX_USB_IRQ_OTG   80
-#define INT_24XX_MCBSP5_IRQ_TX 81
-#define INT_24XX_MCBSP5_IRQ_RX 82
-#define INT_24XX_MMC_IRQ       83
-#define INT_24XX_MMC2_IRQ      86
-#define INT_24XX_MCBSP3_IRQ_TX 89
-#define INT_24XX_MCBSP3_IRQ_RX 90
-#define INT_24XX_SPI3_IRQ      91
-
-#define INT_243X_MCBSP2_IRQ    16
-#define INT_243X_MCBSP3_IRQ    17
-#define INT_243X_MCBSP4_IRQ    18
-#define INT_243X_MCBSP5_IRQ    19
-#define INT_243X_MCBSP1_IRQ    64
-#define INT_243X_HS_USB_MC     92
-#define INT_243X_HS_USB_DMA    93
-#define INT_243X_CARKIT_IRQ    94
-
-#define INT_34XX_BENCH_MPU_EMUL        3
-#define INT_34XX_ST_MCBSP2_IRQ 4
-#define INT_34XX_ST_MCBSP3_IRQ 5
-#define INT_34XX_SSM_ABORT_IRQ 6
-#define INT_34XX_SYS_NIRQ      7
-#define INT_34XX_D2D_FW_IRQ    8
-#define INT_34XX_L3_DBG_IRQ     9
-#define INT_34XX_L3_APP_IRQ     10
-#define INT_34XX_PRCM_MPU_IRQ  11
-#define INT_34XX_MCBSP1_IRQ    16
-#define INT_34XX_MCBSP2_IRQ    17
-#define INT_34XX_GPMC_IRQ      20
-#define INT_34XX_MCBSP3_IRQ    22
-#define INT_34XX_MCBSP4_IRQ    23
-#define INT_34XX_CAM_IRQ       24
-#define INT_34XX_MCBSP5_IRQ    27
-#define INT_34XX_GPIO_BANK1    29
-#define INT_34XX_GPIO_BANK2    30
-#define INT_34XX_GPIO_BANK3    31
-#define INT_34XX_GPIO_BANK4    32
-#define INT_34XX_GPIO_BANK5    33
-#define INT_34XX_GPIO_BANK6    34
-#define INT_34XX_USIM_IRQ      35
-#define INT_34XX_WDT3_IRQ      36
-#define INT_34XX_SPI4_IRQ      48
-#define INT_34XX_SHA1MD52_IRQ  49
-#define INT_34XX_FPKA_READY_IRQ        50
-#define INT_34XX_SHA1MD51_IRQ  51
-#define INT_34XX_RNG_IRQ       52
-#define INT_34XX_I2C3_IRQ      61
-#define INT_34XX_FPKA_ERROR_IRQ        64
-#define INT_34XX_PBIAS_IRQ     75
-#define INT_34XX_OHCI_IRQ      76
-#define INT_34XX_EHCI_IRQ      77
-#define INT_34XX_TLL_IRQ       78
-#define INT_34XX_PARTHASH_IRQ  79
-#define INT_34XX_MMC3_IRQ      94
-#define INT_34XX_GPT12_IRQ     95
-
-#define INT_36XX_UART4_IRQ     80
-
-#define INT_35XX_HECC0_IRQ             24
-#define INT_35XX_HECC1_IRQ             28
-#define INT_35XX_EMAC_C0_RXTHRESH_IRQ  67
-#define INT_35XX_EMAC_C0_RX_PULSE_IRQ  68
-#define INT_35XX_EMAC_C0_TX_PULSE_IRQ  69
-#define INT_35XX_EMAC_C0_MISC_PULSE_IRQ        70
-#define INT_35XX_USBOTG_IRQ            71
-#define INT_35XX_UART4_IRQ             84
-#define INT_35XX_CCDC_VD0_IRQ          88
-#define INT_35XX_CCDC_VD1_IRQ          92
-#define INT_35XX_CCDC_VD2_IRQ          93
-
-/* Max. 128 level 2 IRQs (OMAP1610), 192 GPIOs (OMAP730/850) and
- * 16 MPUIO lines */
-#define OMAP_MAX_GPIO_LINES    192
-#define IH_GPIO_BASE           (128 + IH2_BASE)
-#define IH_MPUIO_BASE          (OMAP_MAX_GPIO_LINES + IH_GPIO_BASE)
-#define OMAP_IRQ_END           (IH_MPUIO_BASE + 16)
-
-/* External FPGA handles interrupts on Innovator boards */
-#define        OMAP_FPGA_IRQ_BASE      (OMAP_IRQ_END)
-#ifdef CONFIG_MACH_OMAP_INNOVATOR
-#define OMAP_FPGA_NR_IRQS      24
-#else
-#define OMAP_FPGA_NR_IRQS      0
-#endif
-#define OMAP_FPGA_IRQ_END      (OMAP_FPGA_IRQ_BASE + OMAP_FPGA_NR_IRQS)
-
-/* External TWL4030 can handle interrupts on 2430 and 34xx boards */
-#define        TWL4030_IRQ_BASE        (OMAP_FPGA_IRQ_END)
-#ifdef CONFIG_TWL4030_CORE
-#define        TWL4030_BASE_NR_IRQS    8
-#define        TWL4030_PWR_NR_IRQS     8
-#else
-#define        TWL4030_BASE_NR_IRQS    0
-#define        TWL4030_PWR_NR_IRQS     0
-#endif
-#define TWL4030_IRQ_END                (TWL4030_IRQ_BASE + TWL4030_BASE_NR_IRQS)
-#define TWL4030_PWR_IRQ_BASE   TWL4030_IRQ_END
-#define        TWL4030_PWR_IRQ_END     (TWL4030_PWR_IRQ_BASE + TWL4030_PWR_NR_IRQS)
-
-/* External TWL4030 gpio interrupts are optional */
-#define TWL4030_GPIO_IRQ_BASE  TWL4030_PWR_IRQ_END
-#ifdef CONFIG_GPIO_TWL4030
-#define TWL4030_GPIO_NR_IRQS   18
-#else
-#define        TWL4030_GPIO_NR_IRQS    0
-#endif
-#define TWL4030_GPIO_IRQ_END   (TWL4030_GPIO_IRQ_BASE + TWL4030_GPIO_NR_IRQS)
-
-#define        TWL6030_IRQ_BASE        (OMAP_FPGA_IRQ_END)
-#ifdef CONFIG_TWL4030_CORE
-#define        TWL6030_BASE_NR_IRQS    20
-#else
-#define        TWL6030_BASE_NR_IRQS    0
-#endif
-#define TWL6030_IRQ_END                (TWL6030_IRQ_BASE + TWL6030_BASE_NR_IRQS)
-
-#define TWL6040_CODEC_IRQ_BASE TWL6030_IRQ_END
-#ifdef CONFIG_TWL6040_CODEC
-#define TWL6040_CODEC_NR_IRQS  6
-#else
-#define TWL6040_CODEC_NR_IRQS  0
-#endif
-#define TWL6040_CODEC_IRQ_END  (TWL6040_CODEC_IRQ_BASE + TWL6040_CODEC_NR_IRQS)
-
-/* Total number of interrupts depends on the enabled blocks above */
-#if (TWL4030_GPIO_IRQ_END > TWL6040_CODEC_IRQ_END)
-#define TWL_IRQ_END            TWL4030_GPIO_IRQ_END
-#else
-#define TWL_IRQ_END            TWL6040_CODEC_IRQ_END
-#endif
-
-/* GPMC related */
-#define OMAP_GPMC_IRQ_BASE     (TWL_IRQ_END)
-#define OMAP_GPMC_NR_IRQS      8
-#define OMAP_GPMC_IRQ_END      (OMAP_GPMC_IRQ_BASE + OMAP_GPMC_NR_IRQS)
-
-/* PRCM IRQ handler */
-#ifdef CONFIG_ARCH_OMAP2PLUS
-#define OMAP_PRCM_IRQ_BASE     (OMAP_GPMC_IRQ_END)
-#define OMAP_PRCM_NR_IRQS      64
-#define OMAP_PRCM_IRQ_END      (OMAP_PRCM_IRQ_BASE + OMAP_PRCM_NR_IRQS)
-#else
-#define OMAP_PRCM_IRQ_END      OMAP_GPMC_IRQ_END
-#endif
-
-#define NR_IRQS                        OMAP_PRCM_IRQ_END
-
-#define OMAP_IRQ_BIT(irq)      (1 << ((irq) % 32))
-
-#define INTCPS_NR_MIR_REGS     3
-#define INTCPS_NR_IRQS         96
-
-#include <mach/hardware.h>
-
-#ifdef CONFIG_FIQ
-#define FIQ_START              1024
-#endif
-
-#endif
index eb3e4d5..8b4e4f2 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/device.h>
 #include <linux/mmc/host.h>
 
-#include <plat/board.h>
 #include <plat/omap_hwmod.h>
 
 #define OMAP15XX_NR_MMC                1
index 1a52725..b2eac60 100644 (file)
 #define __OMAP_SERIAL_H__
 
 #include <linux/serial_core.h>
-#include <linux/platform_device.h>
+#include <linux/device.h>
 #include <linux/pm_qos.h>
 
-#include <plat/mux.h>
-
 #define DRIVER_NAME    "omap_uart"
 
 /*
 #define OMAP_UART_WER_MOD_WKUP 0X7F
 
 /* Enable XON/XOFF flow control on output */
-#define OMAP_UART_SW_TX                0x04
+#define OMAP_UART_SW_TX                0x8
 
 /* Enable XON/XOFF flow control on input */
-#define OMAP_UART_SW_RX                0x04
+#define OMAP_UART_SW_RX                0x2
 
 #define OMAP_UART_SYSC_RESET   0X07
 #define OMAP_UART_TCR_TRIG     0X0F
@@ -69,11 +67,14 @@ struct omap_uart_port_info {
        unsigned int            dma_rx_timeout;
        unsigned int            autosuspend_timeout;
        unsigned int            dma_rx_poll_rate;
+       int                     DTR_gpio;
+       int                     DTR_inverted;
+       int                     DTR_present;
 
        int (*get_context_loss_count)(struct device *);
-       void (*set_forceidle)(struct platform_device *);
-       void (*set_noidle)(struct platform_device *);
-       void (*enable_wakeup)(struct platform_device *, bool);
+       void (*set_forceidle)(struct device *);
+       void (*set_noidle)(struct device *);
+       void (*enable_wakeup)(struct device *, bool);
 };
 
 struct uart_omap_dma {
@@ -102,39 +103,4 @@ struct uart_omap_dma {
        unsigned int            rx_timeout;
 };
 
-struct uart_omap_port {
-       struct uart_port        port;
-       struct uart_omap_dma    uart_dma;
-       struct platform_device  *pdev;
-
-       unsigned char           ier;
-       unsigned char           lcr;
-       unsigned char           mcr;
-       unsigned char           fcr;
-       unsigned char           efr;
-       unsigned char           dll;
-       unsigned char           dlh;
-       unsigned char           mdr1;
-       unsigned char           scr;
-
-       int                     use_dma;
-       /*
-        * Some bits in registers are cleared on a read, so they must
-        * be saved whenever the register is read but the bits will not
-        * be immediately processed.
-        */
-       unsigned int            lsr_break_flag;
-       unsigned char           msr_saved_flags;
-       char                    name[20];
-       unsigned long           port_activity;
-       u32                     context_loss_cnt;
-       u32                     errata;
-       u8                      wakeups_enabled;
-
-       struct pm_qos_request   pm_qos_request;
-       u32                     latency;
-       u32                     calc_latency;
-       struct work_struct      qos_work;
-};
-
 #endif /* __OMAP_SERIAL_H__ */
index 4327b2c..e7259c0 100644 (file)
@@ -60,6 +60,7 @@ extern struct dev_pm_domain omap_device_pm_domain;
  * @_dev_wakeup_lat_limit: dev wakeup latency limit in nsec - set by OMAP PM
  * @_state: one of OMAP_DEVICE_STATE_* (see above)
  * @flags: device flags
+ * @_driver_status: one of BUS_NOTIFY_*_DRIVER from <linux/device.h>
  *
  * Integrates omap_hwmod data into Linux platform_device.
  *
@@ -73,6 +74,7 @@ struct omap_device {
        struct omap_device_pm_latency   *pm_lats;
        u32                             dev_wakeup_lat;
        u32                             _dev_wakeup_lat_limit;
+       unsigned long                   _driver_status;
        u8                              pm_lats_cnt;
        s8                              pm_lat_level;
        u8                              hwmods_cnt;
index 6132972..0533073 100644 (file)
@@ -615,6 +615,7 @@ int omap_hwmod_softreset(struct omap_hwmod *oh);
 
 int omap_hwmod_count_resources(struct omap_hwmod *oh);
 int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res);
+int omap_hwmod_fill_dma_resources(struct omap_hwmod *oh, struct resource *res);
 int omap_hwmod_get_resource_byname(struct omap_hwmod *oh, unsigned int type,
                                   const char *name, struct resource *res);
 
@@ -658,6 +659,7 @@ extern int omap2420_hwmod_init(void);
 extern int omap2430_hwmod_init(void);
 extern int omap3xxx_hwmod_init(void);
 extern int omap44xx_hwmod_init(void);
+extern int am33xx_hwmod_init(void);
 
 extern int __init omap_hwmod_register_links(struct omap_hwmod_ocp_if **ois);
 
diff --git a/arch/arm/plat-omap/include/plat/param.h b/arch/arm/plat-omap/include/plat/param.h
deleted file mode 100644 (file)
index 1eb4dc3..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-/*
- *  arch/arm/plat-omap/include/mach/param.h
- *
- */
-
-#ifdef CONFIG_OMAP_32K_TIMER_HZ
-#define HZ     CONFIG_OMAP_32K_TIMER_HZ
-#endif
index 548a4c8..bd20588 100644 (file)
@@ -5,7 +5,6 @@
 
 #include <linux/io.h>
 #include <linux/usb/musb.h>
-#include <plat/board.h>
 
 #define OMAP3_HS_USB_PORTS     3
 
diff --git a/arch/arm/plat-omap/mux.c b/arch/arm/plat-omap/mux.c
deleted file mode 100644 (file)
index cff8712..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * linux/arch/arm/plat-omap/mux.c
- *
- * Utility to set the Omap MUX and PULL_DWN registers from a table in mux.h
- *
- * Copyright (C) 2003 - 2008 Nokia Corporation
- *
- * Written by Tony Lindgren
- *
- * 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/module.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/io.h>
-#include <linux/spinlock.h>
-
-#include <asm/system.h>
-
-#include <plat/cpu.h>
-#include <plat/mux.h>
-
-#ifdef CONFIG_OMAP_MUX
-
-static struct omap_mux_cfg *mux_cfg;
-
-int __init omap_mux_register(struct omap_mux_cfg *arch_mux_cfg)
-{
-       if (!arch_mux_cfg || !arch_mux_cfg->pins || arch_mux_cfg->size == 0
-                       || !arch_mux_cfg->cfg_reg) {
-               printk(KERN_ERR "Invalid pin table\n");
-               return -EINVAL;
-       }
-
-       mux_cfg = arch_mux_cfg;
-
-       return 0;
-}
-
-/*
- * Sets the Omap MUX and PULL_DWN registers based on the table
- */
-int __init_or_module omap_cfg_reg(const unsigned long index)
-{
-       struct pin_config *reg;
-
-       if (!cpu_class_is_omap1()) {
-               printk(KERN_ERR "mux: Broken omap_cfg_reg(%lu) entry\n",
-                               index);
-               WARN_ON(1);
-               return -EINVAL;
-       }
-
-       if (mux_cfg == NULL) {
-               printk(KERN_ERR "Pin mux table not initialized\n");
-               return -ENODEV;
-       }
-
-       if (index >= mux_cfg->size) {
-               printk(KERN_ERR "Invalid pin mux index: %lu (%lu)\n",
-                      index, mux_cfg->size);
-               dump_stack();
-               return -ENODEV;
-       }
-
-       reg = (struct pin_config *)&mux_cfg->pins[index];
-
-       if (!mux_cfg->cfg_reg)
-               return -ENODEV;
-
-       return mux_cfg->cfg_reg(reg);
-}
-EXPORT_SYMBOL(omap_cfg_reg);
-#else
-#define omap_mux_init() do {} while(0)
-#define omap_cfg_reg(x)        do {} while(0)
-#endif /* CONFIG_OMAP_MUX */
index 5a97b4d..9f64133 100644 (file)
@@ -41,11 +41,11 @@ int omap_pm_set_max_mpu_wakeup_lat(struct device *dev, long t)
        };
 
        if (t == -1)
-               pr_debug("OMAP PM: remove max MPU wakeup latency constraint: "
-                        "dev %s\n", dev_name(dev));
+               pr_debug("OMAP PM: remove max MPU wakeup latency constraint: dev %s\n",
+                        dev_name(dev));
        else
-               pr_debug("OMAP PM: add max MPU wakeup latency constraint: "
-                        "dev %s, t = %ld usec\n", dev_name(dev), t);
+               pr_debug("OMAP PM: add max MPU wakeup latency constraint: dev %s, t = %ld usec\n",
+                        dev_name(dev), t);
 
        /*
         * For current Linux, this needs to map the MPU to a
@@ -70,11 +70,10 @@ int omap_pm_set_min_bus_tput(struct device *dev, u8 agent_id, unsigned long r)
        };
 
        if (r == 0)
-               pr_debug("OMAP PM: remove min bus tput constraint: "
-                        "dev %s for agent_id %d\n", dev_name(dev), agent_id);
+               pr_debug("OMAP PM: remove min bus tput constraint: dev %s for agent_id %d\n",
+                        dev_name(dev), agent_id);
        else
-               pr_debug("OMAP PM: add min bus tput constraint: "
-                        "dev %s for agent_id %d: rate %ld KiB\n",
+               pr_debug("OMAP PM: add min bus tput constraint: dev %s for agent_id %d: rate %ld KiB\n",
                         dev_name(dev), agent_id, r);
 
        /*
@@ -97,11 +96,11 @@ int omap_pm_set_max_dev_wakeup_lat(struct device *req_dev, struct device *dev,
        };
 
        if (t == -1)
-               pr_debug("OMAP PM: remove max device latency constraint: "
-                        "dev %s\n", dev_name(dev));
+               pr_debug("OMAP PM: remove max device latency constraint: dev %s\n",
+                        dev_name(dev));
        else
-               pr_debug("OMAP PM: add max device latency constraint: "
-                        "dev %s, t = %ld usec\n", dev_name(dev), t);
+               pr_debug("OMAP PM: add max device latency constraint: dev %s, t = %ld usec\n",
+                        dev_name(dev), t);
 
        /*
         * For current Linux, this needs to map the device to a
@@ -127,11 +126,11 @@ int omap_pm_set_max_sdma_lat(struct device *dev, long t)
        };
 
        if (t == -1)
-               pr_debug("OMAP PM: remove max DMA latency constraint: "
-                        "dev %s\n", dev_name(dev));
+               pr_debug("OMAP PM: remove max DMA latency constraint: dev %s\n",
+                        dev_name(dev));
        else
-               pr_debug("OMAP PM: add max DMA latency constraint: "
-                        "dev %s, t = %ld usec\n", dev_name(dev), t);
+               pr_debug("OMAP PM: add max DMA latency constraint: dev %s, t = %ld usec\n",
+                        dev_name(dev), t);
 
        /*
         * For current Linux PM QOS params, this code should scan the
@@ -156,11 +155,11 @@ int omap_pm_set_min_clk_rate(struct device *dev, struct clk *c, long r)
        }
 
        if (r == 0)
-               pr_debug("OMAP PM: remove min clk rate constraint: "
-                        "dev %s\n", dev_name(dev));
+               pr_debug("OMAP PM: remove min clk rate constraint: dev %s\n",
+                        dev_name(dev));
        else
-               pr_debug("OMAP PM: add min clk rate constraint: "
-                        "dev %s, rate = %ld Hz\n", dev_name(dev), r);
+               pr_debug("OMAP PM: add min clk rate constraint: dev %s, rate = %ld Hz\n",
+                        dev_name(dev), r);
 
        /*
         * Code in a real implementation should keep track of these
index c490240..d5f617c 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * omap_device implementation
  *
@@ -153,21 +152,19 @@ static int _omap_device_activate(struct omap_device *od, u8 ignore_lat)
                act_lat = timespec_to_ns(&c);
 
                dev_dbg(&od->pdev->dev,
-                       "omap_device: pm_lat %d: activate: elapsed time "
-                       "%llu nsec\n", od->pm_lat_level, act_lat);
+                       "omap_device: pm_lat %d: activate: elapsed time %llu nsec\n",
+                       od->pm_lat_level, act_lat);
 
                if (act_lat > odpl->activate_lat) {
                        odpl->activate_lat_worst = act_lat;
                        if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) {
                                odpl->activate_lat = act_lat;
                                dev_dbg(&od->pdev->dev,
-                                       "new worst case activate latency "
-                                       "%d: %llu\n",
+                                       "new worst case activate latency %d: %llu\n",
                                        od->pm_lat_level, act_lat);
                        } else
                                dev_warn(&od->pdev->dev,
-                                        "activate latency %d "
-                                        "higher than exptected. (%llu > %d)\n",
+                                        "activate latency %d higher than expected. (%llu > %d)\n",
                                         od->pm_lat_level, act_lat,
                                         odpl->activate_lat);
                }
@@ -220,21 +217,19 @@ static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat)
                deact_lat = timespec_to_ns(&c);
 
                dev_dbg(&od->pdev->dev,
-                       "omap_device: pm_lat %d: deactivate: elapsed time "
-                       "%llu nsec\n", od->pm_lat_level, deact_lat);
+                       "omap_device: pm_lat %d: deactivate: elapsed time %llu nsec\n",
+                       od->pm_lat_level, deact_lat);
 
                if (deact_lat > odpl->deactivate_lat) {
                        odpl->deactivate_lat_worst = deact_lat;
                        if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) {
                                odpl->deactivate_lat = deact_lat;
                                dev_dbg(&od->pdev->dev,
-                                       "new worst case deactivate latency "
-                                       "%d: %llu\n",
+                                       "new worst case deactivate latency %d: %llu\n",
                                        od->pm_lat_level, deact_lat);
                        } else
                                dev_warn(&od->pdev->dev,
-                                        "deactivate latency %d "
-                                        "higher than exptected. (%llu > %d)\n",
+                                        "deactivate latency %d higher than expected. (%llu > %d)\n",
                                         od->pm_lat_level, deact_lat,
                                         odpl->deactivate_lat);
                }
@@ -370,6 +365,14 @@ static int omap_device_build_from_dt(struct platform_device *pdev)
                goto odbfd_exit1;
        }
 
+       /* Fix up missing resource names */
+       for (i = 0; i < pdev->num_resources; i++) {
+               struct resource *r = &pdev->resource[i];
+
+               if (r->name == NULL)
+                       r->name = dev_name(&pdev->dev);
+       }
+
        if (of_get_property(node, "ti,no_idle_on_suspend", NULL))
                omap_device_disable_idle_on_suspend(pdev);
 
@@ -385,17 +388,21 @@ static int _omap_device_notifier_call(struct notifier_block *nb,
                                      unsigned long event, void *dev)
 {
        struct platform_device *pdev = to_platform_device(dev);
+       struct omap_device *od;
 
        switch (event) {
-       case BUS_NOTIFY_ADD_DEVICE:
-               if (pdev->dev.of_node)
-                       omap_device_build_from_dt(pdev);
-               break;
-
        case BUS_NOTIFY_DEL_DEVICE:
                if (pdev->archdata.od)
                        omap_device_delete(pdev->archdata.od);
                break;
+       case BUS_NOTIFY_ADD_DEVICE:
+               if (pdev->dev.of_node)
+                       omap_device_build_from_dt(pdev);
+               /* fall through */
+       default:
+               od = to_omap_device(pdev);
+               if (od)
+                       od->_driver_status = event;
        }
 
        return NOTIFY_DONE;
@@ -449,8 +456,8 @@ static int omap_device_count_resources(struct omap_device *od)
        for (i = 0; i < od->hwmods_cnt; i++)
                c += omap_hwmod_count_resources(od->hwmods[i]);
 
-       pr_debug("omap_device: %s: counted %d total resources across %d "
-                "hwmods\n", od->pdev->name, c, od->hwmods_cnt);
+       pr_debug("omap_device: %s: counted %d total resources across %d hwmods\n",
+                od->pdev->name, c, od->hwmods_cnt);
 
        return c;
 }
@@ -486,6 +493,33 @@ static int omap_device_fill_resources(struct omap_device *od,
 }
 
 /**
+ * _od_fill_dma_resources - fill in array of struct resource with dma resources
+ * @od: struct omap_device *
+ * @res: pointer to an array of struct resource to be filled in
+ *
+ * Populate one or more empty struct resource pointed to by @res with
+ * the dma resource data for this omap_device @od.  Used by
+ * omap_device_alloc() after calling omap_device_count_resources().
+ *
+ * Ideally this function would not be needed at all.  If we have
+ * mechanism to get dma resources from DT.
+ *
+ * Returns 0.
+ */
+static int _od_fill_dma_resources(struct omap_device *od,
+                                     struct resource *res)
+{
+       int i, r;
+
+       for (i = 0; i < od->hwmods_cnt; i++) {
+               r = omap_hwmod_fill_dma_resources(od->hwmods[i], res);
+               res += r;
+       }
+
+       return 0;
+}
+
+/**
  * omap_device_alloc - allocate an omap_device
  * @pdev: platform_device that will be included in this omap_device
  * @oh: ptr to the single omap_hwmod that backs this omap_device
@@ -524,24 +558,44 @@ struct omap_device *omap_device_alloc(struct platform_device *pdev,
        od->hwmods = hwmods;
        od->pdev = pdev;
 
+       res_count = omap_device_count_resources(od);
        /*
-        * HACK: Ideally the resources from DT should match, and hwmod
-        * should just add the missing ones. Since the name is not
-        * properly populated by DT, stick to hwmod resources only.
+        * DT Boot:
+        *   OF framework will construct the resource structure (currently
+        *   does for MEM & IRQ resource) and we should respect/use these
+        *   resources, killing hwmod dependency.
+        *   If pdev->num_resources > 0, we assume that MEM & IRQ resources
+        *   have been allocated by OF layer already (through DTB).
+        *
+        * Non-DT Boot:
+        *   Here, pdev->num_resources = 0, and we should get all the
+        *   resources from hwmod.
+        *
+        * TODO: Once DMA resource is available from OF layer, we should
+        *   kill filling any resources from hwmod.
         */
-       if (pdev->num_resources && pdev->resource)
-               dev_warn(&pdev->dev, "%s(): resources already allocated %d\n",
-                       __func__, pdev->num_resources);
-
-       res_count = omap_device_count_resources(od);
-       if (res_count > 0) {
-               dev_dbg(&pdev->dev, "%s(): resources allocated from hwmod %d\n",
-                       __func__, res_count);
+       if (res_count > pdev->num_resources) {
+               /* Allocate resources memory to account for new resources */
                res = kzalloc(sizeof(struct resource) * res_count, GFP_KERNEL);
                if (!res)
                        goto oda_exit3;
 
-               omap_device_fill_resources(od, res);
+               /*
+                * If pdev->num_resources > 0, then assume that,
+                * MEM and IRQ resources will only come from DT and only
+                * fill DMA resource from hwmod layer.
+                */
+               if (pdev->num_resources && pdev->resource) {
+                       dev_dbg(&pdev->dev, "%s(): resources already allocated %d\n",
+                               __func__, res_count);
+                       memcpy(res, pdev->resource,
+                              sizeof(struct resource) * pdev->num_resources);
+                       _od_fill_dma_resources(od, &res[pdev->num_resources]);
+               } else {
+                       dev_dbg(&pdev->dev, "%s(): using resources from hwmod %d\n",
+                               __func__, res_count);
+                       omap_device_fill_resources(od, res);
+               }
 
                ret = platform_device_add_resources(pdev, res, res_count);
                kfree(res);
@@ -752,6 +806,10 @@ static int _od_suspend_noirq(struct device *dev)
        struct omap_device *od = to_omap_device(pdev);
        int ret;
 
+       /* Don't attempt late suspend on a driver that is not bound */
+       if (od->_driver_status != BUS_NOTIFY_BOUND_DRIVER)
+               return 0;
+
        ret = pm_generic_suspend_noirq(dev);
 
        if (!ret && !pm_runtime_status_suspended(dev)) {
@@ -1125,3 +1183,41 @@ static int __init omap_device_init(void)
        return 0;
 }
 core_initcall(omap_device_init);
+
+/**
+ * omap_device_late_idle - idle devices without drivers
+ * @dev: struct device * associated with omap_device
+ * @data: unused
+ *
+ * Check the driver bound status of this device, and idle it
+ * if there is no driver attached.
+ */
+static int __init omap_device_late_idle(struct device *dev, void *data)
+{
+       struct platform_device *pdev = to_platform_device(dev);
+       struct omap_device *od = to_omap_device(pdev);
+
+       if (!od)
+               return 0;
+
+       /*
+        * If omap_device state is enabled, but has no driver bound,
+        * idle it.
+        */
+       if (od->_driver_status != BUS_NOTIFY_BOUND_DRIVER) {
+               if (od->_state == OMAP_DEVICE_STATE_ENABLED) {
+                       dev_warn(dev, "%s: enabled but no driver.  Idling\n",
+                                __func__);
+                       omap_device_idle(pdev);
+               }
+       }
+
+       return 0;
+}
+
+static int __init omap_device_late_init(void)
+{
+       bus_for_each_dev(&platform_bus_type, NULL, NULL, omap_device_late_idle);
+       return 0;
+}
+late_initcall(omap_device_late_init);
index 766181c..28acb38 100644 (file)
@@ -26,7 +26,6 @@
 #include <asm/mach/map.h>
 
 #include <plat/sram.h>
-#include <plat/board.h>
 #include <plat/cpu.h>
 
 #include "sram.h"
@@ -68,6 +67,7 @@
 
 static unsigned long omap_sram_start;
 static void __iomem *omap_sram_base;
+static unsigned long omap_sram_skip;
 static unsigned long omap_sram_size;
 static void __iomem *omap_sram_ceil;
 
@@ -106,6 +106,7 @@ static int is_sram_locked(void)
  */
 static void __init omap_detect_sram(void)
 {
+       omap_sram_skip = SRAM_BOOTLOADER_SZ;
        if (cpu_class_is_omap2()) {
                if (is_sram_locked()) {
                        if (cpu_is_omap34xx()) {
@@ -113,6 +114,7 @@ static void __init omap_detect_sram(void)
                                if ((omap_type() == OMAP2_DEVICE_TYPE_EMU) ||
                                    (omap_type() == OMAP2_DEVICE_TYPE_SEC)) {
                                        omap_sram_size = 0x7000; /* 28K */
+                                       omap_sram_skip += SZ_16K;
                                } else {
                                        omap_sram_size = 0x8000; /* 32K */
                                }
@@ -175,8 +177,10 @@ static void __init omap_map_sram(void)
                return;
 
 #ifdef CONFIG_OMAP4_ERRATA_I688
+       if (cpu_is_omap44xx()) {
                omap_sram_start += PAGE_SIZE;
                omap_sram_size -= SZ_16K;
+       }
 #endif
        if (cpu_is_omap34xx()) {
                /*
@@ -203,8 +207,8 @@ static void __init omap_map_sram(void)
         * Looks like we need to preserve some bootloader code at the
         * beginning of SRAM for jumping to flash for reboot to work...
         */
-       memset_io(omap_sram_base + SRAM_BOOTLOADER_SZ, 0,
-                 omap_sram_size - SRAM_BOOTLOADER_SZ);
+       memset_io(omap_sram_base + omap_sram_skip, 0,
+                 omap_sram_size - omap_sram_skip);
 }
 
 /*
@@ -218,7 +222,7 @@ void *omap_sram_push_address(unsigned long size)
 {
        unsigned long available, new_ceil = (unsigned long)omap_sram_ceil;
 
-       available = omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ);
+       available = omap_sram_ceil - (omap_sram_base + omap_sram_skip);
 
        if (size > available) {
                pr_err("Not enough space in SRAM\n");
index fc49f3d..6ff45d5 100644 (file)
@@ -35,7 +35,6 @@
 #include <media/s5p_hdmi.h>
 
 #include <asm/irq.h>
-#include <asm/pmu.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/irq.h>
@@ -1132,7 +1131,7 @@ static struct resource s5p_pmu_resource[] = {
 
 static struct platform_device s5p_device_pmu = {
        .name           = "arm-pmu",
-       .id             = ARM_PMU_DEVICE_CPU,
+       .id             = -1,
        .num_resources  = ARRAY_SIZE(s5p_pmu_resource),
        .resource       = s5p_pmu_resource,
 };
index bab1392..d1ecef0 100644 (file)
@@ -1,98 +1 @@
-/* arch/arm/mach-s3c2410/include/mach/gpio-fns.h
- *
- * Copyright (c) 2003-2009 Simtec Electronics
- *     Ben Dooks <ben@simtec.co.uk>
- *
- * S3C2410 - hardware
- *
- * 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_GPIO_FNS_H
-#define __MACH_GPIO_FNS_H __FILE__
-
-/* These functions are in the to-be-removed category and it is strongly
- * encouraged not to use these in new code. They will be marked deprecated
- * very soon.
- *
- * Most of the functionality can be either replaced by the gpiocfg calls
- * for the s3c platform or by the generic GPIOlib API.
- *
- * As of 2.6.35-rc, these will be removed, with the few drivers using them
- * either replaced or given a wrapper until the calls can be removed.
-*/
-
 #include <plat/gpio-cfg.h>
-
-static inline void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int cfg)
-{
-       /* 1:1 mapping between cfgpin and setcfg calls at the moment */
-       s3c_gpio_cfgpin(pin, cfg);
-}
-
-/* external functions for GPIO support
- *
- * These allow various different clients to access the same GPIO
- * registers without conflicting. If your driver only owns the entire
- * GPIO register, then it is safe to ioremap/__raw_{read|write} to it.
-*/
-
-extern unsigned int s3c2410_gpio_getcfg(unsigned int pin);
-
-/* s3c2410_gpio_getirq
- *
- * turn the given pin number into the corresponding IRQ number
- *
- * returns:
- *     < 0 = no interrupt for this pin
- *     >=0 = interrupt number for the pin
-*/
-
-extern int s3c2410_gpio_getirq(unsigned int pin);
-
-/* s3c2410_gpio_irqfilter
- *
- * set the irq filtering on the given pin
- *
- * on = 0 => disable filtering
- *      1 => enable filtering
- *
- * config = S3C2410_EINTFLT_PCLK or S3C2410_EINTFLT_EXTCLK orred with
- *          width of filter (0 through 63)
- *
- *
-*/
-
-extern int s3c2410_gpio_irqfilter(unsigned int pin, unsigned int on,
-                                 unsigned int config);
-
-/* s3c2410_gpio_pullup
- *
- * This call should be replaced with s3c_gpio_setpull().
- *
- * As a note, there is currently no distinction between pull-up and pull-down
- * in the s3c24xx series devices with only an on/off configuration.
- */
-
-/* s3c2410_gpio_pullup
- *
- * configure the pull-up control on the given pin
- *
- * to = 1 => disable the pull-up
- *      0 => enable the pull-up
- *
- * eg;
- *
- *   s3c2410_gpio_pullup(S3C2410_GPB(0), 0);
- *   s3c2410_gpio_pullup(S3C2410_GPE(8), 0);
-*/
-
-extern void s3c2410_gpio_pullup(unsigned int pin, unsigned int to);
-
-extern void s3c2410_gpio_setpin(unsigned int pin, unsigned int to);
-
-extern unsigned int s3c2410_gpio_getpin(unsigned int pin);
-
-#endif /* __MACH_GPIO_FNS_H */
index 2997e56..7bc7948 100644 (file)
@@ -158,7 +158,6 @@ edb9315a            MACH_EDB9315A           EDB9315A                772
 stargate2              MACH_STARGATE2          STARGATE2               774
 intelmote2             MACH_INTELMOTE2         INTELMOTE2              775
 trizeps4               MACH_TRIZEPS4           TRIZEPS4                776
-pnx4008                        MACH_PNX4008            PNX4008                 782
 cpuat91                        MACH_CPUAT91            CPUAT91                 787
 iq81340sc              MACH_IQ81340SC          IQ81340SC               799
 iq81340mc              MACH_IQ81340MC          IQ81340MC               801
index f348619..c7092e6 100644 (file)
@@ -38,6 +38,7 @@ config BLACKFIN
        select GENERIC_ATOMIC64
        select GENERIC_IRQ_PROBE
        select IRQ_PER_CPU if SMP
+       select USE_GENERIC_SMP_HELPERS if SMP
        select HAVE_NMI_WATCHDOG if NMI_WATCHDOG
        select GENERIC_SMP_IDLE_THREAD
        select ARCH_USES_GETTIMEOFFSET if !GENERIC_CLOCKEVENTS
index d3d7e64..66cf000 100644 (file)
@@ -20,7 +20,6 @@ endif
 KBUILD_AFLAGS           += $(call cc-option,-mno-fdpic)
 KBUILD_CFLAGS_MODULE    += -mlong-calls
 LDFLAGS                 += -m elf32bfin
-KALLSYMS         += --symbol-prefix=_
 
 KBUILD_DEFCONFIG := BF537-STAMP_defconfig
 
index dc3d144..9631598 100644 (file)
@@ -18,6 +18,8 @@
 #define raw_smp_processor_id()  blackfin_core_id()
 
 extern void bfin_relocate_coreb_l1_mem(void);
+extern void arch_send_call_function_single_ipi(int cpu);
+extern void arch_send_call_function_ipi_mask(const struct cpumask *mask);
 
 #if defined(CONFIG_SMP) && defined(CONFIG_ICACHE_FLUSH_L1)
 asmlinkage void blackfin_icache_flush_range_l1(unsigned long *ptr);
index 00bbe67..a401513 100644 (file)
@@ -48,10 +48,13 @@ unsigned long blackfin_iflush_l1_entry[NR_CPUS];
 
 struct blackfin_initial_pda __cpuinitdata initial_pda_coreb;
 
-#define BFIN_IPI_TIMER       0
-#define BFIN_IPI_RESCHEDULE   1
-#define BFIN_IPI_CALL_FUNC    2
-#define BFIN_IPI_CPU_STOP     3
+enum ipi_message_type {
+       BFIN_IPI_TIMER,
+       BFIN_IPI_RESCHEDULE,
+       BFIN_IPI_CALL_FUNC,
+       BFIN_IPI_CALL_FUNC_SINGLE,
+       BFIN_IPI_CPU_STOP,
+};
 
 struct blackfin_flush_data {
        unsigned long start;
@@ -60,35 +63,20 @@ struct blackfin_flush_data {
 
 void *secondary_stack;
 
-
-struct smp_call_struct {
-       void (*func)(void *info);
-       void *info;
-       int wait;
-       cpumask_t *waitmask;
-};
-
 static struct blackfin_flush_data smp_flush_data;
 
 static DEFINE_SPINLOCK(stop_lock);
 
-struct ipi_message {
-       unsigned long type;
-       struct smp_call_struct call_struct;
-};
-
 /* A magic number - stress test shows this is safe for common cases */
 #define BFIN_IPI_MSGQ_LEN 5
 
 /* Simple FIFO buffer, overflow leads to panic */
-struct ipi_message_queue {
-       spinlock_t lock;
+struct ipi_data {
        unsigned long count;
-       unsigned long head; /* head of the queue */
-       struct ipi_message ipi_message[BFIN_IPI_MSGQ_LEN];
+       unsigned long bits;
 };
 
-static DEFINE_PER_CPU(struct ipi_message_queue, ipi_msg_queue);
+static DEFINE_PER_CPU(struct ipi_data, bfin_ipi);
 
 static void ipi_cpu_stop(unsigned int cpu)
 {
@@ -129,28 +117,6 @@ static void ipi_flush_icache(void *info)
        blackfin_icache_flush_range(fdata->start, fdata->end);
 }
 
-static void ipi_call_function(unsigned int cpu, struct ipi_message *msg)
-{
-       int wait;
-       void (*func)(void *info);
-       void *info;
-       func = msg->call_struct.func;
-       info = msg->call_struct.info;
-       wait = msg->call_struct.wait;
-       func(info);
-       if (wait) {
-#ifdef __ARCH_SYNC_CORE_DCACHE
-               /*
-                * 'wait' usually means synchronization between CPUs.
-                * Invalidate D cache in case shared data was changed
-                * by func() to ensure cache coherence.
-                */
-               resync_core_dcache();
-#endif
-               cpumask_clear_cpu(cpu, msg->call_struct.waitmask);
-       }
-}
-
 /* Use IRQ_SUPPLE_0 to request reschedule.
  * When returning from interrupt to user space,
  * there is chance to reschedule */
@@ -172,152 +138,95 @@ void ipi_timer(void)
 
 static irqreturn_t ipi_handler_int1(int irq, void *dev_instance)
 {
-       struct ipi_message *msg;
-       struct ipi_message_queue *msg_queue;
+       struct ipi_data *bfin_ipi_data;
        unsigned int cpu = smp_processor_id();
-       unsigned long flags;
+       unsigned long pending;
+       unsigned long msg;
 
        platform_clear_ipi(cpu, IRQ_SUPPLE_1);
 
-       msg_queue = &__get_cpu_var(ipi_msg_queue);
-
-       spin_lock_irqsave(&msg_queue->lock, flags);
-
-       while (msg_queue->count) {
-               msg = &msg_queue->ipi_message[msg_queue->head];
-               switch (msg->type) {
-               case BFIN_IPI_TIMER:
-                       ipi_timer();
-                       break;
-               case BFIN_IPI_RESCHEDULE:
-                       scheduler_ipi();
-                       break;
-               case BFIN_IPI_CALL_FUNC:
-                       ipi_call_function(cpu, msg);
-                       break;
-               case BFIN_IPI_CPU_STOP:
-                       ipi_cpu_stop(cpu);
-                       break;
-               default:
-                       printk(KERN_CRIT "CPU%u: Unknown IPI message 0x%lx\n",
-                              cpu, msg->type);
-                       break;
-               }
-               msg_queue->head++;
-               msg_queue->head %= BFIN_IPI_MSGQ_LEN;
-               msg_queue->count--;
+       bfin_ipi_data = &__get_cpu_var(bfin_ipi);
+
+       while ((pending = xchg(&bfin_ipi_data->bits, 0)) != 0) {
+               msg = 0;
+               do {
+                       msg = find_next_bit(&pending, BITS_PER_LONG, msg + 1);
+                       switch (msg) {
+                       case BFIN_IPI_TIMER:
+                               ipi_timer();
+                               break;
+                       case BFIN_IPI_RESCHEDULE:
+                               scheduler_ipi();
+                               break;
+                       case BFIN_IPI_CALL_FUNC:
+                               generic_smp_call_function_interrupt();
+                               break;
+
+                       case BFIN_IPI_CALL_FUNC_SINGLE:
+                               generic_smp_call_function_single_interrupt();
+                               break;
+
+                       case BFIN_IPI_CPU_STOP:
+                               ipi_cpu_stop(cpu);
+                               break;
+                       }
+               } while (msg < BITS_PER_LONG);
+
+               smp_mb();
        }
-       spin_unlock_irqrestore(&msg_queue->lock, flags);
        return IRQ_HANDLED;
 }
 
-static void ipi_queue_init(void)
+static void bfin_ipi_init(void)
 {
        unsigned int cpu;
-       struct ipi_message_queue *msg_queue;
+       struct ipi_data *bfin_ipi_data;
        for_each_possible_cpu(cpu) {
-               msg_queue = &per_cpu(ipi_msg_queue, cpu);
-               spin_lock_init(&msg_queue->lock);
-               msg_queue->count = 0;
-               msg_queue->head = 0;
+               bfin_ipi_data = &per_cpu(bfin_ipi, cpu);
+               bfin_ipi_data->bits = 0;
+               bfin_ipi_data->count = 0;
        }
 }
 
-static inline void smp_send_message(cpumask_t callmap, unsigned long type,
-                                       void (*func) (void *info), void *info, int wait)
+void send_ipi(const struct cpumask *cpumask, enum ipi_message_type msg)
 {
        unsigned int cpu;
-       struct ipi_message_queue *msg_queue;
-       struct ipi_message *msg;
-       unsigned long flags, next_msg;
-       cpumask_t waitmask; /* waitmask is shared by all cpus */
-
-       cpumask_copy(&waitmask, &callmap);
-       for_each_cpu(cpu, &callmap) {
-               msg_queue = &per_cpu(ipi_msg_queue, cpu);
-               spin_lock_irqsave(&msg_queue->lock, flags);
-               if (msg_queue->count < BFIN_IPI_MSGQ_LEN) {
-                       next_msg = (msg_queue->head + msg_queue->count)
-                                       % BFIN_IPI_MSGQ_LEN;
-                       msg = &msg_queue->ipi_message[next_msg];
-                       msg->type = type;
-                       if (type == BFIN_IPI_CALL_FUNC) {
-                               msg->call_struct.func = func;
-                               msg->call_struct.info = info;
-                               msg->call_struct.wait = wait;
-                               msg->call_struct.waitmask = &waitmask;
-                       }
-                       msg_queue->count++;
-               } else
-                       panic("IPI message queue overflow\n");
-               spin_unlock_irqrestore(&msg_queue->lock, flags);
+       struct ipi_data *bfin_ipi_data;
+       unsigned long flags;
+
+       local_irq_save(flags);
+
+       for_each_cpu(cpu, cpumask) {
+               bfin_ipi_data = &per_cpu(bfin_ipi, cpu);
+               smp_mb();
+               set_bit(msg, &bfin_ipi_data->bits);
+               bfin_ipi_data->count++;
                platform_send_ipi_cpu(cpu, IRQ_SUPPLE_1);
        }
 
-       if (wait) {
-               while (!cpumask_empty(&waitmask))
-                       blackfin_dcache_invalidate_range(
-                               (unsigned long)(&waitmask),
-                               (unsigned long)(&waitmask));
-#ifdef __ARCH_SYNC_CORE_DCACHE
-               /*
-                * Invalidate D cache in case shared data was changed by
-                * other processors to ensure cache coherence.
-                */
-               resync_core_dcache();
-#endif
-       }
+       local_irq_restore(flags);
 }
 
-int smp_call_function(void (*func)(void *info), void *info, int wait)
+void arch_send_call_function_single_ipi(int cpu)
 {
-       cpumask_t callmap;
-
-       preempt_disable();
-       cpumask_copy(&callmap, cpu_online_mask);
-       cpumask_clear_cpu(smp_processor_id(), &callmap);
-       if (!cpumask_empty(&callmap))
-               smp_send_message(callmap, BFIN_IPI_CALL_FUNC, func, info, wait);
-
-       preempt_enable();
-
-       return 0;
+       send_ipi(cpumask_of(cpu), BFIN_IPI_CALL_FUNC_SINGLE);
 }
-EXPORT_SYMBOL_GPL(smp_call_function);
 
-int smp_call_function_single(int cpuid, void (*func) (void *info), void *info,
-                               int wait)
+void arch_send_call_function_ipi_mask(const struct cpumask *mask)
 {
-       unsigned int cpu = cpuid;
-       cpumask_t callmap;
-
-       if (cpu_is_offline(cpu))
-               return 0;
-       cpumask_clear(&callmap);
-       cpumask_set_cpu(cpu, &callmap);
-
-       smp_send_message(callmap, BFIN_IPI_CALL_FUNC, func, info, wait);
-
-       return 0;
+       send_ipi(mask, BFIN_IPI_CALL_FUNC);
 }
-EXPORT_SYMBOL_GPL(smp_call_function_single);
 
 void smp_send_reschedule(int cpu)
 {
-       cpumask_t callmap;
-       /* simply trigger an ipi */
-
-       cpumask_clear(&callmap);
-       cpumask_set_cpu(cpu, &callmap);
-
-       smp_send_message(callmap, BFIN_IPI_RESCHEDULE, NULL, NULL, 0);
+       send_ipi(cpumask_of(cpu), BFIN_IPI_RESCHEDULE);
 
        return;
 }
 
 void smp_send_msg(const struct cpumask *mask, unsigned long type)
 {
-       smp_send_message(*mask, type, NULL, NULL, 0);
+       send_ipi(mask, type);
 }
 
 void smp_timer_broadcast(const struct cpumask *mask)
@@ -333,7 +242,7 @@ void smp_send_stop(void)
        cpumask_copy(&callmap, cpu_online_mask);
        cpumask_clear_cpu(smp_processor_id(), &callmap);
        if (!cpumask_empty(&callmap))
-               smp_send_message(callmap, BFIN_IPI_CPU_STOP, NULL, NULL, 0);
+               send_ipi(&callmap, BFIN_IPI_CPU_STOP);
 
        preempt_enable();
 
@@ -436,7 +345,7 @@ void __init smp_prepare_boot_cpu(void)
 void __init smp_prepare_cpus(unsigned int max_cpus)
 {
        platform_prepare_cpus(max_cpus);
-       ipi_queue_init();
+       bfin_ipi_init();
        platform_request_ipi(IRQ_SUPPLE_0, ipi_handler_int0);
        platform_request_ipi(IRQ_SUPPLE_1, ipi_handler_int1);
 }
index c34785d..ec536e4 100644 (file)
@@ -338,7 +338,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 {
        /* Handle turning off CRTSCTS */
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
        }
 }
@@ -545,6 +545,7 @@ static int __init simrs_init(void)
        /* the port is imaginary */
        printk(KERN_INFO "ttyS0 at 0x03f8 (irq = %d) is a 16550\n", state->irq);
 
+       tty_port_link_device(&state->port, hp_simserial_driver, 0);
        retval = tty_register_driver(hp_simserial_driver);
        if (retval) {
                printk(KERN_ERR "Couldn't register simserial driver\n");
index 8db25e8..16d170f 100644 (file)
@@ -19,6 +19,7 @@
 #include <asm/natfeat.h>
 
 static int stderr_id;
+static struct tty_port nfcon_tty_port;
 static struct tty_driver *nfcon_tty_driver;
 
 static void nfputs(const char *str, unsigned int count)
@@ -119,6 +120,8 @@ static int __init nfcon_init(void)
 {
        int res;
 
+       tty_port_init(&nfcon_tty_port);
+
        stderr_id = nf_get_id("NF_STDERR");
        if (!stderr_id)
                return -ENODEV;
@@ -135,6 +138,7 @@ static int __init nfcon_init(void)
        nfcon_tty_driver->flags = TTY_DRIVER_REAL_RAW;
 
        tty_set_operations(nfcon_tty_driver, &nfcon_tty_ops);
+       tty_port_link_device(&nfcon_tty_port, nfcon_tty_driver, 0);
        res = tty_register_driver(nfcon_tty_driver);
        if (res) {
                pr_err("failed to register nfcon tty driver\n");
index 138b221..569f41b 100644 (file)
@@ -47,40 +47,40 @@ static int __devinit octeon_serial_probe(struct platform_device *pdev)
 {
        int irq, res;
        struct resource *res_mem;
-       struct uart_port port;
+       struct uart_8250_port up;
 
        /* All adaptors have an irq.  */
        irq = platform_get_irq(pdev, 0);
        if (irq < 0)
                return irq;
 
-       memset(&port, 0, sizeof(port));
+       memset(&up, 0, sizeof(up));
 
-       port.flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE;
-       port.type = PORT_OCTEON;
-       port.iotype = UPIO_MEM;
-       port.regshift = 3;
-       port.dev = &pdev->dev;
+       up.port.flags = ASYNC_SKIP_TEST | UPF_SHARE_IRQ | UPF_FIXED_TYPE;
+       up.port.type = PORT_OCTEON;
+       up.port.iotype = UPIO_MEM;
+       up.port.regshift = 3;
+       up.port.dev = &pdev->dev;
 
        if (octeon_is_simulation())
                /* Make simulator output fast*/
-               port.uartclk = 115200 * 16;
+               up.port.uartclk = 115200 * 16;
        else
-               port.uartclk = octeon_get_io_clock_rate();
+               up.port.uartclk = octeon_get_io_clock_rate();
 
-       port.serial_in = octeon_serial_in;
-       port.serial_out = octeon_serial_out;
-       port.irq = irq;
+       up.port.serial_in = octeon_serial_in;
+       up.port.serial_out = octeon_serial_out;
+       up.port.irq = irq;
 
        res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (res_mem == NULL) {
                dev_err(&pdev->dev, "found no memory resource\n");
                return -ENXIO;
        }
-       port.mapbase = res_mem->start;
-       port.membase = ioremap(res_mem->start, resource_size(res_mem));
+       up.port.mapbase = res_mem->start;
+       up.port.membase = ioremap(res_mem->start, resource_size(res_mem));
 
-       res = serial8250_register_port(&port);
+       res = serial8250_register_8250_port(&up);
 
        return res >= 0 ? 0 : res;
 }
index c48194c..b2d4f49 100644 (file)
@@ -133,6 +133,38 @@ static struct platform_device sc26xx_pdev = {
        }
 };
 
+#warning "Please try migrate to use new driver SCCNXP and report the status" \
+        "in the linux-serial mailing list."
+
+/* The code bellow is a replacement of SC26XX to SCCNXP */
+#if 0
+#include <linux/platform_data/sccnxp.h>
+
+static struct sccnxp_pdata sccnxp_data = {
+       .reg_shift      = 2,
+       .frequency      = 3686400,
+       .mctrl_cfg[0]   = MCTRL_SIG(DTR_OP, LINE_OP7) |
+                         MCTRL_SIG(RTS_OP, LINE_OP3) |
+                         MCTRL_SIG(DSR_IP, LINE_IP5) |
+                         MCTRL_SIG(DCD_IP, LINE_IP6),
+       .mctrl_cfg[1]   = MCTRL_SIG(DTR_OP, LINE_OP2) |
+                         MCTRL_SIG(RTS_OP, LINE_OP1) |
+                         MCTRL_SIG(DSR_IP, LINE_IP0) |
+                         MCTRL_SIG(CTS_IP, LINE_IP1) |
+                         MCTRL_SIG(DCD_IP, LINE_IP2) |
+                         MCTRL_SIG(RNG_IP, LINE_IP3),
+};
+
+static struct platform_device sc2681_pdev = {
+       .name           = "sc2681",
+       .resource       = sc2xxx_rsrc,
+       .num_resources  = ARRAY_SIZE(sc2xxx_rsrc),
+       .dev    = {
+               .platform_data  = &sccnxp_data,
+       },
+};
+#endif
+
 static u32 a20r_ack_hwint(void)
 {
        u32 status = read_c0_status();
index 47341aa..8823863 100644 (file)
@@ -202,6 +202,7 @@ static int __init pdc_console_tty_driver_init(void)
        pdc_console_tty_driver->flags = TTY_DRIVER_REAL_RAW |
                TTY_DRIVER_RESET_TERMIOS;
        tty_set_operations(pdc_console_tty_driver, &pdc_console_tty_ops);
+       tty_port_link_device(&tty_port, pdc_console_tty_driver, 0);
 
        err = tty_register_driver(pdc_console_tty_driver);
        if (err) {
index 53b6dfa..54b73a2 100644 (file)
@@ -386,6 +386,7 @@ extern unsigned long cpuidle_disable;
 enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF};
 
 extern int powersave_nap;      /* set if nap mode can be used in idle loop */
+extern void power7_nap(void);
 
 #ifdef CONFIG_PSERIES_IDLE
 extern void update_smt_snooze_delay(int snooze);
index 85b05c4..e899572 100644 (file)
@@ -76,6 +76,7 @@ int main(void)
        DEFINE(SIGSEGV, SIGSEGV);
        DEFINE(NMI_MASK, NMI_MASK);
        DEFINE(THREAD_DSCR, offsetof(struct thread_struct, dscr));
+       DEFINE(THREAD_DSCR_INHERIT, offsetof(struct thread_struct, dscr_inherit));
 #else
        DEFINE(THREAD_INFO, offsetof(struct task_struct, stack));
 #endif /* CONFIG_PPC64 */
index 5b25c80..a892680 100644 (file)
@@ -28,6 +28,8 @@ void doorbell_setup_this_cpu(void)
 
 void doorbell_cause_ipi(int cpu, unsigned long data)
 {
+       /* Order previous accesses vs. msgsnd, which is treated as a store */
+       mb();
        ppc_msgsnd(PPC_DBELL, 0, data);
 }
 
index 4b01a25..b40e0b4 100644 (file)
@@ -370,6 +370,12 @@ _GLOBAL(ret_from_fork)
        li      r3,0
        b       syscall_exit
 
+       .section        ".toc","aw"
+DSCR_DEFAULT:
+       .tc dscr_default[TC],dscr_default
+
+       .section        ".text"
+
 /*
  * This routine switches between two different tasks.  The process
  * state of one is saved on its kernel stack.  Then the state
@@ -509,9 +515,6 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
        mr      r1,r8           /* start using new stack pointer */
        std     r7,PACAKSAVE(r13)
 
-       ld      r6,_CCR(r1)
-       mtcrf   0xFF,r6
-
 #ifdef CONFIG_ALTIVEC
 BEGIN_FTR_SECTION
        ld      r0,THREAD_VRSAVE(r4)
@@ -520,14 +523,22 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
 #endif /* CONFIG_ALTIVEC */
 #ifdef CONFIG_PPC64
 BEGIN_FTR_SECTION
+       lwz     r6,THREAD_DSCR_INHERIT(r4)
+       ld      r7,DSCR_DEFAULT@toc(2)
        ld      r0,THREAD_DSCR(r4)
-       cmpd    r0,r25
-       beq     1f
+       cmpwi   r6,0
+       bne     1f
+       ld      r0,0(r7)
+1:     cmpd    r0,r25
+       beq     2f
        mtspr   SPRN_DSCR,r0
-1:     
+2:
 END_FTR_SECTION_IFSET(CPU_FTR_DSCR)
 #endif
 
+       ld      r6,_CCR(r1)
+       mtcrf   0xFF,r6
+
        /* r3-r13 are destroyed -- Cort */
        REST_8GPRS(14, r1)
        REST_10GPRS(22, r1)
index e894515..39aa97d 100644 (file)
@@ -186,7 +186,7 @@ hardware_interrupt_hv:
        KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x800)
 
        MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer)
-       MASKABLE_EXCEPTION_HV(0x980, 0x982, decrementer)
+       STD_EXCEPTION_HV(0x980, 0x982, hdecrementer)
 
        STD_EXCEPTION_PSERIES(0xa00, 0xa00, trap_0a)
        KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00)
@@ -486,6 +486,7 @@ machine_check_common:
 
        STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ)
        STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt)
+       STD_EXCEPTION_COMMON(0x980, hdecrementer, .hdec_interrupt)
        STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception)
        STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)
        STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)
index 7140d83..e11863f 100644 (file)
@@ -28,7 +28,9 @@ _GLOBAL(power7_idle)
        lwz     r4,ADDROFF(powersave_nap)(r3)
        cmpwi   0,r4,0
        beqlr
+       /* fall through */
 
+_GLOBAL(power7_nap)
        /* NAP is a state loss, we create a regs frame on the
         * stack, fill it up with the state we care about and
         * stick a pointer to it in PACAR1. We really only
index 710f400..1a1f2dd 100644 (file)
@@ -802,16 +802,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
 #endif /* CONFIG_PPC_STD_MMU_64 */
 #ifdef CONFIG_PPC64 
        if (cpu_has_feature(CPU_FTR_DSCR)) {
-               if (current->thread.dscr_inherit) {
-                       p->thread.dscr_inherit = 1;
-                       p->thread.dscr = current->thread.dscr;
-               } else if (0 != dscr_default) {
-                       p->thread.dscr_inherit = 1;
-                       p->thread.dscr = dscr_default;
-               } else {
-                       p->thread.dscr_inherit = 0;
-                       p->thread.dscr = 0;
-               }
+               p->thread.dscr_inherit = current->thread.dscr_inherit;
+               p->thread.dscr = current->thread.dscr;
        }
 #endif
 
index 0321007..8d4214a 100644 (file)
@@ -198,8 +198,15 @@ void smp_muxed_ipi_message_pass(int cpu, int msg)
        struct cpu_messages *info = &per_cpu(ipi_message, cpu);
        char *message = (char *)&info->messages;
 
+       /*
+        * Order previous accesses before accesses in the IPI handler.
+        */
+       smp_mb();
        message[msg] = 1;
-       mb();
+       /*
+        * cause_ipi functions are required to include a full barrier
+        * before doing whatever causes the IPI.
+        */
        smp_ops->cause_ipi(cpu, info->data);
 }
 
@@ -211,7 +218,7 @@ irqreturn_t smp_ipi_demux(void)
        mb();   /* order any irq clear */
 
        do {
-               all = xchg_local(&info->messages, 0);
+               all = xchg(&info->messages, 0);
 
 #ifdef __BIG_ENDIAN
                if (all & (1 << (24 - 8 * PPC_MSG_CALL_FUNCTION)))
index 3529446..8302af6 100644 (file)
@@ -194,6 +194,14 @@ static ssize_t show_dscr_default(struct device *dev,
        return sprintf(buf, "%lx\n", dscr_default);
 }
 
+static void update_dscr(void *dummy)
+{
+       if (!current->thread.dscr_inherit) {
+               current->thread.dscr = dscr_default;
+               mtspr(SPRN_DSCR, dscr_default);
+       }
+}
+
 static ssize_t __used store_dscr_default(struct device *dev,
                struct device_attribute *attr, const char *buf,
                size_t count)
@@ -206,6 +214,8 @@ static ssize_t __used store_dscr_default(struct device *dev,
                return -EINVAL;
        dscr_default = val;
 
+       on_each_cpu(update_dscr, NULL, 1);
+
        return count;
 }
 
index be171ee..e49e931 100644 (file)
@@ -535,6 +535,15 @@ void timer_interrupt(struct pt_regs * regs)
        trace_timer_interrupt_exit(regs);
 }
 
+/*
+ * Hypervisor decrementer interrupts shouldn't occur but are sometimes
+ * left pending on exit from a KVM guest.  We don't need to do anything
+ * to clear them, as they are edge-triggered.
+ */
+void hdec_interrupt(struct pt_regs *regs)
+{
+}
+
 #ifdef CONFIG_SUSPEND
 static void generic_suspend_disable_irqs(void)
 {
index 1589723..ae0843f 100644 (file)
@@ -972,8 +972,9 @@ static int emulate_instruction(struct pt_regs *regs)
                        cpu_has_feature(CPU_FTR_DSCR)) {
                PPC_WARN_EMULATED(mtdscr, regs);
                rd = (instword >> 21) & 0x1f;
-               mtspr(SPRN_DSCR, regs->gpr[rd]);
+               current->thread.dscr = regs->gpr[rd];
                current->thread.dscr_inherit = 1;
+               mtspr(SPRN_DSCR, current->thread.dscr);
                return 0;
        }
 #endif
index dd223b3..17e5b23 100644 (file)
@@ -20,7 +20,7 @@ int patch_instruction(unsigned int *addr, unsigned int instr)
 {
        int err;
 
-       err = __put_user(instr, addr);
+       __put_user_size(instr, addr, 4, err);
        if (err)
                return err;
        asm ("dcbst 0, %0; sync; icbi 0,%0; sync; isync" : : "r" (addr));
index 39b1597..59213cf 100644 (file)
@@ -1436,11 +1436,11 @@ static long vphn_get_associativity(unsigned long cpu,
 
 /*
  * Update the node maps and sysfs entries for each cpu whose home node
- * has changed.
+ * has changed. Returns 1 when the topology has changed, and 0 otherwise.
  */
 int arch_update_cpu_topology(void)
 {
-       int cpu, nid, old_nid;
+       int cpu, nid, old_nid, changed = 0;
        unsigned int associativity[VPHN_ASSOC_BUFSIZE] = {0};
        struct device *dev;
 
@@ -1466,9 +1466,10 @@ int arch_update_cpu_topology(void)
                dev = get_cpu_device(cpu);
                if (dev)
                        kobject_uevent(&dev->kobj, KOBJ_CHANGE);
+               changed = 1;
        }
 
-       return 1;
+       return changed;
 }
 
 static void topology_work_fn(struct work_struct *work)
index 3ef4625..7698b6e 100644 (file)
@@ -106,14 +106,6 @@ static void pnv_smp_cpu_kill_self(void)
 {
        unsigned int cpu;
 
-       /* If powersave_nap is enabled, use NAP mode, else just
-        * spin aimlessly
-        */
-       if (!powersave_nap) {
-               generic_mach_cpu_die();
-               return;
-       }
-
        /* Standard hot unplug procedure */
        local_irq_disable();
        idle_task_exit();
@@ -128,7 +120,7 @@ static void pnv_smp_cpu_kill_self(void)
         */
        mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1);
        while (!generic_check_cpu_restart(cpu)) {
-               power7_idle();
+               power7_nap();
                if (!generic_check_cpu_restart(cpu)) {
                        DBG("CPU%d Unexpected exit while offline !\n", cpu);
                        /* We may be getting an IPI, so we re-enable
index 14469cf..df0fc58 100644 (file)
@@ -65,7 +65,11 @@ static inline void icp_hv_set_xirr(unsigned int value)
 static inline void icp_hv_set_qirr(int n_cpu , u8 value)
 {
        int hw_cpu = get_hard_smp_processor_id(n_cpu);
-       long rc = plpar_hcall_norets(H_IPI, hw_cpu, value);
+       long rc;
+
+       /* Make sure all previous accesses are ordered before IPI sending */
+       mb();
+       rc = plpar_hcall_norets(H_IPI, hw_cpu, value);
        if (rc != H_SUCCESS) {
                pr_err("%s: bad return code qirr cpu=%d hw_cpu=%d mfrr=0x%x "
                        "returned %ld\n", __func__, n_cpu, hw_cpu, value, rc);
index a1e9d69..584b936 100644 (file)
@@ -169,7 +169,7 @@ static ssize_t hw_interval_write(struct file *file, char const __user *buf,
        if (*offset)
                return -EINVAL;
        retval = oprofilefs_ulong_from_user(&val, buf, count);
-       if (retval)
+       if (retval <= 0)
                return retval;
        if (val < oprofile_min_interval)
                oprofile_hw_interval = oprofile_min_interval;
@@ -212,7 +212,7 @@ static ssize_t hwsampler_zero_write(struct file *file, char const __user *buf,
                return -EINVAL;
 
        retval = oprofilefs_ulong_from_user(&val, buf, count);
-       if (retval)
+       if (retval <= 0)
                return retval;
        if (val != 0)
                return -EINVAL;
@@ -243,7 +243,7 @@ static ssize_t hwsampler_kernel_write(struct file *file, char const __user *buf,
                return -EINVAL;
 
        retval = oprofilefs_ulong_from_user(&val, buf, count);
-       if (retval)
+       if (retval <= 0)
                return retval;
 
        if (val != 0 && val != 1)
@@ -278,7 +278,7 @@ static ssize_t hwsampler_user_write(struct file *file, char const __user *buf,
                return -EINVAL;
 
        retval = oprofilefs_ulong_from_user(&val, buf, count);
-       if (retval)
+       if (retval <= 0)
                return retval;
 
        if (val != 0 && val != 1)
@@ -317,7 +317,7 @@ static ssize_t timer_enabled_write(struct file *file, char const __user *buf,
                return -EINVAL;
 
        retval = oprofilefs_ulong_from_user(&val, buf, count);
-       if (retval)
+       if (retval <= 0)
                return retval;
 
        if (val != 0 && val != 1)
index bbaf2c5..457475f 100644 (file)
@@ -409,7 +409,8 @@ int setup_one_line(struct line *lines, int n, char *init,
                line->valid = 1;
                err = parse_chan_pair(new, line, n, opts, error_out);
                if (!err) {
-                       struct device *d = tty_register_device(driver, n, NULL);
+                       struct device *d = tty_port_register_device(&line->port,
+                                       driver, n, NULL);
                        if (IS_ERR(d)) {
                                *error_out = "Failed to register device";
                                err = PTR_ERR(d);
index f602385..0748fe0 100644 (file)
@@ -114,7 +114,7 @@ static void deliver_alarm(void)
        skew += this_tick - last_tick;
 
        while (skew >= one_tick) {
-               alarm_handler(SIGVTALRM, NULL);
+               alarm_handler(SIGVTALRM, NULL, NULL);
                skew -= one_tick;
        }
 
index 7f2739e..0d3d63a 100644 (file)
@@ -2008,6 +2008,7 @@ __init int intel_pmu_init(void)
                break;
 
        case 28: /* Atom */
+       case 54: /* Cedariew */
                memcpy(hw_cache_event_ids, atom_hw_cache_event_ids,
                       sizeof(hw_cache_event_ids));
 
index 520b426..da02e9c 100644 (file)
@@ -686,7 +686,8 @@ void intel_pmu_lbr_init_atom(void)
         * to have an operational LBR which can freeze
         * on PMU interrupt
         */
-       if (boot_cpu_data.x86_mask < 10) {
+       if (boot_cpu_data.x86_model == 28
+           && boot_cpu_data.x86_mask < 10) {
                pr_cont("LBR disabled due to erratum");
                return;
        }
index 4873e62..9e5bcf1 100644 (file)
@@ -225,6 +225,9 @@ static ssize_t microcode_write(struct file *file, const char __user *buf,
        if (do_microcode_update(buf, len) == 0)
                ret = (ssize_t)len;
 
+       if (ret > 0)
+               perf_check_microcode();
+
        mutex_unlock(&microcode_mutex);
        put_online_cpus();
 
index e498b18..9fc9aa7 100644 (file)
@@ -318,7 +318,7 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val)
                if (val & 0x10) {
                        u8 edge_irr = s->irr & ~s->elcr;
                        int i;
-                       bool found;
+                       bool found = false;
                        struct kvm_vcpu *vcpu;
 
                        s->init4 = val & 1;
index c00f03d..b1eb202 100644 (file)
@@ -3619,6 +3619,7 @@ static void seg_setup(int seg)
 
 static int alloc_apic_access_page(struct kvm *kvm)
 {
+       struct page *page;
        struct kvm_userspace_memory_region kvm_userspace_mem;
        int r = 0;
 
@@ -3633,7 +3634,13 @@ static int alloc_apic_access_page(struct kvm *kvm)
        if (r)
                goto out;
 
-       kvm->arch.apic_access_page = gfn_to_page(kvm, 0xfee00);
+       page = gfn_to_page(kvm, 0xfee00);
+       if (is_error_page(page)) {
+               r = -EFAULT;
+               goto out;
+       }
+
+       kvm->arch.apic_access_page = page;
 out:
        mutex_unlock(&kvm->slots_lock);
        return r;
@@ -3641,6 +3648,7 @@ out:
 
 static int alloc_identity_pagetable(struct kvm *kvm)
 {
+       struct page *page;
        struct kvm_userspace_memory_region kvm_userspace_mem;
        int r = 0;
 
@@ -3656,8 +3664,13 @@ static int alloc_identity_pagetable(struct kvm *kvm)
        if (r)
                goto out;
 
-       kvm->arch.ept_identity_pagetable = gfn_to_page(kvm,
-                       kvm->arch.ept_identity_map_addr >> PAGE_SHIFT);
+       page = gfn_to_page(kvm, kvm->arch.ept_identity_map_addr >> PAGE_SHIFT);
+       if (is_error_page(page)) {
+               r = -EFAULT;
+               goto out;
+       }
+
+       kvm->arch.ept_identity_pagetable = page;
 out:
        mutex_unlock(&kvm->slots_lock);
        return r;
@@ -6575,7 +6588,7 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
        /* Exposing INVPCID only when PCID is exposed */
        best = kvm_find_cpuid_entry(vcpu, 0x7, 0);
        if (vmx_invpcid_supported() &&
-           best && (best->ecx & bit(X86_FEATURE_INVPCID)) &&
+           best && (best->ebx & bit(X86_FEATURE_INVPCID)) &&
            guest_cpuid_has_pcid(vcpu)) {
                exec_control |= SECONDARY_EXEC_ENABLE_INVPCID;
                vmcs_write32(SECONDARY_VM_EXEC_CONTROL,
@@ -6585,7 +6598,7 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu)
                vmcs_write32(SECONDARY_VM_EXEC_CONTROL,
                             exec_control);
                if (best)
-                       best->ecx &= ~bit(X86_FEATURE_INVPCID);
+                       best->ebx &= ~bit(X86_FEATURE_INVPCID);
        }
 }
 
index 148ed66..2966c84 100644 (file)
@@ -5113,17 +5113,20 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu)
                        !kvm_event_needs_reinjection(vcpu);
 }
 
-static void vapic_enter(struct kvm_vcpu *vcpu)
+static int vapic_enter(struct kvm_vcpu *vcpu)
 {
        struct kvm_lapic *apic = vcpu->arch.apic;
        struct page *page;
 
        if (!apic || !apic->vapic_addr)
-               return;
+               return 0;
 
        page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT);
+       if (is_error_page(page))
+               return -EFAULT;
 
        vcpu->arch.apic->vapic_page = page;
+       return 0;
 }
 
 static void vapic_exit(struct kvm_vcpu *vcpu)
@@ -5430,7 +5433,11 @@ static int __vcpu_run(struct kvm_vcpu *vcpu)
        }
 
        vcpu->srcu_idx = srcu_read_lock(&kvm->srcu);
-       vapic_enter(vcpu);
+       r = vapic_enter(vcpu);
+       if (r) {
+               srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx);
+               return r;
+       }
 
        r = 1;
        while (r > 0) {
index b65a761..5141d80 100644 (file)
@@ -1283,7 +1283,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus,
        cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask));
 
        args->op.cmd = MMUEXT_TLB_FLUSH_MULTI;
-       if (start != TLB_FLUSH_ALL && (end - start) <= PAGE_SIZE) {
+       if (end != TLB_FLUSH_ALL && (end - start) <= PAGE_SIZE) {
                args->op.cmd = MMUEXT_INVLPG_MULTI;
                args->op.arg1.linear_addr = start;
        }
index d4b2554..76ba0e9 100644 (file)
@@ -599,7 +599,7 @@ bool __init early_can_reuse_p2m_middle(unsigned long set_pfn, unsigned long set_
        if (p2m_index(set_pfn))
                return false;
 
-       for (pfn = 0; pfn <= MAX_DOMAIN_PAGES; pfn += P2M_PER_PAGE) {
+       for (pfn = 0; pfn < MAX_DOMAIN_PAGES; pfn += P2M_PER_PAGE) {
                topidx = p2m_top_index(pfn);
 
                if (!p2m_top[topidx])
index f9726f6..2cd3d3a 100644 (file)
@@ -223,6 +223,7 @@ int __init rs_init(void)
        serial_driver->flags = TTY_DRIVER_REAL_RAW;
 
        tty_set_operations(serial_driver, &serial_ops);
+       tty_port_link_device(&serial_port, serial_driver, 0);
 
        if (tty_register_driver(serial_driver))
                panic("Couldn't register serial driver\n");
index 5ef7ba6..d0583a4 100644 (file)
@@ -336,7 +336,7 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv,
                cryptlen += ivsize;
        }
 
-       if (sg_is_last(assoc)) {
+       if (req->assoclen && sg_is_last(assoc)) {
                authenc_ahash_fn = crypto_authenc_ahash;
                sg_init_table(asg, 2);
                sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset);
@@ -490,7 +490,7 @@ static int crypto_authenc_iverify(struct aead_request *req, u8 *iv,
                cryptlen += ivsize;
        }
 
-       if (sg_is_last(assoc)) {
+       if (req->assoclen && sg_is_last(assoc)) {
                authenc_ahash_fn = crypto_authenc_ahash;
                sg_init_table(asg, 2);
                sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset);
index ece958d..36d3daa 100644 (file)
@@ -152,4 +152,6 @@ source "drivers/vme/Kconfig"
 
 source "drivers/pwm/Kconfig"
 
+source "drivers/irqchip/Kconfig"
+
 endmenu
index 5b42184..8c30e73 100644 (file)
@@ -5,6 +5,8 @@
 # Rewritten to use lists instead of if-statements.
 #
 
+obj-y                          += irqchip/
+
 # GPIO must come after pinctrl as gpios may need to mux pins etc
 obj-y                          += pinctrl/
 obj-y                          += gpio/
index 9628652..e059695 100644 (file)
@@ -237,6 +237,16 @@ static int __acpi_bus_get_power(struct acpi_device *device, int *state)
        } else if (result == ACPI_STATE_D3_HOT) {
                result = ACPI_STATE_D3;
        }
+
+       /*
+        * If we were unsure about the device parent's power state up to this
+        * point, the fact that the device is in D0 implies that the parent has
+        * to be in D0 too.
+        */
+       if (device->parent && device->parent->power.state == ACPI_STATE_UNKNOWN
+           && result == ACPI_STATE_D0)
+               device->parent->power.state = ACPI_STATE_D0;
+
        *state = result;
 
  out:
index fc18034..40e38a0 100644 (file)
@@ -107,6 +107,7 @@ struct acpi_power_resource {
 
        /* List of devices relying on this power resource */
        struct acpi_power_resource_device *devices;
+       struct mutex devices_lock;
 };
 
 static struct list_head acpi_power_resource_list;
@@ -225,7 +226,6 @@ static void acpi_power_on_device(struct acpi_power_managed_device *device)
 
 static int __acpi_power_on(struct acpi_power_resource *resource)
 {
-       struct acpi_power_resource_device *device_list = resource->devices;
        acpi_status status = AE_OK;
 
        status = acpi_evaluate_object(resource->device->handle, "_ON", NULL, NULL);
@@ -238,19 +238,15 @@ static int __acpi_power_on(struct acpi_power_resource *resource)
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned on\n",
                          resource->name));
 
-       while (device_list) {
-               acpi_power_on_device(device_list->device);
-
-               device_list = device_list->next;
-       }
-
        return 0;
 }
 
 static int acpi_power_on(acpi_handle handle)
 {
        int result = 0;
+       bool resume_device = false;
        struct acpi_power_resource *resource = NULL;
+       struct acpi_power_resource_device *device_list;
 
        result = acpi_power_get_context(handle, &resource);
        if (result)
@@ -266,10 +262,25 @@ static int acpi_power_on(acpi_handle handle)
                result = __acpi_power_on(resource);
                if (result)
                        resource->ref_count--;
+               else
+                       resume_device = true;
        }
 
        mutex_unlock(&resource->resource_lock);
 
+       if (!resume_device)
+               return result;
+
+       mutex_lock(&resource->devices_lock);
+
+       device_list = resource->devices;
+       while (device_list) {
+               acpi_power_on_device(device_list->device);
+               device_list = device_list->next;
+       }
+
+       mutex_unlock(&resource->devices_lock);
+
        return result;
 }
 
@@ -355,7 +366,7 @@ static void __acpi_power_resource_unregister_device(struct device *dev,
        if (acpi_power_get_context(res_handle, &resource))
                return;
 
-       mutex_lock(&resource->resource_lock);
+       mutex_lock(&resource->devices_lock);
        prev = NULL;
        curr = resource->devices;
        while (curr) {
@@ -372,7 +383,7 @@ static void __acpi_power_resource_unregister_device(struct device *dev,
                prev = curr;
                curr = curr->next;
        }
-       mutex_unlock(&resource->resource_lock);
+       mutex_unlock(&resource->devices_lock);
 }
 
 /* Unlink dev from all power resources in _PR0 */
@@ -414,10 +425,10 @@ static int __acpi_power_resource_register_device(
 
        power_resource_device->device = powered_device;
 
-       mutex_lock(&resource->resource_lock);
+       mutex_lock(&resource->devices_lock);
        power_resource_device->next = resource->devices;
        resource->devices = power_resource_device;
-       mutex_unlock(&resource->resource_lock);
+       mutex_unlock(&resource->devices_lock);
 
        return 0;
 }
@@ -462,7 +473,7 @@ int acpi_power_resource_register_device(struct device *dev, acpi_handle handle)
        return ret;
 
 no_power_resource:
-       printk(KERN_WARNING PREFIX "Invalid Power Resource to register!");
+       printk(KERN_DEBUG PREFIX "Invalid Power Resource to register!");
        return -ENODEV;
 }
 EXPORT_SYMBOL_GPL(acpi_power_resource_register_device);
@@ -721,6 +732,7 @@ static int acpi_power_add(struct acpi_device *device)
 
        resource->device = device;
        mutex_init(&resource->resource_lock);
+       mutex_init(&resource->devices_lock);
        strcpy(resource->name, device->pnp.bus_id);
        strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME);
        strcpy(acpi_device_class(device), ACPI_POWER_CLASS);
index 50d5dea..7862d17 100644 (file)
@@ -268,6 +268,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
        /* JMicron 360/1/3/5/6, match class to avoid IDE function */
        { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
          PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr },
+       /* JMicron 362B and 362C have an AHCI function with IDE class code */
+       { PCI_VDEVICE(JMICRON, 0x2362), board_ahci_ign_iferr },
+       { PCI_VDEVICE(JMICRON, 0x236f), board_ahci_ign_iferr },
 
        /* ATI */
        { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */
@@ -393,6 +396,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
          .driver_data = board_ahci_yes_fbs },                  /* 88se9125 */
        { PCI_DEVICE(0x1b4b, 0x917a),
          .driver_data = board_ahci_yes_fbs },                  /* 88se9172 */
+       { PCI_DEVICE(0x1b4b, 0x9192),
+         .driver_data = board_ahci_yes_fbs },                  /* 88se9172 on some Gigabyte */
        { PCI_DEVICE(0x1b4b, 0x91a3),
          .driver_data = board_ahci_yes_fbs },
 
@@ -400,7 +405,10 @@ static const struct pci_device_id ahci_pci_tbl[] = {
        { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci },   /* PDC42819 */
 
        /* Asmedia */
-       { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci },   /* ASM1061 */
+       { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci },   /* ASM1060 */
+       { PCI_VDEVICE(ASMEDIA, 0x0602), board_ahci },   /* ASM1060 */
+       { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci },   /* ASM1061 */
+       { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci },   /* ASM1062 */
 
        /* Generic, PCI class code for AHCI */
        { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
index 78efb03..34d94c7 100644 (file)
@@ -250,7 +250,7 @@ int __init dma_declare_contiguous(struct device *dev, unsigned long size,
                return -EINVAL;
 
        /* Sanitise input arguments */
-       alignment = PAGE_SIZE << max(MAX_ORDER, pageblock_order);
+       alignment = PAGE_SIZE << max(MAX_ORDER - 1, pageblock_order);
        base = ALIGN(base, alignment);
        size = ALIGN(size, alignment);
        limit &= ~(alignment - 1);
index 11f36e5..fc2de55 100644 (file)
@@ -86,6 +86,7 @@ static struct usb_device_id ath3k_table[] = {
 
        /* Atheros AR5BBU22 with sflash firmware */
        { USB_DEVICE(0x0489, 0xE03C) },
+       { USB_DEVICE(0x0489, 0xE036) },
 
        { }     /* Terminating entry */
 };
@@ -109,6 +110,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
 
        /* Atheros AR5BBU22 with sflash firmware */
        { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 },
 
        { }     /* Terminating entry */
 };
index cef3bac..654e248 100644 (file)
@@ -52,6 +52,9 @@ static struct usb_device_id btusb_table[] = {
        /* Generic Bluetooth USB device */
        { USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
 
+       /* Apple-specific (Broadcom) devices */
+       { USB_VENDOR_AND_INTERFACE_INFO(0x05ac, 0xff, 0x01, 0x01) },
+
        /* Broadcom SoftSailing reporting vendor specific */
        { USB_DEVICE(0x0a5c, 0x21e1) },
 
@@ -94,16 +97,14 @@ static struct usb_device_id btusb_table[] = {
 
        /* Broadcom BCM20702A0 */
        { USB_DEVICE(0x0489, 0xe042) },
-       { USB_DEVICE(0x0a5c, 0x21e3) },
-       { USB_DEVICE(0x0a5c, 0x21e6) },
-       { USB_DEVICE(0x0a5c, 0x21e8) },
-       { USB_DEVICE(0x0a5c, 0x21f3) },
-       { USB_DEVICE(0x0a5c, 0x21f4) },
        { USB_DEVICE(0x413c, 0x8197) },
 
        /* Foxconn - Hon Hai */
        { USB_DEVICE(0x0489, 0xe033) },
 
+       /*Broadcom devices with vendor specific id */
+       { USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) },
+
        { }     /* Terminating entry */
 };
 
@@ -141,6 +142,7 @@ static struct usb_device_id blacklist_table[] = {
 
        /* Atheros AR5BBU12 with sflash firmware */
        { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
+       { USB_DEVICE(0x0489, 0xe036), .driver_info = BTUSB_ATH3012 },
 
        /* Broadcom BCM2035 */
        { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
index 12172a6..0bc8a6a 100644 (file)
@@ -58,7 +58,7 @@ static int ath_wakeup_ar3k(struct tty_struct *tty)
                return status;
 
        /* Disable Automatic RTSCTS */
-       memcpy(&ktermios, tty->termios, sizeof(ktermios));
+       ktermios = tty->termios;
        ktermios.c_cflag &= ~CRTSCTS;
        tty_set_termios(tty, &ktermios);
 
index 1d82d58..164544a 100644 (file)
@@ -430,7 +430,7 @@ static ssize_t mwave_write(struct file *file, const char __user *buf,
 
 static int register_serial_portandirq(unsigned int port, int irq)
 {
-       struct uart_port uart;
+       struct uart_8250_port uart;
        
        switch ( port ) {
                case 0x3f8:
@@ -462,14 +462,14 @@ static int register_serial_portandirq(unsigned int port, int irq)
        } /* switch */
        /* irq is okay */
 
-       memset(&uart, 0, sizeof(struct uart_port));
+       memset(&uart, 0, sizeof(uart));
        
-       uart.uartclk =  1843200;
-       uart.iobase = port;
-       uart.irq = irq;
-       uart.iotype = UPIO_PORT;
-       uart.flags =  UPF_SHARE_IRQ;
-       return serial8250_register_port(&uart);
+       uart.port.uartclk =  1843200;
+       uart.port.iobase = port;
+       uart.port.irq = irq;
+       uart.port.iotype = UPIO_PORT;
+       uart.port.flags =  UPF_SHARE_IRQ;
+       return serial8250_register_8250_port(&uart);
 }
 
 
index 0a484b4..3f57d5d 100644 (file)
@@ -1050,7 +1050,7 @@ static void cts_change(MGSLPC_INFO *info, struct tty_struct *tty)
        wake_up_interruptible(&info->status_event_wait_q);
        wake_up_interruptible(&info->event_wait_q);
 
-       if (info->port.flags & ASYNC_CTS_FLOW) {
+       if (tty_port_cts_enabled(&info->port)) {
                if (tty->hw_stopped) {
                        if (info->serial_signals & SerialSignal_CTS) {
                                if (debug_level >= DEBUG_LEVEL_ISR)
@@ -1344,7 +1344,7 @@ static void shutdown(MGSLPC_INFO * info, struct tty_struct *tty)
        /* TODO:disable interrupts instead of reset to preserve signal states */
        reset_device(info);
 
-       if (!tty || tty->termios->c_cflag & HUPCL) {
+       if (!tty || tty->termios.c_cflag & HUPCL) {
                info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
                set_signals(info);
        }
@@ -1385,7 +1385,7 @@ static void mgslpc_program_hw(MGSLPC_INFO *info, struct tty_struct *tty)
        port_irq_enable(info, (unsigned char) PVR_DSR | PVR_RI);
        get_signals(info);
 
-       if (info->netcount || (tty && (tty->termios->c_cflag & CREAD)))
+       if (info->netcount || (tty && (tty->termios.c_cflag & CREAD)))
                rx_start(info);
 
        spin_unlock_irqrestore(&info->lock,flags);
@@ -1398,14 +1398,14 @@ static void mgslpc_change_params(MGSLPC_INFO *info, struct tty_struct *tty)
        unsigned cflag;
        int bits_per_char;
 
-       if (!tty || !tty->termios)
+       if (!tty)
                return;
 
        if (debug_level >= DEBUG_LEVEL_INFO)
                printk("%s(%d):mgslpc_change_params(%s)\n",
                         __FILE__,__LINE__, info->device_name );
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        /* if B0 rate (hangup) specified then negate DTR and RTS */
        /* otherwise assert DTR and RTS */
@@ -1728,7 +1728,7 @@ static void mgslpc_throttle(struct tty_struct * tty)
        if (I_IXOFF(tty))
                mgslpc_send_xchar(tty, STOP_CHAR(tty));
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->serial_signals &= ~SerialSignal_RTS;
                set_signals(info);
@@ -1757,7 +1757,7 @@ static void mgslpc_unthrottle(struct tty_struct * tty)
                        mgslpc_send_xchar(tty, START_CHAR(tty));
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->serial_signals |= SerialSignal_RTS;
                set_signals(info);
@@ -2293,8 +2293,8 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
                        tty->driver->name );
 
        /* just return if nothing has changed */
-       if ((tty->termios->c_cflag == old_termios->c_cflag)
-           && (RELEVANT_IFLAG(tty->termios->c_iflag)
+       if ((tty->termios.c_cflag == old_termios->c_cflag)
+           && (RELEVANT_IFLAG(tty->termios.c_iflag)
                == RELEVANT_IFLAG(old_termios->c_iflag)))
          return;
 
@@ -2302,7 +2302,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
 
        /* Handle transition to B0 status */
        if (old_termios->c_cflag & CBAUD &&
-           !(tty->termios->c_cflag & CBAUD)) {
+           !(tty->termios.c_cflag & CBAUD)) {
                info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
                spin_lock_irqsave(&info->lock,flags);
                set_signals(info);
@@ -2311,9 +2311,9 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
 
        /* Handle transition away from B0 status */
        if (!(old_termios->c_cflag & CBAUD) &&
-           tty->termios->c_cflag & CBAUD) {
+           tty->termios.c_cflag & CBAUD) {
                info->serial_signals |= SerialSignal_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) ||
+               if (!(tty->termios.c_cflag & CRTSCTS) ||
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        info->serial_signals |= SerialSignal_RTS;
                }
@@ -2324,7 +2324,7 @@ static void mgslpc_set_termios(struct tty_struct *tty, struct ktermios *old_term
 
        /* Handle turning off CRTSCTS */
        if (old_termios->c_cflag & CRTSCTS &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                tx_release(tty);
        }
@@ -2731,6 +2731,8 @@ static void mgslpc_add_device(MGSLPC_INFO *info)
 #if SYNCLINK_GENERIC_HDLC
        hdlcdev_init(info);
 #endif
+       tty_port_register_device(&info->port, serial_driver, info->line,
+                       &info->p_dev->dev);
 }
 
 static void mgslpc_remove_device(MGSLPC_INFO *remove_info)
@@ -2744,6 +2746,7 @@ static void mgslpc_remove_device(MGSLPC_INFO *remove_info)
                                last->next_device = info->next_device;
                        else
                                mgslpc_device_list = info->next_device;
+                       tty_unregister_device(serial_driver, info->line);
 #if SYNCLINK_GENERIC_HDLC
                        hdlcdev_exit(info);
 #endif
@@ -2798,77 +2801,63 @@ static const struct tty_operations mgslpc_ops = {
        .proc_fops = &mgslpc_proc_fops,
 };
 
-static void synclink_cs_cleanup(void)
+static int __init synclink_cs_init(void)
 {
        int rc;
 
-       while(mgslpc_device_list)
-               mgslpc_remove_device(mgslpc_device_list);
-
-       if (serial_driver) {
-               if ((rc = tty_unregister_driver(serial_driver)))
-                       printk("%s(%d) failed to unregister tty driver err=%d\n",
-                              __FILE__,__LINE__,rc);
-               put_tty_driver(serial_driver);
+       if (break_on_load) {
+               mgslpc_get_text_ptr();
+               BREAKPOINT();
        }
 
-       pcmcia_unregister_driver(&mgslpc_driver);
-}
-
-static int __init synclink_cs_init(void)
-{
-    int rc;
-
-    if (break_on_load) {
-           mgslpc_get_text_ptr();
-           BREAKPOINT();
-    }
-
-    if ((rc = pcmcia_register_driver(&mgslpc_driver)) < 0)
-           return rc;
-
-    serial_driver = alloc_tty_driver(MAX_DEVICE_COUNT);
-    if (!serial_driver) {
-           rc = -ENOMEM;
-           goto error;
-    }
+       serial_driver = tty_alloc_driver(MAX_DEVICE_COUNT,
+                       TTY_DRIVER_REAL_RAW |
+                       TTY_DRIVER_DYNAMIC_DEV);
+       if (IS_ERR(serial_driver)) {
+               rc = PTR_ERR(serial_driver);
+               goto err;
+       }
 
-    /* Initialize the tty_driver structure */
-
-    serial_driver->driver_name = "synclink_cs";
-    serial_driver->name = "ttySLP";
-    serial_driver->major = ttymajor;
-    serial_driver->minor_start = 64;
-    serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
-    serial_driver->subtype = SERIAL_TYPE_NORMAL;
-    serial_driver->init_termios = tty_std_termios;
-    serial_driver->init_termios.c_cflag =
-           B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-    serial_driver->flags = TTY_DRIVER_REAL_RAW;
-    tty_set_operations(serial_driver, &mgslpc_ops);
-
-    if ((rc = tty_register_driver(serial_driver)) < 0) {
-           printk("%s(%d):Couldn't register serial driver\n",
-                  __FILE__,__LINE__);
-           put_tty_driver(serial_driver);
-           serial_driver = NULL;
-           goto error;
-    }
+       /* Initialize the tty_driver structure */
+       serial_driver->driver_name = "synclink_cs";
+       serial_driver->name = "ttySLP";
+       serial_driver->major = ttymajor;
+       serial_driver->minor_start = 64;
+       serial_driver->type = TTY_DRIVER_TYPE_SERIAL;
+       serial_driver->subtype = SERIAL_TYPE_NORMAL;
+       serial_driver->init_termios = tty_std_termios;
+       serial_driver->init_termios.c_cflag =
+       B9600 | CS8 | CREAD | HUPCL | CLOCAL;
+       tty_set_operations(serial_driver, &mgslpc_ops);
+
+       rc = tty_register_driver(serial_driver);
+       if (rc < 0) {
+               printk(KERN_ERR "%s(%d):Couldn't register serial driver\n",
+                               __FILE__, __LINE__);
+               goto err_put_tty;
+       }
 
-    printk("%s %s, tty major#%d\n",
-          driver_name, driver_version,
-          serial_driver->major);
+       rc = pcmcia_register_driver(&mgslpc_driver);
+       if (rc < 0)
+               goto err_unreg_tty;
 
-    return 0;
+       printk(KERN_INFO "%s %s, tty major#%d\n", driver_name, driver_version,
+                       serial_driver->major);
 
-error:
-    synclink_cs_cleanup();
-    return rc;
+       return 0;
+err_unreg_tty:
+       tty_unregister_driver(serial_driver);
+err_put_tty:
+       put_tty_driver(serial_driver);
+err:
+       return rc;
 }
 
 static void __exit synclink_cs_exit(void)
 {
-       synclink_cs_cleanup();
+       pcmcia_unregister_driver(&mgslpc_driver);
+       tty_unregister_driver(serial_driver);
+       put_tty_driver(serial_driver);
 }
 
 module_init(synclink_cs_init);
index 46b77ed..af98f6d 100644 (file)
@@ -67,7 +67,7 @@ static int tpk_printk(const unsigned char *buf, int count)
                                tmp[tpk_curr + 1] = '\0';
                                printk(KERN_INFO "%s%s", tpk_tag, tmp);
                                tpk_curr = 0;
-                               if (buf[i + 1] == '\n')
+                               if ((i + 1) < count && buf[i + 1] == '\n')
                                        i++;
                                break;
                        case '\n':
@@ -178,11 +178,17 @@ static struct tty_driver *ttyprintk_driver;
 static int __init ttyprintk_init(void)
 {
        int ret = -ENOMEM;
-       void *rp;
 
-       ttyprintk_driver = alloc_tty_driver(1);
-       if (!ttyprintk_driver)
-               return ret;
+       tty_port_init(&tpk_port.port);
+       tpk_port.port.ops = &null_ops;
+       mutex_init(&tpk_port.port_write_mutex);
+
+       ttyprintk_driver = tty_alloc_driver(1,
+                       TTY_DRIVER_RESET_TERMIOS |
+                       TTY_DRIVER_REAL_RAW |
+                       TTY_DRIVER_UNNUMBERED_NODE);
+       if (IS_ERR(ttyprintk_driver))
+               return PTR_ERR(ttyprintk_driver);
 
        ttyprintk_driver->driver_name = "ttyprintk";
        ttyprintk_driver->name = "ttyprintk";
@@ -191,9 +197,8 @@ static int __init ttyprintk_init(void)
        ttyprintk_driver->type = TTY_DRIVER_TYPE_CONSOLE;
        ttyprintk_driver->init_termios = tty_std_termios;
        ttyprintk_driver->init_termios.c_oflag = OPOST | OCRNL | ONOCR | ONLRET;
-       ttyprintk_driver->flags = TTY_DRIVER_RESET_TERMIOS |
-               TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
        tty_set_operations(ttyprintk_driver, &ttyprintk_ops);
+       tty_port_link_device(&tpk_port.port, ttyprintk_driver, 0);
 
        ret = tty_register_driver(ttyprintk_driver);
        if (ret < 0) {
@@ -201,22 +206,10 @@ static int __init ttyprintk_init(void)
                goto error;
        }
 
-       /* create our unnumbered device */
-       rp = device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 3), NULL,
-                               ttyprintk_driver->name);
-       if (IS_ERR(rp)) {
-               printk(KERN_ERR "Couldn't create ttyprintk device\n");
-               ret = PTR_ERR(rp);
-               goto error;
-       }
-
-       tty_port_init(&tpk_port.port);
-       tpk_port.port.ops = &null_ops;
-       mutex_init(&tpk_port.port_write_mutex);
-
        return 0;
 
 error:
+       tty_unregister_driver(ttyprintk_driver);
        put_tty_driver(ttyprintk_driver);
        ttyprintk_driver = NULL;
        return ret;
index 7f0b5ca..bace9e9 100644 (file)
@@ -40,4 +40,17 @@ config COMMON_CLK_WM831X
           Supports the clocking subsystem of the WM831x/2x series of
          PMICs from Wolfson Microlectronics.
 
+config COMMON_CLK_VERSATILE
+       bool "Clock driver for ARM Reference designs"
+       depends on ARCH_INTEGRATOR || ARCH_REALVIEW
+       ---help---
+          Supports clocking on ARM Reference designs Integrator/AP,
+         Integrator/CP, RealView PB1176, EB, PB11MP and PBX.
+
+config COMMON_CLK_MAX77686
+       tristate "Clock driver for Maxim 77686 MFD"
+       depends on MFD_MAX77686
+       ---help---
+         This driver supports Maxim 77686 crystal oscillator clock. 
+
 endmenu
index 5869ea3..9184b5e 100644 (file)
@@ -3,13 +3,21 @@ obj-$(CONFIG_CLKDEV_LOOKUP)   += clkdev.o
 obj-$(CONFIG_COMMON_CLK)       += clk.o clk-fixed-rate.o clk-gate.o \
                                   clk-mux.o clk-divider.o clk-fixed-factor.o
 # SoCs specific
+obj-$(CONFIG_ARCH_BCM2835)     += clk-bcm2835.o
 obj-$(CONFIG_ARCH_NOMADIK)     += clk-nomadik.o
 obj-$(CONFIG_ARCH_HIGHBANK)    += clk-highbank.o
 obj-$(CONFIG_ARCH_MXS)         += mxs/
 obj-$(CONFIG_ARCH_SOCFPGA)     += socfpga/
 obj-$(CONFIG_PLAT_SPEAR)       += spear/
 obj-$(CONFIG_ARCH_U300)                += clk-u300.o
-obj-$(CONFIG_ARCH_INTEGRATOR)  += versatile/
+obj-$(CONFIG_COMMON_CLK_VERSATILE) += versatile/
+obj-$(CONFIG_ARCH_PRIMA2)      += clk-prima2.o
+ifeq ($(CONFIG_COMMON_CLK), y)
+obj-$(CONFIG_ARCH_MMP)         += mmp/
+endif
+obj-$(CONFIG_MACH_LOONGSON1)   += clk-ls1x.o
+obj-$(CONFIG_ARCH_U8500)       += ux500/
 
 # Chip specific
 obj-$(CONFIG_COMMON_CLK_WM831X) += clk-wm831x.o
+obj-$(CONFIG_COMMON_CLK_MAX77686) += clk-max77686.o
diff --git a/drivers/clk/clk-bcm2835.c b/drivers/clk/clk-bcm2835.c
new file mode 100644 (file)
index 0000000..67ad16b
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2010 Broadcom
+ * Copyright (C) 2012 Stephen Warren
+ *
+ * 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/clk-provider.h>
+#include <linux/clkdev.h>
+#include <linux/clk/bcm2835.h>
+
+/*
+ * These are fixed clocks. They're probably not all root clocks and it may
+ * be possible to turn them on and off but until this is mapped out better
+ * it's the only way they can be used.
+ */
+void __init bcm2835_init_clocks(void)
+{
+       struct clk *clk;
+       int ret;
+
+       clk = clk_register_fixed_rate(NULL, "sys_pclk", NULL, CLK_IS_ROOT,
+                                       250000000);
+       if (!clk)
+               pr_err("sys_pclk not registered\n");
+
+       clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, CLK_IS_ROOT,
+                                       126000000);
+       if (!clk)
+               pr_err("apb_pclk not registered\n");
+
+       clk = clk_register_fixed_rate(NULL, "uart0_pclk", NULL, CLK_IS_ROOT,
+                                       3000000);
+       if (!clk)
+               pr_err("uart0_pclk not registered\n");
+       ret = clk_register_clkdev(clk, NULL, "20201000.uart");
+       if (ret)
+               pr_err("uart0_pclk alias not registered\n");
+
+       clk = clk_register_fixed_rate(NULL, "uart1_pclk", NULL, CLK_IS_ROOT,
+                                       125000000);
+       if (!clk)
+               pr_err("uart1_pclk not registered\n");
+       ret = clk_register_clkdev(clk, NULL, "20215000.uart");
+       if (ret)
+               pr_err("uart0_pclk alias not registered\n");
+}
diff --git a/drivers/clk/clk-ls1x.c b/drivers/clk/clk-ls1x.c
new file mode 100644 (file)
index 0000000..f20b750
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2012 Zhang, Keguang <keguang.zhang@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/clkdev.h>
+#include <linux/clk-provider.h>
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+
+#include <loongson1.h>
+
+#define OSC    33
+
+static DEFINE_SPINLOCK(_lock);
+
+static int ls1x_pll_clk_enable(struct clk_hw *hw)
+{
+       return 0;
+}
+
+static void ls1x_pll_clk_disable(struct clk_hw *hw)
+{
+}
+
+static unsigned long ls1x_pll_recalc_rate(struct clk_hw *hw,
+                                            unsigned long parent_rate)
+{
+       u32 pll, rate;
+
+       pll = __raw_readl(LS1X_CLK_PLL_FREQ);
+       rate = ((12 + (pll & 0x3f)) * 1000000) +
+               ((((pll >> 8) & 0x3ff) * 1000000) >> 10);
+       rate *= OSC;
+       rate >>= 1;
+
+       return rate;
+}
+
+static const struct clk_ops ls1x_pll_clk_ops = {
+       .enable = ls1x_pll_clk_enable,
+       .disable = ls1x_pll_clk_disable,
+       .recalc_rate = ls1x_pll_recalc_rate,
+};
+
+static struct clk * __init clk_register_pll(struct device *dev,
+        const char *name, const char *parent_name, unsigned long flags)
+{
+       struct clk_hw *hw;
+       struct clk *clk;
+       struct clk_init_data init;
+
+       /* allocate the divider */
+       hw = kzalloc(sizeof(struct clk_hw), GFP_KERNEL);
+       if (!hw) {
+               pr_err("%s: could not allocate clk_hw\n", __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       init.name = name;
+       init.ops = &ls1x_pll_clk_ops;
+       init.flags = flags | CLK_IS_BASIC;
+       init.parent_names = (parent_name ? &parent_name : NULL);
+       init.num_parents = (parent_name ? 1 : 0);
+       hw->init = &init;
+
+       /* register the clock */
+       clk = clk_register(dev, hw);
+
+       if (IS_ERR(clk))
+               kfree(hw);
+
+       return clk;
+}
+
+void __init ls1x_clk_init(void)
+{
+       struct clk *clk;
+
+       clk = clk_register_pll(NULL, "pll_clk", NULL, CLK_IS_ROOT);
+       clk_prepare_enable(clk);
+
+       clk = clk_register_divider(NULL, "cpu_clk", "pll_clk",
+                       CLK_SET_RATE_PARENT, LS1X_CLK_PLL_DIV, DIV_CPU_SHIFT,
+                       DIV_CPU_WIDTH, CLK_DIVIDER_ONE_BASED, &_lock);
+       clk_prepare_enable(clk);
+       clk_register_clkdev(clk, "cpu", NULL);
+
+       clk = clk_register_divider(NULL, "dc_clk", "pll_clk",
+                       CLK_SET_RATE_PARENT, LS1X_CLK_PLL_DIV, DIV_DC_SHIFT,
+                       DIV_DC_WIDTH, CLK_DIVIDER_ONE_BASED, &_lock);
+       clk_prepare_enable(clk);
+       clk_register_clkdev(clk, "dc", NULL);
+
+       clk = clk_register_divider(NULL, "ahb_clk", "pll_clk",
+                       CLK_SET_RATE_PARENT, LS1X_CLK_PLL_DIV, DIV_DDR_SHIFT,
+                       DIV_DDR_WIDTH, CLK_DIVIDER_ONE_BASED, &_lock);
+       clk_prepare_enable(clk);
+       clk_register_clkdev(clk, "ahb", NULL);
+       clk_register_clkdev(clk, "stmmaceth", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "apb_clk", "ahb_clk", 0, 1, 2);
+       clk_prepare_enable(clk);
+       clk_register_clkdev(clk, "apb", NULL);
+       clk_register_clkdev(clk, "serial8250", NULL);
+}
diff --git a/drivers/clk/clk-max77686.c b/drivers/clk/clk-max77686.c
new file mode 100644 (file)
index 0000000..ac5f543
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ * clk-max77686.c - Clock driver for Maxim 77686
+ *
+ * Copyright (C) 2012 Samsung Electornics
+ * Jonghwa Lee <jonghwa3.lee@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
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/mfd/max77686.h>
+#include <linux/mfd/max77686-private.h>
+#include <linux/clk-provider.h>
+#include <linux/mutex.h>
+#include <linux/clkdev.h>
+
+enum {
+       MAX77686_CLK_AP = 0,
+       MAX77686_CLK_CP,
+       MAX77686_CLK_PMIC,
+       MAX77686_CLKS_NUM,
+};
+
+struct max77686_clk {
+       struct max77686_dev *iodev;
+       u32 mask;
+       struct clk_hw hw;
+       struct clk_lookup *lookup;
+};
+
+static struct max77686_clk *get_max77686_clk(struct clk_hw *hw)
+{
+       return container_of(hw, struct max77686_clk, hw);
+}
+
+static int max77686_clk_prepare(struct clk_hw *hw)
+{
+       struct max77686_clk *max77686;
+       int ret;
+
+       max77686 = get_max77686_clk(hw);
+       if (!max77686)
+               return -ENOMEM;
+
+       ret = regmap_update_bits(max77686->iodev->regmap,
+               MAX77686_REG_32KHZ, max77686->mask, max77686->mask);
+
+       return ret;
+}
+
+static void max77686_clk_unprepare(struct clk_hw *hw)
+{
+       struct max77686_clk *max77686;
+
+       max77686 = get_max77686_clk(hw);
+       if (!max77686)
+               return;
+
+       regmap_update_bits(max77686->iodev->regmap,
+               MAX77686_REG_32KHZ, max77686->mask, ~max77686->mask);
+}
+
+static int max77686_clk_is_enabled(struct clk_hw *hw)
+{
+       struct max77686_clk *max77686;
+       int ret;
+       u32 val;
+
+       max77686 = get_max77686_clk(hw);
+       if (!max77686)
+               return -ENOMEM;
+
+       ret = regmap_read(max77686->iodev->regmap,
+                               MAX77686_REG_32KHZ, &val);
+
+       if (ret < 0)
+               return -EINVAL;
+
+       return val & max77686->mask;
+}
+
+static struct clk_ops max77686_clk_ops = {
+       .prepare        = max77686_clk_prepare,
+       .unprepare      = max77686_clk_unprepare,
+       .is_enabled     = max77686_clk_is_enabled,
+};
+
+static struct clk_init_data max77686_clks_init[MAX77686_CLKS_NUM] = {
+       [MAX77686_CLK_AP] = {
+               .name = "32khz_ap",
+               .ops = &max77686_clk_ops,
+               .flags = CLK_IS_ROOT,
+       },
+       [MAX77686_CLK_CP] = {
+               .name = "32khz_cp",
+               .ops = &max77686_clk_ops,
+               .flags = CLK_IS_ROOT,
+       },
+       [MAX77686_CLK_PMIC] = {
+               .name = "32khz_pmic",
+               .ops = &max77686_clk_ops,
+               .flags = CLK_IS_ROOT,
+       },
+};
+
+static int max77686_clk_register(struct device *dev,
+                               struct max77686_clk *max77686)
+{
+       struct clk *clk;
+       struct clk_hw *hw = &max77686->hw;
+
+       clk = clk_register(dev, hw);
+
+       if (IS_ERR(clk))
+               return -ENOMEM;
+
+       max77686->lookup = devm_kzalloc(dev, sizeof(struct clk_lookup),
+                                       GFP_KERNEL);
+       if (IS_ERR(max77686->lookup))
+               return -ENOMEM;
+
+       max77686->lookup->con_id = hw->init->name;
+       max77686->lookup->clk = clk;
+
+       clkdev_add(max77686->lookup);
+
+       return 0;
+}
+
+static __devinit int max77686_clk_probe(struct platform_device *pdev)
+{
+       struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent);
+       struct max77686_clk **max77686_clks;
+       int i, ret;
+
+       max77686_clks = devm_kzalloc(&pdev->dev, sizeof(struct max77686_clk *)
+                                       * MAX77686_CLKS_NUM, GFP_KERNEL);
+       if (IS_ERR(max77686_clks))
+               return -ENOMEM;
+
+       for (i = 0; i < MAX77686_CLKS_NUM; i++) {
+               max77686_clks[i] = devm_kzalloc(&pdev->dev,
+                                       sizeof(struct max77686_clk), GFP_KERNEL);
+               if (IS_ERR(max77686_clks[i]))
+                       return -ENOMEM;
+       }
+
+       for (i = 0; i < MAX77686_CLKS_NUM; i++) {
+               max77686_clks[i]->iodev = iodev;
+               max77686_clks[i]->mask = 1 << i;
+               max77686_clks[i]->hw.init = &max77686_clks_init[i];
+
+               ret = max77686_clk_register(&pdev->dev, max77686_clks[i]);
+               if (ret) {
+                       switch (i) {
+                       case MAX77686_CLK_AP:
+                               dev_err(&pdev->dev, "Fail to register CLK_AP\n");
+                               goto err_clk_ap;
+                               break;
+                       case MAX77686_CLK_CP:
+                               dev_err(&pdev->dev, "Fail to register CLK_CP\n");
+                               goto err_clk_cp;
+                               break;
+                       case MAX77686_CLK_PMIC:
+                               dev_err(&pdev->dev, "Fail to register CLK_PMIC\n");
+                               goto err_clk_pmic;
+                       }
+               }
+       }
+
+       platform_set_drvdata(pdev, max77686_clks);
+
+       goto out;
+
+err_clk_pmic:
+       clkdev_drop(max77686_clks[MAX77686_CLK_CP]->lookup);
+       kfree(max77686_clks[MAX77686_CLK_CP]->hw.clk);
+err_clk_cp:
+       clkdev_drop(max77686_clks[MAX77686_CLK_AP]->lookup);
+       kfree(max77686_clks[MAX77686_CLK_AP]->hw.clk);
+err_clk_ap:
+out:
+       return ret;
+}
+
+static int __devexit max77686_clk_remove(struct platform_device *pdev)
+{
+       struct max77686_clk **max77686_clks = platform_get_drvdata(pdev);
+       int i;
+
+       for (i = 0; i < MAX77686_CLKS_NUM; i++) {
+               clkdev_drop(max77686_clks[i]->lookup);
+               kfree(max77686_clks[i]->hw.clk);
+       }
+       return 0;
+}
+
+static const struct platform_device_id max77686_clk_id[] = {
+       { "max77686-clk", 0},
+       { },
+};
+MODULE_DEVICE_TABLE(platform, max77686_clk_id);
+
+static struct platform_driver max77686_clk_driver = {
+       .driver = {
+               .name  = "max77686-clk",
+               .owner = THIS_MODULE,
+       },
+       .probe = max77686_clk_probe,
+       .remove = __devexit_p(max77686_clk_remove),
+       .id_table = max77686_clk_id,
+};
+
+static int __init max77686_clk_init(void)
+{
+       return platform_driver_register(&max77686_clk_driver);
+}
+subsys_initcall(max77686_clk_init);
+
+static void __init max77686_clk_cleanup(void)
+{
+       platform_driver_unregister(&max77686_clk_driver);
+}
+module_exit(max77686_clk_cleanup);
+
+MODULE_DESCRIPTION("MAXIM 77686 Clock Driver");
+MODULE_AUTHOR("Jonghwa Lee <jonghwa3.lee@samsung.com>");
+MODULE_LICENSE("GPL");
diff --git a/drivers/clk/clk-prima2.c b/drivers/clk/clk-prima2.c
new file mode 100644 (file)
index 0000000..517874f
--- /dev/null
@@ -0,0 +1,1171 @@
+/*
+ * Clock tree for CSR SiRFprimaII
+ *
+ * Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
+ *
+ * Licensed under GPLv2 or later.
+ */
+
+#include <linux/module.h>
+#include <linux/bitops.h>
+#include <linux/io.h>
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/clk-provider.h>
+#include <linux/of_address.h>
+#include <linux/syscore_ops.h>
+
+#define SIRFSOC_CLKC_CLK_EN0    0x0000
+#define SIRFSOC_CLKC_CLK_EN1    0x0004
+#define SIRFSOC_CLKC_REF_CFG    0x0014
+#define SIRFSOC_CLKC_CPU_CFG    0x0018
+#define SIRFSOC_CLKC_MEM_CFG    0x001c
+#define SIRFSOC_CLKC_SYS_CFG    0x0020
+#define SIRFSOC_CLKC_IO_CFG     0x0024
+#define SIRFSOC_CLKC_DSP_CFG    0x0028
+#define SIRFSOC_CLKC_GFX_CFG    0x002c
+#define SIRFSOC_CLKC_MM_CFG     0x0030
+#define SIRFSOC_CLKC_LCD_CFG     0x0034
+#define SIRFSOC_CLKC_MMC_CFG    0x0038
+#define SIRFSOC_CLKC_PLL1_CFG0  0x0040
+#define SIRFSOC_CLKC_PLL2_CFG0  0x0044
+#define SIRFSOC_CLKC_PLL3_CFG0  0x0048
+#define SIRFSOC_CLKC_PLL1_CFG1  0x004c
+#define SIRFSOC_CLKC_PLL2_CFG1  0x0050
+#define SIRFSOC_CLKC_PLL3_CFG1  0x0054
+#define SIRFSOC_CLKC_PLL1_CFG2  0x0058
+#define SIRFSOC_CLKC_PLL2_CFG2  0x005c
+#define SIRFSOC_CLKC_PLL3_CFG2  0x0060
+#define SIRFSOC_USBPHY_PLL_CTRL 0x0008
+#define SIRFSOC_USBPHY_PLL_POWERDOWN  BIT(1)
+#define SIRFSOC_USBPHY_PLL_BYPASS     BIT(2)
+#define SIRFSOC_USBPHY_PLL_LOCK       BIT(3)
+
+static void *sirfsoc_clk_vbase, *sirfsoc_rsc_vbase;
+
+#define KHZ     1000
+#define MHZ     (KHZ * KHZ)
+
+/*
+ * SiRFprimaII clock controller
+ * - 2 oscillators: osc-26MHz, rtc-32.768KHz
+ * - 3 standard configurable plls: pll1, pll2 & pll3
+ * - 2 exclusive plls: usb phy pll and sata phy pll
+ * - 8 clock domains: cpu/cpudiv, mem/memdiv, sys/io, dsp, graphic, multimedia,
+ *     display and sdphy.
+ *     Each clock domain can select its own clock source from five clock sources,
+ *     X_XIN, X_XINW, PLL1, PLL2 and PLL3. The domain clock is used as the source
+ *     clock of the group clock.
+ *     - dsp domain: gps, mf
+ *     - io domain: dmac, nand, audio, uart, i2c, spi, usp, pwm, pulse
+ *     - sys domain: security
+ */
+
+struct clk_pll {
+       struct clk_hw hw;
+       unsigned short regofs;  /* register offset */
+};
+
+#define to_pllclk(_hw) container_of(_hw, struct clk_pll, hw)
+
+struct clk_dmn {
+       struct clk_hw hw;
+       signed char enable_bit; /* enable bit: 0 ~ 63 */
+       unsigned short regofs;  /* register offset */
+};
+
+#define to_dmnclk(_hw) container_of(_hw, struct clk_dmn, hw)
+
+struct clk_std {
+       struct clk_hw hw;
+       signed char enable_bit; /* enable bit: 0 ~ 63 */
+};
+
+#define to_stdclk(_hw) container_of(_hw, struct clk_std, hw)
+
+static int std_clk_is_enabled(struct clk_hw *hw);
+static int std_clk_enable(struct clk_hw *hw);
+static void std_clk_disable(struct clk_hw *hw);
+
+static inline unsigned long clkc_readl(unsigned reg)
+{
+       return readl(sirfsoc_clk_vbase + reg);
+}
+
+static inline void clkc_writel(u32 val, unsigned reg)
+{
+       writel(val, sirfsoc_clk_vbase + reg);
+}
+
+/*
+ * std pll
+ */
+
+static unsigned long pll_clk_recalc_rate(struct clk_hw *hw,
+       unsigned long parent_rate)
+{
+       unsigned long fin = parent_rate;
+       struct clk_pll *clk = to_pllclk(hw);
+       u32 regcfg2 = clk->regofs + SIRFSOC_CLKC_PLL1_CFG2 -
+               SIRFSOC_CLKC_PLL1_CFG0;
+
+       if (clkc_readl(regcfg2) & BIT(2)) {
+               /* pll bypass mode */
+               return fin;
+       } else {
+               /* fout = fin * nf / nr / od */
+               u32 cfg0 = clkc_readl(clk->regofs);
+               u32 nf = (cfg0 & (BIT(13) - 1)) + 1;
+               u32 nr = ((cfg0 >> 13) & (BIT(6) - 1)) + 1;
+               u32 od = ((cfg0 >> 19) & (BIT(4) - 1)) + 1;
+               WARN_ON(fin % MHZ);
+               return fin / MHZ * nf / nr / od * MHZ;
+       }
+}
+
+static long pll_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+       unsigned long *parent_rate)
+{
+       unsigned long fin, nf, nr, od;
+
+       /*
+        * fout = fin * nf / (nr * od);
+        * set od = 1, nr = fin/MHz, so fout = nf * MHz
+        */
+       rate = rate - rate % MHZ;
+
+       nf = rate / MHZ;
+       if (nf > BIT(13))
+               nf = BIT(13);
+       if (nf < 1)
+               nf = 1;
+
+       fin = *parent_rate;
+
+       nr = fin / MHZ;
+       if (nr > BIT(6))
+               nr = BIT(6);
+       od = 1;
+
+       return fin * nf / (nr * od);
+}
+
+static int pll_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+       unsigned long parent_rate)
+{
+       struct clk_pll *clk = to_pllclk(hw);
+       unsigned long fin, nf, nr, od, reg;
+
+       /*
+        * fout = fin * nf / (nr * od);
+        * set od = 1, nr = fin/MHz, so fout = nf * MHz
+        */
+
+       nf = rate / MHZ;
+       if (unlikely((rate % MHZ) || nf > BIT(13) || nf < 1))
+               return -EINVAL;
+
+       fin = parent_rate;
+       BUG_ON(fin < MHZ);
+
+       nr = fin / MHZ;
+       BUG_ON((fin % MHZ) || nr > BIT(6));
+
+       od = 1;
+
+       reg = (nf - 1) | ((nr - 1) << 13) | ((od - 1) << 19);
+       clkc_writel(reg, clk->regofs);
+
+       reg = clk->regofs + SIRFSOC_CLKC_PLL1_CFG1 - SIRFSOC_CLKC_PLL1_CFG0;
+       clkc_writel((nf >> 1) - 1, reg);
+
+       reg = clk->regofs + SIRFSOC_CLKC_PLL1_CFG2 - SIRFSOC_CLKC_PLL1_CFG0;
+       while (!(clkc_readl(reg) & BIT(6)))
+               cpu_relax();
+
+       return 0;
+}
+
+static struct clk_ops std_pll_ops = {
+       .recalc_rate = pll_clk_recalc_rate,
+       .round_rate = pll_clk_round_rate,
+       .set_rate = pll_clk_set_rate,
+};
+
+static const char *pll_clk_parents[] = {
+       "osc",
+};
+
+static struct clk_init_data clk_pll1_init = {
+       .name = "pll1",
+       .ops = &std_pll_ops,
+       .parent_names = pll_clk_parents,
+       .num_parents = ARRAY_SIZE(pll_clk_parents),
+};
+
+static struct clk_init_data clk_pll2_init = {
+       .name = "pll2",
+       .ops = &std_pll_ops,
+       .parent_names = pll_clk_parents,
+       .num_parents = ARRAY_SIZE(pll_clk_parents),
+};
+
+static struct clk_init_data clk_pll3_init = {
+       .name = "pll3",
+       .ops = &std_pll_ops,
+       .parent_names = pll_clk_parents,
+       .num_parents = ARRAY_SIZE(pll_clk_parents),
+};
+
+static struct clk_pll clk_pll1 = {
+       .regofs = SIRFSOC_CLKC_PLL1_CFG0,
+       .hw = {
+               .init = &clk_pll1_init,
+       },
+};
+
+static struct clk_pll clk_pll2 = {
+       .regofs = SIRFSOC_CLKC_PLL2_CFG0,
+       .hw = {
+               .init = &clk_pll2_init,
+       },
+};
+
+static struct clk_pll clk_pll3 = {
+       .regofs = SIRFSOC_CLKC_PLL3_CFG0,
+       .hw = {
+               .init = &clk_pll3_init,
+       },
+};
+
+/*
+ * usb uses specified pll
+ */
+
+static int usb_pll_clk_enable(struct clk_hw *hw)
+{
+       u32 reg = readl(sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
+       reg &= ~(SIRFSOC_USBPHY_PLL_POWERDOWN | SIRFSOC_USBPHY_PLL_BYPASS);
+       writel(reg, sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
+       while (!(readl(sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL) &
+                       SIRFSOC_USBPHY_PLL_LOCK))
+               cpu_relax();
+
+       return 0;
+}
+
+static void usb_pll_clk_disable(struct clk_hw *clk)
+{
+       u32 reg = readl(sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
+       reg |= (SIRFSOC_USBPHY_PLL_POWERDOWN | SIRFSOC_USBPHY_PLL_BYPASS);
+       writel(reg, sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
+}
+
+static unsigned long usb_pll_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
+{
+       u32 reg = readl(sirfsoc_rsc_vbase + SIRFSOC_USBPHY_PLL_CTRL);
+       return (reg & SIRFSOC_USBPHY_PLL_BYPASS) ? parent_rate : 48*MHZ;
+}
+
+static struct clk_ops usb_pll_ops = {
+       .enable = usb_pll_clk_enable,
+       .disable = usb_pll_clk_disable,
+       .recalc_rate = usb_pll_clk_recalc_rate,
+};
+
+static struct clk_init_data clk_usb_pll_init = {
+       .name = "usb_pll",
+       .ops = &usb_pll_ops,
+       .parent_names = pll_clk_parents,
+       .num_parents = ARRAY_SIZE(pll_clk_parents),
+};
+
+static struct clk_hw usb_pll_clk_hw = {
+       .init = &clk_usb_pll_init,
+};
+
+/*
+ * clock domains - cpu, mem, sys/io, dsp, gfx
+ */
+
+static const char *dmn_clk_parents[] = {
+       "rtc",
+       "osc",
+       "pll1",
+       "pll2",
+       "pll3",
+};
+
+static u8 dmn_clk_get_parent(struct clk_hw *hw)
+{
+       struct clk_dmn *clk = to_dmnclk(hw);
+       u32 cfg = clkc_readl(clk->regofs);
+
+       /* parent of io domain can only be pll3 */
+       if (strcmp(hw->init->name, "io") == 0)
+               return 4;
+
+       WARN_ON((cfg & (BIT(3) - 1)) > 4);
+
+       return cfg & (BIT(3) - 1);
+}
+
+static int dmn_clk_set_parent(struct clk_hw *hw, u8 parent)
+{
+       struct clk_dmn *clk = to_dmnclk(hw);
+       u32 cfg = clkc_readl(clk->regofs);
+
+       /* parent of io domain can only be pll3 */
+       if (strcmp(hw->init->name, "io") == 0)
+               return -EINVAL;
+
+       cfg &= ~(BIT(3) - 1);
+       clkc_writel(cfg | parent, clk->regofs);
+       /* BIT(3) - switching status: 1 - busy, 0 - done */
+       while (clkc_readl(clk->regofs) & BIT(3))
+               cpu_relax();
+
+       return 0;
+}
+
+static unsigned long dmn_clk_recalc_rate(struct clk_hw *hw,
+       unsigned long parent_rate)
+
+{
+       unsigned long fin = parent_rate;
+       struct clk_dmn *clk = to_dmnclk(hw);
+
+       u32 cfg = clkc_readl(clk->regofs);
+
+       if (cfg & BIT(24)) {
+               /* fcd bypass mode */
+               return fin;
+       } else {
+               /*
+                * wait count: bit[19:16], hold count: bit[23:20]
+                */
+               u32 wait = (cfg >> 16) & (BIT(4) - 1);
+               u32 hold = (cfg >> 20) & (BIT(4) - 1);
+
+               return fin / (wait + hold + 2);
+       }
+}
+
+static long dmn_clk_round_rate(struct clk_hw *hw, unsigned long rate,
+       unsigned long *parent_rate)
+{
+       unsigned long fin;
+       unsigned ratio, wait, hold;
+       unsigned bits = (strcmp(hw->init->name, "mem") == 0) ? 3 : 4;
+
+       fin = *parent_rate;
+       ratio = fin / rate;
+
+       if (ratio < 2)
+               ratio = 2;
+       if (ratio > BIT(bits + 1))
+               ratio = BIT(bits + 1);
+
+       wait = (ratio >> 1) - 1;
+       hold = ratio - wait - 2;
+
+       return fin / (wait + hold + 2);
+}
+
+static int dmn_clk_set_rate(struct clk_hw *hw, unsigned long rate,
+       unsigned long parent_rate)
+{
+       struct clk_dmn *clk = to_dmnclk(hw);
+       unsigned long fin;
+       unsigned ratio, wait, hold, reg;
+       unsigned bits = (strcmp(hw->init->name, "mem") == 0) ? 3 : 4;
+
+       fin = parent_rate;
+       ratio = fin / rate;
+
+       if (unlikely(ratio < 2 || ratio > BIT(bits + 1)))
+               return -EINVAL;
+
+       WARN_ON(fin % rate);
+
+       wait = (ratio >> 1) - 1;
+       hold = ratio - wait - 2;
+
+       reg = clkc_readl(clk->regofs);
+       reg &= ~(((BIT(bits) - 1) << 16) | ((BIT(bits) - 1) << 20));
+       reg |= (wait << 16) | (hold << 20) | BIT(25);
+       clkc_writel(reg, clk->regofs);
+
+       /* waiting FCD been effective */
+       while (clkc_readl(clk->regofs) & BIT(25))
+               cpu_relax();
+
+       return 0;
+}
+
+static struct clk_ops msi_ops = {
+       .set_rate = dmn_clk_set_rate,
+       .round_rate = dmn_clk_round_rate,
+       .recalc_rate = dmn_clk_recalc_rate,
+       .set_parent = dmn_clk_set_parent,
+       .get_parent = dmn_clk_get_parent,
+};
+
+static struct clk_init_data clk_mem_init = {
+       .name = "mem",
+       .ops = &msi_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_mem = {
+       .regofs = SIRFSOC_CLKC_MEM_CFG,
+       .hw = {
+               .init = &clk_mem_init,
+       },
+};
+
+static struct clk_init_data clk_sys_init = {
+       .name = "sys",
+       .ops = &msi_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+       .flags = CLK_SET_RATE_GATE,
+};
+
+static struct clk_dmn clk_sys = {
+       .regofs = SIRFSOC_CLKC_SYS_CFG,
+       .hw = {
+               .init = &clk_sys_init,
+       },
+};
+
+static struct clk_init_data clk_io_init = {
+       .name = "io",
+       .ops = &msi_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_io = {
+       .regofs = SIRFSOC_CLKC_IO_CFG,
+       .hw = {
+               .init = &clk_io_init,
+       },
+};
+
+static struct clk_ops cpu_ops = {
+       .set_parent = dmn_clk_set_parent,
+       .get_parent = dmn_clk_get_parent,
+};
+
+static struct clk_init_data clk_cpu_init = {
+       .name = "cpu",
+       .ops = &cpu_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+       .flags = CLK_SET_RATE_PARENT,
+};
+
+static struct clk_dmn clk_cpu = {
+       .regofs = SIRFSOC_CLKC_CPU_CFG,
+       .hw = {
+               .init = &clk_cpu_init,
+       },
+};
+
+static struct clk_ops dmn_ops = {
+       .is_enabled = std_clk_is_enabled,
+       .enable = std_clk_enable,
+       .disable = std_clk_disable,
+       .set_rate = dmn_clk_set_rate,
+       .round_rate = dmn_clk_round_rate,
+       .recalc_rate = dmn_clk_recalc_rate,
+       .set_parent = dmn_clk_set_parent,
+       .get_parent = dmn_clk_get_parent,
+};
+
+/* dsp, gfx, mm, lcd and vpp domain */
+
+static struct clk_init_data clk_dsp_init = {
+       .name = "dsp",
+       .ops = &dmn_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_dsp = {
+       .regofs = SIRFSOC_CLKC_DSP_CFG,
+       .enable_bit = 0,
+       .hw = {
+               .init = &clk_dsp_init,
+       },
+};
+
+static struct clk_init_data clk_gfx_init = {
+       .name = "gfx",
+       .ops = &dmn_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_gfx = {
+       .regofs = SIRFSOC_CLKC_GFX_CFG,
+       .enable_bit = 8,
+       .hw = {
+               .init = &clk_gfx_init,
+       },
+};
+
+static struct clk_init_data clk_mm_init = {
+       .name = "mm",
+       .ops = &dmn_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_mm = {
+       .regofs = SIRFSOC_CLKC_MM_CFG,
+       .enable_bit = 9,
+       .hw = {
+               .init = &clk_mm_init,
+       },
+};
+
+static struct clk_init_data clk_lcd_init = {
+       .name = "lcd",
+       .ops = &dmn_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_lcd = {
+       .regofs = SIRFSOC_CLKC_LCD_CFG,
+       .enable_bit = 10,
+       .hw = {
+               .init = &clk_lcd_init,
+       },
+};
+
+static struct clk_init_data clk_vpp_init = {
+       .name = "vpp",
+       .ops = &dmn_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_vpp = {
+       .regofs = SIRFSOC_CLKC_LCD_CFG,
+       .enable_bit = 11,
+       .hw = {
+               .init = &clk_vpp_init,
+       },
+};
+
+static struct clk_init_data clk_mmc01_init = {
+       .name = "mmc01",
+       .ops = &dmn_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_mmc01 = {
+       .regofs = SIRFSOC_CLKC_MMC_CFG,
+       .enable_bit = 59,
+       .hw = {
+               .init = &clk_mmc01_init,
+       },
+};
+
+static struct clk_init_data clk_mmc23_init = {
+       .name = "mmc23",
+       .ops = &dmn_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_mmc23 = {
+       .regofs = SIRFSOC_CLKC_MMC_CFG,
+       .enable_bit = 60,
+       .hw = {
+               .init = &clk_mmc23_init,
+       },
+};
+
+static struct clk_init_data clk_mmc45_init = {
+       .name = "mmc45",
+       .ops = &dmn_ops,
+       .parent_names = dmn_clk_parents,
+       .num_parents = ARRAY_SIZE(dmn_clk_parents),
+};
+
+static struct clk_dmn clk_mmc45 = {
+       .regofs = SIRFSOC_CLKC_MMC_CFG,
+       .enable_bit = 61,
+       .hw = {
+               .init = &clk_mmc45_init,
+       },
+};
+
+/*
+ * peripheral controllers in io domain
+ */
+
+static int std_clk_is_enabled(struct clk_hw *hw)
+{
+       u32 reg;
+       int bit;
+       struct clk_std *clk = to_stdclk(hw);
+
+       bit = clk->enable_bit % 32;
+       reg = clk->enable_bit / 32;
+       reg = SIRFSOC_CLKC_CLK_EN0 + reg * sizeof(reg);
+
+       return !!(clkc_readl(reg) & BIT(bit));
+}
+
+static int std_clk_enable(struct clk_hw *hw)
+{
+       u32 val, reg;
+       int bit;
+       struct clk_std *clk = to_stdclk(hw);
+
+       BUG_ON(clk->enable_bit < 0 || clk->enable_bit > 63);
+
+       bit = clk->enable_bit % 32;
+       reg = clk->enable_bit / 32;
+       reg = SIRFSOC_CLKC_CLK_EN0 + reg * sizeof(reg);
+
+       val = clkc_readl(reg) | BIT(bit);
+       clkc_writel(val, reg);
+       return 0;
+}
+
+static void std_clk_disable(struct clk_hw *hw)
+{
+       u32 val, reg;
+       int bit;
+       struct clk_std *clk = to_stdclk(hw);
+
+       BUG_ON(clk->enable_bit < 0 || clk->enable_bit > 63);
+
+       bit = clk->enable_bit % 32;
+       reg = clk->enable_bit / 32;
+       reg = SIRFSOC_CLKC_CLK_EN0 + reg * sizeof(reg);
+
+       val = clkc_readl(reg) & ~BIT(bit);
+       clkc_writel(val, reg);
+}
+
+static const char *std_clk_io_parents[] = {
+       "io",
+};
+
+static struct clk_ops ios_ops = {
+       .is_enabled = std_clk_is_enabled,
+       .enable = std_clk_enable,
+       .disable = std_clk_disable,
+};
+
+static struct clk_init_data clk_dmac0_init = {
+       .name = "dmac0",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_dmac0 = {
+       .enable_bit = 32,
+       .hw = {
+               .init = &clk_dmac0_init,
+       },
+};
+
+static struct clk_init_data clk_dmac1_init = {
+       .name = "dmac1",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_dmac1 = {
+       .enable_bit = 33,
+       .hw = {
+               .init = &clk_dmac1_init,
+       },
+};
+
+static struct clk_init_data clk_nand_init = {
+       .name = "nand",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_nand = {
+       .enable_bit = 34,
+       .hw = {
+               .init = &clk_nand_init,
+       },
+};
+
+static struct clk_init_data clk_audio_init = {
+       .name = "audio",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_audio = {
+       .enable_bit = 35,
+       .hw = {
+               .init = &clk_audio_init,
+       },
+};
+
+static struct clk_init_data clk_uart0_init = {
+       .name = "uart0",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_uart0 = {
+       .enable_bit = 36,
+       .hw = {
+               .init = &clk_uart0_init,
+       },
+};
+
+static struct clk_init_data clk_uart1_init = {
+       .name = "uart1",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_uart1 = {
+       .enable_bit = 37,
+       .hw = {
+               .init = &clk_uart1_init,
+       },
+};
+
+static struct clk_init_data clk_uart2_init = {
+       .name = "uart2",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_uart2 = {
+       .enable_bit = 38,
+       .hw = {
+               .init = &clk_uart2_init,
+       },
+};
+
+static struct clk_init_data clk_usp0_init = {
+       .name = "usp0",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_usp0 = {
+       .enable_bit = 39,
+       .hw = {
+               .init = &clk_usp0_init,
+       },
+};
+
+static struct clk_init_data clk_usp1_init = {
+       .name = "usp1",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_usp1 = {
+       .enable_bit = 40,
+       .hw = {
+               .init = &clk_usp1_init,
+       },
+};
+
+static struct clk_init_data clk_usp2_init = {
+       .name = "usp2",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_usp2 = {
+       .enable_bit = 41,
+       .hw = {
+               .init = &clk_usp2_init,
+       },
+};
+
+static struct clk_init_data clk_vip_init = {
+       .name = "vip",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_vip = {
+       .enable_bit = 42,
+       .hw = {
+               .init = &clk_vip_init,
+       },
+};
+
+static struct clk_init_data clk_spi0_init = {
+       .name = "spi0",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_spi0 = {
+       .enable_bit = 43,
+       .hw = {
+               .init = &clk_spi0_init,
+       },
+};
+
+static struct clk_init_data clk_spi1_init = {
+       .name = "spi1",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_spi1 = {
+       .enable_bit = 44,
+       .hw = {
+               .init = &clk_spi1_init,
+       },
+};
+
+static struct clk_init_data clk_tsc_init = {
+       .name = "tsc",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_tsc = {
+       .enable_bit = 45,
+       .hw = {
+               .init = &clk_tsc_init,
+       },
+};
+
+static struct clk_init_data clk_i2c0_init = {
+       .name = "i2c0",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_i2c0 = {
+       .enable_bit = 46,
+       .hw = {
+               .init = &clk_i2c0_init,
+       },
+};
+
+static struct clk_init_data clk_i2c1_init = {
+       .name = "i2c1",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_i2c1 = {
+       .enable_bit = 47,
+       .hw = {
+               .init = &clk_i2c1_init,
+       },
+};
+
+static struct clk_init_data clk_pwmc_init = {
+       .name = "pwmc",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_pwmc = {
+       .enable_bit = 48,
+       .hw = {
+               .init = &clk_pwmc_init,
+       },
+};
+
+static struct clk_init_data clk_efuse_init = {
+       .name = "efuse",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_efuse = {
+       .enable_bit = 49,
+       .hw = {
+               .init = &clk_efuse_init,
+       },
+};
+
+static struct clk_init_data clk_pulse_init = {
+       .name = "pulse",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_pulse = {
+       .enable_bit = 50,
+       .hw = {
+               .init = &clk_pulse_init,
+       },
+};
+
+static const char *std_clk_dsp_parents[] = {
+       "dsp",
+};
+
+static struct clk_init_data clk_gps_init = {
+       .name = "gps",
+       .ops = &ios_ops,
+       .parent_names = std_clk_dsp_parents,
+       .num_parents = ARRAY_SIZE(std_clk_dsp_parents),
+};
+
+static struct clk_std clk_gps = {
+       .enable_bit = 1,
+       .hw = {
+               .init = &clk_gps_init,
+       },
+};
+
+static struct clk_init_data clk_mf_init = {
+       .name = "mf",
+       .ops = &ios_ops,
+       .parent_names = std_clk_io_parents,
+       .num_parents = ARRAY_SIZE(std_clk_io_parents),
+};
+
+static struct clk_std clk_mf = {
+       .enable_bit = 2,
+       .hw = {
+               .init = &clk_mf_init,
+       },
+};
+
+static const char *std_clk_sys_parents[] = {
+       "sys",
+};
+
+static struct clk_init_data clk_security_init = {
+       .name = "mf",
+       .ops = &ios_ops,
+       .parent_names = std_clk_sys_parents,
+       .num_parents = ARRAY_SIZE(std_clk_sys_parents),
+};
+
+static struct clk_std clk_security = {
+       .enable_bit = 19,
+       .hw = {
+               .init = &clk_security_init,
+       },
+};
+
+static const char *std_clk_usb_parents[] = {
+       "usb_pll",
+};
+
+static struct clk_init_data clk_usb0_init = {
+       .name = "usb0",
+       .ops = &ios_ops,
+       .parent_names = std_clk_usb_parents,
+       .num_parents = ARRAY_SIZE(std_clk_usb_parents),
+};
+
+static struct clk_std clk_usb0 = {
+       .enable_bit = 16,
+       .hw = {
+               .init = &clk_usb0_init,
+       },
+};
+
+static struct clk_init_data clk_usb1_init = {
+       .name = "usb1",
+       .ops = &ios_ops,
+       .parent_names = std_clk_usb_parents,
+       .num_parents = ARRAY_SIZE(std_clk_usb_parents),
+};
+
+static struct clk_std clk_usb1 = {
+       .enable_bit = 17,
+       .hw = {
+               .init = &clk_usb1_init,
+       },
+};
+
+static struct of_device_id clkc_ids[] = {
+       { .compatible = "sirf,prima2-clkc" },
+       {},
+};
+
+static struct of_device_id rsc_ids[] = {
+       { .compatible = "sirf,prima2-rsc" },
+       {},
+};
+
+void __init sirfsoc_of_clk_init(void)
+{
+       struct clk *clk;
+       struct device_node *np;
+
+       np = of_find_matching_node(NULL, clkc_ids);
+       if (!np)
+               panic("unable to find compatible clkc node in dtb\n");
+
+       sirfsoc_clk_vbase = of_iomap(np, 0);
+       if (!sirfsoc_clk_vbase)
+               panic("unable to map clkc registers\n");
+
+       of_node_put(np);
+
+       np = of_find_matching_node(NULL, rsc_ids);
+       if (!np)
+               panic("unable to find compatible rsc node in dtb\n");
+
+       sirfsoc_rsc_vbase = of_iomap(np, 0);
+       if (!sirfsoc_rsc_vbase)
+               panic("unable to map rsc registers\n");
+
+       of_node_put(np);
+
+
+       /* These are always available (RTC and 26MHz OSC)*/
+       clk = clk_register_fixed_rate(NULL, "rtc", NULL,
+               CLK_IS_ROOT, 32768);
+       BUG_ON(!clk);
+       clk = clk_register_fixed_rate(NULL, "osc", NULL,
+               CLK_IS_ROOT, 26000000);
+       BUG_ON(!clk);
+
+       clk = clk_register(NULL, &clk_pll1.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_pll2.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_pll3.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_mem.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_sys.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_security.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b8030000.security");
+       clk = clk_register(NULL, &clk_dsp.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_gps.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "a8010000.gps");
+       clk = clk_register(NULL, &clk_mf.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_io.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "io");
+       clk = clk_register(NULL, &clk_cpu.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "cpu");
+       clk = clk_register(NULL, &clk_uart0.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0050000.uart");
+       clk = clk_register(NULL, &clk_uart1.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0060000.uart");
+       clk = clk_register(NULL, &clk_uart2.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0070000.uart");
+       clk = clk_register(NULL, &clk_tsc.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0110000.tsc");
+       clk = clk_register(NULL, &clk_i2c0.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b00e0000.i2c");
+       clk = clk_register(NULL, &clk_i2c1.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b00f0000.i2c");
+       clk = clk_register(NULL, &clk_spi0.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b00d0000.spi");
+       clk = clk_register(NULL, &clk_spi1.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0170000.spi");
+       clk = clk_register(NULL, &clk_pwmc.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0130000.pwm");
+       clk = clk_register(NULL, &clk_efuse.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0140000.efusesys");
+       clk = clk_register(NULL, &clk_pulse.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0150000.pulsec");
+       clk = clk_register(NULL, &clk_dmac0.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b00b0000.dma-controller");
+       clk = clk_register(NULL, &clk_dmac1.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0160000.dma-controller");
+       clk = clk_register(NULL, &clk_nand.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0030000.nand");
+       clk = clk_register(NULL, &clk_audio.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0040000.audio");
+       clk = clk_register(NULL, &clk_usp0.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0080000.usp");
+       clk = clk_register(NULL, &clk_usp1.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b0090000.usp");
+       clk = clk_register(NULL, &clk_usp2.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b00a0000.usp");
+       clk = clk_register(NULL, &clk_vip.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b00c0000.vip");
+       clk = clk_register(NULL, &clk_gfx.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "98000000.graphics");
+       clk = clk_register(NULL, &clk_mm.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "a0000000.multimedia");
+       clk = clk_register(NULL, &clk_lcd.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "90010000.display");
+       clk = clk_register(NULL, &clk_vpp.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "90020000.vpp");
+       clk = clk_register(NULL, &clk_mmc01.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_mmc23.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_mmc45.hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &usb_pll_clk_hw);
+       BUG_ON(!clk);
+       clk = clk_register(NULL, &clk_usb0.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b00e0000.usb");
+       clk = clk_register(NULL, &clk_usb1.hw);
+       BUG_ON(!clk);
+       clk_register_clkdev(clk, NULL, "b00f0000.usb");
+}
index efdfd00..56e4495 100644 (file)
@@ -558,25 +558,6 @@ int clk_enable(struct clk *clk)
 EXPORT_SYMBOL_GPL(clk_enable);
 
 /**
- * clk_get_rate - return the rate of clk
- * @clk: the clk whose rate is being returned
- *
- * Simply returns the cached rate of the clk.  Does not query the hardware.  If
- * clk is NULL then returns 0.
- */
-unsigned long clk_get_rate(struct clk *clk)
-{
-       unsigned long rate;
-
-       mutex_lock(&prepare_lock);
-       rate = __clk_get_rate(clk);
-       mutex_unlock(&prepare_lock);
-
-       return rate;
-}
-EXPORT_SYMBOL_GPL(clk_get_rate);
-
-/**
  * __clk_round_rate - round the given rate for a clk
  * @clk: round the rate of this clock
  *
@@ -702,6 +683,30 @@ static void __clk_recalc_rates(struct clk *clk, unsigned long msg)
 }
 
 /**
+ * clk_get_rate - return the rate of clk
+ * @clk: the clk whose rate is being returned
+ *
+ * Simply returns the cached rate of the clk, unless CLK_GET_RATE_NOCACHE flag
+ * is set, which means a recalc_rate will be issued.
+ * If clk is NULL then returns 0.
+ */
+unsigned long clk_get_rate(struct clk *clk)
+{
+       unsigned long rate;
+
+       mutex_lock(&prepare_lock);
+
+       if (clk && (clk->flags & CLK_GET_RATE_NOCACHE))
+               __clk_recalc_rates(clk, 0);
+
+       rate = __clk_get_rate(clk);
+       mutex_unlock(&prepare_lock);
+
+       return rate;
+}
+EXPORT_SYMBOL_GPL(clk_get_rate);
+
+/**
  * __clk_speculate_rates
  * @clk: first clk in the subtree
  * @parent_rate: the "future" rate of clk's parent
@@ -1582,6 +1587,20 @@ struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec,
 }
 EXPORT_SYMBOL_GPL(of_clk_src_simple_get);
 
+struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data)
+{
+       struct clk_onecell_data *clk_data = data;
+       unsigned int idx = clkspec->args[0];
+
+       if (idx >= clk_data->clk_num) {
+               pr_err("%s: invalid clock index %d\n", __func__, idx);
+               return ERR_PTR(-EINVAL);
+       }
+
+       return clk_data->clks[idx];
+}
+EXPORT_SYMBOL_GPL(of_clk_src_onecell_get);
+
 /**
  * of_clk_add_provider() - Register a clock provider for a node
  * @np: Device node pointer associated with clock provider
diff --git a/drivers/clk/mmp/Makefile b/drivers/clk/mmp/Makefile
new file mode 100644 (file)
index 0000000..392d780
--- /dev/null
@@ -0,0 +1,9 @@
+#
+# Makefile for mmp specific clk
+#
+
+obj-y += clk-apbc.o clk-apmu.o clk-frac.o
+
+obj-$(CONFIG_CPU_PXA168) += clk-pxa168.o
+obj-$(CONFIG_CPU_PXA910) += clk-pxa910.o
+obj-$(CONFIG_CPU_MMP2) += clk-mmp2.o
diff --git a/drivers/clk/mmp/clk-apbc.c b/drivers/clk/mmp/clk-apbc.c
new file mode 100644 (file)
index 0000000..d14120e
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * mmp APB clock operation source file
+ *
+ * Copyright (C) 2012 Marvell
+ * Chao Xie <xiechao.mail@gmail.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/clk.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+
+#include "clk.h"
+
+/* Common APB clock register bit definitions */
+#define APBC_APBCLK    (1 << 0)  /* APB Bus Clock Enable */
+#define APBC_FNCLK     (1 << 1)  /* Functional Clock Enable */
+#define APBC_RST       (1 << 2)  /* Reset Generation */
+#define APBC_POWER     (1 << 7)  /* Reset Generation */
+
+#define to_clk_apbc(hw) container_of(hw, struct clk_apbc, hw)
+struct clk_apbc {
+       struct clk_hw           hw;
+       void __iomem            *base;
+       unsigned int            delay;
+       unsigned int            flags;
+       spinlock_t              *lock;
+};
+
+static int clk_apbc_prepare(struct clk_hw *hw)
+{
+       struct clk_apbc *apbc = to_clk_apbc(hw);
+       unsigned int data;
+       unsigned long flags = 0;
+
+       /*
+        * It may share same register as MUX clock,
+        * and it will impact FNCLK enable. Spinlock is needed
+        */
+       if (apbc->lock)
+               spin_lock_irqsave(apbc->lock, flags);
+
+       data = readl_relaxed(apbc->base);
+       if (apbc->flags & APBC_POWER_CTRL)
+               data |= APBC_POWER;
+       data |= APBC_FNCLK;
+       writel_relaxed(data, apbc->base);
+
+       if (apbc->lock)
+               spin_unlock_irqrestore(apbc->lock, flags);
+
+       udelay(apbc->delay);
+
+       if (apbc->lock)
+               spin_lock_irqsave(apbc->lock, flags);
+
+       data = readl_relaxed(apbc->base);
+       data |= APBC_APBCLK;
+       writel_relaxed(data, apbc->base);
+
+       if (apbc->lock)
+               spin_unlock_irqrestore(apbc->lock, flags);
+
+       udelay(apbc->delay);
+
+       if (!(apbc->flags & APBC_NO_BUS_CTRL)) {
+               if (apbc->lock)
+                       spin_lock_irqsave(apbc->lock, flags);
+
+               data = readl_relaxed(apbc->base);
+               data &= ~APBC_RST;
+               writel_relaxed(data, apbc->base);
+
+               if (apbc->lock)
+                       spin_unlock_irqrestore(apbc->lock, flags);
+       }
+
+       return 0;
+}
+
+static void clk_apbc_unprepare(struct clk_hw *hw)
+{
+       struct clk_apbc *apbc = to_clk_apbc(hw);
+       unsigned long data;
+       unsigned long flags = 0;
+
+       if (apbc->lock)
+               spin_lock_irqsave(apbc->lock, flags);
+
+       data = readl_relaxed(apbc->base);
+       if (apbc->flags & APBC_POWER_CTRL)
+               data &= ~APBC_POWER;
+       data &= ~APBC_FNCLK;
+       writel_relaxed(data, apbc->base);
+
+       if (apbc->lock)
+               spin_unlock_irqrestore(apbc->lock, flags);
+
+       udelay(10);
+
+       if (apbc->lock)
+               spin_lock_irqsave(apbc->lock, flags);
+
+       data = readl_relaxed(apbc->base);
+       data &= ~APBC_APBCLK;
+       writel_relaxed(data, apbc->base);
+
+       if (apbc->lock)
+               spin_unlock_irqrestore(apbc->lock, flags);
+}
+
+struct clk_ops clk_apbc_ops = {
+       .prepare = clk_apbc_prepare,
+       .unprepare = clk_apbc_unprepare,
+};
+
+struct clk *mmp_clk_register_apbc(const char *name, const char *parent_name,
+               void __iomem *base, unsigned int delay,
+               unsigned int apbc_flags, spinlock_t *lock)
+{
+       struct clk_apbc *apbc;
+       struct clk *clk;
+       struct clk_init_data init;
+
+       apbc = kzalloc(sizeof(*apbc), GFP_KERNEL);
+       if (!apbc)
+               return NULL;
+
+       init.name = name;
+       init.ops = &clk_apbc_ops;
+       init.flags = CLK_SET_RATE_PARENT;
+       init.parent_names = (parent_name ? &parent_name : NULL);
+       init.num_parents = (parent_name ? 1 : 0);
+
+       apbc->base = base;
+       apbc->delay = delay;
+       apbc->flags = apbc_flags;
+       apbc->lock = lock;
+       apbc->hw.init = &init;
+
+       clk = clk_register(NULL, &apbc->hw);
+       if (IS_ERR(clk))
+               kfree(apbc);
+
+       return clk;
+}
diff --git a/drivers/clk/mmp/clk-apmu.c b/drivers/clk/mmp/clk-apmu.c
new file mode 100644 (file)
index 0000000..abe182b
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * mmp AXI peripharal clock operation source file
+ *
+ * Copyright (C) 2012 Marvell
+ * Chao Xie <xiechao.mail@gmail.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/clk.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/delay.h>
+#include <linux/slab.h>
+
+#include "clk.h"
+
+#define to_clk_apmu(clk) (container_of(clk, struct clk_apmu, clk))
+struct clk_apmu {
+       struct clk_hw   hw;
+       void __iomem    *base;
+       u32             rst_mask;
+       u32             enable_mask;
+       spinlock_t      *lock;
+};
+
+static int clk_apmu_enable(struct clk_hw *hw)
+{
+       struct clk_apmu *apmu = to_clk_apmu(hw);
+       unsigned long data;
+       unsigned long flags = 0;
+
+       if (apmu->lock)
+               spin_lock_irqsave(apmu->lock, flags);
+
+       data = readl_relaxed(apmu->base) | apmu->enable_mask;
+       writel_relaxed(data, apmu->base);
+
+       if (apmu->lock)
+               spin_unlock_irqrestore(apmu->lock, flags);
+
+       return 0;
+}
+
+static void clk_apmu_disable(struct clk_hw *hw)
+{
+       struct clk_apmu *apmu = to_clk_apmu(hw);
+       unsigned long data;
+       unsigned long flags = 0;
+
+       if (apmu->lock)
+               spin_lock_irqsave(apmu->lock, flags);
+
+       data = readl_relaxed(apmu->base) & ~apmu->enable_mask;
+       writel_relaxed(data, apmu->base);
+
+       if (apmu->lock)
+               spin_unlock_irqrestore(apmu->lock, flags);
+}
+
+struct clk_ops clk_apmu_ops = {
+       .enable = clk_apmu_enable,
+       .disable = clk_apmu_disable,
+};
+
+struct clk *mmp_clk_register_apmu(const char *name, const char *parent_name,
+               void __iomem *base, u32 enable_mask, spinlock_t *lock)
+{
+       struct clk_apmu *apmu;
+       struct clk *clk;
+       struct clk_init_data init;
+
+       apmu = kzalloc(sizeof(*apmu), GFP_KERNEL);
+       if (!apmu)
+               return NULL;
+
+       init.name = name;
+       init.ops = &clk_apmu_ops;
+       init.flags = CLK_SET_RATE_PARENT;
+       init.parent_names = (parent_name ? &parent_name : NULL);
+       init.num_parents = (parent_name ? 1 : 0);
+
+       apmu->base = base;
+       apmu->enable_mask = enable_mask;
+       apmu->lock = lock;
+       apmu->hw.init = &init;
+
+       clk = clk_register(NULL, &apmu->hw);
+
+       if (IS_ERR(clk))
+               kfree(apmu);
+
+       return clk;
+}
diff --git a/drivers/clk/mmp/clk-frac.c b/drivers/clk/mmp/clk-frac.c
new file mode 100644 (file)
index 0000000..80c1dd1
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * mmp factor clock operation source file
+ *
+ * Copyright (C) 2012 Marvell
+ * Chao Xie <xiechao.mail@gmail.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-provider.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/err.h>
+
+#include "clk.h"
+/*
+ * It is M/N clock
+ *
+ * Fout from synthesizer can be given from two equations:
+ * numerator/denominator = Fin / (Fout * factor)
+ */
+
+#define to_clk_factor(hw) container_of(hw, struct clk_factor, hw)
+struct clk_factor {
+       struct clk_hw           hw;
+       void __iomem            *base;
+       struct clk_factor_masks *masks;
+       struct clk_factor_tbl   *ftbl;
+       unsigned int            ftbl_cnt;
+};
+
+static long clk_factor_round_rate(struct clk_hw *hw, unsigned long drate,
+               unsigned long *prate)
+{
+       struct clk_factor *factor = to_clk_factor(hw);
+       unsigned long rate = 0, prev_rate;
+       int i;
+
+       for (i = 0; i < factor->ftbl_cnt; i++) {
+               prev_rate = rate;
+               rate = (((*prate / 10000) * factor->ftbl[i].num) /
+                       (factor->ftbl[i].den * factor->masks->factor)) * 10000;
+               if (rate > drate)
+                       break;
+       }
+       if (i == 0)
+               return rate;
+       else
+               return prev_rate;
+}
+
+static unsigned long clk_factor_recalc_rate(struct clk_hw *hw,
+               unsigned long parent_rate)
+{
+       struct clk_factor *factor = to_clk_factor(hw);
+       struct clk_factor_masks *masks = factor->masks;
+       unsigned int val, num, den;
+
+       val = readl_relaxed(factor->base);
+
+       /* calculate numerator */
+       num = (val >> masks->num_shift) & masks->num_mask;
+
+       /* calculate denominator */
+       den = (val >> masks->den_shift) & masks->num_mask;
+
+       if (!den)
+               return 0;
+
+       return (((parent_rate / 10000)  * den) /
+                       (num * factor->masks->factor)) * 10000;
+}
+
+/* Configures new clock rate*/
+static int clk_factor_set_rate(struct clk_hw *hw, unsigned long drate,
+                               unsigned long prate)
+{
+       struct clk_factor *factor = to_clk_factor(hw);
+       struct clk_factor_masks *masks = factor->masks;
+       int i;
+       unsigned long val;
+       unsigned long prev_rate, rate = 0;
+
+       for (i = 0; i < factor->ftbl_cnt; i++) {
+               prev_rate = rate;
+               rate = (((prate / 10000) * factor->ftbl[i].num) /
+                       (factor->ftbl[i].den * factor->masks->factor)) * 10000;
+               if (rate > drate)
+                       break;
+       }
+       if (i > 0)
+               i--;
+
+       val = readl_relaxed(factor->base);
+
+       val &= ~(masks->num_mask << masks->num_shift);
+       val |= (factor->ftbl[i].num & masks->num_mask) << masks->num_shift;
+
+       val &= ~(masks->den_mask << masks->den_shift);
+       val |= (factor->ftbl[i].den & masks->den_mask) << masks->den_shift;
+
+       writel_relaxed(val, factor->base);
+
+       return 0;
+}
+
+static struct clk_ops clk_factor_ops = {
+       .recalc_rate = clk_factor_recalc_rate,
+       .round_rate = clk_factor_round_rate,
+       .set_rate = clk_factor_set_rate,
+};
+
+struct clk *mmp_clk_register_factor(const char *name, const char *parent_name,
+               unsigned long flags, void __iomem *base,
+               struct clk_factor_masks *masks, struct clk_factor_tbl *ftbl,
+               unsigned int ftbl_cnt)
+{
+       struct clk_factor *factor;
+       struct clk_init_data init;
+       struct clk *clk;
+
+       if (!masks) {
+               pr_err("%s: must pass a clk_factor_mask\n", __func__);
+               return ERR_PTR(-EINVAL);
+       }
+
+       factor = kzalloc(sizeof(*factor), GFP_KERNEL);
+       if (!factor) {
+               pr_err("%s: could not allocate factor  clk\n", __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       /* struct clk_aux assignments */
+       factor->base = base;
+       factor->masks = masks;
+       factor->ftbl = ftbl;
+       factor->ftbl_cnt = ftbl_cnt;
+       factor->hw.init = &init;
+
+       init.name = name;
+       init.ops = &clk_factor_ops;
+       init.flags = flags;
+       init.parent_names = &parent_name;
+       init.num_parents = 1;
+
+       clk = clk_register(NULL, &factor->hw);
+       if (IS_ERR_OR_NULL(clk))
+               kfree(factor);
+
+       return clk;
+}
diff --git a/drivers/clk/mmp/clk-mmp2.c b/drivers/clk/mmp/clk-mmp2.c
new file mode 100644 (file)
index 0000000..ade4358
--- /dev/null
@@ -0,0 +1,449 @@
+/*
+ * mmp2 clock framework source file
+ *
+ * Copyright (C) 2012 Marvell
+ * Chao Xie <xiechao.mail@gmail.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/kernel.h>
+#include <linux/spinlock.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+
+#include <mach/addr-map.h>
+
+#include "clk.h"
+
+#define APBC_RTC       0x0
+#define APBC_TWSI0     0x4
+#define APBC_TWSI1     0x8
+#define APBC_TWSI2     0xc
+#define APBC_TWSI3     0x10
+#define APBC_TWSI4     0x7c
+#define APBC_TWSI5     0x80
+#define APBC_KPC       0x18
+#define APBC_UART0     0x2c
+#define APBC_UART1     0x30
+#define APBC_UART2     0x34
+#define APBC_UART3     0x88
+#define APBC_GPIO      0x38
+#define APBC_PWM0      0x3c
+#define APBC_PWM1      0x40
+#define APBC_PWM2      0x44
+#define APBC_PWM3      0x48
+#define APBC_SSP0      0x50
+#define APBC_SSP1      0x54
+#define APBC_SSP2      0x58
+#define APBC_SSP3      0x5c
+#define APMU_SDH0      0x54
+#define APMU_SDH1      0x58
+#define APMU_SDH2      0xe8
+#define APMU_SDH3      0xec
+#define APMU_USB       0x5c
+#define APMU_DISP0     0x4c
+#define APMU_DISP1     0x110
+#define APMU_CCIC0     0x50
+#define APMU_CCIC1     0xf4
+#define MPMU_UART_PLL  0x14
+
+static DEFINE_SPINLOCK(clk_lock);
+
+static struct clk_factor_masks uart_factor_masks = {
+       .factor = 2,
+       .num_mask = 0x1fff,
+       .den_mask = 0x1fff,
+       .num_shift = 16,
+       .den_shift = 0,
+};
+
+static struct clk_factor_tbl uart_factor_tbl[] = {
+       {.num = 14634, .den = 2165},    /*14.745MHZ */
+       {.num = 3521, .den = 689},      /*19.23MHZ */
+       {.num = 9679, .den = 5728},     /*58.9824MHZ */
+       {.num = 15850, .den = 9451},    /*59.429MHZ */
+};
+
+static const char *uart_parent[] = {"uart_pll", "vctcxo"};
+static const char *ssp_parent[] = {"vctcxo_4", "vctcxo_2", "vctcxo", "pll1_16"};
+static const char *sdh_parent[] = {"pll1_4", "pll2", "usb_pll", "pll1"};
+static const char *disp_parent[] = {"pll1", "pll1_16", "pll2", "vctcxo"};
+static const char *ccic_parent[] = {"pll1_2", "pll1_16", "vctcxo"};
+
+void __init mmp2_clk_init(void)
+{
+       struct clk *clk;
+       struct clk *vctcxo;
+       void __iomem *mpmu_base;
+       void __iomem *apmu_base;
+       void __iomem *apbc_base;
+
+       mpmu_base = ioremap(APB_PHYS_BASE + 0x50000, SZ_4K);
+       if (mpmu_base == NULL) {
+               pr_err("error to ioremap MPMU base\n");
+               return;
+       }
+
+       apmu_base = ioremap(AXI_PHYS_BASE + 0x82800, SZ_4K);
+       if (apmu_base == NULL) {
+               pr_err("error to ioremap APMU base\n");
+               return;
+       }
+
+       apbc_base = ioremap(APB_PHYS_BASE + 0x15000, SZ_4K);
+       if (apbc_base == NULL) {
+               pr_err("error to ioremap APBC base\n");
+               return;
+       }
+
+       clk = clk_register_fixed_rate(NULL, "clk32", NULL, CLK_IS_ROOT, 3200);
+       clk_register_clkdev(clk, "clk32", NULL);
+
+       vctcxo = clk_register_fixed_rate(NULL, "vctcxo", NULL, CLK_IS_ROOT,
+                               26000000);
+       clk_register_clkdev(vctcxo, "vctcxo", NULL);
+
+       clk = clk_register_fixed_rate(NULL, "pll1", NULL, CLK_IS_ROOT,
+                               800000000);
+       clk_register_clkdev(clk, "pll1", NULL);
+
+       clk = clk_register_fixed_rate(NULL, "usb_pll", NULL, CLK_IS_ROOT,
+                               480000000);
+       clk_register_clkdev(clk, "usb_pll", NULL);
+
+       clk = clk_register_fixed_rate(NULL, "pll2", NULL, CLK_IS_ROOT,
+                               960000000);
+       clk_register_clkdev(clk, "pll2", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_2", "pll1",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_2", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_4", "pll1_2",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_4", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_8", "pll1_4",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_8", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_16", "pll1_8",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_16", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_20", "pll1_4",
+                               CLK_SET_RATE_PARENT, 1, 5);
+       clk_register_clkdev(clk, "pll1_20", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_3", "pll1",
+                               CLK_SET_RATE_PARENT, 1, 3);
+       clk_register_clkdev(clk, "pll1_3", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_6", "pll1_3",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_6", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_12", "pll1_6",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_12", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll2_2", "pll2",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll2_2", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll2_4", "pll2_2",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll2_4", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll2_8", "pll2_4",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll2_8", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll2_16", "pll2_8",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll2_16", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll2_3", "pll2",
+                               CLK_SET_RATE_PARENT, 1, 3);
+       clk_register_clkdev(clk, "pll2_3", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll2_6", "pll2_3",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll2_6", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll2_12", "pll2_6",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll2_12", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "vctcxo_2", "vctcxo",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "vctcxo_2", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "vctcxo_4", "vctcxo_2",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "vctcxo_4", NULL);
+
+       clk = mmp_clk_register_factor("uart_pll", "pll1_4", 0,
+                               mpmu_base + MPMU_UART_PLL,
+                               &uart_factor_masks, uart_factor_tbl,
+                               ARRAY_SIZE(uart_factor_tbl));
+       clk_set_rate(clk, 14745600);
+       clk_register_clkdev(clk, "uart_pll", NULL);
+
+       clk = mmp_clk_register_apbc("twsi0", "vctcxo",
+                               apbc_base + APBC_TWSI0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.0");
+
+       clk = mmp_clk_register_apbc("twsi1", "vctcxo",
+                               apbc_base + APBC_TWSI1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.1");
+
+       clk = mmp_clk_register_apbc("twsi2", "vctcxo",
+                               apbc_base + APBC_TWSI2, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.2");
+
+       clk = mmp_clk_register_apbc("twsi3", "vctcxo",
+                               apbc_base + APBC_TWSI3, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.3");
+
+       clk = mmp_clk_register_apbc("twsi4", "vctcxo",
+                               apbc_base + APBC_TWSI4, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.4");
+
+       clk = mmp_clk_register_apbc("twsi5", "vctcxo",
+                               apbc_base + APBC_TWSI5, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.5");
+
+       clk = mmp_clk_register_apbc("gpio", "vctcxo",
+                               apbc_base + APBC_GPIO, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa-gpio");
+
+       clk = mmp_clk_register_apbc("kpc", "clk32",
+                               apbc_base + APBC_KPC, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa27x-keypad");
+
+       clk = mmp_clk_register_apbc("rtc", "clk32",
+                               apbc_base + APBC_RTC, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-rtc");
+
+       clk = mmp_clk_register_apbc("pwm0", "vctcxo",
+                               apbc_base + APBC_PWM0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp2-pwm.0");
+
+       clk = mmp_clk_register_apbc("pwm1", "vctcxo",
+                               apbc_base + APBC_PWM1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp2-pwm.1");
+
+       clk = mmp_clk_register_apbc("pwm2", "vctcxo",
+                               apbc_base + APBC_PWM2, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp2-pwm.2");
+
+       clk = mmp_clk_register_apbc("pwm3", "vctcxo",
+                               apbc_base + APBC_PWM3, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp2-pwm.3");
+
+       clk = clk_register_mux(NULL, "uart0_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_UART0, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, vctcxo);
+       clk_register_clkdev(clk, "uart_mux.0", NULL);
+
+       clk = mmp_clk_register_apbc("uart0", "uart0_mux",
+                               apbc_base + APBC_UART0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.0");
+
+       clk = clk_register_mux(NULL, "uart1_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_UART1, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, vctcxo);
+       clk_register_clkdev(clk, "uart_mux.1", NULL);
+
+       clk = mmp_clk_register_apbc("uart1", "uart1_mux",
+                               apbc_base + APBC_UART1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.1");
+
+       clk = clk_register_mux(NULL, "uart2_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_UART2, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, vctcxo);
+       clk_register_clkdev(clk, "uart_mux.2", NULL);
+
+       clk = mmp_clk_register_apbc("uart2", "uart2_mux",
+                               apbc_base + APBC_UART2, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.2");
+
+       clk = clk_register_mux(NULL, "uart3_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_UART3, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, vctcxo);
+       clk_register_clkdev(clk, "uart_mux.3", NULL);
+
+       clk = mmp_clk_register_apbc("uart3", "uart3_mux",
+                               apbc_base + APBC_UART3, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.3");
+
+       clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "uart_mux.0", NULL);
+
+       clk = mmp_clk_register_apbc("ssp0", "ssp0_mux",
+                               apbc_base + APBC_SSP0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.0");
+
+       clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "ssp_mux.1", NULL);
+
+       clk = mmp_clk_register_apbc("ssp1", "ssp1_mux",
+                               apbc_base + APBC_SSP1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.1");
+
+       clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "ssp_mux.2", NULL);
+
+       clk = mmp_clk_register_apbc("ssp2", "ssp2_mux",
+                               apbc_base + APBC_SSP2, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.2");
+
+       clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "ssp_mux.3", NULL);
+
+       clk = mmp_clk_register_apbc("ssp3", "ssp3_mux",
+                               apbc_base + APBC_SSP3, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.3");
+
+       clk = clk_register_mux(NULL, "sdh_mux", sdh_parent,
+                               ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_SDH0, 8, 2, 0, &clk_lock);
+       clk_register_clkdev(clk, "sdh_mux", NULL);
+
+       clk = clk_register_divider(NULL, "sdh_div", "sdh_mux",
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_SDH0,
+                               10, 4, CLK_DIVIDER_ONE_BASED, &clk_lock);
+       clk_register_clkdev(clk, "sdh_div", NULL);
+
+       clk = mmp_clk_register_apmu("sdh0", "sdh_div", apmu_base + APMU_SDH0,
+                               0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sdhci-pxav3.0");
+
+       clk = mmp_clk_register_apmu("sdh1", "sdh_div", apmu_base + APMU_SDH1,
+                               0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sdhci-pxav3.1");
+
+       clk = mmp_clk_register_apmu("sdh2", "sdh_div", apmu_base + APMU_SDH2,
+                               0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sdhci-pxav3.2");
+
+       clk = mmp_clk_register_apmu("sdh3", "sdh_div", apmu_base + APMU_SDH3,
+                               0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sdhci-pxav3.3");
+
+       clk = mmp_clk_register_apmu("usb", "usb_pll", apmu_base + APMU_USB,
+                               0x9, &clk_lock);
+       clk_register_clkdev(clk, "usb_clk", NULL);
+
+       clk = clk_register_mux(NULL, "disp0_mux", disp_parent,
+                               ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_DISP0, 6, 2, 0, &clk_lock);
+       clk_register_clkdev(clk, "disp_mux.0", NULL);
+
+       clk = clk_register_divider(NULL, "disp0_div", "disp0_mux",
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_DISP0,
+                               8, 4, CLK_DIVIDER_ONE_BASED, &clk_lock);
+       clk_register_clkdev(clk, "disp_div.0", NULL);
+
+       clk = mmp_clk_register_apmu("disp0", "disp0_div",
+                               apmu_base + APMU_DISP0, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-disp.0");
+
+       clk = clk_register_divider(NULL, "disp0_sphy_div", "disp0_mux", 0,
+                               apmu_base + APMU_DISP0, 15, 5, 0, &clk_lock);
+       clk_register_clkdev(clk, "disp_sphy_div.0", NULL);
+
+       clk = mmp_clk_register_apmu("disp0_sphy", "disp0_sphy_div",
+                               apmu_base + APMU_DISP0, 0x1024, &clk_lock);
+       clk_register_clkdev(clk, "disp_sphy.0", NULL);
+
+       clk = clk_register_mux(NULL, "disp1_mux", disp_parent,
+                               ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_DISP1, 6, 2, 0, &clk_lock);
+       clk_register_clkdev(clk, "disp_mux.1", NULL);
+
+       clk = clk_register_divider(NULL, "disp1_div", "disp1_mux",
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_DISP1,
+                               8, 4, CLK_DIVIDER_ONE_BASED, &clk_lock);
+       clk_register_clkdev(clk, "disp_div.1", NULL);
+
+       clk = mmp_clk_register_apmu("disp1", "disp1_div",
+                               apmu_base + APMU_DISP1, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-disp.1");
+
+       clk = mmp_clk_register_apmu("ccic_arbiter", "vctcxo",
+                               apmu_base + APMU_CCIC0, 0x1800, &clk_lock);
+       clk_register_clkdev(clk, "ccic_arbiter", NULL);
+
+       clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent,
+                               ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_CCIC0, 6, 2, 0, &clk_lock);
+       clk_register_clkdev(clk, "ccic_mux.0", NULL);
+
+       clk = clk_register_divider(NULL, "ccic0_div", "ccic0_mux",
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0,
+                               17, 4, CLK_DIVIDER_ONE_BASED, &clk_lock);
+       clk_register_clkdev(clk, "ccic_div.0", NULL);
+
+       clk = mmp_clk_register_apmu("ccic0", "ccic0_div",
+                               apmu_base + APMU_CCIC0, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, "fnclk", "mmp-ccic.0");
+
+       clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_div",
+                               apmu_base + APMU_CCIC0, 0x24, &clk_lock);
+       clk_register_clkdev(clk, "phyclk", "mmp-ccic.0");
+
+       clk = clk_register_divider(NULL, "ccic0_sphy_div", "ccic0_div",
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0,
+                               10, 5, 0, &clk_lock);
+       clk_register_clkdev(clk, "sphyclk_div", "mmp-ccic.0");
+
+       clk = mmp_clk_register_apmu("ccic0_sphy", "ccic0_sphy_div",
+                               apmu_base + APMU_CCIC0, 0x300, &clk_lock);
+       clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0");
+
+       clk = clk_register_mux(NULL, "ccic1_mux", ccic_parent,
+                               ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_CCIC1, 6, 2, 0, &clk_lock);
+       clk_register_clkdev(clk, "ccic_mux.1", NULL);
+
+       clk = clk_register_divider(NULL, "ccic1_div", "ccic1_mux",
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC1,
+                               16, 4, CLK_DIVIDER_ONE_BASED, &clk_lock);
+       clk_register_clkdev(clk, "ccic_div.1", NULL);
+
+       clk = mmp_clk_register_apmu("ccic1", "ccic1_div",
+                               apmu_base + APMU_CCIC1, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, "fnclk", "mmp-ccic.1");
+
+       clk = mmp_clk_register_apmu("ccic1_phy", "ccic1_div",
+                               apmu_base + APMU_CCIC1, 0x24, &clk_lock);
+       clk_register_clkdev(clk, "phyclk", "mmp-ccic.1");
+
+       clk = clk_register_divider(NULL, "ccic1_sphy_div", "ccic1_div",
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC1,
+                               10, 5, 0, &clk_lock);
+       clk_register_clkdev(clk, "sphyclk_div", "mmp-ccic.1");
+
+       clk = mmp_clk_register_apmu("ccic1_sphy", "ccic1_sphy_div",
+                               apmu_base + APMU_CCIC1, 0x300, &clk_lock);
+       clk_register_clkdev(clk, "sphyclk", "mmp-ccic.1");
+}
diff --git a/drivers/clk/mmp/clk-pxa168.c b/drivers/clk/mmp/clk-pxa168.c
new file mode 100644 (file)
index 0000000..e8d036c
--- /dev/null
@@ -0,0 +1,346 @@
+/*
+ * pxa168 clock framework source file
+ *
+ * Copyright (C) 2012 Marvell
+ * Chao Xie <xiechao.mail@gmail.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/kernel.h>
+#include <linux/spinlock.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+
+#include <mach/addr-map.h>
+
+#include "clk.h"
+
+#define APBC_RTC       0x28
+#define APBC_TWSI0     0x2c
+#define APBC_KPC       0x30
+#define APBC_UART0     0x0
+#define APBC_UART1     0x4
+#define APBC_GPIO      0x8
+#define APBC_PWM0      0xc
+#define APBC_PWM1      0x10
+#define APBC_PWM2      0x14
+#define APBC_PWM3      0x18
+#define APBC_SSP0      0x81c
+#define APBC_SSP1      0x820
+#define APBC_SSP2      0x84c
+#define APBC_SSP3      0x858
+#define APBC_SSP4      0x85c
+#define APBC_TWSI1     0x6c
+#define APBC_UART2     0x70
+#define APMU_SDH0      0x54
+#define APMU_SDH1      0x58
+#define APMU_USB       0x5c
+#define APMU_DISP0     0x4c
+#define APMU_CCIC0     0x50
+#define APMU_DFC       0x60
+#define MPMU_UART_PLL  0x14
+
+static DEFINE_SPINLOCK(clk_lock);
+
+static struct clk_factor_masks uart_factor_masks = {
+       .factor = 2,
+       .num_mask = 0x1fff,
+       .den_mask = 0x1fff,
+       .num_shift = 16,
+       .den_shift = 0,
+};
+
+static struct clk_factor_tbl uart_factor_tbl[] = {
+       {.num = 8125, .den = 1536},     /*14.745MHZ */
+};
+
+static const char *uart_parent[] = {"pll1_3_16", "uart_pll"};
+static const char *ssp_parent[] = {"pll1_96", "pll1_48", "pll1_24", "pll1_12"};
+static const char *sdh_parent[] = {"pll1_12", "pll1_13"};
+static const char *disp_parent[] = {"pll1_2", "pll1_12"};
+static const char *ccic_parent[] = {"pll1_2", "pll1_12"};
+static const char *ccic_phy_parent[] = {"pll1_6", "pll1_12"};
+
+void __init pxa168_clk_init(void)
+{
+       struct clk *clk;
+       struct clk *uart_pll;
+       void __iomem *mpmu_base;
+       void __iomem *apmu_base;
+       void __iomem *apbc_base;
+
+       mpmu_base = ioremap(APB_PHYS_BASE + 0x50000, SZ_4K);
+       if (mpmu_base == NULL) {
+               pr_err("error to ioremap MPMU base\n");
+               return;
+       }
+
+       apmu_base = ioremap(AXI_PHYS_BASE + 0x82800, SZ_4K);
+       if (apmu_base == NULL) {
+               pr_err("error to ioremap APMU base\n");
+               return;
+       }
+
+       apbc_base = ioremap(APB_PHYS_BASE + 0x15000, SZ_4K);
+       if (apbc_base == NULL) {
+               pr_err("error to ioremap APBC base\n");
+               return;
+       }
+
+       clk = clk_register_fixed_rate(NULL, "clk32", NULL, CLK_IS_ROOT, 3200);
+       clk_register_clkdev(clk, "clk32", NULL);
+
+       clk = clk_register_fixed_rate(NULL, "vctcxo", NULL, CLK_IS_ROOT,
+                               26000000);
+       clk_register_clkdev(clk, "vctcxo", NULL);
+
+       clk = clk_register_fixed_rate(NULL, "pll1", NULL, CLK_IS_ROOT,
+                               624000000);
+       clk_register_clkdev(clk, "pll1", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_2", "pll1",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_2", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_4", "pll1_2",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_4", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_8", "pll1_4",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_8", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_16", "pll1_8",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_16", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_6", "pll1_2",
+                               CLK_SET_RATE_PARENT, 1, 3);
+       clk_register_clkdev(clk, "pll1_6", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_12", "pll1_6",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_12", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_24", "pll1_12",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_24", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_48", "pll1_24",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_48", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_96", "pll1_48",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_96", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_13", "pll1",
+                               CLK_SET_RATE_PARENT, 1, 13);
+       clk_register_clkdev(clk, "pll1_13", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_13_1_5", "pll1",
+                               CLK_SET_RATE_PARENT, 2, 3);
+       clk_register_clkdev(clk, "pll1_13_1_5", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_2_1_5", "pll1",
+                               CLK_SET_RATE_PARENT, 2, 3);
+       clk_register_clkdev(clk, "pll1_2_1_5", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_3_16", "pll1",
+                               CLK_SET_RATE_PARENT, 3, 16);
+       clk_register_clkdev(clk, "pll1_3_16", NULL);
+
+       uart_pll = mmp_clk_register_factor("uart_pll", "pll1_4", 0,
+                               mpmu_base + MPMU_UART_PLL,
+                               &uart_factor_masks, uart_factor_tbl,
+                               ARRAY_SIZE(uart_factor_tbl));
+       clk_set_rate(uart_pll, 14745600);
+       clk_register_clkdev(uart_pll, "uart_pll", NULL);
+
+       clk = mmp_clk_register_apbc("twsi0", "pll1_13_1_5",
+                               apbc_base + APBC_TWSI0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.0");
+
+       clk = mmp_clk_register_apbc("twsi1", "pll1_13_1_5",
+                               apbc_base + APBC_TWSI1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.1");
+
+       clk = mmp_clk_register_apbc("gpio", "vctcxo",
+                               apbc_base + APBC_GPIO, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa-gpio");
+
+       clk = mmp_clk_register_apbc("kpc", "clk32",
+                               apbc_base + APBC_KPC, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa27x-keypad");
+
+       clk = mmp_clk_register_apbc("rtc", "clk32",
+                               apbc_base + APBC_RTC, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sa1100-rtc");
+
+       clk = mmp_clk_register_apbc("pwm0", "pll1_48",
+                               apbc_base + APBC_PWM0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa168-pwm.0");
+
+       clk = mmp_clk_register_apbc("pwm1", "pll1_48",
+                               apbc_base + APBC_PWM1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa168-pwm.1");
+
+       clk = mmp_clk_register_apbc("pwm2", "pll1_48",
+                               apbc_base + APBC_PWM2, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa168-pwm.2");
+
+       clk = mmp_clk_register_apbc("pwm3", "pll1_48",
+                               apbc_base + APBC_PWM3, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa168-pwm.3");
+
+       clk = clk_register_mux(NULL, "uart0_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_UART0, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, uart_pll);
+       clk_register_clkdev(clk, "uart_mux.0", NULL);
+
+       clk = mmp_clk_register_apbc("uart0", "uart0_mux",
+                               apbc_base + APBC_UART0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.0");
+
+       clk = clk_register_mux(NULL, "uart1_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_UART1, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, uart_pll);
+       clk_register_clkdev(clk, "uart_mux.1", NULL);
+
+       clk = mmp_clk_register_apbc("uart1", "uart1_mux",
+                               apbc_base + APBC_UART1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.1");
+
+       clk = clk_register_mux(NULL, "uart2_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_UART2, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, uart_pll);
+       clk_register_clkdev(clk, "uart_mux.2", NULL);
+
+       clk = mmp_clk_register_apbc("uart2", "uart2_mux",
+                               apbc_base + APBC_UART2, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.2");
+
+       clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "uart_mux.0", NULL);
+
+       clk = mmp_clk_register_apbc("ssp0", "ssp0_mux", apbc_base + APBC_SSP0,
+                               10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.0");
+
+       clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "ssp_mux.1", NULL);
+
+       clk = mmp_clk_register_apbc("ssp1", "ssp1_mux", apbc_base + APBC_SSP1,
+                               10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.1");
+
+       clk = clk_register_mux(NULL, "ssp2_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP2, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "ssp_mux.2", NULL);
+
+       clk = mmp_clk_register_apbc("ssp2", "ssp1_mux", apbc_base + APBC_SSP2,
+                               10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.2");
+
+       clk = clk_register_mux(NULL, "ssp3_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP3, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "ssp_mux.3", NULL);
+
+       clk = mmp_clk_register_apbc("ssp3", "ssp1_mux", apbc_base + APBC_SSP3,
+                               10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.3");
+
+       clk = clk_register_mux(NULL, "ssp4_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP4, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "ssp_mux.4", NULL);
+
+       clk = mmp_clk_register_apbc("ssp4", "ssp1_mux", apbc_base + APBC_SSP4,
+                               10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.4");
+
+       clk = mmp_clk_register_apmu("dfc", "pll1_4", apmu_base + APMU_DFC,
+                               0x19b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa3xx-nand.0");
+
+       clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent,
+                               ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "sdh0_mux", NULL);
+
+       clk = mmp_clk_register_apmu("sdh0", "sdh_mux", apmu_base + APMU_SDH0,
+                               0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sdhci-pxa.0");
+
+       clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent,
+                               ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "sdh1_mux", NULL);
+
+       clk = mmp_clk_register_apmu("sdh1", "sdh1_mux", apmu_base + APMU_SDH1,
+                               0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sdhci-pxa.1");
+
+       clk = mmp_clk_register_apmu("usb", "usb_pll", apmu_base + APMU_USB,
+                               0x9, &clk_lock);
+       clk_register_clkdev(clk, "usb_clk", NULL);
+
+       clk = mmp_clk_register_apmu("sph", "usb_pll", apmu_base + APMU_USB,
+                               0x12, &clk_lock);
+       clk_register_clkdev(clk, "sph_clk", NULL);
+
+       clk = clk_register_mux(NULL, "disp0_mux", disp_parent,
+                               ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "disp_mux.0", NULL);
+
+       clk = mmp_clk_register_apmu("disp0", "disp0_mux",
+                               apmu_base + APMU_DISP0, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, "fnclk", "mmp-disp.0");
+
+       clk = mmp_clk_register_apmu("disp0_hclk", "disp0_mux",
+                               apmu_base + APMU_DISP0, 0x24, &clk_lock);
+       clk_register_clkdev(clk, "hclk", "mmp-disp.0");
+
+       clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent,
+                               ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "ccic_mux.0", NULL);
+
+       clk = mmp_clk_register_apmu("ccic0", "ccic0_mux",
+                               apmu_base + APMU_CCIC0, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, "fnclk", "mmp-ccic.0");
+
+       clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent,
+                               ARRAY_SIZE(ccic_phy_parent),
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0,
+                               7, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "ccic_phy_mux.0", NULL);
+
+       clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux",
+                               apmu_base + APMU_CCIC0, 0x24, &clk_lock);
+       clk_register_clkdev(clk, "phyclk", "mmp-ccic.0");
+
+       clk = clk_register_divider(NULL, "ccic0_sphy_div", "ccic0_mux",
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0,
+                               10, 5, 0, &clk_lock);
+       clk_register_clkdev(clk, "sphyclk_div", NULL);
+
+       clk = mmp_clk_register_apmu("ccic0_sphy", "ccic0_sphy_div",
+                               apmu_base + APMU_CCIC0, 0x300, &clk_lock);
+       clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0");
+}
diff --git a/drivers/clk/mmp/clk-pxa910.c b/drivers/clk/mmp/clk-pxa910.c
new file mode 100644 (file)
index 0000000..7048c31
--- /dev/null
@@ -0,0 +1,320 @@
+/*
+ * pxa910 clock framework source file
+ *
+ * Copyright (C) 2012 Marvell
+ * Chao Xie <xiechao.mail@gmail.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/kernel.h>
+#include <linux/spinlock.h>
+#include <linux/io.h>
+#include <linux/delay.h>
+#include <linux/err.h>
+
+#include <mach/addr-map.h>
+
+#include "clk.h"
+
+#define APBC_RTC       0x28
+#define APBC_TWSI0     0x2c
+#define APBC_KPC       0x18
+#define APBC_UART0     0x0
+#define APBC_UART1     0x4
+#define APBC_GPIO      0x8
+#define APBC_PWM0      0xc
+#define APBC_PWM1      0x10
+#define APBC_PWM2      0x14
+#define APBC_PWM3      0x18
+#define APBC_SSP0      0x1c
+#define APBC_SSP1      0x20
+#define APBC_SSP2      0x4c
+#define APBCP_TWSI1    0x28
+#define APBCP_UART2    0x1c
+#define APMU_SDH0      0x54
+#define APMU_SDH1      0x58
+#define APMU_USB       0x5c
+#define APMU_DISP0     0x4c
+#define APMU_CCIC0     0x50
+#define APMU_DFC       0x60
+#define MPMU_UART_PLL  0x14
+
+static DEFINE_SPINLOCK(clk_lock);
+
+static struct clk_factor_masks uart_factor_masks = {
+       .factor = 2,
+       .num_mask = 0x1fff,
+       .den_mask = 0x1fff,
+       .num_shift = 16,
+       .den_shift = 0,
+};
+
+static struct clk_factor_tbl uart_factor_tbl[] = {
+       {.num = 8125, .den = 1536},     /*14.745MHZ */
+};
+
+static const char *uart_parent[] = {"pll1_3_16", "uart_pll"};
+static const char *ssp_parent[] = {"pll1_96", "pll1_48", "pll1_24", "pll1_12"};
+static const char *sdh_parent[] = {"pll1_12", "pll1_13"};
+static const char *disp_parent[] = {"pll1_2", "pll1_12"};
+static const char *ccic_parent[] = {"pll1_2", "pll1_12"};
+static const char *ccic_phy_parent[] = {"pll1_6", "pll1_12"};
+
+void __init pxa910_clk_init(void)
+{
+       struct clk *clk;
+       struct clk *uart_pll;
+       void __iomem *mpmu_base;
+       void __iomem *apmu_base;
+       void __iomem *apbcp_base;
+       void __iomem *apbc_base;
+
+       mpmu_base = ioremap(APB_PHYS_BASE + 0x50000, SZ_4K);
+       if (mpmu_base == NULL) {
+               pr_err("error to ioremap MPMU base\n");
+               return;
+       }
+
+       apmu_base = ioremap(AXI_PHYS_BASE + 0x82800, SZ_4K);
+       if (apmu_base == NULL) {
+               pr_err("error to ioremap APMU base\n");
+               return;
+       }
+
+       apbcp_base = ioremap(APB_PHYS_BASE + 0x3b000, SZ_4K);
+       if (apbcp_base == NULL) {
+               pr_err("error to ioremap APBC extension base\n");
+               return;
+       }
+
+       apbc_base = ioremap(APB_PHYS_BASE + 0x15000, SZ_4K);
+       if (apbc_base == NULL) {
+               pr_err("error to ioremap APBC base\n");
+               return;
+       }
+
+       clk = clk_register_fixed_rate(NULL, "clk32", NULL, CLK_IS_ROOT, 3200);
+       clk_register_clkdev(clk, "clk32", NULL);
+
+       clk = clk_register_fixed_rate(NULL, "vctcxo", NULL, CLK_IS_ROOT,
+                               26000000);
+       clk_register_clkdev(clk, "vctcxo", NULL);
+
+       clk = clk_register_fixed_rate(NULL, "pll1", NULL, CLK_IS_ROOT,
+                               624000000);
+       clk_register_clkdev(clk, "pll1", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_2", "pll1",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_2", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_4", "pll1_2",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_4", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_8", "pll1_4",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_8", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_16", "pll1_8",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_16", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_6", "pll1_2",
+                               CLK_SET_RATE_PARENT, 1, 3);
+       clk_register_clkdev(clk, "pll1_6", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_12", "pll1_6",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_12", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_24", "pll1_12",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_24", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_48", "pll1_24",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_48", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_96", "pll1_48",
+                               CLK_SET_RATE_PARENT, 1, 2);
+       clk_register_clkdev(clk, "pll1_96", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_13", "pll1",
+                               CLK_SET_RATE_PARENT, 1, 13);
+       clk_register_clkdev(clk, "pll1_13", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_13_1_5", "pll1",
+                               CLK_SET_RATE_PARENT, 2, 3);
+       clk_register_clkdev(clk, "pll1_13_1_5", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_2_1_5", "pll1",
+                               CLK_SET_RATE_PARENT, 2, 3);
+       clk_register_clkdev(clk, "pll1_2_1_5", NULL);
+
+       clk = clk_register_fixed_factor(NULL, "pll1_3_16", "pll1",
+                               CLK_SET_RATE_PARENT, 3, 16);
+       clk_register_clkdev(clk, "pll1_3_16", NULL);
+
+       uart_pll =  mmp_clk_register_factor("uart_pll", "pll1_4", 0,
+                               mpmu_base + MPMU_UART_PLL,
+                               &uart_factor_masks, uart_factor_tbl,
+                               ARRAY_SIZE(uart_factor_tbl));
+       clk_set_rate(uart_pll, 14745600);
+       clk_register_clkdev(uart_pll, "uart_pll", NULL);
+
+       clk = mmp_clk_register_apbc("twsi0", "pll1_13_1_5",
+                               apbc_base + APBC_TWSI0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.0");
+
+       clk = mmp_clk_register_apbc("twsi1", "pll1_13_1_5",
+                               apbcp_base + APBCP_TWSI1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-i2c.1");
+
+       clk = mmp_clk_register_apbc("gpio", "vctcxo",
+                               apbc_base + APBC_GPIO, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa-gpio");
+
+       clk = mmp_clk_register_apbc("kpc", "clk32",
+                               apbc_base + APBC_KPC, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa27x-keypad");
+
+       clk = mmp_clk_register_apbc("rtc", "clk32",
+                               apbc_base + APBC_RTC, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sa1100-rtc");
+
+       clk = mmp_clk_register_apbc("pwm0", "pll1_48",
+                               apbc_base + APBC_PWM0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa910-pwm.0");
+
+       clk = mmp_clk_register_apbc("pwm1", "pll1_48",
+                               apbc_base + APBC_PWM1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa910-pwm.1");
+
+       clk = mmp_clk_register_apbc("pwm2", "pll1_48",
+                               apbc_base + APBC_PWM2, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa910-pwm.2");
+
+       clk = mmp_clk_register_apbc("pwm3", "pll1_48",
+                               apbc_base + APBC_PWM3, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa910-pwm.3");
+
+       clk = clk_register_mux(NULL, "uart0_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_UART0, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, uart_pll);
+       clk_register_clkdev(clk, "uart_mux.0", NULL);
+
+       clk = mmp_clk_register_apbc("uart0", "uart0_mux",
+                               apbc_base + APBC_UART0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.0");
+
+       clk = clk_register_mux(NULL, "uart1_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_UART1, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, uart_pll);
+       clk_register_clkdev(clk, "uart_mux.1", NULL);
+
+       clk = mmp_clk_register_apbc("uart1", "uart1_mux",
+                               apbc_base + APBC_UART1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.1");
+
+       clk = clk_register_mux(NULL, "uart2_mux", uart_parent,
+                               ARRAY_SIZE(uart_parent), CLK_SET_RATE_PARENT,
+                               apbcp_base + APBCP_UART2, 4, 3, 0, &clk_lock);
+       clk_set_parent(clk, uart_pll);
+       clk_register_clkdev(clk, "uart_mux.2", NULL);
+
+       clk = mmp_clk_register_apbc("uart2", "uart2_mux",
+                               apbcp_base + APBCP_UART2, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa2xx-uart.2");
+
+       clk = clk_register_mux(NULL, "ssp0_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP0, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "uart_mux.0", NULL);
+
+       clk = mmp_clk_register_apbc("ssp0", "ssp0_mux",
+                               apbc_base + APBC_SSP0, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.0");
+
+       clk = clk_register_mux(NULL, "ssp1_mux", ssp_parent,
+                               ARRAY_SIZE(ssp_parent), CLK_SET_RATE_PARENT,
+                               apbc_base + APBC_SSP1, 4, 3, 0, &clk_lock);
+       clk_register_clkdev(clk, "ssp_mux.1", NULL);
+
+       clk = mmp_clk_register_apbc("ssp1", "ssp1_mux",
+                               apbc_base + APBC_SSP1, 10, 0, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-ssp.1");
+
+       clk = mmp_clk_register_apmu("dfc", "pll1_4",
+                               apmu_base + APMU_DFC, 0x19b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "pxa3xx-nand.0");
+
+       clk = clk_register_mux(NULL, "sdh0_mux", sdh_parent,
+                               ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_SDH0, 6, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "sdh0_mux", NULL);
+
+       clk = mmp_clk_register_apmu("sdh0", "sdh_mux",
+                               apmu_base + APMU_SDH0, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sdhci-pxa.0");
+
+       clk = clk_register_mux(NULL, "sdh1_mux", sdh_parent,
+                               ARRAY_SIZE(sdh_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_SDH1, 6, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "sdh1_mux", NULL);
+
+       clk = mmp_clk_register_apmu("sdh1", "sdh1_mux",
+                               apmu_base + APMU_SDH1, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "sdhci-pxa.1");
+
+       clk = mmp_clk_register_apmu("usb", "usb_pll",
+                               apmu_base + APMU_USB, 0x9, &clk_lock);
+       clk_register_clkdev(clk, "usb_clk", NULL);
+
+       clk = mmp_clk_register_apmu("sph", "usb_pll",
+                               apmu_base + APMU_USB, 0x12, &clk_lock);
+       clk_register_clkdev(clk, "sph_clk", NULL);
+
+       clk = clk_register_mux(NULL, "disp0_mux", disp_parent,
+                               ARRAY_SIZE(disp_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_DISP0, 6, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "disp_mux.0", NULL);
+
+       clk = mmp_clk_register_apmu("disp0", "disp0_mux",
+                               apmu_base + APMU_DISP0, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, NULL, "mmp-disp.0");
+
+       clk = clk_register_mux(NULL, "ccic0_mux", ccic_parent,
+                               ARRAY_SIZE(ccic_parent), CLK_SET_RATE_PARENT,
+                               apmu_base + APMU_CCIC0, 6, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "ccic_mux.0", NULL);
+
+       clk = mmp_clk_register_apmu("ccic0", "ccic0_mux",
+                               apmu_base + APMU_CCIC0, 0x1b, &clk_lock);
+       clk_register_clkdev(clk, "fnclk", "mmp-ccic.0");
+
+       clk = clk_register_mux(NULL, "ccic0_phy_mux", ccic_phy_parent,
+                               ARRAY_SIZE(ccic_phy_parent),
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0,
+                               7, 1, 0, &clk_lock);
+       clk_register_clkdev(clk, "ccic_phy_mux.0", NULL);
+
+       clk = mmp_clk_register_apmu("ccic0_phy", "ccic0_phy_mux",
+                               apmu_base + APMU_CCIC0, 0x24, &clk_lock);
+       clk_register_clkdev(clk, "phyclk", "mmp-ccic.0");
+
+       clk = clk_register_divider(NULL, "ccic0_sphy_div", "ccic0_mux",
+                               CLK_SET_RATE_PARENT, apmu_base + APMU_CCIC0,
+                               10, 5, 0, &clk_lock);
+       clk_register_clkdev(clk, "sphyclk_div", NULL);
+
+       clk = mmp_clk_register_apmu("ccic0_sphy", "ccic0_sphy_div",
+                               apmu_base + APMU_CCIC0, 0x300, &clk_lock);
+       clk_register_clkdev(clk, "sphyclk", "mmp-ccic.0");
+}
diff --git a/drivers/clk/mmp/clk.h b/drivers/clk/mmp/clk.h
new file mode 100644 (file)
index 0000000..ab86dd4
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef __MACH_MMP_CLK_H
+#define __MACH_MMP_CLK_H
+
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
+
+#define APBC_NO_BUS_CTRL       BIT(0)
+#define APBC_POWER_CTRL                BIT(1)
+
+struct clk_factor_masks {
+       unsigned int    factor;
+       unsigned int    num_mask;
+       unsigned int    den_mask;
+       unsigned int    num_shift;
+       unsigned int    den_shift;
+};
+
+struct clk_factor_tbl {
+       unsigned int num;
+       unsigned int den;
+};
+
+extern struct clk *mmp_clk_register_pll2(const char *name,
+               const char *parent_name, unsigned long flags);
+extern struct clk *mmp_clk_register_apbc(const char *name,
+               const char *parent_name, void __iomem *base,
+               unsigned int delay, unsigned int apbc_flags, spinlock_t *lock);
+extern struct clk *mmp_clk_register_apmu(const char *name,
+               const char *parent_name, void __iomem *base, u32 enable_mask,
+               spinlock_t *lock);
+extern struct clk *mmp_clk_register_factor(const char *name,
+               const char *parent_name, unsigned long flags,
+               void __iomem *base, struct clk_factor_masks *masks,
+               struct clk_factor_tbl *ftbl, unsigned int ftbl_cnt);
+#endif
index 844043a..9f6d155 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/err.h>
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/of.h>
 #include <mach/common.h>
 #include <mach/mx23.h>
 #include "clk.h"
@@ -71,44 +72,6 @@ static void __init clk_misc_init(void)
        __mxs_setl(30 << BP_FRAC_IOFRAC, FRAC);
 }
 
-static struct clk_lookup uart_lookups[] = {
-       { .dev_id = "duart", },
-       { .dev_id = "mxs-auart.0", },
-       { .dev_id = "mxs-auart.1", },
-       { .dev_id = "8006c000.serial", },
-       { .dev_id = "8006e000.serial", },
-       { .dev_id = "80070000.serial", },
-};
-
-static struct clk_lookup hbus_lookups[] = {
-       { .dev_id = "imx23-dma-apbh", },
-       { .dev_id = "80004000.dma-apbh", },
-};
-
-static struct clk_lookup xbus_lookups[] = {
-       { .dev_id = "duart", .con_id = "apb_pclk"},
-       { .dev_id = "80070000.serial", .con_id = "apb_pclk"},
-       { .dev_id = "imx23-dma-apbx", },
-       { .dev_id = "80024000.dma-apbx", },
-};
-
-static struct clk_lookup ssp_lookups[] = {
-       { .dev_id = "imx23-mmc.0", },
-       { .dev_id = "imx23-mmc.1", },
-       { .dev_id = "80010000.ssp", },
-       { .dev_id = "80034000.ssp", },
-};
-
-static struct clk_lookup lcdif_lookups[] = {
-       { .dev_id = "imx23-fb", },
-       { .dev_id = "80030000.lcdif", },
-};
-
-static struct clk_lookup gpmi_lookups[] = {
-       { .dev_id = "imx23-gpmi-nand", },
-       { .dev_id = "8000c000.gpmi-nand", },
-};
-
 static const char *sel_pll[]  __initconst = { "pll", "ref_xtal", };
 static const char *sel_cpu[]  __initconst = { "ref_cpu", "ref_xtal", };
 static const char *sel_pix[]  __initconst = { "ref_pix", "ref_xtal", };
@@ -127,6 +90,7 @@ enum imx23_clk {
 };
 
 static struct clk *clks[clk_max];
+static struct clk_onecell_data clk_data;
 
 static enum imx23_clk clks_init_on[] __initdata = {
        cpu, hbus, xbus, emi, uart,
@@ -134,6 +98,7 @@ static enum imx23_clk clks_init_on[] __initdata = {
 
 int __init mx23_clocks_init(void)
 {
+       struct device_node *np;
        int i;
 
        clk_misc_init();
@@ -188,14 +153,14 @@ int __init mx23_clocks_init(void)
                        return PTR_ERR(clks[i]);
                }
 
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx23-clkctrl");
+       if (np) {
+               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[clk32k], NULL, "timrot");
-       clk_register_clkdev(clks[pwm], NULL, "80064000.pwm");
-       clk_register_clkdevs(clks[hbus], hbus_lookups, ARRAY_SIZE(hbus_lookups));
-       clk_register_clkdevs(clks[xbus], xbus_lookups, ARRAY_SIZE(xbus_lookups));
-       clk_register_clkdevs(clks[uart], uart_lookups, ARRAY_SIZE(uart_lookups));
-       clk_register_clkdevs(clks[ssp], ssp_lookups, ARRAY_SIZE(ssp_lookups));
-       clk_register_clkdevs(clks[gpmi], gpmi_lookups, ARRAY_SIZE(gpmi_lookups));
-       clk_register_clkdevs(clks[lcdif], lcdif_lookups, ARRAY_SIZE(lcdif_lookups));
 
        for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
                clk_prepare_enable(clks[clks_init_on[i]]);
index e3aab67..613e76f 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/err.h>
 #include <linux/init.h>
 #include <linux/io.h>
+#include <linux/of.h>
 #include <mach/common.h>
 #include <mach/mx28.h>
 #include "clk.h"
@@ -120,90 +121,6 @@ static void __init clk_misc_init(void)
        writel_relaxed(val, FRAC0);
 }
 
-static struct clk_lookup uart_lookups[] = {
-       { .dev_id = "duart", },
-       { .dev_id = "mxs-auart.0", },
-       { .dev_id = "mxs-auart.1", },
-       { .dev_id = "mxs-auart.2", },
-       { .dev_id = "mxs-auart.3", },
-       { .dev_id = "mxs-auart.4", },
-       { .dev_id = "8006a000.serial", },
-       { .dev_id = "8006c000.serial", },
-       { .dev_id = "8006e000.serial", },
-       { .dev_id = "80070000.serial", },
-       { .dev_id = "80072000.serial", },
-       { .dev_id = "80074000.serial", },
-};
-
-static struct clk_lookup hbus_lookups[] = {
-       { .dev_id = "imx28-dma-apbh", },
-       { .dev_id = "80004000.dma-apbh", },
-};
-
-static struct clk_lookup xbus_lookups[] = {
-       { .dev_id = "duart", .con_id = "apb_pclk"},
-       { .dev_id = "80074000.serial", .con_id = "apb_pclk"},
-       { .dev_id = "imx28-dma-apbx", },
-       { .dev_id = "80024000.dma-apbx", },
-};
-
-static struct clk_lookup ssp0_lookups[] = {
-       { .dev_id = "imx28-mmc.0", },
-       { .dev_id = "80010000.ssp", },
-};
-
-static struct clk_lookup ssp1_lookups[] = {
-       { .dev_id = "imx28-mmc.1", },
-       { .dev_id = "80012000.ssp", },
-};
-
-static struct clk_lookup ssp2_lookups[] = {
-       { .dev_id = "imx28-mmc.2", },
-       { .dev_id = "80014000.ssp", },
-};
-
-static struct clk_lookup ssp3_lookups[] = {
-       { .dev_id = "imx28-mmc.3", },
-       { .dev_id = "80016000.ssp", },
-};
-
-static struct clk_lookup lcdif_lookups[] = {
-       { .dev_id = "imx28-fb", },
-       { .dev_id = "80030000.lcdif", },
-};
-
-static struct clk_lookup gpmi_lookups[] = {
-       { .dev_id = "imx28-gpmi-nand", },
-       { .dev_id = "8000c000.gpmi-nand", },
-};
-
-static struct clk_lookup fec_lookups[] = {
-       { .dev_id = "imx28-fec.0", },
-       { .dev_id = "imx28-fec.1", },
-       { .dev_id = "800f0000.ethernet", },
-       { .dev_id = "800f4000.ethernet", },
-};
-
-static struct clk_lookup can0_lookups[] = {
-       { .dev_id = "flexcan.0", },
-       { .dev_id = "80032000.can", },
-};
-
-static struct clk_lookup can1_lookups[] = {
-       { .dev_id = "flexcan.1", },
-       { .dev_id = "80034000.can", },
-};
-
-static struct clk_lookup saif0_lookups[] = {
-       { .dev_id = "mxs-saif.0", },
-       { .dev_id = "80042000.saif", },
-};
-
-static struct clk_lookup saif1_lookups[] = {
-       { .dev_id = "mxs-saif.1", },
-       { .dev_id = "80046000.saif", },
-};
-
 static const char *sel_cpu[]  __initconst = { "ref_cpu", "ref_xtal", };
 static const char *sel_io0[]  __initconst = { "ref_io0", "ref_xtal", };
 static const char *sel_io1[]  __initconst = { "ref_io1", "ref_xtal", };
@@ -228,6 +145,7 @@ enum imx28_clk {
 };
 
 static struct clk *clks[clk_max];
+static struct clk_onecell_data clk_data;
 
 static enum imx28_clk clks_init_on[] __initdata = {
        cpu, hbus, xbus, emi, uart,
@@ -235,6 +153,7 @@ static enum imx28_clk clks_init_on[] __initdata = {
 
 int __init mx28_clocks_init(void)
 {
+       struct device_node *np;
        int i;
 
        clk_misc_init();
@@ -312,27 +231,15 @@ int __init mx28_clocks_init(void)
                        return PTR_ERR(clks[i]);
                }
 
+       np = of_find_compatible_node(NULL, NULL, "fsl,imx28-clkctrl");
+       if (np) {
+               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[clk32k], NULL, "timrot");
        clk_register_clkdev(clks[enet_out], NULL, "enet_out");
-       clk_register_clkdev(clks[pwm], NULL, "80064000.pwm");
-       clk_register_clkdevs(clks[hbus], hbus_lookups, ARRAY_SIZE(hbus_lookups));
-       clk_register_clkdevs(clks[xbus], xbus_lookups, ARRAY_SIZE(xbus_lookups));
-       clk_register_clkdevs(clks[uart], uart_lookups, ARRAY_SIZE(uart_lookups));
-       clk_register_clkdevs(clks[ssp0], ssp0_lookups, ARRAY_SIZE(ssp0_lookups));
-       clk_register_clkdevs(clks[ssp1], ssp1_lookups, ARRAY_SIZE(ssp1_lookups));
-       clk_register_clkdevs(clks[ssp2], ssp2_lookups, ARRAY_SIZE(ssp2_lookups));
-       clk_register_clkdevs(clks[ssp3], ssp3_lookups, ARRAY_SIZE(ssp3_lookups));
-       clk_register_clkdevs(clks[gpmi], gpmi_lookups, ARRAY_SIZE(gpmi_lookups));
-       clk_register_clkdevs(clks[saif0], saif0_lookups, ARRAY_SIZE(saif0_lookups));
-       clk_register_clkdevs(clks[saif1], saif1_lookups, ARRAY_SIZE(saif1_lookups));
-       clk_register_clkdevs(clks[lcdif], lcdif_lookups, ARRAY_SIZE(lcdif_lookups));
-       clk_register_clkdevs(clks[fec], fec_lookups, ARRAY_SIZE(fec_lookups));
-       clk_register_clkdevs(clks[can0], can0_lookups, ARRAY_SIZE(can0_lookups));
-       clk_register_clkdevs(clks[can1], can1_lookups, ARRAY_SIZE(can1_lookups));
-       clk_register_clkdev(clks[usb0_pwr], NULL, "8007c000.usbphy");
-       clk_register_clkdev(clks[usb1_pwr], NULL, "8007e000.usbphy");
-       clk_register_clkdev(clks[usb0], NULL, "80080000.usb");
-       clk_register_clkdev(clks[usb1], NULL, "80090000.usb");
 
        for (i = 0; i < ARRAY_SIZE(clks_init_on); i++)
                clk_prepare_enable(clks[clks_init_on[i]]);
diff --git a/drivers/clk/ux500/Makefile b/drivers/clk/ux500/Makefile
new file mode 100644 (file)
index 0000000..858fbfe
--- /dev/null
@@ -0,0 +1,12 @@
+#
+# Makefile for ux500 clocks
+#
+
+# Clock types
+obj-y += clk-prcc.o
+obj-y += clk-prcmu.o
+
+# Clock definitions
+obj-y += u8500_clk.o
+obj-y += u9540_clk.o
+obj-y += u8540_clk.o
diff --git a/drivers/clk/ux500/clk-prcc.c b/drivers/clk/ux500/clk-prcc.c
new file mode 100644 (file)
index 0000000..7eee7f7
--- /dev/null
@@ -0,0 +1,164 @@
+/*
+ * PRCC clock implementation for ux500 platform.
+ *
+ * Copyright (C) 2012 ST-Ericsson SA
+ * Author: Ulf Hansson <ulf.hansson@linaro.org>
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/clk-private.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include <linux/types.h>
+#include <mach/hardware.h>
+
+#include "clk.h"
+
+#define PRCC_PCKEN                     0x000
+#define PRCC_PCKDIS                    0x004
+#define PRCC_KCKEN                     0x008
+#define PRCC_KCKDIS                    0x00C
+#define PRCC_PCKSR                     0x010
+#define PRCC_KCKSR                     0x014
+
+#define to_clk_prcc(_hw) container_of(_hw, struct clk_prcc, hw)
+
+struct clk_prcc {
+       struct clk_hw hw;
+       void __iomem *base;
+       u32 cg_sel;
+       int is_enabled;
+};
+
+/* PRCC clock operations. */
+
+static int clk_prcc_pclk_enable(struct clk_hw *hw)
+{
+       struct clk_prcc *clk = to_clk_prcc(hw);
+
+       writel(clk->cg_sel, (clk->base + PRCC_PCKEN));
+       while (!(readl(clk->base + PRCC_PCKSR) & clk->cg_sel))
+               cpu_relax();
+
+       clk->is_enabled = 1;
+       return 0;
+}
+
+static void clk_prcc_pclk_disable(struct clk_hw *hw)
+{
+       struct clk_prcc *clk = to_clk_prcc(hw);
+
+       writel(clk->cg_sel, (clk->base + PRCC_PCKDIS));
+       clk->is_enabled = 0;
+}
+
+static int clk_prcc_kclk_enable(struct clk_hw *hw)
+{
+       struct clk_prcc *clk = to_clk_prcc(hw);
+
+       writel(clk->cg_sel, (clk->base + PRCC_KCKEN));
+       while (!(readl(clk->base + PRCC_KCKSR) & clk->cg_sel))
+               cpu_relax();
+
+       clk->is_enabled = 1;
+       return 0;
+}
+
+static void clk_prcc_kclk_disable(struct clk_hw *hw)
+{
+       struct clk_prcc *clk = to_clk_prcc(hw);
+
+       writel(clk->cg_sel, (clk->base + PRCC_KCKDIS));
+       clk->is_enabled = 0;
+}
+
+static int clk_prcc_is_enabled(struct clk_hw *hw)
+{
+       struct clk_prcc *clk = to_clk_prcc(hw);
+       return clk->is_enabled;
+}
+
+static struct clk_ops clk_prcc_pclk_ops = {
+       .enable = clk_prcc_pclk_enable,
+       .disable = clk_prcc_pclk_disable,
+       .is_enabled = clk_prcc_is_enabled,
+};
+
+static struct clk_ops clk_prcc_kclk_ops = {
+       .enable = clk_prcc_kclk_enable,
+       .disable = clk_prcc_kclk_disable,
+       .is_enabled = clk_prcc_is_enabled,
+};
+
+static struct clk *clk_reg_prcc(const char *name,
+                               const char *parent_name,
+                               resource_size_t phy_base,
+                               u32 cg_sel,
+                               unsigned long flags,
+                               struct clk_ops *clk_prcc_ops)
+{
+       struct clk_prcc *clk;
+       struct clk_init_data clk_prcc_init;
+       struct clk *clk_reg;
+
+       if (!name) {
+               pr_err("clk_prcc: %s invalid arguments passed\n", __func__);
+               return ERR_PTR(-EINVAL);
+       }
+
+       clk = kzalloc(sizeof(struct clk_prcc), GFP_KERNEL);
+       if (!clk) {
+               pr_err("clk_prcc: %s could not allocate clk\n", __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       clk->base = ioremap(phy_base, SZ_4K);
+       if (!clk->base)
+               goto free_clk;
+
+       clk->cg_sel = cg_sel;
+       clk->is_enabled = 1;
+
+       clk_prcc_init.name = name;
+       clk_prcc_init.ops = clk_prcc_ops;
+       clk_prcc_init.flags = flags;
+       clk_prcc_init.parent_names = (parent_name ? &parent_name : NULL);
+       clk_prcc_init.num_parents = (parent_name ? 1 : 0);
+       clk->hw.init = &clk_prcc_init;
+
+       clk_reg = clk_register(NULL, &clk->hw);
+       if (IS_ERR_OR_NULL(clk_reg))
+               goto unmap_clk;
+
+       return clk_reg;
+
+unmap_clk:
+       iounmap(clk->base);
+free_clk:
+       kfree(clk);
+       pr_err("clk_prcc: %s failed to register clk\n", __func__);
+       return ERR_PTR(-ENOMEM);
+}
+
+struct clk *clk_reg_prcc_pclk(const char *name,
+                             const char *parent_name,
+                             resource_size_t phy_base,
+                             u32 cg_sel,
+                             unsigned long flags)
+{
+       return clk_reg_prcc(name, parent_name, phy_base, cg_sel, flags,
+                       &clk_prcc_pclk_ops);
+}
+
+struct clk *clk_reg_prcc_kclk(const char *name,
+                             const char *parent_name,
+                             resource_size_t phy_base,
+                             u32 cg_sel,
+                             unsigned long flags)
+{
+       return clk_reg_prcc(name, parent_name, phy_base, cg_sel, flags,
+                       &clk_prcc_kclk_ops);
+}
diff --git a/drivers/clk/ux500/clk-prcmu.c b/drivers/clk/ux500/clk-prcmu.c
new file mode 100644 (file)
index 0000000..930cdfe
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ * PRCMU clock implementation for ux500 platform.
+ *
+ * Copyright (C) 2012 ST-Ericsson SA
+ * Author: Ulf Hansson <ulf.hansson@linaro.org>
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/clk-private.h>
+#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/slab.h>
+#include <linux/io.h>
+#include <linux/err.h>
+#include "clk.h"
+
+#define to_clk_prcmu(_hw) container_of(_hw, struct clk_prcmu, hw)
+
+struct clk_prcmu {
+       struct clk_hw hw;
+       u8 cg_sel;
+       int is_enabled;
+};
+
+/* PRCMU clock operations. */
+
+static int clk_prcmu_prepare(struct clk_hw *hw)
+{
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+       return prcmu_request_clock(clk->cg_sel, true);
+}
+
+static void clk_prcmu_unprepare(struct clk_hw *hw)
+{
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+       if (prcmu_request_clock(clk->cg_sel, false))
+               pr_err("clk_prcmu: %s failed to disable %s.\n", __func__,
+                       hw->init->name);
+}
+
+static int clk_prcmu_enable(struct clk_hw *hw)
+{
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+       clk->is_enabled = 1;
+       return 0;
+}
+
+static void clk_prcmu_disable(struct clk_hw *hw)
+{
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+       clk->is_enabled = 0;
+}
+
+static int clk_prcmu_is_enabled(struct clk_hw *hw)
+{
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+       return clk->is_enabled;
+}
+
+static unsigned long clk_prcmu_recalc_rate(struct clk_hw *hw,
+                                          unsigned long parent_rate)
+{
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+       return prcmu_clock_rate(clk->cg_sel);
+}
+
+static long clk_prcmu_round_rate(struct clk_hw *hw, unsigned long rate,
+                                unsigned long *parent_rate)
+{
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+       return prcmu_round_clock_rate(clk->cg_sel, rate);
+}
+
+static int clk_prcmu_set_rate(struct clk_hw *hw, unsigned long rate,
+                             unsigned long parent_rate)
+{
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+       return prcmu_set_clock_rate(clk->cg_sel, rate);
+}
+
+static int request_ape_opp100(bool enable)
+{
+       static int reqs;
+       int err = 0;
+
+       if (enable) {
+               if (!reqs)
+                       err = prcmu_qos_add_requirement(PRCMU_QOS_APE_OPP,
+                                                       "clock", 100);
+               if (!err)
+                       reqs++;
+       } else {
+               reqs--;
+               if (!reqs)
+                       prcmu_qos_remove_requirement(PRCMU_QOS_APE_OPP,
+                                               "clock");
+       }
+       return err;
+}
+
+static int clk_prcmu_opp_prepare(struct clk_hw *hw)
+{
+       int err;
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+
+       err = request_ape_opp100(true);
+       if (err) {
+               pr_err("clk_prcmu: %s failed to request APE OPP100 for %s.\n",
+                       __func__, hw->init->name);
+               return err;
+       }
+
+       err = prcmu_request_clock(clk->cg_sel, true);
+       if (err)
+               request_ape_opp100(false);
+
+       return err;
+}
+
+static void clk_prcmu_opp_unprepare(struct clk_hw *hw)
+{
+       struct clk_prcmu *clk = to_clk_prcmu(hw);
+
+       if (prcmu_request_clock(clk->cg_sel, false))
+               goto out_error;
+       if (request_ape_opp100(false))
+               goto out_error;
+       return;
+
+out_error:
+       pr_err("clk_prcmu: %s failed to disable %s.\n", __func__,
+               hw->init->name);
+}
+
+static struct clk_ops clk_prcmu_scalable_ops = {
+       .prepare = clk_prcmu_prepare,
+       .unprepare = clk_prcmu_unprepare,
+       .enable = clk_prcmu_enable,
+       .disable = clk_prcmu_disable,
+       .is_enabled = clk_prcmu_is_enabled,
+       .recalc_rate = clk_prcmu_recalc_rate,
+       .round_rate = clk_prcmu_round_rate,
+       .set_rate = clk_prcmu_set_rate,
+};
+
+static struct clk_ops clk_prcmu_gate_ops = {
+       .prepare = clk_prcmu_prepare,
+       .unprepare = clk_prcmu_unprepare,
+       .enable = clk_prcmu_enable,
+       .disable = clk_prcmu_disable,
+       .is_enabled = clk_prcmu_is_enabled,
+       .recalc_rate = clk_prcmu_recalc_rate,
+};
+
+static struct clk_ops clk_prcmu_rate_ops = {
+       .is_enabled = clk_prcmu_is_enabled,
+       .recalc_rate = clk_prcmu_recalc_rate,
+};
+
+static struct clk_ops clk_prcmu_opp_gate_ops = {
+       .prepare = clk_prcmu_opp_prepare,
+       .unprepare = clk_prcmu_opp_unprepare,
+       .enable = clk_prcmu_enable,
+       .disable = clk_prcmu_disable,
+       .is_enabled = clk_prcmu_is_enabled,
+       .recalc_rate = clk_prcmu_recalc_rate,
+};
+
+static struct clk *clk_reg_prcmu(const char *name,
+                                const char *parent_name,
+                                u8 cg_sel,
+                                unsigned long rate,
+                                unsigned long flags,
+                                struct clk_ops *clk_prcmu_ops)
+{
+       struct clk_prcmu *clk;
+       struct clk_init_data clk_prcmu_init;
+       struct clk *clk_reg;
+
+       if (!name) {
+               pr_err("clk_prcmu: %s invalid arguments passed\n", __func__);
+               return ERR_PTR(-EINVAL);
+       }
+
+       clk = kzalloc(sizeof(struct clk_prcmu), GFP_KERNEL);
+       if (!clk) {
+               pr_err("clk_prcmu: %s could not allocate clk\n", __func__);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       clk->cg_sel = cg_sel;
+       clk->is_enabled = 1;
+       /* "rate" can be used for changing the initial frequency */
+       if (rate)
+               prcmu_set_clock_rate(cg_sel, rate);
+
+       clk_prcmu_init.name = name;
+       clk_prcmu_init.ops = clk_prcmu_ops;
+       clk_prcmu_init.flags = flags;
+       clk_prcmu_init.parent_names = (parent_name ? &parent_name : NULL);
+       clk_prcmu_init.num_parents = (parent_name ? 1 : 0);
+       clk->hw.init = &clk_prcmu_init;
+
+       clk_reg = clk_register(NULL, &clk->hw);
+       if (IS_ERR_OR_NULL(clk_reg))
+               goto free_clk;
+
+       return clk_reg;
+
+free_clk:
+       kfree(clk);
+       pr_err("clk_prcmu: %s failed to register clk\n", __func__);
+       return ERR_PTR(-ENOMEM);
+}
+
+struct clk *clk_reg_prcmu_scalable(const char *name,
+                                  const char *parent_name,
+                                  u8 cg_sel,
+                                  unsigned long rate,
+                                  unsigned long flags)
+{
+       return clk_reg_prcmu(name, parent_name, cg_sel, rate, flags,
+                       &clk_prcmu_scalable_ops);
+}
+
+struct clk *clk_reg_prcmu_gate(const char *name,
+                              const char *parent_name,
+                              u8 cg_sel,
+                              unsigned long flags)
+{
+       return clk_reg_prcmu(name, parent_name, cg_sel, 0, flags,
+                       &clk_prcmu_gate_ops);
+}
+
+struct clk *clk_reg_prcmu_rate(const char *name,
+                              const char *parent_name,
+                              u8 cg_sel,
+                              unsigned long flags)
+{
+       return clk_reg_prcmu(name, parent_name, cg_sel, 0, flags,
+                       &clk_prcmu_rate_ops);
+}
+
+struct clk *clk_reg_prcmu_opp_gate(const char *name,
+                                  const char *parent_name,
+                                  u8 cg_sel,
+                                  unsigned long flags)
+{
+       return clk_reg_prcmu(name, parent_name, cg_sel, 0, flags,
+                       &clk_prcmu_opp_gate_ops);
+}
diff --git a/drivers/clk/ux500/clk.h b/drivers/clk/ux500/clk.h
new file mode 100644 (file)
index 0000000..836d7d1
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Clocks for ux500 platforms
+ *
+ * Copyright (C) 2012 ST-Ericsson SA
+ * Author: Ulf Hansson <ulf.hansson@linaro.org>
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#ifndef __UX500_CLK_H
+#define __UX500_CLK_H
+
+#include <linux/clk.h>
+
+struct clk *clk_reg_prcc_pclk(const char *name,
+                             const char *parent_name,
+                             unsigned int phy_base,
+                             u32 cg_sel,
+                             unsigned long flags);
+
+struct clk *clk_reg_prcc_kclk(const char *name,
+                             const char *parent_name,
+                             unsigned int phy_base,
+                             u32 cg_sel,
+                             unsigned long flags);
+
+struct clk *clk_reg_prcmu_scalable(const char *name,
+                                  const char *parent_name,
+                                  u8 cg_sel,
+                                  unsigned long rate,
+                                  unsigned long flags);
+
+struct clk *clk_reg_prcmu_gate(const char *name,
+                              const char *parent_name,
+                              u8 cg_sel,
+                              unsigned long flags);
+
+struct clk *clk_reg_prcmu_rate(const char *name,
+                              const char *parent_name,
+                              u8 cg_sel,
+                              unsigned long flags);
+
+struct clk *clk_reg_prcmu_opp_gate(const char *name,
+                                  const char *parent_name,
+                                  u8 cg_sel,
+                                  unsigned long flags);
+
+#endif /* __UX500_CLK_H */
diff --git a/drivers/clk/ux500/u8500_clk.c b/drivers/clk/ux500/u8500_clk.c
new file mode 100644 (file)
index 0000000..ca4a25e
--- /dev/null
@@ -0,0 +1,477 @@
+/*
+ * Clock definitions for u8500 platform.
+ *
+ * Copyright (C) 2012 ST-Ericsson SA
+ * Author: Ulf Hansson <ulf.hansson@linaro.org>
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/clk-provider.h>
+#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/platform_data/clk-ux500.h>
+
+#include "clk.h"
+
+void u8500_clk_init(void)
+{
+       struct prcmu_fw_version *fw_version;
+       const char *sgaclk_parent = NULL;
+       struct clk *clk;
+
+       /* Clock sources */
+       clk = clk_reg_prcmu_gate("soc0_pll", NULL, PRCMU_PLLSOC0,
+                               CLK_IS_ROOT|CLK_IGNORE_UNUSED);
+       clk_register_clkdev(clk, "soc0_pll", NULL);
+
+       clk = clk_reg_prcmu_gate("soc1_pll", NULL, PRCMU_PLLSOC1,
+                               CLK_IS_ROOT|CLK_IGNORE_UNUSED);
+       clk_register_clkdev(clk, "soc1_pll", NULL);
+
+       clk = clk_reg_prcmu_gate("ddr_pll", NULL, PRCMU_PLLDDR,
+                               CLK_IS_ROOT|CLK_IGNORE_UNUSED);
+       clk_register_clkdev(clk, "ddr_pll", NULL);
+
+       /* FIXME: Add sys, ulp and int clocks here. */
+
+       clk = clk_register_fixed_rate(NULL, "rtc32k", "NULL",
+                               CLK_IS_ROOT|CLK_IGNORE_UNUSED,
+                               32768);
+       clk_register_clkdev(clk, "clk32k", NULL);
+       clk_register_clkdev(clk, NULL, "rtc-pl031");
+
+       /* PRCMU clocks */
+       fw_version = prcmu_get_fw_version();
+       if (fw_version != NULL) {
+               switch (fw_version->project) {
+               case PRCMU_FW_PROJECT_U8500_C2:
+               case PRCMU_FW_PROJECT_U8520:
+               case PRCMU_FW_PROJECT_U8420:
+                       sgaclk_parent = "soc0_pll";
+                       break;
+               default:
+                       break;
+               }
+       }
+
+       if (sgaclk_parent)
+               clk = clk_reg_prcmu_gate("sgclk", sgaclk_parent,
+                                       PRCMU_SGACLK, 0);
+       else
+               clk = clk_reg_prcmu_gate("sgclk", NULL,
+                                       PRCMU_SGACLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "mali");
+
+       clk = clk_reg_prcmu_gate("uartclk", NULL, PRCMU_UARTCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "UART");
+
+       clk = clk_reg_prcmu_gate("msp02clk", NULL, PRCMU_MSP02CLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "MSP02");
+
+       clk = clk_reg_prcmu_gate("msp1clk", NULL, PRCMU_MSP1CLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "MSP1");
+
+       clk = clk_reg_prcmu_gate("i2cclk", NULL, PRCMU_I2CCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "I2C");
+
+       clk = clk_reg_prcmu_gate("slimclk", NULL, PRCMU_SLIMCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "slim");
+
+       clk = clk_reg_prcmu_gate("per1clk", NULL, PRCMU_PER1CLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "PERIPH1");
+
+       clk = clk_reg_prcmu_gate("per2clk", NULL, PRCMU_PER2CLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "PERIPH2");
+
+       clk = clk_reg_prcmu_gate("per3clk", NULL, PRCMU_PER3CLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "PERIPH3");
+
+       clk = clk_reg_prcmu_gate("per5clk", NULL, PRCMU_PER5CLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "PERIPH5");
+
+       clk = clk_reg_prcmu_gate("per6clk", NULL, PRCMU_PER6CLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "PERIPH6");
+
+       clk = clk_reg_prcmu_gate("per7clk", NULL, PRCMU_PER7CLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "PERIPH7");
+
+       clk = clk_reg_prcmu_scalable("lcdclk", NULL, PRCMU_LCDCLK, 0,
+                               CLK_IS_ROOT|CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "lcd");
+       clk_register_clkdev(clk, "lcd", "mcde");
+
+       clk = clk_reg_prcmu_opp_gate("bmlclk", NULL, PRCMU_BMLCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "bml");
+
+       clk = clk_reg_prcmu_scalable("hsitxclk", NULL, PRCMU_HSITXCLK, 0,
+                               CLK_IS_ROOT|CLK_SET_RATE_GATE);
+
+       clk = clk_reg_prcmu_scalable("hsirxclk", NULL, PRCMU_HSIRXCLK, 0,
+                               CLK_IS_ROOT|CLK_SET_RATE_GATE);
+
+       clk = clk_reg_prcmu_scalable("hdmiclk", NULL, PRCMU_HDMICLK, 0,
+                               CLK_IS_ROOT|CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "hdmi");
+       clk_register_clkdev(clk, "hdmi", "mcde");
+
+       clk = clk_reg_prcmu_gate("apeatclk", NULL, PRCMU_APEATCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "apeat");
+
+       clk = clk_reg_prcmu_gate("apetraceclk", NULL, PRCMU_APETRACECLK,
+                               CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "apetrace");
+
+       clk = clk_reg_prcmu_gate("mcdeclk", NULL, PRCMU_MCDECLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "mcde");
+       clk_register_clkdev(clk, "mcde", "mcde");
+       clk_register_clkdev(clk, "dsisys", "dsilink.0");
+       clk_register_clkdev(clk, "dsisys", "dsilink.1");
+       clk_register_clkdev(clk, "dsisys", "dsilink.2");
+
+       clk = clk_reg_prcmu_opp_gate("ipi2cclk", NULL, PRCMU_IPI2CCLK,
+                               CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "ipi2");
+
+       clk = clk_reg_prcmu_gate("dsialtclk", NULL, PRCMU_DSIALTCLK,
+                               CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "dsialt");
+
+       clk = clk_reg_prcmu_gate("dmaclk", NULL, PRCMU_DMACLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "dma40.0");
+
+       clk = clk_reg_prcmu_gate("b2r2clk", NULL, PRCMU_B2R2CLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "b2r2");
+       clk_register_clkdev(clk, NULL, "b2r2_core");
+       clk_register_clkdev(clk, NULL, "U8500-B2R2.0");
+
+       clk = clk_reg_prcmu_scalable("tvclk", NULL, PRCMU_TVCLK, 0,
+                               CLK_IS_ROOT|CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "tv");
+       clk_register_clkdev(clk, "tv", "mcde");
+
+       clk = clk_reg_prcmu_gate("sspclk", NULL, PRCMU_SSPCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "SSP");
+
+       clk = clk_reg_prcmu_gate("rngclk", NULL, PRCMU_RNGCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "rngclk");
+
+       clk = clk_reg_prcmu_gate("uiccclk", NULL, PRCMU_UICCCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "uicc");
+
+       /*
+        * FIXME: The MTU clocks might need some kind of "parent muxed join"
+        * and these have no K-clocks. For now, we ignore the missing
+        * connection to the corresponding P-clocks, p6_mtu0_clk and
+        * p6_mtu1_clk. Instead timclk is used which is the valid parent.
+        */
+       clk = clk_reg_prcmu_gate("timclk", NULL, PRCMU_TIMCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "mtu0");
+       clk_register_clkdev(clk, NULL, "mtu1");
+
+       clk = clk_reg_prcmu_gate("sdmmcclk", NULL, PRCMU_SDMMCCLK, CLK_IS_ROOT);
+       clk_register_clkdev(clk, NULL, "sdmmc");
+
+
+       clk = clk_reg_prcmu_scalable("dsi_pll", "hdmiclk",
+                               PRCMU_PLLDSI, 0, CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, "dsihs2", "mcde");
+       clk_register_clkdev(clk, "dsihs2", "dsilink.2");
+
+
+       clk = clk_reg_prcmu_scalable("dsi0clk", "dsi_pll",
+                               PRCMU_DSI0CLK, 0, CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, "dsihs0", "mcde");
+       clk_register_clkdev(clk, "dsihs0", "dsilink.0");
+
+       clk = clk_reg_prcmu_scalable("dsi1clk", "dsi_pll",
+                               PRCMU_DSI1CLK, 0, CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, "dsihs1", "mcde");
+       clk_register_clkdev(clk, "dsihs1", "dsilink.1");
+
+       clk = clk_reg_prcmu_scalable("dsi0escclk", "tvclk",
+                               PRCMU_DSI0ESCCLK, 0, CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, "dsilp0", "dsilink.0");
+       clk_register_clkdev(clk, "dsilp0", "mcde");
+
+       clk = clk_reg_prcmu_scalable("dsi1escclk", "tvclk",
+                               PRCMU_DSI1ESCCLK, 0, CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, "dsilp1", "dsilink.1");
+       clk_register_clkdev(clk, "dsilp1", "mcde");
+
+       clk = clk_reg_prcmu_scalable("dsi2escclk", "tvclk",
+                               PRCMU_DSI2ESCCLK, 0, CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, "dsilp2", "dsilink.2");
+       clk_register_clkdev(clk, "dsilp2", "mcde");
+
+       clk = clk_reg_prcmu_rate("smp_twd", NULL, PRCMU_ARMSS,
+                               CLK_IS_ROOT|CLK_GET_RATE_NOCACHE|
+                               CLK_IGNORE_UNUSED);
+       clk_register_clkdev(clk, NULL, "smp_twd");
+
+       /*
+        * FIXME: Add special handled PRCMU clocks here:
+        * 1. clk_arm, use PRCMU_ARMCLK.
+        * 2. clkout0yuv, use PRCMU as parent + need regulator + pinctrl.
+        * 3. ab9540_clkout1yuv, see clkout0yuv
+        */
+
+       /* PRCC P-clocks */
+       clk = clk_reg_prcc_pclk("p1_pclk0", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(0), 0);
+       clk_register_clkdev(clk, "apb_pclk", "uart0");
+
+       clk = clk_reg_prcc_pclk("p1_pclk1", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(1), 0);
+       clk_register_clkdev(clk, "apb_pclk", "uart1");
+
+       clk = clk_reg_prcc_pclk("p1_pclk2", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(2), 0);
+       clk = clk_reg_prcc_pclk("p1_pclk3", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(3), 0);
+       clk = clk_reg_prcc_pclk("p1_pclk4", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(4), 0);
+
+       clk = clk_reg_prcc_pclk("p1_pclk5", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(5), 0);
+       clk_register_clkdev(clk, "apb_pclk", "sdi0");
+
+       clk = clk_reg_prcc_pclk("p1_pclk6", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(6), 0);
+
+       clk = clk_reg_prcc_pclk("p1_pclk7", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(7), 0);
+       clk_register_clkdev(clk, NULL, "spi3");
+
+       clk = clk_reg_prcc_pclk("p1_pclk8", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(8), 0);
+
+       clk = clk_reg_prcc_pclk("p1_pclk9", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(9), 0);
+       clk_register_clkdev(clk, NULL, "gpio.0");
+       clk_register_clkdev(clk, NULL, "gpio.1");
+       clk_register_clkdev(clk, NULL, "gpioblock0");
+
+       clk = clk_reg_prcc_pclk("p1_pclk10", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(10), 0);
+       clk = clk_reg_prcc_pclk("p1_pclk11", "per1clk", U8500_CLKRST1_BASE,
+                               BIT(11), 0);
+
+       clk = clk_reg_prcc_pclk("p2_pclk0", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(0), 0);
+
+       clk = clk_reg_prcc_pclk("p2_pclk1", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(1), 0);
+       clk_register_clkdev(clk, NULL, "spi2");
+
+       clk = clk_reg_prcc_pclk("p2_pclk2", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(2), 0);
+       clk_register_clkdev(clk, NULL, "spi1");
+
+       clk = clk_reg_prcc_pclk("p2_pclk3", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(3), 0);
+       clk_register_clkdev(clk, NULL, "pwl");
+
+       clk = clk_reg_prcc_pclk("p2_pclk4", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(4), 0);
+       clk_register_clkdev(clk, "apb_pclk", "sdi4");
+
+       clk = clk_reg_prcc_pclk("p2_pclk5", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(5), 0);
+
+       clk = clk_reg_prcc_pclk("p2_pclk6", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(6), 0);
+       clk_register_clkdev(clk, "apb_pclk", "sdi1");
+
+
+       clk = clk_reg_prcc_pclk("p2_pclk7", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(7), 0);
+       clk_register_clkdev(clk, "apb_pclk", "sdi3");
+
+       clk = clk_reg_prcc_pclk("p2_pclk8", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(8), 0);
+       clk_register_clkdev(clk, NULL, "spi0");
+
+       clk = clk_reg_prcc_pclk("p2_pclk9", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(9), 0);
+       clk_register_clkdev(clk, "hsir_hclk", "ste_hsi.0");
+
+       clk = clk_reg_prcc_pclk("p2_pclk10", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(10), 0);
+       clk_register_clkdev(clk, "hsit_hclk", "ste_hsi.0");
+
+       clk = clk_reg_prcc_pclk("p2_pclk11", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(11), 0);
+       clk_register_clkdev(clk, NULL, "gpio.6");
+       clk_register_clkdev(clk, NULL, "gpio.7");
+       clk_register_clkdev(clk, NULL, "gpioblock1");
+
+       clk = clk_reg_prcc_pclk("p2_pclk12", "per2clk", U8500_CLKRST2_BASE,
+                               BIT(11), 0);
+
+       clk = clk_reg_prcc_pclk("p3_pclk0", "per3clk", U8500_CLKRST3_BASE,
+                               BIT(0), 0);
+       clk_register_clkdev(clk, NULL, "fsmc");
+
+       clk = clk_reg_prcc_pclk("p3_pclk1", "per3clk", U8500_CLKRST3_BASE,
+                               BIT(1), 0);
+       clk = clk_reg_prcc_pclk("p3_pclk2", "per3clk", U8500_CLKRST3_BASE,
+                               BIT(2), 0);
+       clk = clk_reg_prcc_pclk("p3_pclk3", "per3clk", U8500_CLKRST3_BASE,
+                               BIT(3), 0);
+
+       clk = clk_reg_prcc_pclk("p3_pclk4", "per3clk", U8500_CLKRST3_BASE,
+                               BIT(4), 0);
+       clk_register_clkdev(clk, "apb_pclk", "sdi2");
+
+       clk = clk_reg_prcc_pclk("p3_pclk5", "per3clk", U8500_CLKRST3_BASE,
+                               BIT(5), 0);
+
+       clk = clk_reg_prcc_pclk("p3_pclk6", "per3clk", U8500_CLKRST3_BASE,
+                               BIT(6), 0);
+       clk_register_clkdev(clk, "apb_pclk", "uart2");
+
+       clk = clk_reg_prcc_pclk("p3_pclk7", "per3clk", U8500_CLKRST3_BASE,
+                               BIT(7), 0);
+       clk_register_clkdev(clk, "apb_pclk", "sdi5");
+
+       clk = clk_reg_prcc_pclk("p3_pclk8", "per3clk", U8500_CLKRST3_BASE,
+                               BIT(8), 0);
+       clk_register_clkdev(clk, NULL, "gpio.2");
+       clk_register_clkdev(clk, NULL, "gpio.3");
+       clk_register_clkdev(clk, NULL, "gpio.4");
+       clk_register_clkdev(clk, NULL, "gpio.5");
+       clk_register_clkdev(clk, NULL, "gpioblock2");
+
+       clk = clk_reg_prcc_pclk("p5_pclk0", "per5clk", U8500_CLKRST5_BASE,
+                               BIT(0), 0);
+       clk_register_clkdev(clk, "usb", "musb-ux500.0");
+
+       clk = clk_reg_prcc_pclk("p5_pclk1", "per5clk", U8500_CLKRST5_BASE,
+                               BIT(1), 0);
+       clk_register_clkdev(clk, NULL, "gpio.8");
+       clk_register_clkdev(clk, NULL, "gpioblock3");
+
+       clk = clk_reg_prcc_pclk("p6_pclk0", "per6clk", U8500_CLKRST6_BASE,
+                               BIT(0), 0);
+
+       clk = clk_reg_prcc_pclk("p6_pclk1", "per6clk", U8500_CLKRST6_BASE,
+                               BIT(1), 0);
+       clk_register_clkdev(clk, NULL, "cryp0");
+       clk_register_clkdev(clk, NULL, "cryp1");
+
+       clk = clk_reg_prcc_pclk("p6_pclk2", "per6clk", U8500_CLKRST6_BASE,
+                               BIT(2), 0);
+       clk_register_clkdev(clk, NULL, "hash0");
+
+       clk = clk_reg_prcc_pclk("p6_pclk3", "per6clk", U8500_CLKRST6_BASE,
+                               BIT(3), 0);
+       clk_register_clkdev(clk, NULL, "pka");
+
+       clk = clk_reg_prcc_pclk("p6_pclk4", "per6clk", U8500_CLKRST6_BASE,
+                               BIT(4), 0);
+       clk_register_clkdev(clk, NULL, "hash1");
+
+       clk = clk_reg_prcc_pclk("p6_pclk5", "per6clk", U8500_CLKRST6_BASE,
+                               BIT(5), 0);
+       clk_register_clkdev(clk, NULL, "cfgreg");
+
+       clk = clk_reg_prcc_pclk("p6_pclk6", "per6clk", U8500_CLKRST6_BASE,
+                               BIT(6), 0);
+       clk = clk_reg_prcc_pclk("p6_pclk7", "per6clk", U8500_CLKRST6_BASE,
+                               BIT(7), 0);
+
+       /* PRCC K-clocks
+        *
+        * FIXME: Some drivers requires PERPIH[n| to be automatically enabled
+        * by enabling just the K-clock, even if it is not a valid parent to
+        * the K-clock. Until drivers get fixed we might need some kind of
+        * "parent muxed join".
+        */
+
+       /* Periph1 */
+       clk = clk_reg_prcc_kclk("p1_uart0_kclk", "uartclk",
+                       U8500_CLKRST1_BASE, BIT(0), CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "uart0");
+
+       clk = clk_reg_prcc_kclk("p1_uart1_kclk", "uartclk",
+                       U8500_CLKRST1_BASE, BIT(1), CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "uart1");
+
+       clk = clk_reg_prcc_kclk("p1_i2c1_kclk", "i2cclk",
+                       U8500_CLKRST1_BASE, BIT(2), CLK_SET_RATE_GATE);
+       clk = clk_reg_prcc_kclk("p1_msp0_kclk", "msp02clk",
+                       U8500_CLKRST1_BASE, BIT(3), CLK_SET_RATE_GATE);
+       clk = clk_reg_prcc_kclk("p1_msp1_kclk", "msp1clk",
+                       U8500_CLKRST1_BASE, BIT(4), CLK_SET_RATE_GATE);
+
+       clk = clk_reg_prcc_kclk("p1_sdi0_kclk", "sdmmcclk",
+                       U8500_CLKRST1_BASE, BIT(5), CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "sdi0");
+
+       clk = clk_reg_prcc_kclk("p1_i2c2_kclk", "i2cclk",
+                       U8500_CLKRST1_BASE, BIT(6), CLK_SET_RATE_GATE);
+       clk = clk_reg_prcc_kclk("p1_slimbus0_kclk", "slimclk",
+                       U8500_CLKRST1_BASE, BIT(3), CLK_SET_RATE_GATE);
+       /* FIXME: Redefinition of BIT(3). */
+       clk = clk_reg_prcc_kclk("p1_i2c4_kclk", "i2cclk",
+                       U8500_CLKRST1_BASE, BIT(9), CLK_SET_RATE_GATE);
+       clk = clk_reg_prcc_kclk("p1_msp3_kclk", "msp1clk",
+                       U8500_CLKRST1_BASE, BIT(10), CLK_SET_RATE_GATE);
+
+       /* Periph2 */
+       clk = clk_reg_prcc_kclk("p2_i2c3_kclk", "i2cclk",
+                       U8500_CLKRST2_BASE, BIT(0), CLK_SET_RATE_GATE);
+
+       clk = clk_reg_prcc_kclk("p2_sdi4_kclk", "sdmmcclk",
+                       U8500_CLKRST2_BASE, BIT(2), CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "sdi4");
+
+       clk = clk_reg_prcc_kclk("p2_msp2_kclk", "msp02clk",
+                       U8500_CLKRST2_BASE, BIT(3), CLK_SET_RATE_GATE);
+
+       clk = clk_reg_prcc_kclk("p2_sdi1_kclk", "sdmmcclk",
+                       U8500_CLKRST2_BASE, BIT(4), CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "sdi1");
+
+       clk = clk_reg_prcc_kclk("p2_sdi3_kclk", "sdmmcclk",
+                       U8500_CLKRST2_BASE, BIT(5), CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "sdi3");
+
+       /* Note that rate is received from parent. */
+       clk = clk_reg_prcc_kclk("p2_ssirx_kclk", "hsirxclk",
+                       U8500_CLKRST2_BASE, BIT(6),
+                       CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT);
+       clk = clk_reg_prcc_kclk("p2_ssitx_kclk", "hsitxclk",
+                       U8500_CLKRST2_BASE, BIT(7),
+                       CLK_SET_RATE_GATE|CLK_SET_RATE_PARENT);
+
+       /* Periph3 */
+       clk = clk_reg_prcc_kclk("p3_ssp0_kclk", "sspclk",
+                       U8500_CLKRST3_BASE, BIT(1), CLK_SET_RATE_GATE);
+       clk = clk_reg_prcc_kclk("p3_ssp1_kclk", "sspclk",
+                       U8500_CLKRST3_BASE, BIT(2), CLK_SET_RATE_GATE);
+       clk = clk_reg_prcc_kclk("p3_i2c0_kclk", "i2cclk",
+                       U8500_CLKRST3_BASE, BIT(3), CLK_SET_RATE_GATE);
+
+       clk = clk_reg_prcc_kclk("p3_sdi2_kclk", "sdmmcclk",
+                       U8500_CLKRST3_BASE, BIT(4), CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "sdi2");
+
+       clk = clk_reg_prcc_kclk("p3_ske_kclk", "rtc32k",
+                       U8500_CLKRST3_BASE, BIT(5), CLK_SET_RATE_GATE);
+
+       clk = clk_reg_prcc_kclk("p3_uart2_kclk", "uartclk",
+                       U8500_CLKRST3_BASE, BIT(6), CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "uart2");
+
+       clk = clk_reg_prcc_kclk("p3_sdi5_kclk", "sdmmcclk",
+                       U8500_CLKRST3_BASE, BIT(7), CLK_SET_RATE_GATE);
+       clk_register_clkdev(clk, NULL, "sdi5");
+
+       /* Periph6 */
+       clk = clk_reg_prcc_kclk("p3_rng_kclk", "rngclk",
+                       U8500_CLKRST6_BASE, BIT(0), CLK_SET_RATE_GATE);
+
+}
diff --git a/drivers/clk/ux500/u8540_clk.c b/drivers/clk/ux500/u8540_clk.c
new file mode 100644 (file)
index 0000000..10adfd2
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Clock definitions for u8540 platform.
+ *
+ * Copyright (C) 2012 ST-Ericsson SA
+ * Author: Ulf Hansson <ulf.hansson@linaro.org>
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/clk-provider.h>
+#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/platform_data/clk-ux500.h>
+
+#include "clk.h"
+
+void u8540_clk_init(void)
+{
+       /* register clocks here */
+}
diff --git a/drivers/clk/ux500/u9540_clk.c b/drivers/clk/ux500/u9540_clk.c
new file mode 100644 (file)
index 0000000..dbc0191
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Clock definitions for u9540 platform.
+ *
+ * Copyright (C) 2012 ST-Ericsson SA
+ * Author: Ulf Hansson <ulf.hansson@linaro.org>
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/clk-provider.h>
+#include <linux/mfd/dbx500-prcmu.h>
+#include <linux/platform_data/clk-ux500.h>
+
+#include "clk.h"
+
+void u9540_clk_init(void)
+{
+       /* register clocks here */
+}
index 50cf6a2..c0a0f64 100644 (file)
@@ -1,3 +1,4 @@
 # Makefile for Versatile-specific clocks
 obj-$(CONFIG_ICST)             += clk-icst.o
 obj-$(CONFIG_ARCH_INTEGRATOR)  += clk-integrator.o
+obj-$(CONFIG_ARCH_REALVIEW)    += clk-realview.o
diff --git a/drivers/clk/versatile/clk-realview.c b/drivers/clk/versatile/clk-realview.c
new file mode 100644 (file)
index 0000000..e21a99c
--- /dev/null
@@ -0,0 +1,114 @@
+#include <linux/clk.h>
+#include <linux/clkdev.h>
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/clk-provider.h>
+
+#include <mach/hardware.h>
+#include <mach/platform.h>
+
+#include "clk-icst.h"
+
+/*
+ * Implementation of the ARM RealView clock trees.
+ */
+
+static void __iomem *sys_lock;
+static void __iomem *sys_vcoreg;
+
+/**
+ * realview_oscvco_get() - get ICST OSC settings for the RealView
+ */
+static struct icst_vco realview_oscvco_get(void)
+{
+       u32 val;
+       struct icst_vco vco;
+
+       val = readl(sys_vcoreg);
+       vco.v = val & 0x1ff;
+       vco.r = (val >> 9) & 0x7f;
+       vco.s = (val >> 16) & 03;
+       return vco;
+}
+
+static void realview_oscvco_set(struct icst_vco vco)
+{
+       u32 val;
+
+       val = readl(sys_vcoreg) & ~0x7ffff;
+       val |= vco.v | (vco.r << 9) | (vco.s << 16);
+
+       /* This magic unlocks the CM VCO so it can be controlled */
+       writel(0xa05f, sys_lock);
+       writel(val, sys_vcoreg);
+       /* This locks the CM again */
+       writel(0, sys_lock);
+}
+
+static const struct icst_params realview_oscvco_params = {
+       .ref            = 24000000,
+       .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 __initdata realview_icst_desc = {
+       .params = &realview_oscvco_params,
+       .getvco = realview_oscvco_get,
+       .setvco = realview_oscvco_set,
+};
+
+/*
+ * realview_clk_init() - set up the RealView clock tree
+ */
+void __init realview_clk_init(void __iomem *sysbase, bool is_pb1176)
+{
+       struct clk *clk;
+
+       sys_lock = sysbase + REALVIEW_SYS_LOCK_OFFSET;
+       if (is_pb1176)
+               sys_vcoreg = sysbase + REALVIEW_SYS_OSC0_OFFSET;
+       else
+               sys_vcoreg = sysbase + REALVIEW_SYS_OSC4_OFFSET;
+
+
+       /* APB clock dummy */
+       clk = clk_register_fixed_rate(NULL, "apb_pclk", NULL, CLK_IS_ROOT, 0);
+       clk_register_clkdev(clk, "apb_pclk", NULL);
+
+       /* 24 MHz clock */
+       clk = clk_register_fixed_rate(NULL, "clk24mhz", NULL, CLK_IS_ROOT,
+                               24000000);
+       clk_register_clkdev(clk, NULL, "dev:uart0");
+       clk_register_clkdev(clk, NULL, "dev:uart1");
+       clk_register_clkdev(clk, NULL, "dev:uart2");
+       clk_register_clkdev(clk, NULL, "fpga:kmi0");
+       clk_register_clkdev(clk, NULL, "fpga:kmi1");
+       clk_register_clkdev(clk, NULL, "fpga:mmc0");
+       clk_register_clkdev(clk, NULL, "dev:ssp0");
+       if (is_pb1176) {
+               /*
+                * UART3 is on the dev chip in PB1176
+                * UART4 only exists in PB1176
+                */
+               clk_register_clkdev(clk, NULL, "dev:uart3");
+               clk_register_clkdev(clk, NULL, "dev:uart4");
+       } else
+               clk_register_clkdev(clk, NULL, "fpga:uart3");
+
+
+       /* 1 MHz clock */
+       clk = clk_register_fixed_rate(NULL, "clk1mhz", NULL, CLK_IS_ROOT,
+                                     1000000);
+       clk_register_clkdev(clk, NULL, "sp804");
+
+       /* ICST VCO clock */
+       clk = icst_clk_register(NULL, &realview_icst_desc);
+       clk_register_clkdev(clk, NULL, "dev:clcd");
+       clk_register_clkdev(clk, NULL, "issp:clcd");
+}
index b65d0c5..d496a55 100644 (file)
@@ -13,3 +13,4 @@ obj-$(CONFIG_DW_APB_TIMER)    += dw_apb_timer.o
 obj-$(CONFIG_DW_APB_TIMER_OF)  += dw_apb_timer_of.o
 obj-$(CONFIG_CLKSRC_DBX500_PRCMU)      += clksrc-dbx500-prcmu.o
 obj-$(CONFIG_ARMADA_370_XP_TIMER)      += time-armada-370-xp.o
+obj-$(CONFIG_ARCH_BCM2835)     += bcm2835_timer.o
diff --git a/drivers/clocksource/bcm2835_timer.c b/drivers/clocksource/bcm2835_timer.c
new file mode 100644 (file)
index 0000000..bc19f12
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2012 Simon Arlott
+ *
+ * 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/bcm2835_timer.h>
+#include <linux/bitops.h>
+#include <linux/clockchips.h>
+#include <linux/clocksource.h>
+#include <linux/interrupt.h>
+#include <linux/irqreturn.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+
+#include <asm/sched_clock.h>
+#include <asm/irq.h>
+
+#define REG_CONTROL    0x00
+#define REG_COUNTER_LO 0x04
+#define REG_COUNTER_HI 0x08
+#define REG_COMPARE(n) (0x0c + (n) * 4)
+#define MAX_TIMER      3
+#define DEFAULT_TIMER  3
+
+struct bcm2835_timer {
+       void __iomem *control;
+       void __iomem *compare;
+       int match_mask;
+       struct clock_event_device evt;
+       struct irqaction act;
+};
+
+static void __iomem *system_clock __read_mostly;
+
+static u32 notrace bcm2835_sched_read(void)
+{
+       return readl_relaxed(system_clock);
+}
+
+static void bcm2835_time_set_mode(enum clock_event_mode mode,
+       struct clock_event_device *evt_dev)
+{
+       switch (mode) {
+       case CLOCK_EVT_MODE_ONESHOT:
+       case CLOCK_EVT_MODE_UNUSED:
+       case CLOCK_EVT_MODE_SHUTDOWN:
+       case CLOCK_EVT_MODE_RESUME:
+               break;
+       default:
+               WARN(1, "%s: unhandled event mode %d\n", __func__, mode);
+               break;
+       }
+}
+
+static int bcm2835_time_set_next_event(unsigned long event,
+       struct clock_event_device *evt_dev)
+{
+       struct bcm2835_timer *timer = container_of(evt_dev,
+               struct bcm2835_timer, evt);
+       writel_relaxed(readl_relaxed(system_clock) + event,
+               timer->compare);
+       return 0;
+}
+
+static irqreturn_t bcm2835_time_interrupt(int irq, void *dev_id)
+{
+       struct bcm2835_timer *timer = dev_id;
+       void (*event_handler)(struct clock_event_device *);
+       if (readl_relaxed(timer->control) & timer->match_mask) {
+               writel_relaxed(timer->match_mask, timer->control);
+
+               event_handler = ACCESS_ONCE(timer->evt.event_handler);
+               if (event_handler)
+                       event_handler(&timer->evt);
+               return IRQ_HANDLED;
+       } else {
+               return IRQ_NONE;
+       }
+}
+
+static struct of_device_id bcm2835_time_match[] __initconst = {
+       { .compatible = "brcm,bcm2835-system-timer" },
+       {}
+};
+
+static void __init bcm2835_time_init(void)
+{
+       struct device_node *node;
+       void __iomem *base;
+       u32 freq;
+       int irq;
+       struct bcm2835_timer *timer;
+
+       node = of_find_matching_node(NULL, bcm2835_time_match);
+       if (!node)
+               panic("No bcm2835 timer node");
+
+       base = of_iomap(node, 0);
+       if (!base)
+               panic("Can't remap registers");
+
+       if (of_property_read_u32(node, "clock-frequency", &freq))
+               panic("Can't read clock-frequency");
+
+       system_clock = base + REG_COUNTER_LO;
+       setup_sched_clock(bcm2835_sched_read, 32, freq);
+
+       clocksource_mmio_init(base + REG_COUNTER_LO, node->name,
+               freq, 300, 32, clocksource_mmio_readl_up);
+
+       irq = irq_of_parse_and_map(node, DEFAULT_TIMER);
+       if (irq <= 0)
+               panic("Can't parse IRQ");
+
+       timer = kzalloc(sizeof(*timer), GFP_KERNEL);
+       if (!timer)
+               panic("Can't allocate timer struct\n");
+
+       timer->control = base + REG_CONTROL;
+       timer->compare = base + REG_COMPARE(DEFAULT_TIMER);
+       timer->match_mask = BIT(DEFAULT_TIMER);
+       timer->evt.name = node->name;
+       timer->evt.rating = 300;
+       timer->evt.features = CLOCK_EVT_FEAT_ONESHOT;
+       timer->evt.set_mode = bcm2835_time_set_mode;
+       timer->evt.set_next_event = bcm2835_time_set_next_event;
+       timer->evt.cpumask = cpumask_of(0);
+       timer->act.name = node->name;
+       timer->act.flags = IRQF_TIMER | IRQF_SHARED;
+       timer->act.dev_id = timer;
+       timer->act.handler = bcm2835_time_interrupt;
+
+       if (setup_irq(irq, &timer->act))
+               panic("Can't set up timer IRQ\n");
+
+       clockevents_config_and_register(&timer->evt, freq, 0xf, 0xffffffff);
+
+       pr_info("bcm2835: system timer (irq = %d)\n", irq);
+}
+
+struct sys_timer bcm2835_timer = {
+       .init = bcm2835_time_init,
+};
index 0028881..d216cd3 100644 (file)
@@ -120,3 +120,4 @@ u32 gen_split_key(struct device *jrdev, u8 *key_out, int split_key_len,
 
        return ret;
 }
+EXPORT_SYMBOL(gen_split_key);
index ae05618..2e16627 100644 (file)
@@ -18,6 +18,8 @@
 #include <linux/spinlock.h>
 
 #include "virt-dma.h"
+
+#include <plat/cpu.h>
 #include <plat/dma.h>
 
 struct omap_dmadev {
index 920a609..38f9e52 100644 (file)
@@ -669,13 +669,18 @@ static int __devinit max77693_muic_probe(struct platform_device *pdev)
        }
        info->dev = &pdev->dev;
        info->max77693 = max77693;
-       info->max77693->regmap_muic = regmap_init_i2c(info->max77693->muic,
-                                        &max77693_muic_regmap_config);
-       if (IS_ERR(info->max77693->regmap_muic)) {
-               ret = PTR_ERR(info->max77693->regmap_muic);
-               dev_err(max77693->dev,
-                       "failed to allocate register map: %d\n", ret);
-               goto err_regmap;
+       if (info->max77693->regmap_muic)
+               dev_dbg(&pdev->dev, "allocate register map\n");
+       else {
+               info->max77693->regmap_muic = devm_regmap_init_i2c(
+                                               info->max77693->muic,
+                                               &max77693_muic_regmap_config);
+               if (IS_ERR(info->max77693->regmap_muic)) {
+                       ret = PTR_ERR(info->max77693->regmap_muic);
+                       dev_err(max77693->dev,
+                               "failed to allocate register map: %d\n", ret);
+                       goto err_regmap;
+               }
        }
        platform_set_drvdata(pdev, info);
        mutex_init(&info->mutex);
index b16c8a7..ba7926f 100644 (file)
@@ -294,7 +294,7 @@ config GPIO_MAX732X_IRQ
 
 config GPIO_MC9S08DZ60
        bool "MX35 3DS BOARD MC9S08DZ60 GPIO functions"
-       depends on I2C && MACH_MX35_3DS
+       depends on I2C=y && MACH_MX35_3DS
        help
          Select this to enable the MC9S08DZ60 GPIO driver
 
index ae37181..ec48ed5 100644 (file)
@@ -247,9 +247,9 @@ static int __devinit em_gio_irq_domain_init(struct em_gio_priv *p)
 
        p->irq_base = irq_alloc_descs(pdata->irq_base, 0,
                                      pdata->number_of_pins, numa_node_id());
-       if (IS_ERR_VALUE(p->irq_base)) {
+       if (p->irq_base < 0) {
                dev_err(&pdev->dev, "cannot get irq_desc\n");
-               return -ENXIO;
+               return p->irq_base;
        }
        pr_debug("gio: hw base = %d, nr = %d, sw base = %d\n",
                 pdata->gpio_base, pdata->number_of_pins, p->irq_base);
index e6efd77..64fbce3 100644 (file)
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/irqdomain.h>
+#include <linux/gpio.h>
+#include <linux/platform_data/gpio-omap.h>
 
-#include <mach/hardware.h>
-#include <asm/irq.h>
-#include <mach/irqs.h>
-#include <asm/gpio.h>
 #include <asm/mach/irq.h>
 
 #define OFF_MODE       1
@@ -385,13 +383,16 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio,
 static int gpio_irq_type(struct irq_data *d, unsigned type)
 {
        struct gpio_bank *bank = irq_data_get_irq_chip_data(d);
-       unsigned gpio;
+       unsigned gpio = 0;
        int retval;
        unsigned long flags;
 
-       if (!cpu_class_is_omap2() && d->irq > IH_MPUIO_BASE)
+#ifdef CONFIG_ARCH_OMAP1
+       if (d->irq > IH_MPUIO_BASE)
                gpio = OMAP_MPUIO(d->irq - IH_MPUIO_BASE);
-       else
+#endif
+
+       if (!gpio)
                gpio = irq_to_gpio(bank, d->irq);
 
        if (type & ~IRQ_TYPE_SENSE_MASK)
index 9cac88a..9528779 100644 (file)
@@ -26,6 +26,8 @@
 #include <linux/syscore_ops.h>
 #include <linux/slab.h>
 
+#include <asm/mach/irq.h>
+
 #include <mach/irqs.h>
 
 /*
@@ -59,6 +61,7 @@
 #define BANK_OFF(n)    (((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2))
 
 int pxa_last_gpio;
+static int irq_base;
 
 #ifdef CONFIG_OF
 static struct irq_domain *domain;
@@ -167,63 +170,14 @@ static inline int __gpio_is_occupied(unsigned gpio)
        return ret;
 }
 
-#ifdef CONFIG_ARCH_PXA
-static inline int __pxa_gpio_to_irq(int gpio)
-{
-       if (gpio_is_pxa_type(gpio_type))
-               return PXA_GPIO_TO_IRQ(gpio);
-       return -1;
-}
-
-static inline int __pxa_irq_to_gpio(int irq)
-{
-       if (gpio_is_pxa_type(gpio_type))
-               return irq - PXA_GPIO_TO_IRQ(0);
-       return -1;
-}
-#else
-static inline int __pxa_gpio_to_irq(int gpio) { return -1; }
-static inline int __pxa_irq_to_gpio(int irq) { return -1; }
-#endif
-
-#ifdef CONFIG_ARCH_MMP
-static inline int __mmp_gpio_to_irq(int gpio)
-{
-       if (gpio_is_mmp_type(gpio_type))
-               return MMP_GPIO_TO_IRQ(gpio);
-       return -1;
-}
-
-static inline int __mmp_irq_to_gpio(int irq)
-{
-       if (gpio_is_mmp_type(gpio_type))
-               return irq - MMP_GPIO_TO_IRQ(0);
-       return -1;
-}
-#else
-static inline int __mmp_gpio_to_irq(int gpio) { return -1; }
-static inline int __mmp_irq_to_gpio(int irq) { return -1; }
-#endif
-
 static int pxa_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
 {
-       int gpio, ret;
-
-       gpio = chip->base + offset;
-       ret = __pxa_gpio_to_irq(gpio);
-       if (ret >= 0)
-               return ret;
-       return __mmp_gpio_to_irq(gpio);
+       return chip->base + offset + irq_base;
 }
 
 int pxa_irq_to_gpio(int irq)
 {
-       int ret;
-
-       ret = __pxa_irq_to_gpio(irq);
-       if (ret >= 0)
-               return ret;
-       return __mmp_irq_to_gpio(irq);
+       return irq - irq_base;
 }
 
 static int pxa_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
@@ -403,6 +357,9 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc)
        struct pxa_gpio_chip *c;
        int loop, gpio, gpio_base, n;
        unsigned long gedr;
+       struct irq_chip *chip = irq_desc_get_chip(desc);
+
+       chained_irq_enter(chip, desc);
 
        do {
                loop = 0;
@@ -422,6 +379,8 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc)
                        }
                }
        } while (loop);
+
+       chained_irq_exit(chip, desc);
 }
 
 static void pxa_ack_muxed_gpio(struct irq_data *d)
@@ -535,7 +494,7 @@ const struct irq_domain_ops pxa_irq_domain_ops = {
 
 static int __devinit pxa_gpio_probe_dt(struct platform_device *pdev)
 {
-       int ret, nr_banks, nr_gpios, irq_base;
+       int ret, nr_banks, nr_gpios;
        struct device_node *prev, *next, *np = pdev->dev.of_node;
        const struct of_device_id *of_id =
                                of_match_device(pxa_gpio_dt_ids, &pdev->dev);
@@ -590,10 +549,20 @@ static int __devinit pxa_gpio_probe(struct platform_device *pdev)
        int irq0 = 0, irq1 = 0, irq_mux, gpio_offset = 0;
 
        ret = pxa_gpio_probe_dt(pdev);
-       if (ret < 0)
+       if (ret < 0) {
                pxa_last_gpio = pxa_gpio_nums();
-       else
+#ifdef CONFIG_ARCH_PXA
+               if (gpio_is_pxa_type(gpio_type))
+                       irq_base = PXA_GPIO_TO_IRQ(0);
+#endif
+#ifdef CONFIG_ARCH_MMP
+               if (gpio_is_mmp_type(gpio_type))
+                       irq_base = MMP_GPIO_TO_IRQ(0);
+#endif
+       } else {
                use_of = 1;
+       }
+
        if (!pxa_last_gpio)
                return -EINVAL;
 
index e97016a..b62d443 100644 (file)
@@ -170,6 +170,7 @@ static int __devinit rdc321x_gpio_probe(struct platform_device *pdev)
        rdc321x_gpio_dev->reg2_data_base = r->start + 0x4;
 
        rdc321x_gpio_dev->chip.label = "rdc321x-gpio";
+       rdc321x_gpio_dev->chip.owner = THIS_MODULE;
        rdc321x_gpio_dev->chip.direction_input = rdc_gpio_direction_input;
        rdc321x_gpio_dev->chip.direction_output = rdc_gpio_config;
        rdc321x_gpio_dev->chip.get = rdc_gpio_get_value;
index ba126cc..8af4b06 100644 (file)
@@ -938,6 +938,67 @@ static void __init samsung_gpiolib_add(struct samsung_gpio_chip *chip)
                s3c_gpiolib_track(chip);
 }
 
+#if defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF)
+static int s3c24xx_gpio_xlate(struct gpio_chip *gc,
+                       const struct of_phandle_args *gpiospec, u32 *flags)
+{
+       unsigned int pin;
+
+       if (WARN_ON(gc->of_gpio_n_cells < 3))
+               return -EINVAL;
+
+       if (WARN_ON(gpiospec->args_count < gc->of_gpio_n_cells))
+               return -EINVAL;
+
+       if (gpiospec->args[0] > gc->ngpio)
+               return -EINVAL;
+
+       pin = gc->base + gpiospec->args[0];
+
+       if (s3c_gpio_cfgpin(pin, S3C_GPIO_SFN(gpiospec->args[1])))
+               pr_warn("gpio_xlate: failed to set pin function\n");
+       if (s3c_gpio_setpull(pin, gpiospec->args[2] & 0xffff))
+               pr_warn("gpio_xlate: failed to set pin pull up/down\n");
+
+       if (flags)
+               *flags = gpiospec->args[2] >> 16;
+
+       return gpiospec->args[0];
+}
+
+static const struct of_device_id s3c24xx_gpio_dt_match[] __initdata = {
+       { .compatible = "samsung,s3c24xx-gpio", },
+       {}
+};
+
+static __init void s3c24xx_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip,
+                                                u64 base, u64 offset)
+{
+       struct gpio_chip *gc =  &chip->chip;
+       u64 address;
+
+       if (!of_have_populated_dt())
+               return;
+
+       address = chip->base ? base + ((u32)chip->base & 0xfff) : base + offset;
+       gc->of_node = of_find_matching_node_by_address(NULL,
+                       s3c24xx_gpio_dt_match, address);
+       if (!gc->of_node) {
+               pr_info("gpio: device tree node not found for gpio controller"
+                       " with base address %08llx\n", address);
+               return;
+       }
+       gc->of_gpio_n_cells = 3;
+       gc->of_xlate = s3c24xx_gpio_xlate;
+}
+#else
+static __init void s3c24xx_gpiolib_attach_ofnode(struct samsung_gpio_chip *chip,
+                                                u64 base, u64 offset)
+{
+       return;
+}
+#endif /* defined(CONFIG_PLAT_S3C24XX) && defined(CONFIG_OF) */
+
 static void __init s3c24xx_gpiolib_add_chips(struct samsung_gpio_chip *chip,
                                             int nr_chips, void __iomem *base)
 {
@@ -962,6 +1023,8 @@ static void __init s3c24xx_gpiolib_add_chips(struct samsung_gpio_chip *chip,
                        gc->direction_output = samsung_gpiolib_2bit_output;
 
                samsung_gpiolib_add(chip);
+
+               s3c24xx_gpiolib_attach_ofnode(chip, S3C24XX_PA_GPIO, i * 0x10);
        }
 }
 
@@ -3131,46 +3194,6 @@ samsung_gpio_pull_t s3c_gpio_getpull(unsigned int pin)
 }
 EXPORT_SYMBOL(s3c_gpio_getpull);
 
-/* gpiolib wrappers until these are totally eliminated */
-
-void s3c2410_gpio_pullup(unsigned int pin, unsigned int to)
-{
-       int ret;
-
-       WARN_ON(to);    /* should be none of these left */
-
-       if (!to) {
-               /* if pull is enabled, try first with up, and if that
-                * fails, try using down */
-
-               ret = s3c_gpio_setpull(pin, S3C_GPIO_PULL_UP);
-               if (ret)
-                       s3c_gpio_setpull(pin, S3C_GPIO_PULL_DOWN);
-       } else {
-               s3c_gpio_setpull(pin, S3C_GPIO_PULL_NONE);
-       }
-}
-EXPORT_SYMBOL(s3c2410_gpio_pullup);
-
-void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
-{
-       /* do this via gpiolib until all users removed */
-
-       gpio_request(pin, "temporary");
-       gpio_set_value(pin, to);
-       gpio_free(pin);
-}
-EXPORT_SYMBOL(s3c2410_gpio_setpin);
-
-unsigned int s3c2410_gpio_getpin(unsigned int pin)
-{
-       struct samsung_gpio_chip *chip = samsung_gpiolib_getchip(pin);
-       unsigned long offs = pin - chip->chip.base;
-
-       return __raw_readl(chip->base + 0x04) & (1 << offs);
-}
-EXPORT_SYMBOL(s3c2410_gpio_getpin);
-
 #ifdef CONFIG_S5P_GPIO_DRVSTR
 s5p_gpio_drvstr_t s5p_gpio_get_drvstr(unsigned int pin)
 {
index dc5184d..d982593 100644 (file)
@@ -30,9 +30,6 @@
 
 #include <asm/mach/irq.h>
 
-#include <mach/iomap.h>
-#include <mach/suspend.h>
-
 #define GPIO_BANK(x)           ((x) >> 5)
 #define GPIO_PORT(x)           (((x) >> 3) & 0x3)
 #define GPIO_BIT(x)            ((x) & 0x7)
index 94256fe..c5f8ca2 100644 (file)
@@ -51,6 +51,7 @@
 
 
 static struct gpio_chip twl_gpiochip;
+static int twl4030_gpio_base;
 static int twl4030_gpio_irq_base;
 
 /* genirq interfaces are not available to modules */
@@ -395,6 +396,29 @@ static int __devinit gpio_twl4030_debounce(u32 debounce, u8 mmc_cd)
 
 static int gpio_twl4030_remove(struct platform_device *pdev);
 
+static struct twl4030_gpio_platform_data *of_gpio_twl4030(struct device *dev)
+{
+       struct twl4030_gpio_platform_data *omap_twl_info;
+
+       omap_twl_info = devm_kzalloc(dev, sizeof(*omap_twl_info), GFP_KERNEL);
+       if (!omap_twl_info)
+               return NULL;
+
+       omap_twl_info->use_leds = of_property_read_bool(dev->of_node,
+                       "ti,use-leds");
+
+       of_property_read_u32(dev->of_node, "ti,debounce",
+                            &omap_twl_info->debounce);
+       of_property_read_u32(dev->of_node, "ti,mmc-cd",
+                            (u32 *)&omap_twl_info->mmc_cd);
+       of_property_read_u32(dev->of_node, "ti,pullups",
+                            &omap_twl_info->pullups);
+       of_property_read_u32(dev->of_node, "ti,pulldowns",
+                            &omap_twl_info->pulldowns);
+
+       return omap_twl_info;
+}
+
 static int __devinit gpio_twl4030_probe(struct platform_device *pdev)
 {
        struct twl4030_gpio_platform_data *pdata = pdev->dev.platform_data;
@@ -427,49 +451,57 @@ no_irqs:
        twl_gpiochip.ngpio = TWL4030_GPIO_MAX;
        twl_gpiochip.dev = &pdev->dev;
 
-       if (pdata) {
-               twl_gpiochip.base = pdata->gpio_base;
+       if (node)
+               pdata = of_gpio_twl4030(&pdev->dev);
 
-               /*
-                * NOTE:  boards may waste power if they don't set pullups
-                * and pulldowns correctly ... default for non-ULPI pins is
-                * pulldown, and some other pins may have external pullups
-                * or pulldowns.  Careful!
-                */
-               ret = gpio_twl4030_pulls(pdata->pullups, pdata->pulldowns);
-               if (ret)
-                       dev_dbg(&pdev->dev, "pullups %.05x %.05x --> %d\n",
-                                       pdata->pullups, pdata->pulldowns,
-                                       ret);
-
-               ret = gpio_twl4030_debounce(pdata->debounce, pdata->mmc_cd);
-               if (ret)
-                       dev_dbg(&pdev->dev, "debounce %.03x %.01x --> %d\n",
-                                       pdata->debounce, pdata->mmc_cd,
-                                       ret);
-
-               /*
-                * NOTE: we assume VIBRA_CTL.VIBRA_EN, in MODULE_AUDIO_VOICE,
-                * is (still) clear if use_leds is set.
-                */
-               if (pdata->use_leds)
-                       twl_gpiochip.ngpio += 2;
+       if (pdata == NULL) {
+               dev_err(&pdev->dev, "Platform data is missing\n");
+               return -ENXIO;
        }
 
+       /*
+        * NOTE:  boards may waste power if they don't set pullups
+        * and pulldowns correctly ... default for non-ULPI pins is
+        * pulldown, and some other pins may have external pullups
+        * or pulldowns.  Careful!
+        */
+       ret = gpio_twl4030_pulls(pdata->pullups, pdata->pulldowns);
+       if (ret)
+               dev_dbg(&pdev->dev, "pullups %.05x %.05x --> %d\n",
+                       pdata->pullups, pdata->pulldowns, ret);
+
+       ret = gpio_twl4030_debounce(pdata->debounce, pdata->mmc_cd);
+       if (ret)
+               dev_dbg(&pdev->dev, "debounce %.03x %.01x --> %d\n",
+                       pdata->debounce, pdata->mmc_cd, ret);
+
+       /*
+        * NOTE: we assume VIBRA_CTL.VIBRA_EN, in MODULE_AUDIO_VOICE,
+        * is (still) clear if use_leds is set.
+        */
+       if (pdata->use_leds)
+               twl_gpiochip.ngpio += 2;
+
        ret = gpiochip_add(&twl_gpiochip);
        if (ret < 0) {
                dev_err(&pdev->dev, "could not register gpiochip, %d\n", ret);
                twl_gpiochip.ngpio = 0;
                gpio_twl4030_remove(pdev);
-       } else if (pdata && pdata->setup) {
+               goto out;
+       }
+
+       twl4030_gpio_base = twl_gpiochip.base;
+
+       if (pdata && pdata->setup) {
                int status;
 
                status = pdata->setup(&pdev->dev,
-                               pdata->gpio_base, TWL4030_GPIO_MAX);
+                               twl4030_gpio_base, TWL4030_GPIO_MAX);
                if (status)
                        dev_dbg(&pdev->dev, "setup --> %d\n", status);
        }
 
+out:
        return ret;
 }
 
@@ -481,7 +513,7 @@ static int gpio_twl4030_remove(struct platform_device *pdev)
 
        if (pdata && pdata->teardown) {
                status = pdata->teardown(&pdev->dev,
-                               pdata->gpio_base, TWL4030_GPIO_MAX);
+                               twl4030_gpio_base, TWL4030_GPIO_MAX);
                if (status) {
                        dev_dbg(&pdev->dev, "teardown --> %d\n", status);
                        return status;
index a18c4aa..f1a4599 100644 (file)
@@ -82,7 +82,7 @@ int of_get_named_gpio_flags(struct device_node *np, const char *propname,
        gpiochip_find(&gg_data, of_gpiochip_find_and_xlate);
 
        of_node_put(gg_data.gpiospec.np);
-       pr_debug("%s exited with status %d\n", __func__, ret);
+       pr_debug("%s exited with status %d\n", __func__, gg_data.out_gpio);
        return gg_data.out_gpio;
 }
 EXPORT_SYMBOL(of_get_named_gpio_flags);
index d0c4574..3616480 100644 (file)
@@ -193,6 +193,9 @@ static const struct file_operations ast_fops = {
        .mmap = ast_mmap,
        .poll = drm_poll,
        .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .read = drm_read,
 };
 
index 7282c08..a712caf 100644 (file)
@@ -841,7 +841,7 @@ int ast_cursor_init(struct drm_device *dev)
 
        ast->cursor_cache = obj;
        ast->cursor_cache_gpu_addr = gpu_addr;
-       DRM_ERROR("pinned cursor cache at %llx\n", ast->cursor_cache_gpu_addr);
+       DRM_DEBUG_KMS("pinned cursor cache at %llx\n", ast->cursor_cache_gpu_addr);
        return 0;
 fail:
        return ret;
index 7053140..b83a2d7 100644 (file)
@@ -74,6 +74,9 @@ static const struct file_operations cirrus_driver_fops = {
        .unlocked_ioctl = drm_ioctl,
        .mmap = cirrus_mmap,
        .poll = drm_poll,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .fasync = drm_fasync,
 };
 static struct drm_driver driver = {
index 7f50967..59a26e5 100644 (file)
@@ -36,6 +36,6 @@ config DRM_EXYNOS_VIDI
 
 config DRM_EXYNOS_G2D
        bool "Exynos DRM G2D"
-       depends on DRM_EXYNOS
+       depends on DRM_EXYNOS && !VIDEO_SAMSUNG_S5P_G2D
        help
          Choose this option if you want to use Exynos G2D for DRM.
index 613bf8a..ae13feb 100644 (file)
@@ -163,6 +163,12 @@ static void exynos_gem_dmabuf_kunmap(struct dma_buf *dma_buf,
        /* TODO */
 }
 
+static int exynos_gem_dmabuf_mmap(struct dma_buf *dma_buf,
+       struct vm_area_struct *vma)
+{
+       return -ENOTTY;
+}
+
 static struct dma_buf_ops exynos_dmabuf_ops = {
        .map_dma_buf            = exynos_gem_map_dma_buf,
        .unmap_dma_buf          = exynos_gem_unmap_dma_buf,
@@ -170,6 +176,7 @@ static struct dma_buf_ops exynos_dmabuf_ops = {
        .kmap_atomic            = exynos_gem_dmabuf_kmap_atomic,
        .kunmap                 = exynos_gem_dmabuf_kunmap,
        .kunmap_atomic          = exynos_gem_dmabuf_kunmap_atomic,
+       .mmap                   = exynos_gem_dmabuf_mmap,
        .release                = exynos_dmabuf_release,
 };
 
index ebacec6..d070719 100644 (file)
@@ -160,7 +160,6 @@ static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
        if (!file_priv)
                return -ENOMEM;
 
-       drm_prime_init_file_private(&file->prime);
        file->driver_priv = file_priv;
 
        return exynos_drm_subdrv_open(dev, file);
@@ -184,7 +183,6 @@ static void exynos_drm_preclose(struct drm_device *dev,
                        e->base.destroy(&e->base);
                }
        }
-       drm_prime_destroy_file_private(&file->prime);
        spin_unlock_irqrestore(&dev->event_lock, flags);
 
        exynos_drm_subdrv_close(dev, file);
@@ -241,6 +239,9 @@ static const struct file_operations exynos_drm_driver_fops = {
        .poll           = drm_poll,
        .read           = drm_read,
        .unlocked_ioctl = drm_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .release        = drm_release,
 };
 
index a68d2b3..b19cd93 100644 (file)
@@ -831,11 +831,6 @@ static int __devinit fimd_probe(struct platform_device *pdev)
        }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(dev, "failed to find registers\n");
-               ret = -ENOENT;
-               goto err_clk;
-       }
 
        ctx->regs = devm_request_and_ioremap(&pdev->dev, res);
        if (!ctx->regs) {
index d2d88f2..1065e90 100644 (file)
@@ -129,7 +129,6 @@ struct g2d_runqueue_node {
 struct g2d_data {
        struct device                   *dev;
        struct clk                      *gate_clk;
-       struct resource                 *regs_res;
        void __iomem                    *regs;
        int                             irq;
        struct workqueue_struct         *g2d_workq;
@@ -751,7 +750,7 @@ static int __devinit g2d_probe(struct platform_device *pdev)
        struct exynos_drm_subdrv *subdrv;
        int ret;
 
-       g2d = kzalloc(sizeof(*g2d), GFP_KERNEL);
+       g2d = devm_kzalloc(&pdev->dev, sizeof(*g2d), GFP_KERNEL);
        if (!g2d) {
                dev_err(dev, "failed to allocate driver data\n");
                return -ENOMEM;
@@ -759,10 +758,8 @@ static int __devinit g2d_probe(struct platform_device *pdev)
 
        g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab",
                        sizeof(struct g2d_runqueue_node), 0, 0, NULL);
-       if (!g2d->runqueue_slab) {
-               ret = -ENOMEM;
-               goto err_free_mem;
-       }
+       if (!g2d->runqueue_slab)
+               return -ENOMEM;
 
        g2d->dev = dev;
 
@@ -794,38 +791,26 @@ static int __devinit g2d_probe(struct platform_device *pdev)
        pm_runtime_enable(dev);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               dev_err(dev, "failed to get I/O memory\n");
-               ret = -ENOENT;
-               goto err_put_clk;
-       }
 
-       g2d->regs_res = request_mem_region(res->start, resource_size(res),
-                                          dev_name(dev));
-       if (!g2d->regs_res) {
-               dev_err(dev, "failed to request I/O memory\n");
-               ret = -ENOENT;
-               goto err_put_clk;
-       }
-
-       g2d->regs = ioremap(res->start, resource_size(res));
+       g2d->regs = devm_request_and_ioremap(&pdev->dev, res);
        if (!g2d->regs) {
                dev_err(dev, "failed to remap I/O memory\n");
                ret = -ENXIO;
-               goto err_release_res;
+               goto err_put_clk;
        }
 
        g2d->irq = platform_get_irq(pdev, 0);
        if (g2d->irq < 0) {
                dev_err(dev, "failed to get irq\n");
                ret = g2d->irq;
-               goto err_unmap_base;
+               goto err_put_clk;
        }
 
-       ret = request_irq(g2d->irq, g2d_irq_handler, 0, "drm_g2d", g2d);
+       ret = devm_request_irq(&pdev->dev, g2d->irq, g2d_irq_handler, 0,
+                                                               "drm_g2d", g2d);
        if (ret < 0) {
                dev_err(dev, "irq request failed\n");
-               goto err_unmap_base;
+               goto err_put_clk;
        }
 
        platform_set_drvdata(pdev, g2d);
@@ -838,7 +823,7 @@ static int __devinit g2d_probe(struct platform_device *pdev)
        ret = exynos_drm_subdrv_register(subdrv);
        if (ret < 0) {
                dev_err(dev, "failed to register drm g2d device\n");
-               goto err_free_irq;
+               goto err_put_clk;
        }
 
        dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n",
@@ -846,13 +831,6 @@ static int __devinit g2d_probe(struct platform_device *pdev)
 
        return 0;
 
-err_free_irq:
-       free_irq(g2d->irq, g2d);
-err_unmap_base:
-       iounmap(g2d->regs);
-err_release_res:
-       release_resource(g2d->regs_res);
-       kfree(g2d->regs_res);
 err_put_clk:
        pm_runtime_disable(dev);
        clk_put(g2d->gate_clk);
@@ -862,8 +840,6 @@ err_destroy_workqueue:
        destroy_workqueue(g2d->g2d_workq);
 err_destroy_slab:
        kmem_cache_destroy(g2d->runqueue_slab);
-err_free_mem:
-       kfree(g2d);
        return ret;
 }
 
@@ -873,24 +849,18 @@ static int __devexit g2d_remove(struct platform_device *pdev)
 
        cancel_work_sync(&g2d->runqueue_work);
        exynos_drm_subdrv_unregister(&g2d->subdrv);
-       free_irq(g2d->irq, g2d);
 
        while (g2d->runqueue_node) {
                g2d_free_runqueue_node(g2d, g2d->runqueue_node);
                g2d->runqueue_node = g2d_get_runqueue_node(g2d);
        }
 
-       iounmap(g2d->regs);
-       release_resource(g2d->regs_res);
-       kfree(g2d->regs_res);
-
        pm_runtime_disable(&pdev->dev);
        clk_put(g2d->gate_clk);
 
        g2d_fini_cmdlist(g2d);
        destroy_workqueue(g2d->g2d_workq);
        kmem_cache_destroy(g2d->runqueue_slab);
-       kfree(g2d);
 
        return 0;
 }
@@ -924,7 +894,7 @@ static int g2d_resume(struct device *dev)
 }
 #endif
 
-SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume);
+static SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume);
 
 struct platform_driver g2d_driver = {
        .probe          = g2d_probe,
index f9efde4..a38051c 100644 (file)
@@ -122,7 +122,7 @@ fail:
                __free_page(pages[i]);
 
        drm_free_large(pages);
-       return ERR_PTR(PTR_ERR(p));
+       return ERR_CAST(p);
 }
 
 static void exynos_gem_put_pages(struct drm_gem_object *obj,
@@ -662,7 +662,7 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
         */
 
        args->pitch = args->width * ((args->bpp + 7) / 8);
-       args->size = PAGE_ALIGN(args->pitch * args->height);
+       args->size = args->pitch * args->height;
 
        exynos_gem_obj = exynos_drm_gem_create(dev, args->flags, args->size);
        if (IS_ERR(exynos_gem_obj))
index 8ffcdf8..3fdf0b6 100644 (file)
@@ -345,7 +345,7 @@ static int __devinit exynos_drm_hdmi_probe(struct platform_device *pdev)
 
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
-       ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+       ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
        if (!ctx) {
                DRM_LOG_KMS("failed to alloc common hdmi context.\n");
                return -ENOMEM;
@@ -371,7 +371,6 @@ static int __devexit exynos_drm_hdmi_remove(struct platform_device *pdev)
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
        exynos_drm_subdrv_unregister(&ctx->subdrv);
-       kfree(ctx);
 
        return 0;
 }
index b89829e..e1f94b7 100644 (file)
@@ -29,7 +29,6 @@ static const uint32_t formats[] = {
        DRM_FORMAT_XRGB8888,
        DRM_FORMAT_ARGB8888,
        DRM_FORMAT_NV12,
-       DRM_FORMAT_NV12M,
        DRM_FORMAT_NV12MT,
 };
 
index bb1550c..537027a 100644 (file)
@@ -633,7 +633,7 @@ static int __devinit vidi_probe(struct platform_device *pdev)
 
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
-       ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+       ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
        if (!ctx)
                return -ENOMEM;
 
@@ -673,8 +673,6 @@ static int __devexit vidi_remove(struct platform_device *pdev)
                ctx->raw_edid = NULL;
        }
 
-       kfree(ctx);
-
        return 0;
 }
 
index 409e2ec..a6aea6f 100644 (file)
@@ -2172,7 +2172,7 @@ static int __devinit hdmi_resources_init(struct hdmi_context *hdata)
 
        DRM_DEBUG_KMS("HDMI resource init\n");
 
-       memset(res, 0, sizeof *res);
+       memset(res, 0, sizeof(*res));
 
        /* get clocks, power */
        res->hdmi = clk_get(dev, "hdmi");
@@ -2204,7 +2204,7 @@ static int __devinit hdmi_resources_init(struct hdmi_context *hdata)
        clk_set_parent(res->sclk_hdmi, res->sclk_pixel);
 
        res->regul_bulk = kzalloc(ARRAY_SIZE(supply) *
-               sizeof res->regul_bulk[0], GFP_KERNEL);
+               sizeof(res->regul_bulk[0]), GFP_KERNEL);
        if (!res->regul_bulk) {
                DRM_ERROR("failed to get memory for regulators\n");
                goto fail;
@@ -2243,7 +2243,7 @@ static int hdmi_resources_cleanup(struct hdmi_context *hdata)
                clk_put(res->sclk_hdmi);
        if (!IS_ERR_OR_NULL(res->hdmi))
                clk_put(res->hdmi);
-       memset(res, 0, sizeof *res);
+       memset(res, 0, sizeof(*res));
 
        return 0;
 }
@@ -2312,11 +2312,6 @@ static int __devinit hdmi_probe(struct platform_device *pdev)
        }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       if (!res) {
-               DRM_ERROR("failed to find registers\n");
-               ret = -ENOENT;
-               goto err_resource;
-       }
 
        hdata->regs = devm_request_and_ioremap(&pdev->dev, res);
        if (!hdata->regs) {
index 30fcc12..25b97d5 100644 (file)
@@ -236,11 +236,11 @@ static inline void vp_filter_set(struct mixer_resources *res,
 static void vp_default_filter(struct mixer_resources *res)
 {
        vp_filter_set(res, VP_POLY8_Y0_LL,
-               filter_y_horiz_tap8, sizeof filter_y_horiz_tap8);
+               filter_y_horiz_tap8, sizeof(filter_y_horiz_tap8));
        vp_filter_set(res, VP_POLY4_Y0_LL,
-               filter_y_vert_tap4, sizeof filter_y_vert_tap4);
+               filter_y_vert_tap4, sizeof(filter_y_vert_tap4));
        vp_filter_set(res, VP_POLY4_C0_LL,
-               filter_cr_horiz_tap4, sizeof filter_cr_horiz_tap4);
+               filter_cr_horiz_tap4, sizeof(filter_cr_horiz_tap4));
 }
 
 static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable)
index 0f9b7db..cf49ba5 100644 (file)
@@ -476,6 +476,7 @@ static const struct psb_offset oaktrail_regmap[2] = {
                .pos = DSPAPOS,
                .surf = DSPASURF,
                .addr = MRST_DSPABASE,
+               .base = MRST_DSPABASE,
                .status = PIPEASTAT,
                .linoff = DSPALINOFF,
                .tileoff = DSPATILEOFF,
@@ -499,6 +500,7 @@ static const struct psb_offset oaktrail_regmap[2] = {
                .pos = DSPBPOS,
                .surf = DSPBSURF,
                .addr = DSPBBASE,
+               .base = DSPBBASE,
                .status = PIPEBSTAT,
                .linoff = DSPBLINOFF,
                .tileoff = DSPBTILEOFF,
index 57d892e..463ec68 100644 (file)
@@ -115,6 +115,9 @@ static const struct file_operations i810_buffer_fops = {
        .unlocked_ioctl = drm_ioctl,
        .mmap = i810_mmap_buffers,
        .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .llseek = noop_llseek,
 };
 
index f9924ad..48cfcca 100644 (file)
@@ -51,6 +51,9 @@ static const struct file_operations i810_driver_fops = {
        .mmap = drm_mmap,
        .poll = drm_poll,
        .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .llseek = noop_llseek,
 };
 
index 9cf7dfe..914c0df 100644 (file)
@@ -1587,6 +1587,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
        spin_lock_init(&dev_priv->irq_lock);
        spin_lock_init(&dev_priv->error_lock);
        spin_lock_init(&dev_priv->rps_lock);
+       spin_lock_init(&dev_priv->dpio_lock);
 
        if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev))
                dev_priv->num_pipe = 3;
index 8a38285..5249640 100644 (file)
@@ -2700,9 +2700,6 @@ void intel_irq_init(struct drm_device *dev)
                        dev->driver->irq_handler = i8xx_irq_handler;
                        dev->driver->irq_uninstall = i8xx_irq_uninstall;
                } else if (INTEL_INFO(dev)->gen == 3) {
-                       /* IIR "flip pending" means done if this bit is set */
-                       I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE));
-
                        dev->driver->irq_preinstall = i915_irq_preinstall;
                        dev->driver->irq_postinstall = i915_irq_postinstall;
                        dev->driver->irq_uninstall = i915_irq_uninstall;
index 2dfa6cf..bc2ad34 100644 (file)
@@ -1376,7 +1376,8 @@ static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
             "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
             reg, pipe_name(pipe));
 
-       WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_PIPE_B_SELECT),
+       WARN(HAS_PCH_IBX(dev_priv->dev) && (val & DP_PORT_EN) == 0
+            && (val & DP_PIPEB_SELECT),
             "IBX PCH dp port still using transcoder B\n");
 }
 
@@ -1388,7 +1389,8 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
             "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n",
             reg, pipe_name(pipe));
 
-       WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_PIPE_B_SELECT),
+       WARN(HAS_PCH_IBX(dev_priv->dev) && (val & PORT_ENABLE) == 0
+            && (val & SDVO_PIPE_B_SELECT),
             "IBX PCH hdmi port still using transcoder B\n");
 }
 
index a6c426a..ace757a 100644 (file)
@@ -2533,14 +2533,10 @@ intel_dp_init(struct drm_device *dev, int output_reg)
                        break;
        }
 
-       intel_dp_i2c_init(intel_dp, intel_connector, name);
-
        /* Cache some DPCD data in the eDP case */
        if (is_edp(intel_dp)) {
-               bool ret;
                struct edp_power_seq    cur, vbt;
                u32 pp_on, pp_off, pp_div;
-               struct edid *edid;
 
                pp_on = I915_READ(PCH_PP_ON_DELAYS);
                pp_off = I915_READ(PCH_PP_OFF_DELAYS);
@@ -2591,6 +2587,13 @@ intel_dp_init(struct drm_device *dev, int output_reg)
 
                DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n",
                              intel_dp->backlight_on_delay, intel_dp->backlight_off_delay);
+       }
+
+       intel_dp_i2c_init(intel_dp, intel_connector, name);
+
+       if (is_edp(intel_dp)) {
+               bool ret;
+               struct edid *edid;
 
                ironlake_edp_panel_vdd_on(intel_dp);
                ret = intel_dp_get_dpcd(intel_dp);
index 3df4f5f..e019b23 100644 (file)
@@ -162,19 +162,12 @@ static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv)
        return val;
 }
 
-u32 intel_panel_get_max_backlight(struct drm_device *dev)
+static u32 _intel_panel_get_max_backlight(struct drm_device *dev)
 {
        struct drm_i915_private *dev_priv = dev->dev_private;
        u32 max;
 
        max = i915_read_blc_pwm_ctl(dev_priv);
-       if (max == 0) {
-               /* XXX add code here to query mode clock or hardware clock
-                * and program max PWM appropriately.
-                */
-               pr_warn_once("fixme: max PWM is zero\n");
-               return 1;
-       }
 
        if (HAS_PCH_SPLIT(dev)) {
                max >>= 16;
@@ -188,6 +181,22 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev)
                        max *= 0xff;
        }
 
+       return max;
+}
+
+u32 intel_panel_get_max_backlight(struct drm_device *dev)
+{
+       u32 max;
+
+       max = _intel_panel_get_max_backlight(dev);
+       if (max == 0) {
+               /* XXX add code here to query mode clock or hardware clock
+                * and program max PWM appropriately.
+                */
+               pr_warn_once("fixme: max PWM is zero\n");
+               return 1;
+       }
+
        DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max);
        return max;
 }
@@ -424,7 +433,11 @@ int intel_panel_setup_backlight(struct drm_device *dev)
 
        memset(&props, 0, sizeof(props));
        props.type = BACKLIGHT_RAW;
-       props.max_brightness = intel_panel_get_max_backlight(dev);
+       props.max_brightness = _intel_panel_get_max_backlight(dev);
+       if (props.max_brightness == 0) {
+               DRM_ERROR("Failed to get maximum backlight value\n");
+               return -ENODEV;
+       }
        dev_priv->backlight =
                backlight_device_register("intel_backlight",
                                          &connector->kdev, dev,
index 1881c8c..ba8a27b 100644 (file)
@@ -3672,6 +3672,9 @@ static void gen3_init_clock_gating(struct drm_device *dev)
 
        if (IS_PINEVIEW(dev))
                I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY));
+
+       /* IIR "flip pending" means done if this bit is set */
+       I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE));
 }
 
 static void i85x_init_clock_gating(struct drm_device *dev)
index d81bb0b..123afd3 100644 (file)
@@ -2573,7 +2573,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
                hotplug_mask = intel_sdvo->is_sdvob ?
                        SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915;
        }
-       dev_priv->hotplug_supported_mask |= hotplug_mask;
 
        drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs);
 
@@ -2581,14 +2580,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
        if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps))
                goto err;
 
-       /* Set up hotplug command - note paranoia about contents of reply.
-        * We assume that the hardware is in a sane state, and only touch
-        * the bits we think we understand.
-        */
-       intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ACTIVE_HOT_PLUG,
-                            &intel_sdvo->hotplug_active, 2);
-       intel_sdvo->hotplug_active[0] &= ~0x3;
-
        if (intel_sdvo_output_setup(intel_sdvo,
                                    intel_sdvo->caps.output_flags) != true) {
                DRM_DEBUG_KMS("SDVO output failed to setup on %s\n",
@@ -2596,6 +2587,12 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob)
                goto err;
        }
 
+       /* Only enable the hotplug irq if we need it, to work around noisy
+        * hotplug lines.
+        */
+       if (intel_sdvo->hotplug_active[0])
+               dev_priv->hotplug_supported_mask |= hotplug_mask;
+
        intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg);
 
        /* Set the input timing to the screen. Assume always input 0. */
index ea1024d..e5f145d 100644 (file)
@@ -84,6 +84,9 @@ static const struct file_operations mgag200_driver_fops = {
        .mmap = mgag200_mmap,
        .poll = drm_poll,
        .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .read = drm_read,
 };
 
index 69688ef..7e16dc5 100644 (file)
@@ -598,7 +598,7 @@ nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev,
        args->size = args->pitch * args->height;
        args->size = roundup(args->size, PAGE_SIZE);
 
-       ret = nouveau_gem_new(dev, args->size, 0, TTM_PL_FLAG_VRAM, 0, 0, &bo);
+       ret = nouveau_gem_new(dev, args->size, 0, NOUVEAU_GEM_DOMAIN_VRAM, 0, 0, &bo);
        if (ret)
                return ret;
 
index f429e6a..f034905 100644 (file)
@@ -115,6 +115,9 @@ nv50_gpio_init(struct drm_device *dev)
 {
        struct drm_nouveau_private *dev_priv = dev->dev_private;
 
+       /* initialise gpios and routing to vbios defaults */
+       nouveau_gpio_reset(dev);
+
        /* disable, and ack any pending gpio interrupts */
        nv_wr32(dev, 0xe050, 0x00000000);
        nv_wr32(dev, 0xe054, 0xffffffff);
index dac525b..8a2fc89 100644 (file)
@@ -1510,10 +1510,10 @@ nvd0_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *umode,
        case OUTPUT_DP:
                if (nv_connector->base.display_info.bpc == 6) {
                        nv_encoder->dp.datarate = mode->clock * 18 / 8;
-                       syncs |= 0x00000140;
+                       syncs |= 0x00000002 << 6;
                } else {
                        nv_encoder->dp.datarate = mode->clock * 24 / 8;
-                       syncs |= 0x00000180;
+                       syncs |= 0x00000005 << 6;
                }
 
                if (nv_encoder->dcb->sorconf.link & 1)
index 2817101..e721e30 100644 (file)
@@ -1479,14 +1479,98 @@ static void radeon_legacy_atom_fixup(struct drm_crtc *crtc)
        }
 }
 
+/**
+ * radeon_get_pll_use_mask - look up a mask of which pplls are in use
+ *
+ * @crtc: drm crtc
+ *
+ * Returns the mask of which PPLLs (Pixel PLLs) are in use.
+ */
+static u32 radeon_get_pll_use_mask(struct drm_crtc *crtc)
+{
+       struct drm_device *dev = crtc->dev;
+       struct drm_crtc *test_crtc;
+       struct radeon_crtc *radeon_test_crtc;
+       u32 pll_in_use = 0;
+
+       list_for_each_entry(test_crtc, &dev->mode_config.crtc_list, head) {
+               if (crtc == test_crtc)
+                       continue;
+
+               radeon_test_crtc = to_radeon_crtc(test_crtc);
+               if (radeon_test_crtc->pll_id != ATOM_PPLL_INVALID)
+                       pll_in_use |= (1 << radeon_test_crtc->pll_id);
+       }
+       return pll_in_use;
+}
+
+/**
+ * radeon_get_shared_dp_ppll - return the PPLL used by another crtc for DP
+ *
+ * @crtc: drm crtc
+ *
+ * Returns the PPLL (Pixel PLL) used by another crtc/encoder which is
+ * also in DP mode.  For DP, a single PPLL can be used for all DP
+ * crtcs/encoders.
+ */
+static int radeon_get_shared_dp_ppll(struct drm_crtc *crtc)
+{
+       struct drm_device *dev = crtc->dev;
+       struct drm_encoder *test_encoder;
+       struct radeon_crtc *radeon_test_crtc;
+
+       list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) {
+               if (test_encoder->crtc && (test_encoder->crtc != crtc)) {
+                       if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_encoder))) {
+                               /* for DP use the same PLL for all */
+                               radeon_test_crtc = to_radeon_crtc(test_encoder->crtc);
+                               if (radeon_test_crtc->pll_id != ATOM_PPLL_INVALID)
+                                       return radeon_test_crtc->pll_id;
+                       }
+               }
+       }
+       return ATOM_PPLL_INVALID;
+}
+
+/**
+ * radeon_atom_pick_pll - Allocate a PPLL for use by the crtc.
+ *
+ * @crtc: drm crtc
+ *
+ * Returns the PPLL (Pixel PLL) to be used by the crtc.  For DP monitors
+ * a single PPLL can be used for all DP crtcs/encoders.  For non-DP
+ * monitors a dedicated PPLL must be used.  If a particular board has
+ * an external DP PLL, return ATOM_PPLL_INVALID to skip PLL programming
+ * as there is no need to program the PLL itself.  If we are not able to
+ * allocate a PLL, return ATOM_PPLL_INVALID to skip PLL programming to
+ * avoid messing up an existing monitor.
+ *
+ * Asic specific PLL information
+ *
+ * DCE 6.1
+ * - PPLL2 is only available to UNIPHYA (both DP and non-DP)
+ * - PPLL0, PPLL1 are available for UNIPHYB/C/D/E/F (both DP and non-DP)
+ *
+ * DCE 6.0
+ * - PPLL0 is available to all UNIPHY (DP only)
+ * - PPLL1, PPLL2 are available for all UNIPHY (both DP and non-DP) and DAC
+ *
+ * DCE 5.0
+ * - DCPLL is available to all UNIPHY (DP only)
+ * - PPLL1, PPLL2 are available for all UNIPHY (both DP and non-DP) and DAC
+ *
+ * DCE 3.0/4.0/4.1
+ * - PPLL1, PPLL2 are available for all UNIPHY (both DP and non-DP) and DAC
+ *
+ */
 static int radeon_atom_pick_pll(struct drm_crtc *crtc)
 {
        struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
        struct drm_device *dev = crtc->dev;
        struct radeon_device *rdev = dev->dev_private;
        struct drm_encoder *test_encoder;
-       struct drm_crtc *test_crtc;
-       uint32_t pll_in_use = 0;
+       u32 pll_in_use;
+       int pll;
 
        if (ASIC_IS_DCE61(rdev)) {
                list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) {
@@ -1498,32 +1582,40 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
 
                                if ((test_radeon_encoder->encoder_id ==
                                     ENCODER_OBJECT_ID_INTERNAL_UNIPHY) &&
-                                   (dig->linkb == false)) /* UNIPHY A uses PPLL2 */
+                                   (dig->linkb == false))
+                                       /* UNIPHY A uses PPLL2 */
                                        return ATOM_PPLL2;
+                               else if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_encoder))) {
+                                       /* UNIPHY B/C/D/E/F */
+                                       if (rdev->clock.dp_extclk)
+                                               /* skip PPLL programming if using ext clock */
+                                               return ATOM_PPLL_INVALID;
+                                       else {
+                                               /* use the same PPLL for all DP monitors */
+                                               pll = radeon_get_shared_dp_ppll(crtc);
+                                               if (pll != ATOM_PPLL_INVALID)
+                                                       return pll;
+                                       }
+                               }
+                               break;
                        }
                }
                /* UNIPHY B/C/D/E/F */
-               list_for_each_entry(test_crtc, &dev->mode_config.crtc_list, head) {
-                       struct radeon_crtc *radeon_test_crtc;
-
-                       if (crtc == test_crtc)
-                               continue;
-
-                       radeon_test_crtc = to_radeon_crtc(test_crtc);
-                       if ((radeon_test_crtc->pll_id == ATOM_PPLL0) ||
-                           (radeon_test_crtc->pll_id == ATOM_PPLL1))
-                               pll_in_use |= (1 << radeon_test_crtc->pll_id);
-               }
-               if (!(pll_in_use & 4))
+               pll_in_use = radeon_get_pll_use_mask(crtc);
+               if (!(pll_in_use & (1 << ATOM_PPLL0)))
                        return ATOM_PPLL0;
-               return ATOM_PPLL1;
+               if (!(pll_in_use & (1 << ATOM_PPLL1)))
+                       return ATOM_PPLL1;
+               DRM_ERROR("unable to allocate a PPLL\n");
+               return ATOM_PPLL_INVALID;
        } else if (ASIC_IS_DCE4(rdev)) {
                list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) {
                        if (test_encoder->crtc && (test_encoder->crtc == crtc)) {
                                /* in DP mode, the DP ref clock can come from PPLL, DCPLL, or ext clock,
                                 * depending on the asic:
                                 * DCE4: PPLL or ext clock
-                                * DCE5: DCPLL or ext clock
+                                * DCE5: PPLL, DCPLL, or ext clock
+                                * DCE6: PPLL, PPLL0, or ext clock
                                 *
                                 * Setting ATOM_PPLL_INVALID will cause SetPixelClock to skip
                                 * PPLL/DCPLL programming and only program the DP DTO for the
@@ -1531,31 +1623,34 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
                                 */
                                if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(test_encoder))) {
                                        if (rdev->clock.dp_extclk)
+                                               /* skip PPLL programming if using ext clock */
                                                return ATOM_PPLL_INVALID;
                                        else if (ASIC_IS_DCE6(rdev))
+                                               /* use PPLL0 for all DP */
                                                return ATOM_PPLL0;
                                        else if (ASIC_IS_DCE5(rdev))
+                                               /* use DCPLL for all DP */
                                                return ATOM_DCPLL;
+                                       else {
+                                               /* use the same PPLL for all DP monitors */
+                                               pll = radeon_get_shared_dp_ppll(crtc);
+                                               if (pll != ATOM_PPLL_INVALID)
+                                                       return pll;
+                                       }
                                }
+                               break;
                        }
                }
-
-               /* otherwise, pick one of the plls */
-               list_for_each_entry(test_crtc, &dev->mode_config.crtc_list, head) {
-                       struct radeon_crtc *radeon_test_crtc;
-
-                       if (crtc == test_crtc)
-                               continue;
-
-                       radeon_test_crtc = to_radeon_crtc(test_crtc);
-                       if ((radeon_test_crtc->pll_id >= ATOM_PPLL1) &&
-                           (radeon_test_crtc->pll_id <= ATOM_PPLL2))
-                               pll_in_use |= (1 << radeon_test_crtc->pll_id);
-               }
-               if (!(pll_in_use & 1))
+               /* all other cases */
+               pll_in_use = radeon_get_pll_use_mask(crtc);
+               if (!(pll_in_use & (1 << ATOM_PPLL2)))
+                       return ATOM_PPLL2;
+               if (!(pll_in_use & (1 << ATOM_PPLL1)))
                        return ATOM_PPLL1;
-               return ATOM_PPLL2;
+               DRM_ERROR("unable to allocate a PPLL\n");
+               return ATOM_PPLL_INVALID;
        } else
+               /* use PPLL1 or PPLL2 */
                return radeon_crtc->crtc_id;
 
 }
@@ -1697,7 +1792,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc)
                break;
        }
 done:
-       radeon_crtc->pll_id = -1;
+       radeon_crtc->pll_id = ATOM_PPLL_INVALID;
 }
 
 static const struct drm_crtc_helper_funcs atombios_helper_funcs = {
@@ -1746,6 +1841,6 @@ void radeon_atombios_init_crtc(struct drm_device *dev,
                else
                        radeon_crtc->crtc_offset = 0;
        }
-       radeon_crtc->pll_id = -1;
+       radeon_crtc->pll_id = ATOM_PPLL_INVALID;
        drm_crtc_helper_add(&radeon_crtc->base, &atombios_helper_funcs);
 }
index 7b737b9..2a59375 100644 (file)
@@ -131,7 +131,7 @@ int radeon_fence_emit(struct radeon_device *rdev,
  */
 void radeon_fence_process(struct radeon_device *rdev, int ring)
 {
-       uint64_t seq, last_seq;
+       uint64_t seq, last_seq, last_emitted;
        unsigned count_loop = 0;
        bool wake = false;
 
@@ -158,13 +158,15 @@ void radeon_fence_process(struct radeon_device *rdev, int ring)
         */
        last_seq = atomic64_read(&rdev->fence_drv[ring].last_seq);
        do {
+               last_emitted = rdev->fence_drv[ring].sync_seq[ring];
                seq = radeon_fence_read(rdev, ring);
                seq |= last_seq & 0xffffffff00000000LL;
                if (seq < last_seq) {
-                       seq += 0x100000000LL;
+                       seq &= 0xffffffff;
+                       seq |= last_emitted & 0xffffffff00000000LL;
                }
 
-               if (seq == last_seq) {
+               if (seq <= last_seq || seq > last_emitted) {
                        break;
                }
                /* If we loop over we don't want to return without
index d31d4cc..c5a1643 100644 (file)
@@ -43,6 +43,9 @@ static const struct file_operations savage_driver_fops = {
        .mmap = drm_mmap,
        .poll = drm_poll,
        .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .llseek = noop_llseek,
 };
 
index 7f11987..867dc03 100644 (file)
@@ -74,6 +74,9 @@ static const struct file_operations sis_driver_fops = {
        .mmap = drm_mmap,
        .poll = drm_poll,
        .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .llseek = noop_llseek,
 };
 
index 90f6b13..a7f4d6b 100644 (file)
@@ -49,6 +49,9 @@ static const struct file_operations tdfx_driver_fops = {
        .mmap = drm_mmap,
        .poll = drm_poll,
        .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .llseek = noop_llseek,
 };
 
index 6e52069..9f84128 100644 (file)
@@ -66,6 +66,9 @@ static const struct file_operations udl_driver_fops = {
        .unlocked_ioctl = drm_ioctl,
        .release = drm_release,
        .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .llseek = noop_llseek,
 };
 
index e927b4c..af1b914 100644 (file)
@@ -65,6 +65,9 @@ static const struct file_operations via_driver_fops = {
        .mmap = drm_mmap,
        .poll = drm_poll,
        .fasync = drm_fasync,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = drm_compat_ioctl,
+#endif
        .llseek = noop_llseek,
 };
 
index 794ff67..b71bcd0 100644 (file)
@@ -12,3 +12,11 @@ config DRM_VMWGFX
          This is a KMS enabled DRM driver for the VMware SVGA2
          virtual hardware.
          The compiled module will be called "vmwgfx.ko".
+
+config DRM_VMWGFX_FBCON
+       depends on DRM_VMWGFX
+       bool "Enable framebuffer console under vmwgfx by default"
+       help
+          Choose this option if you are shipping a new vmwgfx
+          userspace driver that supports using the kernel driver.
+
index 4d9edea..ba2c35d 100644 (file)
@@ -182,8 +182,9 @@ static struct pci_device_id vmw_pci_id_list[] = {
        {0x15ad, 0x0405, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VMWGFX_CHIP_SVGAII},
        {0, 0, 0}
 };
+MODULE_DEVICE_TABLE(pci, vmw_pci_id_list);
 
-static int enable_fbdev;
+static int enable_fbdev = IS_ENABLED(CONFIG_DRM_VMWGFX_FBCON);
 
 static int vmw_probe(struct pci_dev *, const struct pci_device_id *);
 static void vmw_master_init(struct vmw_master *);
@@ -1154,6 +1155,11 @@ static struct drm_driver driver = {
        .open = vmw_driver_open,
        .preclose = vmw_preclose,
        .postclose = vmw_postclose,
+
+       .dumb_create = vmw_dumb_create,
+       .dumb_map_offset = vmw_dumb_map_offset,
+       .dumb_destroy = vmw_dumb_destroy,
+
        .fops = &vmwgfx_driver_fops,
        .name = VMWGFX_DRIVER_NAME,
        .desc = VMWGFX_DRIVER_DESC,
index d0f2c07..29c984f 100644 (file)
@@ -645,6 +645,16 @@ int vmw_kms_readback(struct vmw_private *dev_priv,
 int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
                                struct drm_file *file_priv);
 
+int vmw_dumb_create(struct drm_file *file_priv,
+                   struct drm_device *dev,
+                   struct drm_mode_create_dumb *args);
+
+int vmw_dumb_map_offset(struct drm_file *file_priv,
+                       struct drm_device *dev, uint32_t handle,
+                       uint64_t *offset);
+int vmw_dumb_destroy(struct drm_file *file_priv,
+                    struct drm_device *dev,
+                    uint32_t handle);
 /**
  * Overlay control - vmwgfx_overlay.c
  */
index 22bf9a2..2c6ffe0 100644 (file)
@@ -1917,3 +1917,76 @@ err_ref:
        vmw_resource_unreference(&res);
        return ret;
 }
+
+
+int vmw_dumb_create(struct drm_file *file_priv,
+                   struct drm_device *dev,
+                   struct drm_mode_create_dumb *args)
+{
+       struct vmw_private *dev_priv = vmw_priv(dev);
+       struct vmw_master *vmaster = vmw_master(file_priv->master);
+       struct vmw_user_dma_buffer *vmw_user_bo;
+       struct ttm_buffer_object *tmp;
+       int ret;
+
+       args->pitch = args->width * ((args->bpp + 7) / 8);
+       args->size = args->pitch * args->height;
+
+       vmw_user_bo = kzalloc(sizeof(*vmw_user_bo), GFP_KERNEL);
+       if (vmw_user_bo == NULL)
+               return -ENOMEM;
+
+       ret = ttm_read_lock(&vmaster->lock, true);
+       if (ret != 0) {
+               kfree(vmw_user_bo);
+               return ret;
+       }
+
+       ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, args->size,
+                             &vmw_vram_sys_placement, true,
+                             &vmw_user_dmabuf_destroy);
+       if (ret != 0)
+               goto out_no_dmabuf;
+
+       tmp = ttm_bo_reference(&vmw_user_bo->dma.base);
+       ret = ttm_base_object_init(vmw_fpriv(file_priv)->tfile,
+                                  &vmw_user_bo->base,
+                                  false,
+                                  ttm_buffer_type,
+                                  &vmw_user_dmabuf_release, NULL);
+       if (unlikely(ret != 0))
+               goto out_no_base_object;
+
+       args->handle = vmw_user_bo->base.hash.key;
+
+out_no_base_object:
+       ttm_bo_unref(&tmp);
+out_no_dmabuf:
+       ttm_read_unlock(&vmaster->lock);
+       return ret;
+}
+
+int vmw_dumb_map_offset(struct drm_file *file_priv,
+                       struct drm_device *dev, uint32_t handle,
+                       uint64_t *offset)
+{
+       struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
+       struct vmw_dma_buffer *out_buf;
+       int ret;
+
+       ret = vmw_user_dmabuf_lookup(tfile, handle, &out_buf);
+       if (ret != 0)
+               return -EINVAL;
+
+       *offset = out_buf->base.addr_space_offset;
+       vmw_dmabuf_unreference(&out_buf);
+       return 0;
+}
+
+int vmw_dumb_destroy(struct drm_file *file_priv,
+                    struct drm_device *dev,
+                    uint32_t handle)
+{
+       return ttm_ref_object_base_unref(vmw_fpriv(file_priv)->tfile,
+                                        handle, TTM_REF_USAGE);
+}
index 8bf8a64..8bcd168 100644 (file)
@@ -996,7 +996,8 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field,
        struct hid_driver *hdrv = hid->driver;
        int ret;
 
-       hid_dump_input(hid, usage, value);
+       if (!list_empty(&hid->debug_list))
+               hid_dump_input(hid, usage, value);
 
        if (hdrv && hdrv->event && hid_match_usage(hid, usage)) {
                ret = hdrv->event(hid, field, usage, value);
@@ -1558,7 +1559,9 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) },
-       { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
+#if IS_ENABLED(CONFIG_HID_LENOVO_TPKBD)
+       { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) },
+#endif
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) },
        { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) },
index 0f9c146..4d524b5 100644 (file)
@@ -439,7 +439,7 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev)
        struct dj_report *dj_report;
        int retval;
 
-       dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL);
+       dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
        if (!dj_report)
                return -ENOMEM;
        dj_report->report_id = REPORT_ID_DJ_SHORT;
@@ -456,7 +456,7 @@ static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev,
        struct dj_report *dj_report;
        int retval;
 
-       dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL);
+       dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL);
        if (!dj_report)
                return -ENOMEM;
        dj_report->report_id = REPORT_ID_DJ_SHORT;
index 903eef3..991e85c 100644 (file)
@@ -70,6 +70,7 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET },
+       { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
        { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NO_INIT_REPORTS },
        { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1, HID_QUIRK_NO_INIT_REPORTS },
        { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2, HID_QUIRK_NO_INIT_REPORTS },
index 7f3f4a3..6021482 100644 (file)
@@ -69,22 +69,6 @@ struct ina2xx_data {
        u16 regs[INA2XX_MAX_REGISTERS];
 };
 
-int ina2xx_read_word(struct i2c_client *client, int reg)
-{
-       int val = i2c_smbus_read_word_data(client, reg);
-       if (unlikely(val < 0)) {
-               dev_dbg(&client->dev,
-                       "Failed to read register: %d\n", reg);
-               return val;
-       }
-       return be16_to_cpu(val);
-}
-
-void ina2xx_write_word(struct i2c_client *client, int reg, int data)
-{
-       i2c_smbus_write_word_data(client, reg, cpu_to_be16(data));
-}
-
 static struct ina2xx_data *ina2xx_update_device(struct device *dev)
 {
        struct i2c_client *client = to_i2c_client(dev);
@@ -102,7 +86,7 @@ static struct ina2xx_data *ina2xx_update_device(struct device *dev)
 
                /* Read all registers */
                for (i = 0; i < data->registers; i++) {
-                       int rv = ina2xx_read_word(client, i);
+                       int rv = i2c_smbus_read_word_swapped(client, i);
                        if (rv < 0) {
                                ret = ERR_PTR(rv);
                                goto abort;
@@ -279,22 +263,26 @@ static int ina2xx_probe(struct i2c_client *client,
        switch (data->kind) {
        case ina219:
                /* device configuration */
-               ina2xx_write_word(client, INA2XX_CONFIG, INA219_CONFIG_DEFAULT);
+               i2c_smbus_write_word_swapped(client, INA2XX_CONFIG,
+                                            INA219_CONFIG_DEFAULT);
 
                /* set current LSB to 1mA, shunt is in uOhms */
                /* (equation 13 in datasheet) */
-               ina2xx_write_word(client, INA2XX_CALIBRATION, 40960000 / shunt);
+               i2c_smbus_write_word_swapped(client, INA2XX_CALIBRATION,
+                                            40960000 / shunt);
                dev_info(&client->dev,
                         "power monitor INA219 (Rshunt = %li uOhm)\n", shunt);
                data->registers = INA219_REGISTERS;
                break;
        case ina226:
                /* device configuration */
-               ina2xx_write_word(client, INA2XX_CONFIG, INA226_CONFIG_DEFAULT);
+               i2c_smbus_write_word_swapped(client, INA2XX_CONFIG,
+                                            INA226_CONFIG_DEFAULT);
 
                /* set current LSB to 1mA, shunt is in uOhms */
                /* (equation 1 in datasheet)*/
-               ina2xx_write_word(client, INA2XX_CALIBRATION, 5120000 / shunt);
+               i2c_smbus_write_word_swapped(client, INA2XX_CALIBRATION,
+                                            5120000 / shunt);
                dev_info(&client->dev,
                         "power monitor INA226 (Rshunt = %li uOhm)\n", shunt);
                data->registers = INA226_REGISTERS;
index 0018c7d..1a174f0 100644 (file)
@@ -44,12 +44,13 @@ static ssize_t madc_read(struct device *dev,
                         struct device_attribute *devattr, char *buf)
 {
        struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
-       struct twl4030_madc_request req;
+       struct twl4030_madc_request req = {
+               .channels = 1 << attr->index,
+               .method = TWL4030_MADC_SW2,
+               .type = TWL4030_MADC_WAIT,
+       };
        long val;
 
-       req.channels = (1 << attr->index);
-       req.method = TWL4030_MADC_SW2;
-       req.func_cb = NULL;
        val = twl4030_madc_conversion(&req);
        if (val < 0)
                return val;
index 73133b1..6f5f98d 100644 (file)
@@ -476,17 +476,17 @@ static int pca_init(struct i2c_adapter *adap)
                /* To avoid integer overflow, use clock/100 for calculations */
                clock = pca_clock(pca_data) / 100;
 
-               if (pca_data->i2c_clock > 10000) {
+               if (pca_data->i2c_clock > 1000000) {
                        mode = I2C_PCA_MODE_TURBO;
                        min_tlow = 14;
                        min_thi  = 5;
                        raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */
-               } else if (pca_data->i2c_clock > 4000) {
+               } else if (pca_data->i2c_clock > 400000) {
                        mode = I2C_PCA_MODE_FASTP;
                        min_tlow = 17;
                        min_thi  = 9;
                        raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */
-               } else if (pca_data->i2c_clock > 1000) {
+               } else if (pca_data->i2c_clock > 100000) {
                        mode = I2C_PCA_MODE_FAST;
                        min_tlow = 44;
                        min_thi  = 20;
index b4aaa1b..42d9fdd 100644 (file)
@@ -104,6 +104,7 @@ config I2C_I801
            DH89xxCC (PCH)
            Panther Point (PCH)
            Lynx Point (PCH)
+           Lynx Point-LP (PCH)
 
          This driver can also be built as a module.  If so, the module
          will be called i2c-i801.
@@ -354,9 +355,13 @@ config I2C_DAVINCI
          devices such as DaVinci NIC.
          For details please see http://www.ti.com/davinci
 
+config I2C_DESIGNWARE_CORE
+       tristate
+
 config I2C_DESIGNWARE_PLATFORM
        tristate "Synopsys DesignWare Platform"
        depends on HAVE_CLK
+       select I2C_DESIGNWARE_CORE
        help
          If you say yes to this option, support will be included for the
          Synopsys DesignWare I2C adapter. Only master mode is supported.
@@ -367,6 +372,7 @@ config I2C_DESIGNWARE_PLATFORM
 config I2C_DESIGNWARE_PCI
        tristate "Synopsys DesignWare PCI"
        depends on PCI
+       select I2C_DESIGNWARE_CORE
        help
          If you say yes to this option, support will be included for the
          Synopsys DesignWare I2C adapter. Only master mode is supported.
@@ -545,7 +551,7 @@ config I2C_PMCMSP
 
 config I2C_PNX
        tristate "I2C bus support for Philips PNX and NXP LPC targets"
-       depends on ARCH_PNX4008 || ARCH_LPC32XX
+       depends on ARCH_LPC32XX
        help
          This driver supports the Philips IP3204 I2C IP block master and/or
          slave controller
index ce3c2be..37c4182 100644 (file)
@@ -33,10 +33,11 @@ obj-$(CONFIG_I2C_AU1550)    += i2c-au1550.o
 obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o
 obj-$(CONFIG_I2C_CPM)          += i2c-cpm.o
 obj-$(CONFIG_I2C_DAVINCI)      += i2c-davinci.o
+obj-$(CONFIG_I2C_DESIGNWARE_CORE)      += i2c-designware-core.o
 obj-$(CONFIG_I2C_DESIGNWARE_PLATFORM)  += i2c-designware-platform.o
-i2c-designware-platform-objs := i2c-designware-platdrv.o i2c-designware-core.o
+i2c-designware-platform-objs := i2c-designware-platdrv.o
 obj-$(CONFIG_I2C_DESIGNWARE_PCI)       += i2c-designware-pci.o
-i2c-designware-pci-objs := i2c-designware-pcidrv.o i2c-designware-core.o
+i2c-designware-pci-objs := i2c-designware-pcidrv.o
 obj-$(CONFIG_I2C_EG20T)                += i2c-eg20t.o
 obj-$(CONFIG_I2C_GPIO)         += i2c-gpio.o
 obj-$(CONFIG_I2C_HIGHLANDER)   += i2c-highlander.o
index 1e48bec..7b8ebbe 100644 (file)
@@ -25,6 +25,7 @@
  * ----------------------------------------------------------------------------
  *
  */
+#include <linux/export.h>
 #include <linux/clk.h>
 #include <linux/errno.h>
 #include <linux/err.h>
@@ -316,6 +317,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
        dw_writel(dev, dev->master_cfg , DW_IC_CON);
        return 0;
 }
+EXPORT_SYMBOL_GPL(i2c_dw_init);
 
 /*
  * Waiting for bus not busy
@@ -568,12 +570,14 @@ done:
 
        return ret;
 }
+EXPORT_SYMBOL_GPL(i2c_dw_xfer);
 
 u32 i2c_dw_func(struct i2c_adapter *adap)
 {
        struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
        return dev->functionality;
 }
+EXPORT_SYMBOL_GPL(i2c_dw_func);
 
 static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev)
 {
@@ -678,17 +682,20 @@ tx_aborted:
 
        return IRQ_HANDLED;
 }
+EXPORT_SYMBOL_GPL(i2c_dw_isr);
 
 void i2c_dw_enable(struct dw_i2c_dev *dev)
 {
        /* Enable the adapter */
        dw_writel(dev, 1, DW_IC_ENABLE);
 }
+EXPORT_SYMBOL_GPL(i2c_dw_enable);
 
 u32 i2c_dw_is_enabled(struct dw_i2c_dev *dev)
 {
        return dw_readl(dev, DW_IC_ENABLE);
 }
+EXPORT_SYMBOL_GPL(i2c_dw_is_enabled);
 
 void i2c_dw_disable(struct dw_i2c_dev *dev)
 {
@@ -699,18 +706,22 @@ void i2c_dw_disable(struct dw_i2c_dev *dev)
        dw_writel(dev, 0, DW_IC_INTR_MASK);
        dw_readl(dev, DW_IC_CLR_INTR);
 }
+EXPORT_SYMBOL_GPL(i2c_dw_disable);
 
 void i2c_dw_clear_int(struct dw_i2c_dev *dev)
 {
        dw_readl(dev, DW_IC_CLR_INTR);
 }
+EXPORT_SYMBOL_GPL(i2c_dw_clear_int);
 
 void i2c_dw_disable_int(struct dw_i2c_dev *dev)
 {
        dw_writel(dev, 0, DW_IC_INTR_MASK);
 }
+EXPORT_SYMBOL_GPL(i2c_dw_disable_int);
 
 u32 i2c_dw_read_comp_param(struct dw_i2c_dev *dev)
 {
        return dw_readl(dev, DW_IC_COMP_PARAM_1);
 }
+EXPORT_SYMBOL_GPL(i2c_dw_read_comp_param);
index 898dcf9..33e9b0c 100644 (file)
@@ -52,6 +52,7 @@
   DH89xxCC (PCH)        0x2330     32     hard     yes     yes     yes
   Panther Point (PCH)   0x1e22     32     hard     yes     yes     yes
   Lynx Point (PCH)      0x8c22     32     hard     yes     yes     yes
+  Lynx Point-LP (PCH)   0x9c22     32     hard     yes     yes     yes
 
   Features supported by this driver:
   Software PEC                     no
 #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS     0x2330
 #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS        0x3b30
 #define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS    0x8c22
+#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS 0x9c22
 
 struct i801_priv {
        struct i2c_adapter adapter;
@@ -771,6 +773,7 @@ static DEFINE_PCI_DEVICE_TABLE(i801_ids) = {
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) },
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) },
        { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) },
+       { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS) },
        { 0, }
 };
 
index 93f147a..2f99613 100644 (file)
@@ -4,13 +4,13 @@
 /* Copyright (C) 2003 Peter Milne, D-TACQ Solutions Ltd
  *                    <Peter dot Milne at D hyphen TACQ dot com>
  *
- * With acknowledgements to i2c-algo-ibm_ocp.c by 
+ * With acknowledgements to i2c-algo-ibm_ocp.c by
  * Ian DaSilva, MontaVista Software, Inc. idasilva@mvista.com
  *
  * And i2c-algo-pcf.c, which was created by Simon G. Vogl and Hans Berglund:
  *
  * Copyright (C) 1995-1997 Simon G. Vogl, 1998-2000 Hans Berglund
- *  
+ *
  * And which acknowledged Kyösti Mälkki <kmalkki@cc.hut.fi>,
  * Frodo Looijaard <frodol@dds.nl>, Martin Bailey<mbailey@littlefeet-inc.com>
  *
 #include <linux/platform_device.h>
 #include <linux/i2c.h>
 #include <linux/io.h>
+#include <linux/gpio.h>
 
 #include "i2c-iop3xx.h"
 
 /* global unit counter */
 static int i2c_id;
 
-static inline unsigned char 
-iic_cook_addr(struct i2c_msg *msg) 
+static inline unsigned char
+iic_cook_addr(struct i2c_msg *msg)
 {
        unsigned char addr;
 
@@ -55,38 +56,38 @@ iic_cook_addr(struct i2c_msg *msg)
        if (msg->flags & I2C_M_RD)
                addr |= 1;
 
-       return addr;   
+       return addr;
 }
 
-static void 
+static void
 iop3xx_i2c_reset(struct i2c_algo_iop3xx_data *iop3xx_adap)
 {
        /* Follows devman 9.3 */
        __raw_writel(IOP3XX_ICR_UNIT_RESET, iop3xx_adap->ioaddr + CR_OFFSET);
        __raw_writel(IOP3XX_ISR_CLEARBITS, iop3xx_adap->ioaddr + SR_OFFSET);
        __raw_writel(0, iop3xx_adap->ioaddr + CR_OFFSET);
-} 
+}
 
-static void 
+static void
 iop3xx_i2c_enable(struct i2c_algo_iop3xx_data *iop3xx_adap)
 {
        u32 cr = IOP3XX_ICR_GCD | IOP3XX_ICR_SCLEN | IOP3XX_ICR_UE;
 
-       /* 
+       /*
         * Every time unit enable is asserted, GPOD needs to be cleared
         * on IOP3XX to avoid data corruption on the bus.
         */
 #if defined(CONFIG_ARCH_IOP32X) || defined(CONFIG_ARCH_IOP33X)
        if (iop3xx_adap->id == 0) {
-               gpio_line_set(IOP3XX_GPIO_LINE(7), GPIO_LOW);
-               gpio_line_set(IOP3XX_GPIO_LINE(6), GPIO_LOW);
+               gpio_set_value(7, 0);
+               gpio_set_value(6, 0);
        } else {
-               gpio_line_set(IOP3XX_GPIO_LINE(5), GPIO_LOW);
-               gpio_line_set(IOP3XX_GPIO_LINE(4), GPIO_LOW);
+               gpio_set_value(5, 0);
+               gpio_set_value(4, 0);
        }
 #endif
        /* NB SR bits not same position as CR IE bits :-( */
-       iop3xx_adap->SR_enabled = 
+       iop3xx_adap->SR_enabled =
                IOP3XX_ISR_ALD | IOP3XX_ISR_BERRD |
                IOP3XX_ISR_RXFULL | IOP3XX_ISR_TXEMPTY;
 
@@ -96,23 +97,23 @@ iop3xx_i2c_enable(struct i2c_algo_iop3xx_data *iop3xx_adap)
        __raw_writel(cr, iop3xx_adap->ioaddr + CR_OFFSET);
 }
 
-static void 
+static void
 iop3xx_i2c_transaction_cleanup(struct i2c_algo_iop3xx_data *iop3xx_adap)
 {
        unsigned long cr = __raw_readl(iop3xx_adap->ioaddr + CR_OFFSET);
-       
-       cr &= ~(IOP3XX_ICR_MSTART | IOP3XX_ICR_TBYTE | 
+
+       cr &= ~(IOP3XX_ICR_MSTART | IOP3XX_ICR_TBYTE |
                IOP3XX_ICR_MSTOP | IOP3XX_ICR_SCLEN);
 
        __raw_writel(cr, iop3xx_adap->ioaddr + CR_OFFSET);
 }
 
-/* 
- * NB: the handler has to clear the source of the interrupt! 
+/*
+ * NB: the handler has to clear the source of the interrupt!
  * Then it passes the SR flags of interest to BH via adap data
  */
-static irqreturn_t 
-iop3xx_i2c_irq_handler(int this_irq, void *dev_id) 
+static irqreturn_t
+iop3xx_i2c_irq_handler(int this_irq, void *dev_id)
 {
        struct i2c_algo_iop3xx_data *iop3xx_adap = dev_id;
        u32 sr = __raw_readl(iop3xx_adap->ioaddr + SR_OFFSET);
@@ -126,7 +127,7 @@ iop3xx_i2c_irq_handler(int this_irq, void *dev_id)
 }
 
 /* check all error conditions, clear them , report most important */
-static int 
+static int
 iop3xx_i2c_error(u32 sr)
 {
        int rc = 0;
@@ -135,12 +136,12 @@ iop3xx_i2c_error(u32 sr)
                if ( !rc ) rc = -I2C_ERR_BERR;
        }
        if ((sr & IOP3XX_ISR_ALD)) {
-               if ( !rc ) rc = -I2C_ERR_ALD;           
+               if ( !rc ) rc = -I2C_ERR_ALD;
        }
-       return rc;      
+       return rc;
 }
 
-static inline u32 
+static inline u32
 iop3xx_i2c_get_srstat(struct i2c_algo_iop3xx_data *iop3xx_adap)
 {
        unsigned long flags;
@@ -161,8 +162,8 @@ iop3xx_i2c_get_srstat(struct i2c_algo_iop3xx_data *iop3xx_adap)
 typedef int (* compare_func)(unsigned test, unsigned mask);
 /* returns 1 on correct comparison */
 
-static int 
-iop3xx_i2c_wait_event(struct i2c_algo_iop3xx_data *iop3xx_adap, 
+static int
+iop3xx_i2c_wait_event(struct i2c_algo_iop3xx_data *iop3xx_adap,
                          unsigned flags, unsigned* status,
                          compare_func compare)
 {
@@ -192,47 +193,47 @@ iop3xx_i2c_wait_event(struct i2c_algo_iop3xx_data *iop3xx_adap,
 }
 
 /*
- * Concrete compare_funcs 
+ * Concrete compare_funcs
  */
-static int 
+static int
 all_bits_clear(unsigned test, unsigned mask)
 {
        return (test & mask) == 0;
 }
 
-static int 
+static int
 any_bits_set(unsigned test, unsigned mask)
 {
        return (test & mask) != 0;
 }
 
-static int 
+static int
 iop3xx_i2c_wait_tx_done(struct i2c_algo_iop3xx_data *iop3xx_adap, int *status)
 {
-       return iop3xx_i2c_wait_event( 
-               iop3xx_adap, 
+       return iop3xx_i2c_wait_event(
+               iop3xx_adap,
                IOP3XX_ISR_TXEMPTY | IOP3XX_ISR_ALD | IOP3XX_ISR_BERRD,
                status, any_bits_set);
 }
 
-static int 
+static int
 iop3xx_i2c_wait_rx_done(struct i2c_algo_iop3xx_data *iop3xx_adap, int *status)
 {
-       return iop3xx_i2c_wait_event( 
-               iop3xx_adap, 
+       return iop3xx_i2c_wait_event(
+               iop3xx_adap,
                IOP3XX_ISR_RXFULL | IOP3XX_ISR_ALD | IOP3XX_ISR_BERRD,
                status, any_bits_set);
 }
 
-static int 
+static int
 iop3xx_i2c_wait_idle(struct i2c_algo_iop3xx_data *iop3xx_adap, int *status)
 {
-       return iop3xx_i2c_wait_event( 
+       return iop3xx_i2c_wait_event(
                iop3xx_adap, IOP3XX_ISR_UNITBUSY, status, all_bits_clear);
 }
 
-static int 
-iop3xx_i2c_send_target_addr(struct i2c_algo_iop3xx_data *iop3xx_adap, 
+static int
+iop3xx_i2c_send_target_addr(struct i2c_algo_iop3xx_data *iop3xx_adap,
                                struct i2c_msg* msg)
 {
        unsigned long cr = __raw_readl(iop3xx_adap->ioaddr + CR_OFFSET);
@@ -247,7 +248,7 @@ iop3xx_i2c_send_target_addr(struct i2c_algo_iop3xx_data *iop3xx_adap,
        }
 
        __raw_writel(iic_cook_addr(msg), iop3xx_adap->ioaddr + DBR_OFFSET);
-       
+
        cr &= ~(IOP3XX_ICR_MSTOP | IOP3XX_ICR_NACK);
        cr |= IOP3XX_ICR_MSTART | IOP3XX_ICR_TBYTE;
 
@@ -257,8 +258,8 @@ iop3xx_i2c_send_target_addr(struct i2c_algo_iop3xx_data *iop3xx_adap,
        return rc;
 }
 
-static int 
-iop3xx_i2c_write_byte(struct i2c_algo_iop3xx_data *iop3xx_adap, char byte, 
+static int
+iop3xx_i2c_write_byte(struct i2c_algo_iop3xx_data *iop3xx_adap, char byte,
                                int stop)
 {
        unsigned long cr = __raw_readl(iop3xx_adap->ioaddr + CR_OFFSET);
@@ -277,10 +278,10 @@ iop3xx_i2c_write_byte(struct i2c_algo_iop3xx_data *iop3xx_adap, char byte,
        rc = iop3xx_i2c_wait_tx_done(iop3xx_adap, &status);
 
        return rc;
-} 
+}
 
-static int 
-iop3xx_i2c_read_byte(struct i2c_algo_iop3xx_data *iop3xx_adap, char* byte, 
+static int
+iop3xx_i2c_read_byte(struct i2c_algo_iop3xx_data *iop3xx_adap, char* byte,
                                int stop)
 {
        unsigned long cr = __raw_readl(iop3xx_adap->ioaddr + CR_OFFSET);
@@ -304,19 +305,19 @@ iop3xx_i2c_read_byte(struct i2c_algo_iop3xx_data *iop3xx_adap, char* byte,
        return rc;
 }
 
-static int 
+static int
 iop3xx_i2c_writebytes(struct i2c_adapter *i2c_adap, const char *buf, int count)
 {
        struct i2c_algo_iop3xx_data *iop3xx_adap = i2c_adap->algo_data;
        int ii;
        int rc = 0;
 
-       for (ii = 0; rc == 0 && ii != count; ++ii) 
+       for (ii = 0; rc == 0 && ii != count; ++ii)
                rc = iop3xx_i2c_write_byte(iop3xx_adap, buf[ii], ii==count-1);
        return rc;
 }
 
-static int 
+static int
 iop3xx_i2c_readbytes(struct i2c_adapter *i2c_adap, char *buf, int count)
 {
        struct i2c_algo_iop3xx_data *iop3xx_adap = i2c_adap->algo_data;
@@ -325,7 +326,7 @@ iop3xx_i2c_readbytes(struct i2c_adapter *i2c_adap, char *buf, int count)
 
        for (ii = 0; rc == 0 && ii != count; ++ii)
                rc = iop3xx_i2c_read_byte(iop3xx_adap, &buf[ii], ii==count-1);
-       
+
        return rc;
 }
 
@@ -336,8 +337,8 @@ iop3xx_i2c_readbytes(struct i2c_adapter *i2c_adap, char *buf, int count)
  * Each transfer (i.e. a read or a write) is separated by a repeated start
  * condition.
  */
-static int 
-iop3xx_i2c_handle_msg(struct i2c_adapter *i2c_adap, struct i2c_msg* pmsg) 
+static int
+iop3xx_i2c_handle_msg(struct i2c_adapter *i2c_adap, struct i2c_msg* pmsg)
 {
        struct i2c_algo_iop3xx_data *iop3xx_adap = i2c_adap->algo_data;
        int rc;
@@ -357,8 +358,8 @@ iop3xx_i2c_handle_msg(struct i2c_adapter *i2c_adap, struct i2c_msg* pmsg)
 /*
  * master_xfer() - main read/write entry
  */
-static int 
-iop3xx_i2c_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, 
+static int
+iop3xx_i2c_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs,
                                int num)
 {
        struct i2c_algo_iop3xx_data *iop3xx_adap = i2c_adap->algo_data;
@@ -375,14 +376,14 @@ iop3xx_i2c_master_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs,
        }
 
        iop3xx_i2c_transaction_cleanup(iop3xx_adap);
-       
+
        if(ret)
                return ret;
 
-       return im;   
+       return im;
 }
 
-static u32 
+static u32
 iop3xx_i2c_func(struct i2c_adapter *adap)
 {
        return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
@@ -393,11 +394,11 @@ static const struct i2c_algorithm iop3xx_i2c_algo = {
        .functionality  = iop3xx_i2c_func,
 };
 
-static int 
+static int
 iop3xx_i2c_remove(struct platform_device *pdev)
 {
        struct i2c_adapter *padapter = platform_get_drvdata(pdev);
-       struct i2c_algo_iop3xx_data *adapter_data = 
+       struct i2c_algo_iop3xx_data *adapter_data =
                (struct i2c_algo_iop3xx_data *)padapter->algo_data;
        struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        unsigned long cr = __raw_readl(adapter_data->ioaddr + CR_OFFSET);
@@ -419,7 +420,7 @@ iop3xx_i2c_remove(struct platform_device *pdev)
        return 0;
 }
 
-static int 
+static int
 iop3xx_i2c_probe(struct platform_device *pdev)
 {
        struct resource *res;
index 088c5c1..51f05b8 100644 (file)
@@ -365,10 +365,6 @@ static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c)
        struct device_node *node = dev->of_node;
        int ret;
 
-       if (!node)
-               return -EINVAL;
-
-       i2c->speed = &mxs_i2c_95kHz_config;
        ret = of_property_read_u32(node, "clock-frequency", &speed);
        if (ret)
                dev_warn(dev, "No I2C speed selected, using 100kHz\n");
@@ -419,10 +415,13 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev)
                return err;
 
        i2c->dev = dev;
+       i2c->speed = &mxs_i2c_95kHz_config;
 
-       err = mxs_i2c_get_ofdata(i2c);
-       if (err)
-               return err;
+       if (dev->of_node) {
+               err = mxs_i2c_get_ofdata(i2c);
+               if (err)
+                       return err;
+       }
 
        platform_set_drvdata(pdev, i2c);
 
index 5d54416..8488bdd 100644 (file)
@@ -48,8 +48,9 @@ enum {
        mcntrl_afie = 0x00000002,
        mcntrl_naie = 0x00000004,
        mcntrl_drmie = 0x00000008,
-       mcntrl_daie = 0x00000020,
-       mcntrl_rffie = 0x00000040,
+       mcntrl_drsie = 0x00000010,
+       mcntrl_rffie = 0x00000020,
+       mcntrl_daie = 0x00000040,
        mcntrl_tffie = 0x00000080,
        mcntrl_reset = 0x00000100,
        mcntrl_cdbmode = 0x00000400,
@@ -290,31 +291,37 @@ static int i2c_pnx_master_rcv(struct i2c_pnx_algo_data *alg_data)
         * or we didn't 'ask' for it yet.
         */
        if (ioread32(I2C_REG_STS(alg_data)) & mstatus_rfe) {
-               dev_dbg(&alg_data->adapter.dev,
-                       "%s(): Write dummy data to fill Rx-fifo...\n",
-                       __func__);
+               /* 'Asking' is done asynchronously, e.g. dummy TX of several
+                * bytes is done before the first actual RX arrives in FIFO.
+                * Therefore, ordered bytes (via TX) are counted separately.
+                */
+               if (alg_data->mif.order) {
+                       dev_dbg(&alg_data->adapter.dev,
+                               "%s(): Write dummy data to fill Rx-fifo...\n",
+                               __func__);
 
-               if (alg_data->mif.len == 1) {
-                       /* Last byte, do not acknowledge next rcv. */
-                       val |= stop_bit;
+                       if (alg_data->mif.order == 1) {
+                               /* Last byte, do not acknowledge next rcv. */
+                               val |= stop_bit;
+
+                               /*
+                                * Enable interrupt RFDAIE (data in Rx fifo),
+                                * and disable DRMIE (need data for Tx)
+                                */
+                               ctl = ioread32(I2C_REG_CTL(alg_data));
+                               ctl |= mcntrl_rffie | mcntrl_daie;
+                               ctl &= ~mcntrl_drmie;
+                               iowrite32(ctl, I2C_REG_CTL(alg_data));
+                       }
 
                        /*
-                        * Enable interrupt RFDAIE (data in Rx fifo),
-                        * and disable DRMIE (need data for Tx)
+                        * Now we'll 'ask' for data:
+                        * For each byte we want to receive, we must
+                        * write a (dummy) byte to the Tx-FIFO.
                         */
-                       ctl = ioread32(I2C_REG_CTL(alg_data));
-                       ctl |= mcntrl_rffie | mcntrl_daie;
-                       ctl &= ~mcntrl_drmie;
-                       iowrite32(ctl, I2C_REG_CTL(alg_data));
+                       iowrite32(val, I2C_REG_TX(alg_data));
+                       alg_data->mif.order--;
                }
-
-               /*
-                * Now we'll 'ask' for data:
-                * For each byte we want to receive, we must
-                * write a (dummy) byte to the Tx-FIFO.
-                */
-               iowrite32(val, I2C_REG_TX(alg_data));
-
                return 0;
        }
 
@@ -514,6 +521,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
 
                alg_data->mif.buf = pmsg->buf;
                alg_data->mif.len = pmsg->len;
+               alg_data->mif.order = pmsg->len;
                alg_data->mif.mode = (pmsg->flags & I2C_M_RD) ?
                        I2C_SMBUS_READ : I2C_SMBUS_WRITE;
                alg_data->mif.ret = 0;
@@ -566,6 +574,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
        /* Cleanup to be sure... */
        alg_data->mif.buf = NULL;
        alg_data->mif.len = 0;
+       alg_data->mif.order = 0;
 
        dev_dbg(&alg_data->adapter.dev, "%s(): exiting, stat = %x\n",
                __func__, ioread32(I2C_REG_STS(alg_data)));
index 2efa56c..2091ae8 100644 (file)
@@ -637,6 +637,22 @@ static void i2c_adapter_dev_release(struct device *dev)
 }
 
 /*
+ * This function is only needed for mutex_lock_nested, so it is never
+ * called unless locking correctness checking is enabled. Thus we
+ * make it inline to avoid a compiler warning. That's what gcc ends up
+ * doing anyway.
+ */
+static inline unsigned int i2c_adapter_depth(struct i2c_adapter *adapter)
+{
+       unsigned int depth = 0;
+
+       while ((adapter = i2c_parent_is_i2c_adapter(adapter)))
+               depth++;
+
+       return depth;
+}
+
+/*
  * Let users instantiate I2C devices through sysfs. This can be used when
  * platform initialization code doesn't contain the proper data for
  * whatever reason. Also useful for drivers that do device detection and
@@ -726,7 +742,8 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr,
 
        /* Make sure the device was added through sysfs */
        res = -ENOENT;
-       mutex_lock(&adap->userspace_clients_lock);
+       mutex_lock_nested(&adap->userspace_clients_lock,
+                         i2c_adapter_depth(adap));
        list_for_each_entry_safe(client, next, &adap->userspace_clients,
                                 detected) {
                if (client->addr == addr) {
@@ -1073,7 +1090,8 @@ int i2c_del_adapter(struct i2c_adapter *adap)
                return res;
 
        /* Remove devices instantiated from sysfs */
-       mutex_lock(&adap->userspace_clients_lock);
+       mutex_lock_nested(&adap->userspace_clients_lock,
+                         i2c_adapter_depth(adap));
        list_for_each_entry_safe(client, next, &adap->userspace_clients,
                                 detected) {
                dev_dbg(&adap->dev, "Removing %s at 0x%x\n", client->name,
index f61780a..3bd5540 100644 (file)
@@ -617,7 +617,7 @@ static int __devinit at91_adc_probe(struct platform_device *pdev)
        st->adc_clk = clk_get(&pdev->dev, "adc_op_clk");
        if (IS_ERR(st->adc_clk)) {
                dev_err(&pdev->dev, "Failed to get the ADC clock.\n");
-               ret = PTR_ERR(st->clk);
+               ret = PTR_ERR(st->adc_clk);
                goto error_disable_clk;
        }
 
index c50fa75..b4b65af 100644 (file)
@@ -533,7 +533,7 @@ config KEYBOARD_DAVINCI
 
 config KEYBOARD_OMAP
        tristate "TI OMAP keypad support"
-       depends on (ARCH_OMAP1 || ARCH_OMAP2)
+       depends on ARCH_OMAP1
        select INPUT_MATRIXKMAP
        help
          Say Y here if you want to use the OMAP keypad.
index ff4c0a8..ce68e36 100644 (file)
@@ -358,6 +358,7 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad)
        /* Inhibit KDI and KRI interrupts. */
        reg_val = readw(keypad->mmio_base + KPSR);
        reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE);
+       reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD;
        writew(reg_val, keypad->mmio_base + KPSR);
 
        /* Colums as open drain and disable all rows */
@@ -515,7 +516,9 @@ static int __devinit imx_keypad_probe(struct platform_device *pdev)
        input_set_drvdata(input_dev, keypad);
 
        /* Ensure that the keypad will stay dormant until opened */
+       clk_enable(keypad->clk);
        imx_keypad_inhibit(keypad);
+       clk_disable(keypad->clk);
 
        error = request_irq(irq, imx_keypad_irq_handler, 0,
                            pdev->name, keypad);
index a0222db..6d6b142 100644 (file)
 #include <linux/mutex.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
-#include <asm/gpio.h>
-#include <plat/keypad.h>
-#include <plat/menelaus.h>
-#include <asm/irq.h>
-#include <mach/hardware.h>
-#include <asm/io.h>
-#include <plat/mux.h>
+#include <linux/gpio.h>
+#include <linux/platform_data/gpio-omap.h>
+#include <linux/platform_data/keypad-omap.h>
 
 #undef NEW_BOARD_LEARNING_MODE
 
@@ -96,28 +92,8 @@ static u8 get_row_gpio_val(struct omap_kp *omap_kp)
 
 static irqreturn_t omap_kp_interrupt(int irq, void *dev_id)
 {
-       struct omap_kp *omap_kp = dev_id;
-
        /* disable keyboard interrupt and schedule for handling */
-       if (cpu_is_omap24xx()) {
-               int i;
-
-               for (i = 0; i < omap_kp->rows; i++) {
-                       int gpio_irq = gpio_to_irq(row_gpios[i]);
-                       /*
-                        * The interrupt which we're currently handling should
-                        * be disabled _nosync() to avoid deadlocks waiting
-                        * for this handler to complete.  All others should
-                        * be disabled the regular way for SMP safety.
-                        */
-                       if (gpio_irq == irq)
-                               disable_irq_nosync(gpio_irq);
-                       else
-                               disable_irq(gpio_irq);
-               }
-       } else
-               /* disable keyboard interrupt and schedule for handling */
-               omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
+       omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
 
        tasklet_schedule(&kp_tasklet);
 
@@ -133,33 +109,22 @@ static void omap_kp_scan_keypad(struct omap_kp *omap_kp, unsigned char *state)
 {
        int col = 0;
 
-       /* read the keypad status */
-       if (cpu_is_omap24xx()) {
-               /* read the keypad status */
-               for (col = 0; col < omap_kp->cols; col++) {
-                       set_col_gpio_val(omap_kp, ~(1 << col));
-                       state[col] = ~(get_row_gpio_val(omap_kp)) & 0xff;
-               }
-               set_col_gpio_val(omap_kp, 0);
-
-       } else {
-               /* disable keyboard interrupt and schedule for handling */
-               omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
+       /* disable keyboard interrupt and schedule for handling */
+       omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
 
-               /* read the keypad status */
-               omap_writew(0xff, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC);
-               for (col = 0; col < omap_kp->cols; col++) {
-                       omap_writew(~(1 << col) & 0xff,
-                                   OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC);
+       /* read the keypad status */
+       omap_writew(0xff, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC);
+       for (col = 0; col < omap_kp->cols; col++) {
+               omap_writew(~(1 << col) & 0xff,
+                           OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC);
 
-                       udelay(omap_kp->delay);
+               udelay(omap_kp->delay);
 
-                       state[col] = ~omap_readw(OMAP1_MPUIO_BASE +
-                                                OMAP_MPUIO_KBR_LATCH) & 0xff;
-               }
-               omap_writew(0x00, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC);
-               udelay(2);
+               state[col] = ~omap_readw(OMAP1_MPUIO_BASE +
+                                        OMAP_MPUIO_KBR_LATCH) & 0xff;
        }
+       omap_writew(0x00, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBC);
+       udelay(2);
 }
 
 static void omap_kp_tasklet(unsigned long data)
@@ -222,14 +187,8 @@ static void omap_kp_tasklet(unsigned long data)
                mod_timer(&omap_kp_data->timer, jiffies + delay);
        } else {
                /* enable interrupts */
-               if (cpu_is_omap24xx()) {
-                       int i;
-                       for (i = 0; i < omap_kp_data->rows; i++)
-                               enable_irq(gpio_to_irq(row_gpios[i]));
-               } else {
-                       omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
-                       kp_cur_group = -1;
-               }
+               omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
+               kp_cur_group = -1;
        }
 }
 
@@ -242,6 +201,7 @@ static ssize_t omap_kp_enable_show(struct device *dev,
 static ssize_t omap_kp_enable_store(struct device *dev, struct device_attribute *attr,
                                    const char *buf, size_t count)
 {
+       struct omap_kp *omap_kp = dev_get_drvdata(dev);
        int state;
 
        if (sscanf(buf, "%u", &state) != 1)
@@ -253,9 +213,9 @@ static ssize_t omap_kp_enable_store(struct device *dev, struct device_attribute
        mutex_lock(&kp_enable_mutex);
        if (state != kp_enable) {
                if (state)
-                       enable_irq(INT_KEYBOARD);
+                       enable_irq(omap_kp->irq);
                else
-                       disable_irq(INT_KEYBOARD);
+                       disable_irq(omap_kp->irq);
                kp_enable = state;
        }
        mutex_unlock(&kp_enable_mutex);
@@ -289,7 +249,7 @@ static int __devinit omap_kp_probe(struct platform_device *pdev)
        struct omap_kp *omap_kp;
        struct input_dev *input_dev;
        struct omap_kp_platform_data *pdata =  pdev->dev.platform_data;
-       int i, col_idx, row_idx, irq_idx, ret;
+       int i, col_idx, row_idx, ret;
        unsigned int row_shift, keycodemax;
 
        if (!pdata->rows || !pdata->cols || !pdata->keymap_data) {
@@ -314,8 +274,7 @@ static int __devinit omap_kp_probe(struct platform_device *pdev)
        omap_kp->input = input_dev;
 
        /* Disable the interrupt for the MPUIO keyboard */
-       if (!cpu_is_omap24xx())
-               omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
+       omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
 
        if (pdata->delay)
                omap_kp->delay = pdata->delay;
@@ -328,31 +287,8 @@ static int __devinit omap_kp_probe(struct platform_device *pdev)
        omap_kp->rows = pdata->rows;
        omap_kp->cols = pdata->cols;
 
-       if (cpu_is_omap24xx()) {
-               /* Cols: outputs */
-               for (col_idx = 0; col_idx < omap_kp->cols; col_idx++) {
-                       if (gpio_request(col_gpios[col_idx], "omap_kp_col") < 0) {
-                               printk(KERN_ERR "Failed to request"
-                                      "GPIO%d for keypad\n",
-                                      col_gpios[col_idx]);
-                               goto err1;
-                       }
-                       gpio_direction_output(col_gpios[col_idx], 0);
-               }
-               /* Rows: inputs */
-               for (row_idx = 0; row_idx < omap_kp->rows; row_idx++) {
-                       if (gpio_request(row_gpios[row_idx], "omap_kp_row") < 0) {
-                               printk(KERN_ERR "Failed to request"
-                                      "GPIO%d for keypad\n",
-                                      row_gpios[row_idx]);
-                               goto err2;
-                       }
-                       gpio_direction_input(row_gpios[row_idx]);
-               }
-       } else {
-               col_idx = 0;
-               row_idx = 0;
-       }
+       col_idx = 0;
+       row_idx = 0;
 
        setup_timer(&omap_kp->timer, omap_kp_timer, (unsigned long)omap_kp);
 
@@ -394,27 +330,16 @@ static int __devinit omap_kp_probe(struct platform_device *pdev)
 
        /* scan current status and enable interrupt */
        omap_kp_scan_keypad(omap_kp, keypad_state);
-       if (!cpu_is_omap24xx()) {
-               omap_kp->irq = platform_get_irq(pdev, 0);
-               if (omap_kp->irq >= 0) {
-                       if (request_irq(omap_kp->irq, omap_kp_interrupt, 0,
-                                       "omap-keypad", omap_kp) < 0)
-                               goto err4;
-               }
-               omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
-       } else {
-               for (irq_idx = 0; irq_idx < omap_kp->rows; irq_idx++) {
-                       if (request_irq(gpio_to_irq(row_gpios[irq_idx]),
-                                       omap_kp_interrupt,
-                                       IRQF_TRIGGER_FALLING,
-                                       "omap-keypad", omap_kp) < 0)
-                               goto err5;
-               }
+       omap_kp->irq = platform_get_irq(pdev, 0);
+       if (omap_kp->irq >= 0) {
+               if (request_irq(omap_kp->irq, omap_kp_interrupt, 0,
+                               "omap-keypad", omap_kp) < 0)
+                       goto err4;
        }
+       omap_writew(0, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
+
        return 0;
-err5:
-       for (i = irq_idx - 1; i >=0; i--)
-               free_irq(row_gpios[i], omap_kp);
+
 err4:
        input_unregister_device(omap_kp->input);
        input_dev = NULL;
@@ -423,7 +348,6 @@ err3:
 err2:
        for (i = row_idx - 1; i >=0; i--)
                gpio_free(row_gpios[i]);
-err1:
        for (i = col_idx - 1; i >=0; i--)
                gpio_free(col_gpios[i]);
 
@@ -439,18 +363,8 @@ static int __devexit omap_kp_remove(struct platform_device *pdev)
 
        /* disable keypad interrupt handling */
        tasklet_disable(&kp_tasklet);
-       if (cpu_is_omap24xx()) {
-               int i;
-               for (i = 0; i < omap_kp->cols; i++)
-                       gpio_free(col_gpios[i]);
-               for (i = 0; i < omap_kp->rows; i++) {
-                       gpio_free(row_gpios[i]);
-                       free_irq(gpio_to_irq(row_gpios[i]), omap_kp);
-               }
-       } else {
-               omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
-               free_irq(omap_kp->irq, omap_kp);
-       }
+       omap_writew(1, OMAP1_MPUIO_BASE + OMAP_MPUIO_KBD_MASKIT);
+       free_irq(omap_kp->irq, omap_kp);
 
        del_timer_sync(&omap_kp->timer);
        tasklet_kill(&kp_tasklet);
index f5fbdf9..45887e3 100644 (file)
@@ -27,7 +27,7 @@
 #include <linux/module.h>
 
 #include <asm/mach-types.h>
-#include <plat/board-ams-delta.h>
+#include <mach/board-ams-delta.h>
 
 #include <mach/ams-delta-fiq.h>
 
index 5ec774d..6918773 100644 (file)
@@ -177,6 +177,20 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = {
                },
        },
        {
+               /* Gigabyte T1005 - defines wrong chassis type ("Other") */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "T1005"),
+               },
+       },
+       {
+               /* Gigabyte T1005M/P - defines wrong chassis type ("Other") */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"),
+               },
+       },
+       {
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
                        DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"),
index 0020419..532d067 100644 (file)
@@ -1848,7 +1848,10 @@ static const struct wacom_features wacom_features_0x2A =
        { "Wacom Intuos5 M", WACOM_PKGLEN_INTUOS,  44704, 27940, 2047,
          63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
 static const struct wacom_features wacom_features_0xF4 =
-       { "Wacom Cintiq 24HD",    WACOM_PKGLEN_INTUOS,   104480, 65600, 2047,
+       { "Wacom Cintiq 24HD",       WACOM_PKGLEN_INTUOS,   104480, 65600, 2047,
+         63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
+static const struct wacom_features wacom_features_0xF8 =
+       { "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS,   104480, 65600, 2047,
          63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES };
 static const struct wacom_features wacom_features_0x3F =
        { "Wacom Cintiq 21UX",    WACOM_PKGLEN_INTUOS,    87200, 65600, 1023,
@@ -2091,6 +2094,7 @@ const struct usb_device_id wacom_ids[] = {
        { USB_DEVICE_WACOM(0xEF) },
        { USB_DEVICE_WACOM(0x47) },
        { USB_DEVICE_WACOM(0xF4) },
+       { USB_DEVICE_WACOM(0xF8) },
        { USB_DEVICE_WACOM(0xFA) },
        { USB_DEVICE_LENOVO(0x6004) },
        { }
index 9afc777..b06a5e3 100644 (file)
@@ -602,6 +602,7 @@ edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata)
 {
        if (tsdata->debug_dir)
                debugfs_remove_recursive(tsdata->debug_dir);
+       kfree(tsdata->raw_buffer);
 }
 
 #else
@@ -843,7 +844,6 @@ static int __devexit edt_ft5x06_ts_remove(struct i2c_client *client)
        if (gpio_is_valid(pdata->reset_pin))
                gpio_free(pdata->reset_pin);
 
-       kfree(tsdata->raw_buffer);
        kfree(tsdata);
 
        return 0;
diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
new file mode 100644 (file)
index 0000000..054321d
--- /dev/null
@@ -0,0 +1 @@
+obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o
diff --git a/drivers/irqchip/irq-bcm2835.c b/drivers/irqchip/irq-bcm2835.c
new file mode 100644 (file)
index 0000000..dc670cc
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * Copyright 2010 Broadcom
+ * Copyright 2012 Simon Arlott, Chris Boot, Stephen Warren
+ *
+ * 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.
+ *
+ * Quirk 1: Shortcut interrupts don't set the bank 1/2 register pending bits
+ *
+ * If an interrupt fires on bank 1 that isn't in the shortcuts list, bit 8
+ * on bank 0 is set to signify that an interrupt in bank 1 has fired, and
+ * to look in the bank 1 status register for more information.
+ *
+ * If an interrupt fires on bank 1 that _is_ in the shortcuts list, its
+ * shortcut bit in bank 0 is set as well as its interrupt bit in the bank 1
+ * status register, but bank 0 bit 8 is _not_ set.
+ *
+ * Quirk 2: You can't mask the register 1/2 pending interrupts
+ *
+ * In a proper cascaded interrupt controller, the interrupt lines with
+ * cascaded interrupt controllers on them are just normal interrupt lines.
+ * You can mask the interrupts and get on with things. With this controller
+ * you can't do that.
+ *
+ * Quirk 3: The shortcut interrupts can't be (un)masked in bank 0
+ *
+ * Those interrupts that have shortcuts can only be masked/unmasked in
+ * their respective banks' enable/disable registers. Doing so in the bank 0
+ * enable/disable registers has no effect.
+ *
+ * The FIQ control register:
+ *  Bits 0-6: IRQ (index in order of interrupts from banks 1, 2, then 0)
+ *  Bit    7: Enable FIQ generation
+ *  Bits  8+: Unused
+ *
+ * An interrupt must be disabled before configuring it for FIQ generation
+ * otherwise both handlers will fire at the same time!
+ */
+
+#include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/irqdomain.h>
+#include <linux/irqchip/bcm2835.h>
+
+#include <asm/exception.h>
+
+/* Put the bank and irq (32 bits) into the hwirq */
+#define MAKE_HWIRQ(b, n)       ((b << 5) | (n))
+#define HWIRQ_BANK(i)          (i >> 5)
+#define HWIRQ_BIT(i)           BIT(i & 0x1f)
+
+#define NR_IRQS_BANK0          8
+#define BANK0_HWIRQ_MASK       0xff
+/* Shortcuts can't be disabled so any unknown new ones need to be masked */
+#define SHORTCUT1_MASK         0x00007c00
+#define SHORTCUT2_MASK         0x001f8000
+#define SHORTCUT_SHIFT         10
+#define BANK1_HWIRQ            BIT(8)
+#define BANK2_HWIRQ            BIT(9)
+#define BANK0_VALID_MASK       (BANK0_HWIRQ_MASK | BANK1_HWIRQ | BANK2_HWIRQ \
+                                       | SHORTCUT1_MASK | SHORTCUT2_MASK)
+
+#define REG_FIQ_CONTROL                0x0c
+
+#define NR_BANKS               3
+#define IRQS_PER_BANK          32
+
+static int reg_pending[] __initconst = { 0x00, 0x04, 0x08 };
+static int reg_enable[] __initconst = { 0x18, 0x10, 0x14 };
+static int reg_disable[] __initconst = { 0x24, 0x1c, 0x20 };
+static int bank_irqs[] __initconst = { 8, 32, 32 };
+
+static const int shortcuts[] = {
+       7, 9, 10, 18, 19,               /* Bank 1 */
+       21, 22, 23, 24, 25, 30          /* Bank 2 */
+};
+
+struct armctrl_ic {
+       void __iomem *base;
+       void __iomem *pending[NR_BANKS];
+       void __iomem *enable[NR_BANKS];
+       void __iomem *disable[NR_BANKS];
+       struct irq_domain *domain;
+};
+
+static struct armctrl_ic intc __read_mostly;
+
+static void armctrl_mask_irq(struct irq_data *d)
+{
+       writel_relaxed(HWIRQ_BIT(d->hwirq), intc.disable[HWIRQ_BANK(d->hwirq)]);
+}
+
+static void armctrl_unmask_irq(struct irq_data *d)
+{
+       writel_relaxed(HWIRQ_BIT(d->hwirq), intc.enable[HWIRQ_BANK(d->hwirq)]);
+}
+
+static struct irq_chip armctrl_chip = {
+       .name = "ARMCTRL-level",
+       .irq_mask = armctrl_mask_irq,
+       .irq_unmask = armctrl_unmask_irq
+};
+
+static int armctrl_xlate(struct irq_domain *d, struct device_node *ctrlr,
+       const u32 *intspec, unsigned int intsize,
+       unsigned long *out_hwirq, unsigned int *out_type)
+{
+       if (WARN_ON(intsize != 2))
+               return -EINVAL;
+
+       if (WARN_ON(intspec[0] >= NR_BANKS))
+               return -EINVAL;
+
+       if (WARN_ON(intspec[1] >= IRQS_PER_BANK))
+               return -EINVAL;
+
+       if (WARN_ON(intspec[0] == 0 && intspec[1] >= NR_IRQS_BANK0))
+               return -EINVAL;
+
+       *out_hwirq = MAKE_HWIRQ(intspec[0], intspec[1]);
+       *out_type = IRQ_TYPE_NONE;
+       return 0;
+}
+
+static struct irq_domain_ops armctrl_ops = {
+       .xlate = armctrl_xlate
+};
+
+static int __init armctrl_of_init(struct device_node *node,
+       struct device_node *parent)
+{
+       void __iomem *base;
+       int irq, b, i;
+
+       base = of_iomap(node, 0);
+       if (!base)
+               panic("%s: unable to map IC registers\n",
+                       node->full_name);
+
+       intc.domain = irq_domain_add_linear(node, MAKE_HWIRQ(NR_BANKS, 0),
+                       &armctrl_ops, NULL);
+       if (!intc.domain)
+               panic("%s: unable to create IRQ domain\n", node->full_name);
+
+       for (b = 0; b < NR_BANKS; b++) {
+               intc.pending[b] = base + reg_pending[b];
+               intc.enable[b] = base + reg_enable[b];
+               intc.disable[b] = base + reg_disable[b];
+
+               for (i = 0; i < bank_irqs[b]; i++) {
+                       irq = irq_create_mapping(intc.domain, MAKE_HWIRQ(b, i));
+                       BUG_ON(irq <= 0);
+                       irq_set_chip_and_handler(irq, &armctrl_chip,
+                               handle_level_irq);
+                       set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
+               }
+       }
+       return 0;
+}
+
+static struct of_device_id irq_of_match[] __initconst = {
+       { .compatible = "brcm,bcm2835-armctrl-ic", .data = armctrl_of_init }
+};
+
+void __init bcm2835_init_irq(void)
+{
+       of_irq_init(irq_of_match);
+}
+
+/*
+ * Handle each interrupt across the entire interrupt controller.  This reads the
+ * status register before handling each interrupt, which is necessary given that
+ * handle_IRQ may briefly re-enable interrupts for soft IRQ handling.
+ */
+
+static void armctrl_handle_bank(int bank, struct pt_regs *regs)
+{
+       u32 stat, irq;
+
+       while ((stat = readl_relaxed(intc.pending[bank]))) {
+               irq = MAKE_HWIRQ(bank, ffs(stat) - 1);
+               handle_IRQ(irq_linear_revmap(intc.domain, irq), regs);
+       }
+}
+
+static void armctrl_handle_shortcut(int bank, struct pt_regs *regs,
+       u32 stat)
+{
+       u32 irq = MAKE_HWIRQ(bank, shortcuts[ffs(stat >> SHORTCUT_SHIFT) - 1]);
+       handle_IRQ(irq_linear_revmap(intc.domain, irq), regs);
+}
+
+asmlinkage void __exception_irq_entry bcm2835_handle_irq(
+       struct pt_regs *regs)
+{
+       u32 stat, irq;
+
+       while ((stat = readl_relaxed(intc.pending[0]) & BANK0_VALID_MASK)) {
+               if (stat & BANK0_HWIRQ_MASK) {
+                       irq = MAKE_HWIRQ(0, ffs(stat & BANK0_HWIRQ_MASK) - 1);
+                       handle_IRQ(irq_linear_revmap(intc.domain, irq), regs);
+               } else if (stat & SHORTCUT1_MASK) {
+                       armctrl_handle_shortcut(1, regs, stat & SHORTCUT1_MASK);
+               } else if (stat & SHORTCUT2_MASK) {
+                       armctrl_handle_shortcut(2, regs, stat & SHORTCUT2_MASK);
+               } else if (stat & BANK1_HWIRQ) {
+                       armctrl_handle_bank(1, regs);
+               } else if (stat & BANK2_HWIRQ) {
+                       armctrl_handle_bank(2, regs);
+               } else {
+                       BUG();
+               }
+       }
+}
index 38c4bd8..c679867 100644 (file)
@@ -234,7 +234,8 @@ static struct capiminor *capiminor_alloc(struct capi20_appl *ap, u32 ncci)
 
        mp->minor = minor;
 
-       dev = tty_register_device(capinc_tty_driver, minor, NULL);
+       dev = tty_port_register_device(&mp->port, capinc_tty_driver, minor,
+                       NULL);
        if (IS_ERR(dev))
                goto err_out2;
 
index a6d9fd2..67abf3f 100644 (file)
@@ -446,8 +446,8 @@ static void if_set_termios(struct tty_struct *tty, struct ktermios *old)
                goto out;
        }
 
-       iflag = tty->termios->c_iflag;
-       cflag = tty->termios->c_cflag;
+       iflag = tty->termios.c_iflag;
+       cflag = tty->termios.c_cflag;
        old_cflag = old ? old->c_cflag : cflag;
        gig_dbg(DEBUG_IF, "%u: iflag %x cflag %x old %x",
                cs->minor_index, iflag, cflag, old_cflag);
@@ -524,7 +524,8 @@ void gigaset_if_init(struct cardstate *cs)
        tasklet_init(&cs->if_wake_tasklet, if_wake, (unsigned long) cs);
 
        mutex_lock(&cs->mutex);
-       cs->tty_dev = tty_register_device(drv->tty, cs->minor_index, NULL);
+       cs->tty_dev = tty_port_register_device(&cs->port, drv->tty,
+                       cs->minor_index, NULL);
 
        if (!IS_ERR(cs->tty_dev))
                dev_set_drvdata(cs->tty_dev, cs);
index fa6ca47..dceaec8 100644 (file)
@@ -857,8 +857,9 @@ avm_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
        switch (cmd) {
        case CLOSE_CHANNEL:
                test_and_clear_bit(FLG_OPEN, &bch->Flags);
+               cancel_work_sync(&bch->workq);
                spin_lock_irqsave(&fc->lock, flags);
-               mISDN_freebchannel(bch);
+               mISDN_clear_bchannel(bch);
                modehdlc(bch, ISDN_P_NONE);
                spin_unlock_irqrestore(&fc->lock, flags);
                ch->protocol = ISDN_P_NONE;
index 5e402cf..f027942 100644 (file)
@@ -5059,6 +5059,7 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
                                printk(KERN_INFO
                                       "HFC-E1 #%d has overlapping B-channels on fragment #%d\n",
                                       E1_cnt + 1, pt);
+                               kfree(hc);
                                return -EINVAL;
                        }
                        maskcheck |= hc->bmask[pt];
@@ -5086,6 +5087,7 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev,
        if ((poll >> 1) > sizeof(hc->silence_data)) {
                printk(KERN_ERR "HFCMULTI error: silence_data too small, "
                       "please fix\n");
+               kfree(hc);
                return -EINVAL;
        }
        for (i = 0; i < (poll >> 1); i++)
index 752e082..ccd7d85 100644 (file)
@@ -1406,8 +1406,9 @@ hscx_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
        switch (cmd) {
        case CLOSE_CHANNEL:
                test_and_clear_bit(FLG_OPEN, &bch->Flags);
+               cancel_work_sync(&bch->workq);
                spin_lock_irqsave(hx->ip->hwlock, flags);
-               mISDN_freebchannel(bch);
+               mISDN_clear_bchannel(bch);
                hscx_mode(hx, ISDN_P_NONE);
                spin_unlock_irqrestore(hx->ip->hwlock, flags);
                ch->protocol = ISDN_P_NONE;
index be5973d..182ecf0 100644 (file)
@@ -1588,8 +1588,9 @@ isar_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
        switch (cmd) {
        case CLOSE_CHANNEL:
                test_and_clear_bit(FLG_OPEN, &bch->Flags);
+               cancel_work_sync(&bch->workq);
                spin_lock_irqsave(ich->is->hwlock, flags);
-               mISDN_freebchannel(bch);
+               mISDN_clear_bchannel(bch);
                modeisar(ich, ISDN_P_NONE);
                spin_unlock_irqrestore(ich->is->hwlock, flags);
                ch->protocol = ISDN_P_NONE;
index c3e3e76..9bcade5 100644 (file)
@@ -812,8 +812,9 @@ nj_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
        switch (cmd) {
        case CLOSE_CHANNEL:
                test_and_clear_bit(FLG_OPEN, &bch->Flags);
+               cancel_work_sync(&bch->workq);
                spin_lock_irqsave(&card->lock, flags);
-               mISDN_freebchannel(bch);
+               mISDN_clear_bchannel(bch);
                mode_tiger(bc, ISDN_P_NONE);
                spin_unlock_irqrestore(&card->lock, flags);
                ch->protocol = ISDN_P_NONE;
index 26a86b8..335fe64 100644 (file)
@@ -1054,8 +1054,9 @@ w6692_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
        switch (cmd) {
        case CLOSE_CHANNEL:
                test_and_clear_bit(FLG_OPEN, &bch->Flags);
+               cancel_work_sync(&bch->workq);
                spin_lock_irqsave(&card->lock, flags);
-               mISDN_freebchannel(bch);
+               mISDN_clear_bchannel(bch);
                w6692_mode(bc, ISDN_P_NONE);
                spin_unlock_irqrestore(&card->lock, flags);
                ch->protocol = ISDN_P_NONE;
index 7bc5067..b817809 100644 (file)
@@ -1009,15 +1009,15 @@ isdn_tty_change_speed(modem_info *info)
                quot;
        int i;
 
-       if (!port->tty || !port->tty->termios)
+       if (!port->tty)
                return;
-       cflag = port->tty->termios->c_cflag;
+       cflag = port->tty->termios.c_cflag;
 
        quot = i = cflag & CBAUD;
        if (i & CBAUDEX) {
                i &= ~CBAUDEX;
                if (i < 1 || i > 2)
-                       port->tty->termios->c_cflag &= ~CBAUDEX;
+                       port->tty->termios.c_cflag &= ~CBAUDEX;
                else
                        i += 15;
        }
@@ -1097,7 +1097,7 @@ isdn_tty_shutdown(modem_info *info)
 #endif
        isdn_unlock_drivers();
        info->msr &= ~UART_MSR_RI;
-       if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) {
+       if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) {
                info->mcr &= ~(UART_MCR_DTR | UART_MCR_RTS);
                if (info->emu.mdmreg[REG_DTRHUP] & BIT_DTRHUP) {
                        isdn_tty_modem_reset_regs(info, 0);
@@ -1469,13 +1469,13 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
        if (!old_termios)
                isdn_tty_change_speed(info);
        else {
-               if (tty->termios->c_cflag == old_termios->c_cflag &&
-                   tty->termios->c_ispeed == old_termios->c_ispeed &&
-                   tty->termios->c_ospeed == old_termios->c_ospeed)
+               if (tty->termios.c_cflag == old_termios->c_cflag &&
+                   tty->termios.c_ispeed == old_termios->c_ispeed &&
+                   tty->termios.c_ospeed == old_termios->c_ospeed)
                        return;
                isdn_tty_change_speed(info);
                if ((old_termios->c_cflag & CRTSCTS) &&
-                   !(tty->termios->c_cflag & CRTSCTS))
+                   !(tty->termios.c_cflag & CRTSCTS))
                        tty->hw_stopped = 0;
        }
 }
@@ -1486,6 +1486,18 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
  * ------------------------------------------------------------
  */
 
+static int isdn_tty_install(struct tty_driver *driver, struct tty_struct *tty)
+{
+       modem_info *info = &dev->mdm.info[tty->index];
+
+       if (isdn_tty_paranoia_check(info, tty->name, __func__))
+               return -ENODEV;
+
+       tty->driver_data = info;
+
+       return tty_port_install(&info->port, driver, tty);
+}
+
 /*
  * This routine is called whenever a serial port is opened.  It
  * enables interrupts for a serial port, linking in its async structure into
@@ -1495,22 +1507,16 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 static int
 isdn_tty_open(struct tty_struct *tty, struct file *filp)
 {
-       struct tty_port *port;
-       modem_info *info;
+       modem_info *info = tty->driver_data;
+       struct tty_port *port = &info->port;
        int retval;
 
-       info = &dev->mdm.info[tty->index];
-       if (isdn_tty_paranoia_check(info, tty->name, "isdn_tty_open"))
-               return -ENODEV;
-       port = &info->port;
 #ifdef ISDN_DEBUG_MODEM_OPEN
        printk(KERN_DEBUG "isdn_tty_open %s, count = %d\n", tty->name,
               port->count);
 #endif
        port->count++;
-       tty->driver_data = info;
        port->tty = tty;
-       tty->port = port;
        /*
         * Start up serial port
         */
@@ -1738,6 +1744,7 @@ modem_write_profile(atemu *m)
 }
 
 static const struct tty_operations modem_ops = {
+       .install = isdn_tty_install,
        .open = isdn_tty_open,
        .close = isdn_tty_close,
        .write = isdn_tty_write,
@@ -1782,7 +1789,7 @@ isdn_tty_modem_init(void)
        m->tty_modem->subtype = SERIAL_TYPE_NORMAL;
        m->tty_modem->init_termios = tty_std_termios;
        m->tty_modem->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL;
-       m->tty_modem->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
+       m->tty_modem->flags = TTY_DRIVER_REAL_RAW;
        m->tty_modem->driver_name = "isdn_tty";
        tty_set_operations(m->tty_modem, &modem_ops);
        retval = tty_register_driver(m->tty_modem);
index ef34fd4..2602be2 100644 (file)
@@ -148,17 +148,16 @@ mISDN_clear_bchannel(struct bchannel *ch)
        ch->next_minlen = ch->init_minlen;
        ch->maxlen = ch->init_maxlen;
        ch->next_maxlen = ch->init_maxlen;
+       skb_queue_purge(&ch->rqueue);
+       ch->rcount = 0;
 }
 EXPORT_SYMBOL(mISDN_clear_bchannel);
 
-int
+void
 mISDN_freebchannel(struct bchannel *ch)
 {
+       cancel_work_sync(&ch->workq);
        mISDN_clear_bchannel(ch);
-       skb_queue_purge(&ch->rqueue);
-       ch->rcount = 0;
-       flush_work_sync(&ch->workq);
-       return 0;
 }
 EXPORT_SYMBOL(mISDN_freebchannel);
 
index 88cf9d9..409da0f 100644 (file)
@@ -44,6 +44,7 @@
 #include <media/v4l2-device.h>
 #include <media/v4l2-ioctl.h>
 
+#include <plat/cpu.h>
 #include <plat/dma.h>
 #include <plat/vrfb.h>
 #include <video/omapdss.h>
index 1c34763..43e61fe 100644 (file)
@@ -70,6 +70,8 @@
 #include <media/v4l2-common.h>
 #include <media/v4l2-device.h>
 
+#include <plat/cpu.h>
+
 #include "isp.h"
 #include "ispreg.h"
 #include "ispccdc.h"
index b67a301..ce229ea 100644 (file)
@@ -470,7 +470,8 @@ static int __devinit device_800_init(struct pm80x_chip *chip,
 
        ret =
            mfd_add_devices(chip->dev, 0, &onkey_devs[0],
-                           ARRAY_SIZE(onkey_devs), &onkey_resources[0], 0);
+                           ARRAY_SIZE(onkey_devs), &onkey_resources[0], 0,
+                           NULL);
        if (ret < 0) {
                dev_err(chip->dev, "Failed to add onkey subdev\n");
                goto out_dev;
@@ -481,7 +482,7 @@ static int __devinit device_800_init(struct pm80x_chip *chip,
                rtc_devs[0].platform_data = pdata->rtc;
                rtc_devs[0].pdata_size = sizeof(struct pm80x_rtc_pdata);
                ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0],
-                                     ARRAY_SIZE(rtc_devs), NULL, 0);
+                                     ARRAY_SIZE(rtc_devs), NULL, 0, NULL);
                if (ret < 0) {
                        dev_err(chip->dev, "Failed to add rtc subdev\n");
                        goto out_dev;
index 6146583..c20a311 100644 (file)
@@ -216,7 +216,8 @@ static int __devinit device_805_init(struct pm80x_chip *chip)
        }
 
        ret = mfd_add_devices(chip->dev, 0, &codec_devs[0],
-                             ARRAY_SIZE(codec_devs), &codec_resources[0], 0);
+                             ARRAY_SIZE(codec_devs), &codec_resources[0], 0,
+                             NULL);
        if (ret < 0) {
                dev_err(chip->dev, "Failed to add codec subdev\n");
                goto out_codec;
index d09918c..b73f033 100644 (file)
@@ -637,7 +637,7 @@ static void __devinit device_bk_init(struct pm860x_chip *chip,
                        bk_devs[i].resources = &bk_resources[j];
                        ret = mfd_add_devices(chip->dev, 0,
                                              &bk_devs[i], 1,
-                                             &bk_resources[j], 0);
+                                             &bk_resources[j], 0, NULL);
                        if (ret < 0) {
                                dev_err(chip->dev, "Failed to add "
                                        "backlight subdev\n");
@@ -672,7 +672,7 @@ static void __devinit device_led_init(struct pm860x_chip *chip,
                        led_devs[i].resources = &led_resources[j],
                        ret = mfd_add_devices(chip->dev, 0,
                                              &led_devs[i], 1,
-                                             &led_resources[j], 0);
+                                             &led_resources[j], 0, NULL);
                        if (ret < 0) {
                                dev_err(chip->dev, "Failed to add "
                                        "led subdev\n");
@@ -709,7 +709,7 @@ static void __devinit device_regulator_init(struct pm860x_chip *chip,
                regulator_devs[i].resources = &regulator_resources[seq];
 
                ret = mfd_add_devices(chip->dev, 0, &regulator_devs[i], 1,
-                                     &regulator_resources[seq], 0);
+                                     &regulator_resources[seq], 0, NULL);
                if (ret < 0) {
                        dev_err(chip->dev, "Failed to add regulator subdev\n");
                        goto out;
@@ -733,7 +733,7 @@ static void __devinit device_rtc_init(struct pm860x_chip *chip,
        rtc_devs[0].resources = &rtc_resources[0];
        ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0],
                              ARRAY_SIZE(rtc_devs), &rtc_resources[0],
-                             chip->irq_base);
+                             chip->irq_base, NULL);
        if (ret < 0)
                dev_err(chip->dev, "Failed to add rtc subdev\n");
 }
@@ -752,7 +752,7 @@ static void __devinit device_touch_init(struct pm860x_chip *chip,
        touch_devs[0].resources = &touch_resources[0];
        ret = mfd_add_devices(chip->dev, 0, &touch_devs[0],
                              ARRAY_SIZE(touch_devs), &touch_resources[0],
-                             chip->irq_base);
+                             chip->irq_base, NULL);
        if (ret < 0)
                dev_err(chip->dev, "Failed to add touch subdev\n");
 }
@@ -770,7 +770,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
        power_devs[0].num_resources = ARRAY_SIZE(battery_resources);
        power_devs[0].resources = &battery_resources[0],
        ret = mfd_add_devices(chip->dev, 0, &power_devs[0], 1,
-                             &battery_resources[0], chip->irq_base);
+                             &battery_resources[0], chip->irq_base, NULL);
        if (ret < 0)
                dev_err(chip->dev, "Failed to add battery subdev\n");
 
@@ -779,7 +779,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
        power_devs[1].num_resources = ARRAY_SIZE(charger_resources);
        power_devs[1].resources = &charger_resources[0],
        ret = mfd_add_devices(chip->dev, 0, &power_devs[1], 1,
-                             &charger_resources[0], chip->irq_base);
+                             &charger_resources[0], chip->irq_base, NULL);
        if (ret < 0)
                dev_err(chip->dev, "Failed to add charger subdev\n");
 
@@ -788,7 +788,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip,
        power_devs[2].num_resources = ARRAY_SIZE(preg_resources);
        power_devs[2].resources = &preg_resources[0],
        ret = mfd_add_devices(chip->dev, 0, &power_devs[2], 1,
-                             &preg_resources[0], chip->irq_base);
+                             &preg_resources[0], chip->irq_base, NULL);
        if (ret < 0)
                dev_err(chip->dev, "Failed to add preg subdev\n");
 }
@@ -802,7 +802,7 @@ static void __devinit device_onkey_init(struct pm860x_chip *chip,
        onkey_devs[0].resources = &onkey_resources[0],
        ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0],
                              ARRAY_SIZE(onkey_devs), &onkey_resources[0],
-                             chip->irq_base);
+                             chip->irq_base, NULL);
        if (ret < 0)
                dev_err(chip->dev, "Failed to add onkey subdev\n");
 }
@@ -815,7 +815,8 @@ static void __devinit device_codec_init(struct pm860x_chip *chip,
        codec_devs[0].num_resources = ARRAY_SIZE(codec_resources);
        codec_devs[0].resources = &codec_resources[0],
        ret = mfd_add_devices(chip->dev, 0, &codec_devs[0],
-                             ARRAY_SIZE(codec_devs), &codec_resources[0], 0);
+                             ARRAY_SIZE(codec_devs), &codec_resources[0], 0,
+                             NULL);
        if (ret < 0)
                dev_err(chip->dev, "Failed to add codec subdev\n");
 }
index 44a3fdb..f1beb49 100644 (file)
@@ -424,7 +424,7 @@ static int aat2870_i2c_probe(struct i2c_client *client,
        }
 
        ret = mfd_add_devices(aat2870->dev, 0, aat2870_devs,
-                             ARRAY_SIZE(aat2870_devs), NULL, 0);
+                             ARRAY_SIZE(aat2870_devs), NULL, 0, NULL);
        if (ret != 0) {
                dev_err(aat2870->dev, "Failed to add subdev: %d\n", ret);
                goto out_disable;
index 78fca29..01781ae 100644 (file)
@@ -946,7 +946,7 @@ static int __devinit ab3100_probe(struct i2c_client *client,
        }
 
        err = mfd_add_devices(&client->dev, 0, ab3100_devs,
-               ARRAY_SIZE(ab3100_devs), NULL, 0);
+                             ARRAY_SIZE(ab3100_devs), NULL, 0, NULL);
 
        ab3100_setup_debugfs(ab3100);
 
index 626b4ec..47adf80 100644 (file)
@@ -1418,25 +1418,25 @@ static int __devinit ab8500_probe(struct platform_device *pdev)
 
        ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs,
                        ARRAY_SIZE(abx500_common_devs), NULL,
-                       ab8500->irq_base);
+                       ab8500->irq_base, ab8500->domain);
        if (ret)
                goto out_freeirq;
 
        if (is_ab9540(ab8500))
                ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs,
                                ARRAY_SIZE(ab9540_devs), NULL,
-                               ab8500->irq_base);
+                               ab8500->irq_base, ab8500->domain);
        else
                ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs,
                                ARRAY_SIZE(ab8500_devs), NULL,
-                               ab8500->irq_base);
+                               ab8500->irq_base, ab8500->domain);
        if (ret)
                goto out_freeirq;
 
        if (is_ab9540(ab8500) || is_ab8505(ab8500))
                ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs,
                                ARRAY_SIZE(ab9540_ab8505_devs), NULL,
-                               ab8500->irq_base);
+                               ab8500->irq_base, ab8500->domain);
        if (ret)
                goto out_freeirq;
 
@@ -1444,7 +1444,7 @@ static int __devinit ab8500_probe(struct platform_device *pdev)
                /* Add battery management devices */
                ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs,
                                      ARRAY_SIZE(ab8500_bm_devs), NULL,
-                                     ab8500->irq_base);
+                                     ab8500->irq_base, ab8500->domain);
                if (ret)
                        dev_err(ab8500->dev, "error adding bm devices\n");
        }
index c7983e8..1b48f20 100644 (file)
@@ -316,7 +316,7 @@ int __devinit arizona_dev_init(struct arizona *arizona)
        }
 
        ret = mfd_add_devices(arizona->dev, -1, early_devs,
-                             ARRAY_SIZE(early_devs), NULL, 0);
+                             ARRAY_SIZE(early_devs), NULL, 0, NULL);
        if (ret != 0) {
                dev_err(dev, "Failed to add early children: %d\n", ret);
                return ret;
@@ -516,11 +516,11 @@ int __devinit arizona_dev_init(struct arizona *arizona)
        switch (arizona->type) {
        case WM5102:
                ret = mfd_add_devices(arizona->dev, -1, wm5102_devs,
-                                     ARRAY_SIZE(wm5102_devs), NULL, 0);
+                                     ARRAY_SIZE(wm5102_devs), NULL, 0, NULL);
                break;
        case WM5110:
                ret = mfd_add_devices(arizona->dev, -1, wm5110_devs,
-                                     ARRAY_SIZE(wm5102_devs), NULL, 0);
+                                     ARRAY_SIZE(wm5102_devs), NULL, 0, NULL);
                break;
        }
 
index 683e18a..62f0883 100644 (file)
@@ -913,14 +913,14 @@ static int __init asic3_mfd_probe(struct platform_device *pdev,
        if (pdata->clock_rate) {
                ds1wm_pdata.clock_rate = pdata->clock_rate;
                ret = mfd_add_devices(&pdev->dev, pdev->id,
-                       &asic3_cell_ds1wm, 1, mem, asic->irq_base);
+                       &asic3_cell_ds1wm, 1, mem, asic->irq_base, NULL);
                if (ret < 0)
                        goto out;
        }
 
        if (mem_sdio && (irq >= 0)) {
                ret = mfd_add_devices(&pdev->dev, pdev->id,
-                       &asic3_cell_mmc, 1, mem_sdio, irq);
+                       &asic3_cell_mmc, 1, mem_sdio, irq, NULL);
                if (ret < 0)
                        goto out;
        }
@@ -934,7 +934,7 @@ static int __init asic3_mfd_probe(struct platform_device *pdev,
                        asic3_cell_leds[i].pdata_size = sizeof(pdata->leds[i]);
                }
                ret = mfd_add_devices(&pdev->dev, 0,
-                       asic3_cell_leds, ASIC3_NUM_LEDS, NULL, 0);
+                       asic3_cell_leds, ASIC3_NUM_LEDS, NULL, 0, NULL);
        }
 
  out:
index 3419e72..2b28213 100644 (file)
@@ -149,7 +149,7 @@ static int __devinit cs5535_mfd_probe(struct pci_dev *pdev,
        }
 
        err = mfd_add_devices(&pdev->dev, -1, cs5535_mfd_cells,
-                       ARRAY_SIZE(cs5535_mfd_cells), NULL, 0);
+                             ARRAY_SIZE(cs5535_mfd_cells), NULL, 0, NULL);
        if (err) {
                dev_err(&pdev->dev, "MFD add devices failed: %d\n", err);
                goto err_disable;
index 2544910..a0a62b2 100644 (file)
@@ -803,7 +803,7 @@ int __devinit da9052_device_init(struct da9052 *da9052, u8 chip_id)
                dev_err(da9052->dev, "DA9052 ADC IRQ failed ret=%d\n", ret);
 
        ret = mfd_add_devices(da9052->dev, -1, da9052_subdev_info,
-                             ARRAY_SIZE(da9052_subdev_info), NULL, 0);
+                             ARRAY_SIZE(da9052_subdev_info), NULL, 0, NULL);
        if (ret)
                goto err;
 
index 4e2af2c..45e83a6 100644 (file)
@@ -129,7 +129,7 @@ static int __init davinci_vc_probe(struct platform_device *pdev)
        cell->pdata_size = sizeof(*davinci_vc);
 
        ret = mfd_add_devices(&pdev->dev, pdev->id, davinci_vc->cells,
-                             DAVINCI_VC_CELLS, NULL, 0);
+                             DAVINCI_VC_CELLS, NULL, 0, NULL);
        if (ret != 0) {
                dev_err(&pdev->dev, "fail to register client devices\n");
                goto fail4;
index 7040a00..6b67edb 100644 (file)
@@ -418,6 +418,9 @@ static struct {
 
 static atomic_t ac_wake_req_state = ATOMIC_INIT(0);
 
+/* Functions definition */
+static void compute_armss_rate(void);
+
 /* Spinlocks */
 static DEFINE_SPINLOCK(prcmu_lock);
 static DEFINE_SPINLOCK(clkout_lock);
@@ -517,6 +520,7 @@ static struct dsiescclk dsiescclk[3] = {
        }
 };
 
+
 /*
 * Used by MCDE to setup all necessary PRCMU registers
 */
@@ -1013,6 +1017,7 @@ int db8500_prcmu_set_arm_opp(u8 opp)
                (mb1_transfer.ack.arm_opp != opp))
                r = -EIO;
 
+       compute_armss_rate();
        mutex_unlock(&mb1_transfer.lock);
 
        return r;
@@ -1612,6 +1617,7 @@ static unsigned long pll_rate(void __iomem *reg, unsigned long src_rate,
        if ((branch == PLL_FIX) || ((branch == PLL_DIV) &&
                (val & PRCM_PLL_FREQ_DIV2EN) &&
                ((reg == PRCM_PLLSOC0_FREQ) ||
+                (reg == PRCM_PLLARM_FREQ) ||
                 (reg == PRCM_PLLDDR_FREQ))))
                div *= 2;
 
@@ -1661,6 +1667,39 @@ static unsigned long clock_rate(u8 clock)
        else
                return 0;
 }
+static unsigned long latest_armss_rate;
+static unsigned long armss_rate(void)
+{
+       return latest_armss_rate;
+}
+
+static void compute_armss_rate(void)
+{
+       u32 r;
+       unsigned long rate;
+
+       r = readl(PRCM_ARM_CHGCLKREQ);
+
+       if (r & PRCM_ARM_CHGCLKREQ_PRCM_ARM_CHGCLKREQ) {
+               /* External ARMCLKFIX clock */
+
+               rate = pll_rate(PRCM_PLLDDR_FREQ, ROOT_CLOCK_RATE, PLL_FIX);
+
+               /* Check PRCM_ARM_CHGCLKREQ divider */
+               if (!(r & PRCM_ARM_CHGCLKREQ_PRCM_ARM_DIVSEL))
+                       rate /= 2;
+
+               /* Check PRCM_ARMCLKFIX_MGT divider */
+               r = readl(PRCM_ARMCLKFIX_MGT);
+               r &= PRCM_CLK_MGT_CLKPLLDIV_MASK;
+               rate /= r;
+
+       } else {/* ARM PLL */
+               rate = pll_rate(PRCM_PLLARM_FREQ, ROOT_CLOCK_RATE, PLL_DIV);
+       }
+
+       latest_armss_rate = rate;
+}
 
 static unsigned long dsiclk_rate(u8 n)
 {
@@ -1707,6 +1746,8 @@ unsigned long prcmu_clock_rate(u8 clock)
                return pll_rate(PRCM_PLLSOC0_FREQ, ROOT_CLOCK_RATE, PLL_RAW);
        else if (clock == PRCMU_PLLSOC1)
                return pll_rate(PRCM_PLLSOC1_FREQ, ROOT_CLOCK_RATE, PLL_RAW);
+       else if (clock == PRCMU_ARMSS)
+               return armss_rate();
        else if (clock == PRCMU_PLLDDR)
                return pll_rate(PRCM_PLLDDR_FREQ, ROOT_CLOCK_RATE, PLL_RAW);
        else if (clock == PRCMU_PLLDSI)
@@ -2693,6 +2734,7 @@ void __init db8500_prcmu_early_init(void)
                                         handle_simple_irq);
                set_irq_flags(irq, IRQF_VALID);
        }
+       compute_armss_rate();
 }
 
 static void __init init_prcm_registers(void)
@@ -3010,7 +3052,7 @@ static int __devinit db8500_prcmu_probe(struct platform_device *pdev)
                prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET);
 
        err = mfd_add_devices(&pdev->dev, 0, db8500_prcmu_devs,
-                       ARRAY_SIZE(db8500_prcmu_devs), NULL, 0);
+                             ARRAY_SIZE(db8500_prcmu_devs), NULL, 0, NULL);
        if (err) {
                pr_err("prcmu: Failed to add subdevices\n");
                return err;
index 23108a6..79c76eb 100644 (file)
@@ -61,7 +61,8 @@
 #define PRCM_PLLARM_LOCKP_PRCM_PLLARM_LOCKP3   0x2
 
 #define PRCM_ARM_CHGCLKREQ     (_PRCMU_BASE + 0x114)
-#define PRCM_ARM_CHGCLKREQ_PRCM_ARM_CHGCLKREQ  0x1
+#define PRCM_ARM_CHGCLKREQ_PRCM_ARM_CHGCLKREQ  BIT(0)
+#define PRCM_ARM_CHGCLKREQ_PRCM_ARM_DIVSEL     BIT(16)
 
 #define PRCM_PLLARM_ENABLE     (_PRCMU_BASE + 0x98)
 #define PRCM_PLLARM_ENABLE_PRCM_PLLARM_ENABLE  0x1
 /* PRCMU clock/PLL/reset registers */
 #define PRCM_PLLSOC0_FREQ         (_PRCMU_BASE + 0x080)
 #define PRCM_PLLSOC1_FREQ         (_PRCMU_BASE + 0x084)
+#define PRCM_PLLARM_FREQ          (_PRCMU_BASE + 0x088)
 #define PRCM_PLLDDR_FREQ          (_PRCMU_BASE + 0x08C)
 #define PRCM_PLL_FREQ_D_SHIFT  0
 #define PRCM_PLL_FREQ_D_MASK   BITS(0, 7)
index 04c7093..9e5453d 100644 (file)
@@ -168,7 +168,7 @@ static int __init pasic3_probe(struct platform_device *pdev)
                /* the first 5 PASIC3 registers control the DS1WM */
                ds1wm_resources[0].end = (5 << asic->bus_shift) - 1;
                ret = mfd_add_devices(&pdev->dev, pdev->id,
-                               &ds1wm_cell, 1, r, irq);
+                                     &ds1wm_cell, 1, r, irq, NULL);
                if (ret < 0)
                        dev_warn(dev, "failed to register DS1WM\n");
        }
@@ -176,7 +176,8 @@ static int __init pasic3_probe(struct platform_device *pdev)
        if (pdata && pdata->led_pdata) {
                led_cell.platform_data = pdata->led_pdata;
                led_cell.pdata_size = sizeof(struct pasic3_leds_machinfo);
-               ret = mfd_add_devices(&pdev->dev, pdev->id, &led_cell, 1, r, 0);
+               ret = mfd_add_devices(&pdev->dev, pdev->id, &led_cell, 1, r,
+                                     0, NULL);
                if (ret < 0)
                        dev_warn(dev, "failed to register LED device\n");
        }
index 59df558..266bdc5 100644 (file)
@@ -344,13 +344,13 @@ static int __devinit intel_msic_init_devices(struct intel_msic *msic)
                        continue;
 
                ret = mfd_add_devices(&pdev->dev, -1, &msic_devs[i], 1, NULL,
-                                     pdata->irq[i]);
+                                     pdata->irq[i], NULL);
                if (ret)
                        goto fail;
        }
 
        ret = mfd_add_devices(&pdev->dev, 0, msic_other_devs,
-                             ARRAY_SIZE(msic_other_devs), NULL, 0);
+                             ARRAY_SIZE(msic_other_devs), NULL, 0, NULL);
        if (ret)
                goto fail;
 
index 2ea9998..965c480 100644 (file)
@@ -147,7 +147,7 @@ static int __devinit cmodio_probe_submodules(struct cmodio_device *priv)
        }
 
        return mfd_add_devices(&pdev->dev, 0, priv->cells,
-                              num_probed, NULL, pdev->irq);
+                              num_probed, NULL, pdev->irq, NULL);
 }
 
 /*
index 87662a1..c6b6d7d 100644 (file)
@@ -287,7 +287,8 @@ static int __devinit jz4740_adc_probe(struct platform_device *pdev)
        writeb(0xff, adc->base + JZ_REG_ADC_CTRL);
 
        ret = mfd_add_devices(&pdev->dev, 0, jz4740_adc_cells,
-               ARRAY_SIZE(jz4740_adc_cells), mem_base, irq_base);
+                             ARRAY_SIZE(jz4740_adc_cells), mem_base,
+                             irq_base, NULL);
        if (ret < 0)
                goto err_clk_put;
 
index 0b2879b..24212f4 100644 (file)
@@ -393,7 +393,8 @@ static int __devinit lm3533_device_als_init(struct lm3533 *lm3533)
        lm3533_als_devs[0].platform_data = pdata->als;
        lm3533_als_devs[0].pdata_size = sizeof(*pdata->als);
 
-       ret = mfd_add_devices(lm3533->dev, 0, lm3533_als_devs, 1, NULL, 0);
+       ret = mfd_add_devices(lm3533->dev, 0, lm3533_als_devs, 1, NULL,
+                             0, NULL);
        if (ret) {
                dev_err(lm3533->dev, "failed to add ALS device\n");
                return ret;
@@ -422,7 +423,7 @@ static int __devinit lm3533_device_bl_init(struct lm3533 *lm3533)
        }
 
        ret = mfd_add_devices(lm3533->dev, 0, lm3533_bl_devs,
-                                       pdata->num_backlights, NULL, 0);
+                             pdata->num_backlights, NULL, 0, NULL);
        if (ret) {
                dev_err(lm3533->dev, "failed to add backlight devices\n");
                return ret;
@@ -451,7 +452,7 @@ static int __devinit lm3533_device_led_init(struct lm3533 *lm3533)
        }
 
        ret = mfd_add_devices(lm3533->dev, 0, lm3533_led_devs,
-                                               pdata->num_leds, NULL, 0);
+                             pdata->num_leds, NULL, 0, NULL);
        if (ret) {
                dev_err(lm3533->dev, "failed to add LED devices\n");
                return ret;
index 027cc8f..092ad4b 100644 (file)
@@ -750,7 +750,7 @@ gpe0_done:
 
        lpc_ich_finalize_cell(&lpc_ich_cells[LPC_GPIO], id);
        ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_GPIO],
-                               1, NULL, 0);
+                             1, NULL, 0, NULL);
 
 gpio_done:
        if (acpi_conflict)
@@ -765,7 +765,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
        u32 base_addr_cfg;
        u32 base_addr;
        int ret;
-       bool acpi_conflict = false;
        struct resource *res;
 
        /* Setup power management base register */
@@ -780,20 +779,11 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
        res = wdt_io_res(ICH_RES_IO_TCO);
        res->start = base_addr + ACPIBASE_TCO_OFF;
        res->end = base_addr + ACPIBASE_TCO_END;
-       ret = acpi_check_resource_conflict(res);
-       if (ret) {
-               acpi_conflict = true;
-               goto wdt_done;
-       }
 
        res = wdt_io_res(ICH_RES_IO_SMI);
        res->start = base_addr + ACPIBASE_SMI_OFF;
        res->end = base_addr + ACPIBASE_SMI_END;
-       ret = acpi_check_resource_conflict(res);
-       if (ret) {
-               acpi_conflict = true;
-               goto wdt_done;
-       }
+
        lpc_ich_enable_acpi_space(dev);
 
        /*
@@ -813,21 +803,13 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev,
                res = wdt_mem_res(ICH_RES_MEM_GCS);
                res->start = base_addr + ACPIBASE_GCS_OFF;
                res->end = base_addr + ACPIBASE_GCS_END;
-               ret = acpi_check_resource_conflict(res);
-               if (ret) {
-                       acpi_conflict = true;
-                       goto wdt_done;
-               }
        }
 
        lpc_ich_finalize_cell(&lpc_ich_cells[LPC_WDT], id);
        ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_WDT],
-                               1, NULL, 0);
+                             1, NULL, 0, NULL);
 
 wdt_done:
-       if (acpi_conflict)
-               pr_warn("Resource conflict(s) found affecting %s\n",
-                               lpc_ich_cells[LPC_WDT].name);
        return ret;
 }
 
index 9f20abc..f6b9c5c 100644 (file)
@@ -127,7 +127,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev,
                lpc_sch_cells[i].id = id->device;
 
        ret = mfd_add_devices(&dev->dev, 0,
-                       lpc_sch_cells, ARRAY_SIZE(lpc_sch_cells), NULL, 0);
+                             lpc_sch_cells, ARRAY_SIZE(lpc_sch_cells), NULL,
+                             0, NULL);
        if (ret)
                goto out_dev;
 
@@ -153,7 +154,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev,
                        tunnelcreek_cells[i].id = id->device;
 
                ret = mfd_add_devices(&dev->dev, 0, tunnelcreek_cells,
-                       ARRAY_SIZE(tunnelcreek_cells), NULL, 0);
+                                     ARRAY_SIZE(tunnelcreek_cells), NULL,
+                                     0, NULL);
        }
 
        return ret;
index c03e12b..d9e24c8 100644 (file)
@@ -126,7 +126,7 @@ static int max77686_i2c_probe(struct i2c_client *i2c,
        max77686_irq_init(max77686);
 
        ret = mfd_add_devices(max77686->dev, -1, max77686_devs,
-                             ARRAY_SIZE(max77686_devs), NULL, 0);
+                             ARRAY_SIZE(max77686_devs), NULL, 0, NULL);
 
        if (ret < 0)
                goto err_mfd;
index 2b40356..1029d01 100644 (file)
@@ -137,6 +137,9 @@ static void max77693_irq_mask(struct irq_data *data)
        const struct max77693_irq_data *irq_data =
                                irq_to_max77693_irq(max77693, data->irq);
 
+       if (irq_data->group >= MAX77693_IRQ_GROUP_NR)
+               return;
+
        if (irq_data->group >= MUIC_INT1 && irq_data->group <= MUIC_INT3)
                max77693->irq_masks_cur[irq_data->group] &= ~irq_data->mask;
        else
@@ -149,6 +152,9 @@ static void max77693_irq_unmask(struct irq_data *data)
        const struct max77693_irq_data *irq_data =
            irq_to_max77693_irq(max77693, data->irq);
 
+       if (irq_data->group >= MAX77693_IRQ_GROUP_NR)
+               return;
+
        if (irq_data->group >= MUIC_INT1 && irq_data->group <= MUIC_INT3)
                max77693->irq_masks_cur[irq_data->group] |= irq_data->mask;
        else
@@ -200,7 +206,7 @@ static irqreturn_t max77693_irq_thread(int irq, void *data)
 
        if (irq_src & MAX77693_IRQSRC_MUIC)
                /* MUIC INT1 ~ INT3 */
-               max77693_bulk_read(max77693->regmap, MAX77693_MUIC_REG_INT1,
+               max77693_bulk_read(max77693->regmap_muic, MAX77693_MUIC_REG_INT1,
                        MAX77693_NUM_IRQ_MUIC_REGS, &irq_reg[MUIC_INT1]);
 
        /* Apply masking */
@@ -255,7 +261,8 @@ int max77693_irq_init(struct max77693_dev *max77693)
 {
        struct irq_domain *domain;
        int i;
-       int ret;
+       int ret = 0;
+       u8 intsrc_mask;
 
        mutex_init(&max77693->irqlock);
 
@@ -287,19 +294,38 @@ int max77693_irq_init(struct max77693_dev *max77693)
                                        &max77693_irq_domain_ops, max77693);
        if (!domain) {
                dev_err(max77693->dev, "could not create irq domain\n");
-               return -ENODEV;
+               ret = -ENODEV;
+               goto err_irq;
        }
        max77693->irq_domain = domain;
 
+       /* Unmask max77693 interrupt */
+       ret = max77693_read_reg(max77693->regmap,
+                       MAX77693_PMIC_REG_INTSRC_MASK, &intsrc_mask);
+       if (ret < 0) {
+               dev_err(max77693->dev, "fail to read PMIC register\n");
+               goto err_irq;
+       }
+
+       intsrc_mask &= ~(MAX77693_IRQSRC_CHG);
+       intsrc_mask &= ~(MAX77693_IRQSRC_FLASH);
+       intsrc_mask &= ~(MAX77693_IRQSRC_MUIC);
+       ret = max77693_write_reg(max77693->regmap,
+                       MAX77693_PMIC_REG_INTSRC_MASK, intsrc_mask);
+       if (ret < 0) {
+               dev_err(max77693->dev, "fail to write PMIC register\n");
+               goto err_irq;
+       }
+
        ret = request_threaded_irq(max77693->irq, NULL, max77693_irq_thread,
                                   IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
                                   "max77693-irq", max77693);
-
        if (ret)
                dev_err(max77693->dev, "Failed to request IRQ %d: %d\n",
                        max77693->irq, ret);
 
-       return 0;
+err_irq:
+       return ret;
 }
 
 void max77693_irq_exit(struct max77693_dev *max77693)
index a1811cb..cc5155e 100644 (file)
@@ -152,6 +152,20 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
        max77693->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC);
        i2c_set_clientdata(max77693->haptic, max77693);
 
+       /*
+        * Initialize register map for MUIC device because use regmap-muic
+        * instance of MUIC device when irq of max77693 is initialized
+        * before call max77693-muic probe() function.
+        */
+       max77693->regmap_muic = devm_regmap_init_i2c(max77693->muic,
+                                        &max77693_regmap_config);
+       if (IS_ERR(max77693->regmap_muic)) {
+               ret = PTR_ERR(max77693->regmap_muic);
+               dev_err(max77693->dev,
+                       "failed to allocate register map: %d\n", ret);
+               goto err_regmap;
+       }
+
        ret = max77693_irq_init(max77693);
        if (ret < 0)
                goto err_irq;
@@ -159,7 +173,7 @@ static int max77693_i2c_probe(struct i2c_client *i2c,
        pm_runtime_set_active(max77693->dev);
 
        ret = mfd_add_devices(max77693->dev, -1, max77693_devs,
-                       ARRAY_SIZE(max77693_devs), NULL, 0);
+                             ARRAY_SIZE(max77693_devs), NULL, 0, NULL);
        if (ret < 0)
                goto err_mfd;
 
index 825a7f0..ee53757 100644 (file)
@@ -598,7 +598,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
 
        ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0],
                              ARRAY_SIZE(rtc_devs),
-                             &rtc_resources[0], chip->irq_base);
+                             &rtc_resources[0], chip->irq_base, NULL);
        if (ret < 0) {
                dev_err(chip->dev, "Failed to add rtc subdev\n");
                goto out;
@@ -606,7 +606,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
 
        ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0],
                              ARRAY_SIZE(onkey_devs),
-                             &onkey_resources[0], 0);
+                             &onkey_resources[0], 0, NULL);
        if (ret < 0) {
                dev_err(chip->dev, "Failed to add onkey subdev\n");
                goto out_dev;
@@ -615,7 +615,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
        if (pdata) {
                ret = mfd_add_devices(chip->dev, 0, &regulator_devs[0],
                                      ARRAY_SIZE(regulator_devs),
-                                     &regulator_resources[0], 0);
+                                     &regulator_resources[0], 0, NULL);
                if (ret < 0) {
                        dev_err(chip->dev, "Failed to add regulator subdev\n");
                        goto out_dev;
@@ -625,7 +625,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
        if (pdata && pdata->backlight) {
                ret = mfd_add_devices(chip->dev, 0, &backlight_devs[0],
                                      ARRAY_SIZE(backlight_devs),
-                                     &backlight_resources[0], 0);
+                                     &backlight_resources[0], 0, NULL);
                if (ret < 0) {
                        dev_err(chip->dev, "Failed to add backlight subdev\n");
                        goto out_dev;
@@ -635,7 +635,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
        if (pdata && pdata->power) {
                ret = mfd_add_devices(chip->dev, 0, &power_devs[0],
                                        ARRAY_SIZE(power_devs),
-                                       &power_supply_resources[0], 0);
+                                     &power_supply_resources[0], 0, NULL);
                if (ret < 0) {
                        dev_err(chip->dev, "Failed to add power supply "
                                "subdev\n");
@@ -646,7 +646,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip,
        if (pdata && pdata->touch) {
                ret = mfd_add_devices(chip->dev, 0, &touch_devs[0],
                                      ARRAY_SIZE(touch_devs),
-                                     &touch_resources[0], 0);
+                                     &touch_resources[0], 0, NULL);
                if (ret < 0) {
                        dev_err(chip->dev, "Failed to add touch subdev\n");
                        goto out_dev;
index 10b629c..f123517 100644 (file)
@@ -160,7 +160,7 @@ static int max8997_i2c_probe(struct i2c_client *i2c,
 
        mfd_add_devices(max8997->dev, -1, max8997_devs,
                        ARRAY_SIZE(max8997_devs),
-                       NULL, 0);
+                       NULL, 0, NULL);
 
        /*
         * TODO: enable others (flash, muic, rtc, battery, ...) and
index 6ef56d2..d7218cc 100644 (file)
@@ -161,13 +161,13 @@ static int max8998_i2c_probe(struct i2c_client *i2c,
        switch (id->driver_data) {
        case TYPE_LP3974:
                ret = mfd_add_devices(max8998->dev, -1,
-                               lp3974_devs, ARRAY_SIZE(lp3974_devs),
-                               NULL, 0);
+                                     lp3974_devs, ARRAY_SIZE(lp3974_devs),
+                                     NULL, 0, NULL);
                break;
        case TYPE_MAX8998:
                ret = mfd_add_devices(max8998->dev, -1,
-                               max8998_devs, ARRAY_SIZE(max8998_devs),
-                               NULL, 0);
+                                     max8998_devs, ARRAY_SIZE(max8998_devs),
+                                     NULL, 0, NULL);
                break;
        default:
                ret = -EINVAL;
index b801dc7..1ec79b5 100644 (file)
@@ -612,7 +612,7 @@ 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);
+       return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0, NULL);
 }
 
 static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format)
index 0c3a01c..f8b7771 100644 (file)
@@ -74,12 +74,11 @@ static int mfd_platform_add_cell(struct platform_device *pdev,
 static int mfd_add_device(struct device *parent, int id,
                          const struct mfd_cell *cell,
                          struct resource *mem_base,
-                         int irq_base)
+                         int irq_base, struct irq_domain *domain)
 {
        struct resource *res;
        struct platform_device *pdev;
        struct device_node *np = NULL;
-       struct irq_domain *domain = NULL;
        int ret = -ENOMEM;
        int r;
 
@@ -97,7 +96,6 @@ static int mfd_add_device(struct device *parent, int id,
                for_each_child_of_node(parent->of_node, np) {
                        if (of_device_is_compatible(np, cell->of_compatible)) {
                                pdev->dev.of_node = np;
-                               domain = irq_find_host(parent->of_node);
                                break;
                        }
                }
@@ -177,7 +175,7 @@ fail_alloc:
 int mfd_add_devices(struct device *parent, int id,
                    struct mfd_cell *cells, int n_devs,
                    struct resource *mem_base,
-                   int irq_base)
+                   int irq_base, struct irq_domain *domain)
 {
        int i;
        int ret = 0;
@@ -191,7 +189,8 @@ int mfd_add_devices(struct device *parent, int id,
        for (i = 0; i < n_devs; i++) {
                atomic_set(&cnts[i], 0);
                cells[i].usage_count = &cnts[i];
-               ret = mfd_add_device(parent, id, cells + i, mem_base, irq_base);
+               ret = mfd_add_device(parent, id, cells + i, mem_base,
+                                    irq_base, domain);
                if (ret)
                        break;
        }
@@ -247,7 +246,8 @@ int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones)
        for (i = 0; i < n_clones; i++) {
                cell_entry.name = clones[i];
                /* don't give up if a single call fails; just report error */
-               if (mfd_add_device(pdev->dev.parent, -1, &cell_entry, NULL, 0))
+               if (mfd_add_device(pdev->dev.parent, -1, &cell_entry, NULL, 0,
+                                  NULL))
                        dev_err(dev, "failed to create platform device '%s'\n",
                                        clones[i]);
        }
index c4a69f1..a345f9b 100644 (file)
@@ -453,7 +453,8 @@ static int __devinit palmas_i2c_probe(struct i2c_client *i2c,
 
        ret = mfd_add_devices(palmas->dev, -1,
                              children, ARRAY_SIZE(palmas_children),
-                             NULL, regmap_irq_chip_get_base(palmas->irq_data));
+                             NULL, regmap_irq_chip_get_base(palmas->irq_data),
+                             NULL);
        kfree(children);
 
        if (ret < 0)
index cdc1df7..3a8fa88 100644 (file)
@@ -289,7 +289,7 @@ static int __devinit rc5t583_i2c_probe(struct i2c_client *i2c,
        }
 
        ret = mfd_add_devices(rc5t583->dev, -1, rc5t583_subdevs,
-                       ARRAY_SIZE(rc5t583_subdevs), NULL, 0);
+                             ARRAY_SIZE(rc5t583_subdevs), NULL, 0, NULL);
        if (ret) {
                dev_err(&i2c->dev, "add mfd devices failed: %d\n", ret);
                goto err_add_devs;
index 685d61e..0f70dce 100644 (file)
@@ -87,7 +87,8 @@ static int __devinit rdc321x_sb_probe(struct pci_dev *pdev,
        rdc321x_wdt_pdata.sb_pdev = pdev;
 
        return mfd_add_devices(&pdev->dev, -1,
-               rdc321x_sb_cells, ARRAY_SIZE(rdc321x_sb_cells), NULL, 0);
+                              rdc321x_sb_cells, ARRAY_SIZE(rdc321x_sb_cells),
+                              NULL, 0, NULL);
 }
 
 static void __devexit rdc321x_sb_remove(struct pci_dev *pdev)
index 2988efd..49d361a 100644 (file)
@@ -141,19 +141,19 @@ 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);
+                                     ARRAY_SIZE(s5m8751_devs), NULL, 0, NULL);
                break;
        case S5M8763X:
                ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs,
-                                       ARRAY_SIZE(s5m8763_devs), NULL, 0);
+                                     ARRAY_SIZE(s5m8763_devs), NULL, 0, NULL);
                break;
        case S5M8767X:
                ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs,
-                                       ARRAY_SIZE(s5m8767_devs), NULL, 0);
+                                     ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL);
                break;
        case S2MPS11X:
                ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs,
-                                       ARRAY_SIZE(s2mps11_devs), NULL, 0);
+                                     ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL);
                break;
        default:
                /* If this happens the probe function is problem */
index d31fed0..d35da68 100644 (file)
@@ -407,7 +407,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev,
                              sta2x11_mfd_bar0,
                              ARRAY_SIZE(sta2x11_mfd_bar0),
                              &pdev->resource[0],
-                             0);
+                             0, NULL);
        if (err) {
                dev_err(&pdev->dev, "mfd_add_devices[0] failed: %d\n", err);
                goto err_disable;
@@ -417,7 +417,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev,
                              sta2x11_mfd_bar1,
                              ARRAY_SIZE(sta2x11_mfd_bar1),
                              &pdev->resource[1],
-                             0);
+                             0, NULL);
        if (err) {
                dev_err(&pdev->dev, "mfd_add_devices[1] failed: %d\n", err);
                goto err_disable;
index 2dd8d49..c94f521 100644 (file)
@@ -962,7 +962,7 @@ static int __devinit stmpe_add_device(struct stmpe *stmpe,
                                      struct mfd_cell *cell, int irq)
 {
        return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1,
-                              NULL, stmpe->irq_base + irq);
+                              NULL, stmpe->irq_base + irq, NULL);
 }
 
 static int __devinit stmpe_devices_init(struct stmpe *stmpe)
index 2d9e879..b32940e 100644 (file)
@@ -388,7 +388,7 @@ static int t7l66xb_probe(struct platform_device *dev)
 
        ret = mfd_add_devices(&dev->dev, dev->id,
                              t7l66xb_cells, ARRAY_SIZE(t7l66xb_cells),
-                             iomem, t7l66xb->irq_base);
+                             iomem, t7l66xb->irq_base, NULL);
 
        if (!ret)
                return 0;
index 048bf05..b56ba6b 100644 (file)
@@ -262,8 +262,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
 
        if (blocks & TC3589x_BLOCK_GPIO) {
                ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_gpio,
-                               ARRAY_SIZE(tc3589x_dev_gpio), NULL,
-                               tc3589x->irq_base);
+                                     ARRAY_SIZE(tc3589x_dev_gpio), NULL,
+                                     tc3589x->irq_base, NULL);
                if (ret) {
                        dev_err(tc3589x->dev, "failed to add gpio child\n");
                        return ret;
@@ -273,8 +273,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x)
 
        if (blocks & TC3589x_BLOCK_KEYPAD) {
                ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_keypad,
-                               ARRAY_SIZE(tc3589x_dev_keypad), NULL,
-                               tc3589x->irq_base);
+                                     ARRAY_SIZE(tc3589x_dev_keypad), NULL,
+                                     tc3589x->irq_base, NULL);
                if (ret) {
                        dev_err(tc3589x->dev, "failed to keypad child\n");
                        return ret;
index d20a284..413c891 100644 (file)
@@ -192,7 +192,7 @@ static int __devinit tc6387xb_probe(struct platform_device *dev)
        printk(KERN_INFO "Toshiba tc6387xb initialised\n");
 
        ret = mfd_add_devices(&dev->dev, dev->id, tc6387xb_cells,
-                             ARRAY_SIZE(tc6387xb_cells), iomem, irq);
+                             ARRAY_SIZE(tc6387xb_cells), iomem, irq, NULL);
 
        if (!ret)
                return 0;
index 9612264..dcab026 100644 (file)
@@ -700,8 +700,8 @@ static int __devinit tc6393xb_probe(struct platform_device *dev)
        tc6393xb_cells[TC6393XB_CELL_FB].pdata_size = sizeof(*tcpd->fb_data);
 
        ret = mfd_add_devices(&dev->dev, dev->id,
-                       tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells),
-                       iomem, tcpd->irq_base);
+                             tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells),
+                             iomem, tcpd->irq_base, NULL);
 
        if (!ret)
                return 0;
index 4fb0e6c..7c3675a 100644 (file)
@@ -412,7 +412,7 @@ static int __devinit ti_ssp_probe(struct platform_device *pdev)
                cells[id].data_size     = data->pdata_size;
        }
 
-       error = mfd_add_devices(dev, 0, cells, 2, NULL, 0);
+       error = mfd_add_devices(dev, 0, cells, 2, NULL, 0, NULL);
        if (error < 0) {
                dev_err(dev, "cannot add mfd cells\n");
                goto error_enable;
index a447f4e..cccc626 100644 (file)
@@ -757,25 +757,25 @@ static int __devinit timb_probe(struct pci_dev *dev,
                err = mfd_add_devices(&dev->dev, -1,
                        timberdale_cells_bar0_cfg0,
                        ARRAY_SIZE(timberdale_cells_bar0_cfg0),
-                       &dev->resource[0], msix_entries[0].vector);
+                       &dev->resource[0], msix_entries[0].vector, NULL);
                break;
        case TIMB_HW_VER1:
                err = mfd_add_devices(&dev->dev, -1,
                        timberdale_cells_bar0_cfg1,
                        ARRAY_SIZE(timberdale_cells_bar0_cfg1),
-                       &dev->resource[0], msix_entries[0].vector);
+                       &dev->resource[0], msix_entries[0].vector, NULL);
                break;
        case TIMB_HW_VER2:
                err = mfd_add_devices(&dev->dev, -1,
                        timberdale_cells_bar0_cfg2,
                        ARRAY_SIZE(timberdale_cells_bar0_cfg2),
-                       &dev->resource[0], msix_entries[0].vector);
+                       &dev->resource[0], msix_entries[0].vector, NULL);
                break;
        case TIMB_HW_VER3:
                err = mfd_add_devices(&dev->dev, -1,
                        timberdale_cells_bar0_cfg3,
                        ARRAY_SIZE(timberdale_cells_bar0_cfg3),
-                       &dev->resource[0], msix_entries[0].vector);
+                       &dev->resource[0], msix_entries[0].vector, NULL);
                break;
        default:
                dev_err(&dev->dev, "Uknown IP setup: %d.%d.%d\n",
@@ -792,7 +792,7 @@ static int __devinit timb_probe(struct pci_dev *dev,
 
        err = mfd_add_devices(&dev->dev, 0,
                timberdale_cells_bar1, ARRAY_SIZE(timberdale_cells_bar1),
-               &dev->resource[1], msix_entries[0].vector);
+               &dev->resource[1], msix_entries[0].vector, NULL);
        if (err) {
                dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err);
                goto err_mfd2;
@@ -803,7 +803,7 @@ static int __devinit timb_probe(struct pci_dev *dev,
                ((priv->fw.config & TIMB_HW_VER_MASK) == TIMB_HW_VER3)) {
                err = mfd_add_devices(&dev->dev, 1, timberdale_cells_bar2,
                        ARRAY_SIZE(timberdale_cells_bar2),
-                       &dev->resource[2], msix_entries[0].vector);
+                       &dev->resource[2], msix_entries[0].vector, NULL);
                if (err) {
                        dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err);
                        goto err_mfd2;
index a293b97..14051bd 100644 (file)
@@ -188,7 +188,7 @@ static int __devinit tps6105x_probe(struct i2c_client *client,
        }
 
        ret = mfd_add_devices(&client->dev, 0, tps6105x_cells,
-               ARRAY_SIZE(tps6105x_cells), NULL, 0);
+                             ARRAY_SIZE(tps6105x_cells), NULL, 0, NULL);
        if (ret)
                goto fail;
 
index 33ba772..1b20349 100644 (file)
@@ -100,7 +100,7 @@ static int tps6507x_i2c_probe(struct i2c_client *i2c,
 
        ret = mfd_add_devices(tps6507x->dev, -1,
                              tps6507x_devs, ARRAY_SIZE(tps6507x_devs),
-                             NULL, 0);
+                             NULL, 0, NULL);
 
        if (ret < 0)
                goto err;
index 80e24f4..50fd87c 100644 (file)
@@ -292,7 +292,7 @@ static int __devinit tps65090_i2c_probe(struct i2c_client *client,
        }
 
        ret = mfd_add_devices(tps65090->dev, -1, tps65090s,
-               ARRAY_SIZE(tps65090s), NULL, 0);
+                             ARRAY_SIZE(tps65090s), NULL, 0, NULL);
        if (ret) {
                dev_err(&client->dev, "add mfd devices failed with err: %d\n",
                        ret);
index 61c097a..a95e942 100644 (file)
 #include <linux/slab.h>
 #include <linux/regmap.h>
 #include <linux/err.h>
-#include <linux/regulator/of_regulator.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
 
 #include <linux/mfd/core.h>
 #include <linux/mfd/tps65217.h>
 
+static struct mfd_cell tps65217s[] = {
+       {
+               .name = "tps65217-pmic",
+       },
+};
+
 /**
  * tps65217_reg_read: Read a single tps65217 register.
  *
@@ -133,83 +140,48 @@ int tps65217_clear_bits(struct tps65217 *tps, unsigned int reg,
 }
 EXPORT_SYMBOL_GPL(tps65217_clear_bits);
 
-#ifdef CONFIG_OF
-static struct of_regulator_match reg_matches[] = {
-       { .name = "dcdc1", .driver_data = (void *)TPS65217_DCDC_1 },
-       { .name = "dcdc2", .driver_data = (void *)TPS65217_DCDC_2 },
-       { .name = "dcdc3", .driver_data = (void *)TPS65217_DCDC_3 },
-       { .name = "ldo1", .driver_data = (void *)TPS65217_LDO_1 },
-       { .name = "ldo2", .driver_data = (void *)TPS65217_LDO_2 },
-       { .name = "ldo3", .driver_data = (void *)TPS65217_LDO_3 },
-       { .name = "ldo4", .driver_data = (void *)TPS65217_LDO_4 },
-};
-
-static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client)
-{
-       struct device_node *node = client->dev.of_node;
-       struct tps65217_board *pdata;
-       struct device_node *regs;
-       int count = ARRAY_SIZE(reg_matches);
-       int ret, i;
-
-       regs = of_find_node_by_name(node, "regulators");
-       if (!regs)
-               return NULL;
-
-       ret = of_regulator_match(&client->dev, regs, reg_matches, count);
-       of_node_put(regs);
-       if ((ret < 0) || (ret > count))
-               return NULL;
-
-       count = ret;
-       pdata = devm_kzalloc(&client->dev, count * sizeof(*pdata), GFP_KERNEL);
-       if (!pdata)
-               return NULL;
-
-       for (i = 0; i < count; i++) {
-               if (!reg_matches[i].init_data || !reg_matches[i].of_node)
-                       continue;
-
-               pdata->tps65217_init_data[i] = reg_matches[i].init_data;
-               pdata->of_node[i] = reg_matches[i].of_node;
-       }
-
-       return pdata;
-}
-
-static struct of_device_id tps65217_of_match[] = {
-       { .compatible = "ti,tps65217", },
-       { },
-};
-#else
-static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client)
-{
-       return NULL;
-}
-#endif
-
 static struct regmap_config tps65217_regmap_config = {
        .reg_bits = 8,
        .val_bits = 8,
 };
 
+static const struct of_device_id tps65217_of_match[] = {
+       { .compatible = "ti,tps65217", .data = (void *)TPS65217 },
+       { /* sentinel */ },
+};
+
 static int __devinit tps65217_probe(struct i2c_client *client,
                                const struct i2c_device_id *ids)
 {
        struct tps65217 *tps;
-       struct regulator_init_data *reg_data;
-       struct tps65217_board *pdata = client->dev.platform_data;
-       int i, ret;
        unsigned int version;
+       unsigned int chip_id = ids->driver_data;
+       const struct of_device_id *match;
+       int ret;
 
-       if (!pdata && client->dev.of_node)
-               pdata = tps65217_parse_dt(client);
+       if (client->dev.of_node) {
+               match = of_match_device(tps65217_of_match, &client->dev);
+               if (!match) {
+                       dev_err(&client->dev,
+                               "Failed to find matching dt id\n");
+                       return -EINVAL;
+               }
+               chip_id = (unsigned int)match->data;
+       }
+
+       if (!chip_id) {
+               dev_err(&client->dev, "id is null.\n");
+               return -ENODEV;
+       }
 
        tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL);
        if (!tps)
                return -ENOMEM;
 
-       tps->pdata = pdata;
+       i2c_set_clientdata(client, tps);
+       tps->dev = &client->dev;
+       tps->id = chip_id;
+
        tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config);
        if (IS_ERR(tps->regmap)) {
                ret = PTR_ERR(tps->regmap);
@@ -218,8 +190,12 @@ static int __devinit tps65217_probe(struct i2c_client *client,
                return ret;
        }
 
-       i2c_set_clientdata(client, tps);
-       tps->dev = &client->dev;
+       ret = mfd_add_devices(tps->dev, -1, tps65217s,
+                             ARRAY_SIZE(tps65217s), NULL, 0, NULL);
+       if (ret < 0) {
+               dev_err(tps->dev, "mfd_add_devices failed: %d\n", ret);
+               return ret;
+       }
 
        ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version);
        if (ret < 0) {
@@ -232,41 +208,21 @@ static int __devinit tps65217_probe(struct i2c_client *client,
                        (version & TPS65217_CHIPID_CHIP_MASK) >> 4,
                        version & TPS65217_CHIPID_REV_MASK);
 
-       for (i = 0; i < TPS65217_NUM_REGULATOR; i++) {
-               struct platform_device *pdev;
-
-               pdev = platform_device_alloc("tps65217-pmic", i);
-               if (!pdev) {
-                       dev_err(tps->dev, "Cannot create regulator %d\n", i);
-                       continue;
-               }
-
-               pdev->dev.parent = tps->dev;
-               pdev->dev.of_node = pdata->of_node[i];
-               reg_data = pdata->tps65217_init_data[i];
-               platform_device_add_data(pdev, reg_data, sizeof(*reg_data));
-               tps->regulator_pdev[i] = pdev;
-
-               platform_device_add(pdev);
-       }
-
        return 0;
 }
 
 static int __devexit tps65217_remove(struct i2c_client *client)
 {
        struct tps65217 *tps = i2c_get_clientdata(client);
-       int i;
 
-       for (i = 0; i < TPS65217_NUM_REGULATOR; i++)
-               platform_device_unregister(tps->regulator_pdev[i]);
+       mfd_remove_devices(tps->dev);
 
        return 0;
 }
 
 static const struct i2c_device_id tps65217_id_table[] = {
-       {"tps65217", 0xF0},
-       {/* end of list */}
+       {"tps65217", TPS65217},
+       { /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(i2c, tps65217_id_table);
 
index 353c348..345960c 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/i2c.h>
 #include <linux/regmap.h>
 #include <linux/regulator/of_regulator.h>
+#include <linux/regulator/machine.h>
 
 #include <linux/mfd/core.h>
 #include <linux/mfd/tps6586x.h>
@@ -346,6 +347,7 @@ failed:
 
 #ifdef CONFIG_OF
 static struct of_regulator_match tps6586x_matches[] = {
+       { .name = "sys",     .driver_data = (void *)TPS6586X_ID_SYS     },
        { .name = "sm0",     .driver_data = (void *)TPS6586X_ID_SM_0    },
        { .name = "sm1",     .driver_data = (void *)TPS6586X_ID_SM_1    },
        { .name = "sm2",     .driver_data = (void *)TPS6586X_ID_SM_2    },
@@ -369,6 +371,7 @@ static struct tps6586x_platform_data *tps6586x_parse_dt(struct i2c_client *clien
        struct tps6586x_platform_data *pdata;
        struct tps6586x_subdev_info *devs;
        struct device_node *regs;
+       const char *sys_rail_name = NULL;
        unsigned int count;
        unsigned int i, j;
        int err;
@@ -391,12 +394,22 @@ static struct tps6586x_platform_data *tps6586x_parse_dt(struct i2c_client *clien
                return NULL;
 
        for (i = 0, j = 0; i < num && j < count; i++) {
+               struct regulator_init_data *reg_idata;
+
                if (!tps6586x_matches[i].init_data)
                        continue;
 
+               reg_idata  = tps6586x_matches[i].init_data;
                devs[j].name = "tps6586x-regulator";
                devs[j].platform_data = tps6586x_matches[i].init_data;
                devs[j].id = (int)tps6586x_matches[i].driver_data;
+               if (devs[j].id == TPS6586X_ID_SYS)
+                       sys_rail_name = reg_idata->constraints.name;
+
+               if ((devs[j].id == TPS6586X_ID_LDO_5) ||
+                       (devs[j].id == TPS6586X_ID_LDO_RTC))
+                       reg_idata->supply_regulator = sys_rail_name;
+
                devs[j].of_node = tps6586x_matches[i].of_node;
                j++;
        }
@@ -493,7 +506,8 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client,
        }
 
        ret = mfd_add_devices(tps6586x->dev, -1,
-                       tps6586x_cell, ARRAY_SIZE(tps6586x_cell), NULL, 0);
+                             tps6586x_cell, ARRAY_SIZE(tps6586x_cell),
+                             NULL, 0, NULL);
        if (ret < 0) {
                dev_err(&client->dev, "mfd_add_devices failed: %d\n", ret);
                goto err_mfd_add;
index 1c56379..d3ce4d5 100644 (file)
@@ -254,7 +254,7 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c,
 
        ret = mfd_add_devices(tps65910->dev, -1,
                              tps65910s, ARRAY_SIZE(tps65910s),
-                             NULL, 0);
+                             NULL, 0, NULL);
        if (ret < 0) {
                dev_err(&i2c->dev, "mfd_add_devices failed: %d\n", ret);
                return ret;
index 74fd8cb..4658b5b 100644 (file)
@@ -146,7 +146,7 @@ int tps65912_device_init(struct tps65912 *tps65912)
 
        ret = mfd_add_devices(tps65912->dev, -1,
                              tps65912s, ARRAY_SIZE(tps65912s),
-                             NULL, 0);
+                             NULL, 0, NULL);
        if (ret < 0)
                goto err;
 
index 1c32afe..9d3a0bc 100644 (file)
@@ -1132,12 +1132,7 @@ static void clocks_init(struct device *dev,
        u32 rate;
        u8 ctrl = HFCLK_FREQ_26_MHZ;
 
-#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
-       if (cpu_is_omap2430())
-               osc = clk_get(dev, "osc_ck");
-       else
-               osc = clk_get(dev, "osc_sys_ck");
-
+       osc = clk_get(dev, "fck");
        if (IS_ERR(osc)) {
                printk(KERN_WARNING "Skipping twl internal clock init and "
                                "using bootloader value (unknown osc rate)\n");
@@ -1147,18 +1142,6 @@ static void clocks_init(struct device *dev,
        rate = clk_get_rate(osc);
        clk_put(osc);
 
-#else
-       /* REVISIT for non-OMAP systems, pass the clock rate from
-        * board init code, using platform_data.
-        */
-       osc = ERR_PTR(-EIO);
-
-       printk(KERN_WARNING "Skipping twl internal clock init and "
-              "using bootloader value (unknown osc rate)\n");
-
-       return;
-#endif
-
        switch (rate) {
        case 19200000:
                ctrl = HFCLK_FREQ_19p2_MHZ;
@@ -1220,10 +1203,23 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)
 {
        struct twl4030_platform_data    *pdata = client->dev.platform_data;
        struct device_node              *node = client->dev.of_node;
+       struct platform_device          *pdev;
        int                             irq_base = 0;
        int                             status;
        unsigned                        i, num_slaves;
 
+       pdev = platform_device_alloc(DRIVER_NAME, -1);
+       if (!pdev) {
+               dev_err(&client->dev, "can't alloc pdev\n");
+               return -ENOMEM;
+       }
+
+       status = platform_device_add(pdev);
+       if (status) {
+               platform_device_put(pdev);
+               return status;
+       }
+
        if (node && !pdata) {
                /*
                 * XXX: Temporary pdata until the information is correctly
@@ -1232,23 +1228,30 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)
                pdata = devm_kzalloc(&client->dev,
                                     sizeof(struct twl4030_platform_data),
                                     GFP_KERNEL);
-               if (!pdata)
-                       return -ENOMEM;
+               if (!pdata) {
+                       status = -ENOMEM;
+                       goto free;
+               }
        }
 
        if (!pdata) {
                dev_dbg(&client->dev, "no platform data?\n");
-               return -EINVAL;
+               status = -EINVAL;
+               goto free;
        }
 
+       platform_set_drvdata(pdev, pdata);
+
        if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) {
                dev_dbg(&client->dev, "can't talk I2C?\n");
-               return -EIO;
+               status = -EIO;
+               goto free;
        }
 
        if (inuse) {
                dev_dbg(&client->dev, "driver is already in use\n");
-               return -EBUSY;
+               status = -EBUSY;
+               goto free;
        }
 
        if ((id->driver_data) & TWL6030_CLASS) {
@@ -1283,7 +1286,7 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)
        inuse = true;
 
        /* setup clock framework */
-       clocks_init(&client->dev, pdata->clock);
+       clocks_init(&pdev->dev, pdata->clock);
 
        /* read TWL IDCODE Register */
        if (twl_id == TWL4030_CLASS_ID) {
@@ -1333,6 +1336,9 @@ twl_probe(struct i2c_client *client, const struct i2c_device_id *id)
 fail:
        if (status < 0)
                twl_remove(client);
+free:
+       if (status < 0)
+               platform_device_unregister(pdev);
 
        return status;
 }
index 838ce4e..77c9acb 100644 (file)
@@ -223,7 +223,7 @@ static int __devinit twl4030_audio_probe(struct platform_device *pdev)
 
        if (childs)
                ret = mfd_add_devices(&pdev->dev, pdev->id, audio->cells,
-                                     childs, NULL, 0);
+                                     childs, NULL, 0, NULL);
        else {
                dev_err(&pdev->dev, "No platform data found for childs\n");
                ret = -ENODEV;
index b0fad0f..3dca5c1 100644 (file)
@@ -632,7 +632,7 @@ static int __devinit twl6040_probe(struct i2c_client *client,
        }
 
        ret = mfd_add_devices(&client->dev, -1, twl6040->cells, children,
-                             NULL, 0);
+                             NULL, 0, NULL);
        if (ret)
                goto mfd_err;
 
index 872aff2..b9a636d 100644 (file)
@@ -102,7 +102,7 @@ static __devinit int vx855_probe(struct pci_dev *pdev,
        vx855_gpio_resources[1].end = vx855_gpio_resources[1].start + 3;
 
        ret = mfd_add_devices(&pdev->dev, -1, vx855_cells, ARRAY_SIZE(vx855_cells),
-                       NULL, 0);
+                       NULL, 0, NULL);
 
        /* we always return -ENODEV here in order to enable other
         * drivers like old, not-yet-platform_device ported i2c-viapro */
index f39b756..86e0e43 100644 (file)
@@ -241,7 +241,7 @@ static int __devinit wl1273_core_probe(struct i2c_client *client,
                __func__, children);
 
        r = mfd_add_devices(&client->dev, -1, core->cells,
-                           children, NULL, 0);
+                           children, NULL, 0, NULL);
        if (r)
                goto err;
 
index 946698f..3017310 100644 (file)
@@ -1813,27 +1813,27 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
        case WM8310:
                ret = mfd_add_devices(wm831x->dev, wm831x_num,
                                      wm8310_devs, ARRAY_SIZE(wm8310_devs),
-                                     NULL, 0);
+                                     NULL, 0, NULL);
                break;
 
        case WM8311:
                ret = mfd_add_devices(wm831x->dev, wm831x_num,
                                      wm8311_devs, ARRAY_SIZE(wm8311_devs),
-                                     NULL, 0);
+                                     NULL, 0, NULL);
                if (!pdata || !pdata->disable_touch)
                        mfd_add_devices(wm831x->dev, wm831x_num,
                                        touch_devs, ARRAY_SIZE(touch_devs),
-                                       NULL, 0);
+                                       NULL, 0, NULL);
                break;
 
        case WM8312:
                ret = mfd_add_devices(wm831x->dev, wm831x_num,
                                      wm8312_devs, ARRAY_SIZE(wm8312_devs),
-                                     NULL, 0);
+                                     NULL, 0, NULL);
                if (!pdata || !pdata->disable_touch)
                        mfd_add_devices(wm831x->dev, wm831x_num,
                                        touch_devs, ARRAY_SIZE(touch_devs),
-                                       NULL, 0);
+                                       NULL, 0, NULL);
                break;
 
        case WM8320:
@@ -1842,7 +1842,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
        case WM8326:
                ret = mfd_add_devices(wm831x->dev, wm831x_num,
                                      wm8320_devs, ARRAY_SIZE(wm8320_devs),
-                                     NULL, 0);
+                                     NULL, 0, NULL);
                break;
 
        default:
@@ -1867,7 +1867,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
        if (ret & WM831X_XTAL_ENA) {
                ret = mfd_add_devices(wm831x->dev, wm831x_num,
                                      rtc_devs, ARRAY_SIZE(rtc_devs),
-                                     NULL, 0);
+                                     NULL, 0, NULL);
                if (ret != 0) {
                        dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret);
                        goto err_irq;
@@ -1880,7 +1880,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq)
                /* Treat errors as non-critical */
                ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs,
                                      ARRAY_SIZE(backlight_devs), NULL,
-                                     0);
+                                     0, NULL);
                if (ret < 0)
                        dev_err(wm831x->dev, "Failed to add backlight: %d\n",
                                ret);
index 4b7d378..639ca35 100644 (file)
@@ -70,7 +70,7 @@ static int wm8400_register_codec(struct wm8400 *wm8400)
                .pdata_size = sizeof(*wm8400),
        };
 
-       return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0);
+       return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0, NULL);
 }
 
 /*
index eec74aa..2febf88 100644 (file)
@@ -414,7 +414,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)
        ret = mfd_add_devices(wm8994->dev, -1,
                              wm8994_regulator_devs,
                              ARRAY_SIZE(wm8994_regulator_devs),
-                             NULL, 0);
+                             NULL, 0, NULL);
        if (ret != 0) {
                dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
                goto err;
@@ -648,7 +648,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq)
 
        ret = mfd_add_devices(wm8994->dev, -1,
                              wm8994_devs, ARRAY_SIZE(wm8994_devs),
-                             NULL, 0);
+                             NULL, 0, NULL);
        if (ret != 0) {
                dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
                goto err_irq;
index 1dcb9ae..01e2b0d 100644 (file)
@@ -33,7 +33,7 @@
 
 void ibmasm_register_uart(struct service_processor *sp)
 {
-       struct uart_port uport;
+       struct uart_8250_port uart;
        void __iomem *iomem_base;
 
        iomem_base = sp->base_address + SCOUT_COM_B_BASE;
@@ -47,14 +47,14 @@ void ibmasm_register_uart(struct service_processor *sp)
                return;
        }
 
-       memset(&uport, 0, sizeof(struct uart_port));
-       uport.irq       = sp->irq;
-       uport.uartclk   = 3686400;
-       uport.flags     = UPF_SHARE_IRQ;
-       uport.iotype    = UPIO_MEM;
-       uport.membase   = iomem_base;
+       memset(&uart, 0, sizeof(uart));
+       uart.port.irq           = sp->irq;
+       uart.port.uartclk       = 3686400;
+       uart.port.flags         = UPF_SHARE_IRQ;
+       uart.port.iotype        = UPIO_MEM;
+       uart.port.membase       = iomem_base;
 
-       sp->serial_line = serial8250_register_port(&uport);
+       sp->serial_line = serial8250_register_8250_port(&uart);
        if (sp->serial_line < 0) {
                dev_err(sp->dev, "Failed to register serial port\n");
                return;
index b7eb545..4999b34 100644 (file)
@@ -60,7 +60,7 @@ struct pti_tty {
 };
 
 struct pti_dev {
-       struct tty_port port;
+       struct tty_port port[PTITTY_MINOR_NUM];
        unsigned long pti_addr;
        unsigned long aperture_base;
        void __iomem *pti_ioaddr;
@@ -76,7 +76,7 @@ struct pti_dev {
  */
 static DEFINE_MUTEX(alloclock);
 
-static struct pci_device_id pci_ids[] __devinitconst = {
+static const struct pci_device_id pci_ids[] __devinitconst = {
                {PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x82B)},
                {0}
 };
@@ -393,25 +393,6 @@ void pti_writedata(struct pti_masterchannel *mc, u8 *buf, int count)
 }
 EXPORT_SYMBOL_GPL(pti_writedata);
 
-/**
- * pti_pci_remove()- Driver exit method to remove PTI from
- *                PCI bus.
- * @pdev: variable containing pci info of PTI.
- */
-static void __devexit pti_pci_remove(struct pci_dev *pdev)
-{
-       struct pti_dev *drv_data;
-
-       drv_data = pci_get_drvdata(pdev);
-       if (drv_data != NULL) {
-               pci_iounmap(pdev, drv_data->pti_ioaddr);
-               pci_set_drvdata(pdev, NULL);
-               kfree(drv_data);
-               pci_release_region(pdev, 1);
-               pci_disable_device(pdev);
-       }
-}
-
 /*
  * for the tty_driver_*() basic function descriptions, see tty_driver.h.
  * Specific header comments made for PTI-related specifics.
@@ -446,7 +427,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp)
         * also removes a locking requirement for the actual write
         * procedure.
         */
-       return tty_port_open(&drv_data->port, tty, filp);
+       return tty_port_open(tty->port, tty, filp);
 }
 
 /**
@@ -462,7 +443,7 @@ static int pti_tty_driver_open(struct tty_struct *tty, struct file *filp)
  */
 static void pti_tty_driver_close(struct tty_struct *tty, struct file *filp)
 {
-       tty_port_close(&drv_data->port, tty, filp);
+       tty_port_close(tty->port, tty, filp);
 }
 
 /**
@@ -818,6 +799,7 @@ static const struct tty_port_operations tty_port_ops = {
 static int __devinit pti_pci_probe(struct pci_dev *pdev,
                const struct pci_device_id *ent)
 {
+       unsigned int a;
        int retval = -EINVAL;
        int pci_bar = 1;
 
@@ -830,7 +812,7 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev,
                        __func__, __LINE__);
                pr_err("%s(%d): Error value returned: %d\n",
                        __func__, __LINE__, retval);
-               return retval;
+               goto err;
        }
 
        retval = pci_enable_device(pdev);
@@ -838,17 +820,16 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev,
                dev_err(&pdev->dev,
                        "%s: pci_enable_device() returned error %d\n",
                        __func__, retval);
-               return retval;
+               goto err_unreg_misc;
        }
 
        drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL);
-
        if (drv_data == NULL) {
                retval = -ENOMEM;
                dev_err(&pdev->dev,
                        "%s(%d): kmalloc() returned NULL memory.\n",
                        __func__, __LINE__);
-               return retval;
+               goto err_disable_pci;
        }
        drv_data->pti_addr = pci_resource_start(pdev, pci_bar);
 
@@ -857,33 +838,65 @@ static int __devinit pti_pci_probe(struct pci_dev *pdev,
                dev_err(&pdev->dev,
                        "%s(%d): pci_request_region() returned error %d\n",
                        __func__, __LINE__, retval);
-               kfree(drv_data);
-               return retval;
+               goto err_free_dd;
        }
        drv_data->aperture_base = drv_data->pti_addr+APERTURE_14;
        drv_data->pti_ioaddr =
                ioremap_nocache((u32)drv_data->aperture_base,
                APERTURE_LEN);
        if (!drv_data->pti_ioaddr) {
-               pci_release_region(pdev, pci_bar);
                retval = -ENOMEM;
-               kfree(drv_data);
-               return retval;
+               goto err_rel_reg;
        }
 
        pci_set_drvdata(pdev, drv_data);
 
-       tty_port_init(&drv_data->port);
-       drv_data->port.ops = &tty_port_ops;
+       for (a = 0; a < PTITTY_MINOR_NUM; a++) {
+               struct tty_port *port = &drv_data->port[a];
+               tty_port_init(port);
+               port->ops = &tty_port_ops;
 
-       tty_register_device(pti_tty_driver, 0, &pdev->dev);
-       tty_register_device(pti_tty_driver, 1, &pdev->dev);
+               tty_port_register_device(port, pti_tty_driver, a, &pdev->dev);
+       }
 
        register_console(&pti_console);
 
+       return 0;
+err_rel_reg:
+       pci_release_region(pdev, pci_bar);
+err_free_dd:
+       kfree(drv_data);
+err_disable_pci:
+       pci_disable_device(pdev);
+err_unreg_misc:
+       misc_deregister(&pti_char_driver);
+err:
        return retval;
 }
 
+/**
+ * pti_pci_remove()- Driver exit method to remove PTI from
+ *                PCI bus.
+ * @pdev: variable containing pci info of PTI.
+ */
+static void __devexit pti_pci_remove(struct pci_dev *pdev)
+{
+       struct pti_dev *drv_data = pci_get_drvdata(pdev);
+
+       unregister_console(&pti_console);
+
+       tty_unregister_device(pti_tty_driver, 0);
+       tty_unregister_device(pti_tty_driver, 1);
+
+       iounmap(drv_data->pti_ioaddr);
+       pci_set_drvdata(pdev, NULL);
+       kfree(drv_data);
+       pci_release_region(pdev, 1);
+       pci_disable_device(pdev);
+
+       misc_deregister(&pti_char_driver);
+}
+
 static struct pci_driver pti_pci_driver = {
        .name           = PCINAME,
        .id_table       = pci_ids,
@@ -933,25 +946,24 @@ static int __init pti_init(void)
                pr_err("%s(%d): Error value returned: %d\n",
                        __func__, __LINE__, retval);
 
-               pti_tty_driver = NULL;
-               return retval;
+               goto put_tty;
        }
 
        retval = pci_register_driver(&pti_pci_driver);
-
        if (retval) {
                pr_err("%s(%d): PCI registration failed of pti driver\n",
                        __func__, __LINE__);
                pr_err("%s(%d): Error value returned: %d\n",
                        __func__, __LINE__, retval);
-
-               tty_unregister_driver(pti_tty_driver);
-               pr_err("%s(%d): Unregistering TTY part of pti driver\n",
-                       __func__, __LINE__);
-               pti_tty_driver = NULL;
-               return retval;
+               goto unreg_tty;
        }
 
+       return 0;
+unreg_tty:
+       tty_unregister_driver(pti_tty_driver);
+put_tty:
+       put_tty_driver(pti_tty_driver);
+       pti_tty_driver = NULL;
        return retval;
 }
 
@@ -960,31 +972,9 @@ static int __init pti_init(void)
  */
 static void __exit pti_exit(void)
 {
-       int retval;
-
-       tty_unregister_device(pti_tty_driver, 0);
-       tty_unregister_device(pti_tty_driver, 1);
-
-       retval = tty_unregister_driver(pti_tty_driver);
-       if (retval) {
-               pr_err("%s(%d): TTY unregistration failed of pti driver\n",
-                       __func__, __LINE__);
-               pr_err("%s(%d): Error value returned: %d\n",
-                       __func__, __LINE__, retval);
-       }
-
+       tty_unregister_driver(pti_tty_driver);
        pci_unregister_driver(&pti_pci_driver);
-
-       retval = misc_deregister(&pti_char_driver);
-       if (retval) {
-               pr_err("%s(%d): CHAR unregistration failed of pti driver\n",
-                       __func__, __LINE__);
-               pr_err("%s(%d): Error value returned: %d\n",
-                       __func__, __LINE__, retval);
-       }
-
-       unregister_console(&pti_console);
-       return;
+       put_tty_driver(pti_tty_driver);
 }
 
 module_init(pti_init);
index f1c84de..172a768 100644 (file)
@@ -1411,7 +1411,8 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
                /* complete ongoing async transfer before issuing discard */
                if (card->host->areq)
                        mmc_blk_issue_rw_rq(mq, NULL);
-               if (req->cmd_flags & REQ_SECURE)
+               if (req->cmd_flags & REQ_SECURE &&
+                       !(card->quirks & MMC_QUIRK_SEC_ERASE_TRIM_BROKEN))
                        ret = mmc_blk_issue_secdiscard_rq(mq, req);
                else
                        ret = mmc_blk_issue_discard_rq(mq, req);
@@ -1716,6 +1717,7 @@ force_ro_fail:
 #define CID_MANFID_SANDISK     0x2
 #define CID_MANFID_TOSHIBA     0x11
 #define CID_MANFID_MICRON      0x13
+#define CID_MANFID_SAMSUNG     0x15
 
 static const struct mmc_fixup blk_fixups[] =
 {
@@ -1752,6 +1754,28 @@ static const struct mmc_fixup blk_fixups[] =
        MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc,
                  MMC_QUIRK_LONG_READ_TIME),
 
+       /*
+        * On these Samsung MoviNAND parts, performing secure erase or
+        * secure trim can result in unrecoverable corruption due to a
+        * firmware bug.
+        */
+       MMC_FIXUP("M8G2FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
+                 MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
+       MMC_FIXUP("MAG4FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
+                 MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
+       MMC_FIXUP("MBG8FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
+                 MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
+       MMC_FIXUP("MCGAFA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
+                 MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
+       MMC_FIXUP("VAL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
+                 MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
+       MMC_FIXUP("VYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
+                 MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
+       MMC_FIXUP("KYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
+                 MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
+       MMC_FIXUP("VZL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc,
+                 MMC_QUIRK_SEC_ERASE_TRIM_BROKEN),
+
        END_FIXUP
 };
 
index 5a2cbfa..d2339ea 100644 (file)
@@ -518,7 +518,7 @@ static void sdio_uart_check_modem_status(struct sdio_uart_port *port)
        if (status & UART_MSR_DCTS) {
                port->icount.cts++;
                tty = tty_port_tty_get(&port->port);
-               if (tty && (tty->termios->c_cflag & CRTSCTS)) {
+               if (tty && (tty->termios.c_cflag & CRTSCTS)) {
                        int cts = (status & UART_MSR_CTS);
                        if (tty->hw_stopped) {
                                if (cts) {
@@ -671,12 +671,12 @@ static int sdio_uart_activate(struct tty_port *tport, struct tty_struct *tty)
        port->ier = UART_IER_RLSI|UART_IER_RDI|UART_IER_RTOIE|UART_IER_UUE;
        port->mctrl = TIOCM_OUT2;
 
-       sdio_uart_change_speed(port, tty->termios, NULL);
+       sdio_uart_change_speed(port, &tty->termios, NULL);
 
-       if (tty->termios->c_cflag & CBAUD)
+       if (tty->termios.c_cflag & CBAUD)
                sdio_uart_set_mctrl(port, TIOCM_RTS | TIOCM_DTR);
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                if (!(sdio_uart_get_mctrl(port) & TIOCM_CTS))
                        tty->hw_stopped = 1;
 
@@ -850,7 +850,7 @@ static void sdio_uart_throttle(struct tty_struct *tty)
 {
        struct sdio_uart_port *port = tty->driver_data;
 
-       if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS))
+       if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS))
                return;
 
        if (sdio_uart_claim_func(port) != 0)
@@ -861,7 +861,7 @@ static void sdio_uart_throttle(struct tty_struct *tty)
                sdio_uart_start_tx(port);
        }
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                sdio_uart_clear_mctrl(port, TIOCM_RTS);
 
        sdio_uart_irq(port->func);
@@ -872,7 +872,7 @@ static void sdio_uart_unthrottle(struct tty_struct *tty)
 {
        struct sdio_uart_port *port = tty->driver_data;
 
-       if (!I_IXOFF(tty) && !(tty->termios->c_cflag & CRTSCTS))
+       if (!I_IXOFF(tty) && !(tty->termios.c_cflag & CRTSCTS))
                return;
 
        if (sdio_uart_claim_func(port) != 0)
@@ -887,7 +887,7 @@ static void sdio_uart_unthrottle(struct tty_struct *tty)
                }
        }
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                sdio_uart_set_mctrl(port, TIOCM_RTS);
 
        sdio_uart_irq(port->func);
@@ -898,12 +898,12 @@ static void sdio_uart_set_termios(struct tty_struct *tty,
                                                struct ktermios *old_termios)
 {
        struct sdio_uart_port *port = tty->driver_data;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
        if (sdio_uart_claim_func(port) != 0)
                return;
 
-       sdio_uart_change_speed(port, tty->termios, old_termios);
+       sdio_uart_change_speed(port, &tty->termios, old_termios);
 
        /* Handle transition to B0 status */
        if ((old_termios->c_cflag & CBAUD) && !(cflag & CBAUD))
@@ -1132,8 +1132,8 @@ static int sdio_uart_probe(struct sdio_func *func,
                kfree(port);
        } else {
                struct device *dev;
-               dev = tty_register_device(sdio_uart_tty_driver,
-                                               port->index, &func->dev);
+               dev = tty_port_register_device(&port->port,
+                               sdio_uart_tty_driver, port->index, &func->dev);
                if (IS_ERR(dev)) {
                        sdio_uart_port_remove(port);
                        ret = PTR_ERR(dev);
index 322412c..a53c7c4 100644 (file)
@@ -81,6 +81,7 @@ struct atmel_mci_caps {
        bool    has_bad_data_ordering;
        bool    need_reset_after_xfer;
        bool    need_blksz_mul_4;
+       bool    need_notbusy_for_read_ops;
 };
 
 struct atmel_mci_dma {
@@ -1625,7 +1626,8 @@ static void atmci_tasklet_func(unsigned long priv)
                                __func__);
                        atmci_set_completed(host, EVENT_XFER_COMPLETE);
 
-                       if (host->data->flags & MMC_DATA_WRITE) {
+                       if (host->caps.need_notbusy_for_read_ops ||
+                          (host->data->flags & MMC_DATA_WRITE)) {
                                atmci_writel(host, ATMCI_IER, ATMCI_NOTBUSY);
                                state = STATE_WAITING_NOTBUSY;
                        } else if (host->mrq->stop) {
@@ -2218,6 +2220,7 @@ static void __init atmci_get_cap(struct atmel_mci *host)
        host->caps.has_bad_data_ordering = 1;
        host->caps.need_reset_after_xfer = 1;
        host->caps.need_blksz_mul_4 = 1;
+       host->caps.need_notbusy_for_read_ops = 0;
 
        /* keep only major version number */
        switch (version & 0xf00) {
@@ -2238,6 +2241,7 @@ static void __init atmci_get_cap(struct atmel_mci *host)
        case 0x200:
                host->caps.has_rwproof = 1;
                host->caps.need_blksz_mul_4 = 0;
+               host->caps.need_notbusy_for_read_ops = 1;
        case 0x100:
                host->caps.has_bad_data_ordering = 0;
                host->caps.need_reset_after_xfer = 0;
index 0366617..a17dd73 100644 (file)
 #define bfin_write_SDH_CFG             bfin_write_RSI_CFG
 #endif
 
-struct dma_desc_array {
-       unsigned long   start_addr;
-       unsigned short  cfg;
-       unsigned short  x_count;
-       short           x_modify;
-} __packed;
-
 struct sdh_host {
        struct mmc_host         *mmc;
        spinlock_t              lock;
index 72dc3cd..af40d22 100644 (file)
@@ -627,6 +627,7 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot)
 {
        struct dw_mci *host = slot->host;
        u32 div;
+       u32 clk_en_a;
 
        if (slot->clock != host->current_speed) {
                div = host->bus_hz / slot->clock;
@@ -659,9 +660,11 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot)
                mci_send_cmd(slot,
                             SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT, 0);
 
-               /* enable clock */
-               mci_writel(host, CLKENA, ((SDMMC_CLKEN_ENABLE |
-                          SDMMC_CLKEN_LOW_PWR) << slot->id));
+               /* enable clock; only low power if no SDIO */
+               clk_en_a = SDMMC_CLKEN_ENABLE << slot->id;
+               if (!(mci_readl(host, INTMASK) & SDMMC_INT_SDIO(slot->id)))
+                       clk_en_a |= SDMMC_CLKEN_LOW_PWR << slot->id;
+               mci_writel(host, CLKENA, clk_en_a);
 
                /* inform CIU */
                mci_send_cmd(slot,
@@ -862,6 +865,30 @@ static int dw_mci_get_cd(struct mmc_host *mmc)
        return present;
 }
 
+/*
+ * Disable lower power mode.
+ *
+ * Low power mode will stop the card clock when idle.  According to the
+ * description of the CLKENA register we should disable low power mode
+ * for SDIO cards if we need SDIO interrupts to work.
+ *
+ * This function is fast if low power mode is already disabled.
+ */
+static void dw_mci_disable_low_power(struct dw_mci_slot *slot)
+{
+       struct dw_mci *host = slot->host;
+       u32 clk_en_a;
+       const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id;
+
+       clk_en_a = mci_readl(host, CLKENA);
+
+       if (clk_en_a & clken_low_pwr) {
+               mci_writel(host, CLKENA, clk_en_a & ~clken_low_pwr);
+               mci_send_cmd(slot, SDMMC_CMD_UPD_CLK |
+                            SDMMC_CMD_PRV_DAT_WAIT, 0);
+       }
+}
+
 static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb)
 {
        struct dw_mci_slot *slot = mmc_priv(mmc);
@@ -871,6 +898,14 @@ static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb)
        /* Enable/disable Slot Specific SDIO interrupt */
        int_mask = mci_readl(host, INTMASK);
        if (enb) {
+               /*
+                * Turn off low power mode if it was enabled.  This is a bit of
+                * a heavy operation and we disable / enable IRQs a lot, so
+                * we'll leave low power mode disabled and it will get
+                * re-enabled again in dw_mci_setup_bus().
+                */
+               dw_mci_disable_low_power(slot);
+
                mci_writel(host, INTMASK,
                           (int_mask | SDMMC_INT_SDIO(slot->id)));
        } else {
@@ -1429,22 +1464,10 @@ static void dw_mci_read_data_pio(struct dw_mci *host)
                        nbytes += len;
                        remain -= len;
                } while (remain);
-               sg_miter->consumed = offset;
 
+               sg_miter->consumed = offset;
                status = mci_readl(host, MINTSTS);
                mci_writel(host, RINTSTS, SDMMC_INT_RXDR);
-               if (status & DW_MCI_DATA_ERROR_FLAGS) {
-                       host->data_status = status;
-                       data->bytes_xfered += nbytes;
-                       sg_miter_stop(sg_miter);
-                       host->sg = NULL;
-                       smp_wmb();
-
-                       set_bit(EVENT_DATA_ERROR, &host->pending_events);
-
-                       tasklet_schedule(&host->tasklet);
-                       return;
-               }
        } while (status & SDMMC_INT_RXDR); /*if the RXDR is ready read again*/
        data->bytes_xfered += nbytes;
 
@@ -1497,23 +1520,10 @@ static void dw_mci_write_data_pio(struct dw_mci *host)
                        nbytes += len;
                        remain -= len;
                } while (remain);
-               sg_miter->consumed = offset;
 
+               sg_miter->consumed = offset;
                status = mci_readl(host, MINTSTS);
                mci_writel(host, RINTSTS, SDMMC_INT_TXDR);
-               if (status & DW_MCI_DATA_ERROR_FLAGS) {
-                       host->data_status = status;
-                       data->bytes_xfered += nbytes;
-                       sg_miter_stop(sg_miter);
-                       host->sg = NULL;
-
-                       smp_wmb();
-
-                       set_bit(EVENT_DATA_ERROR, &host->pending_events);
-
-                       tasklet_schedule(&host->tasklet);
-                       return;
-               }
        } while (status & SDMMC_INT_TXDR); /* if TXDR write again */
        data->bytes_xfered += nbytes;
 
@@ -1547,12 +1557,11 @@ static void dw_mci_cmd_interrupt(struct dw_mci *host, u32 status)
 static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
 {
        struct dw_mci *host = dev_id;
-       u32 status, pending;
+       u32 pending;
        unsigned int pass_count = 0;
        int i;
 
        do {
-               status = mci_readl(host, RINTSTS);
                pending = mci_readl(host, MINTSTS); /* read-only mask reg */
 
                /*
@@ -1570,7 +1579,7 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
 
                if (pending & DW_MCI_CMD_ERROR_FLAGS) {
                        mci_writel(host, RINTSTS, DW_MCI_CMD_ERROR_FLAGS);
-                       host->cmd_status = status;
+                       host->cmd_status = pending;
                        smp_wmb();
                        set_bit(EVENT_CMD_COMPLETE, &host->pending_events);
                }
@@ -1578,18 +1587,16 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
                if (pending & DW_MCI_DATA_ERROR_FLAGS) {
                        /* if there is an error report DATA_ERROR */
                        mci_writel(host, RINTSTS, DW_MCI_DATA_ERROR_FLAGS);
-                       host->data_status = status;
+                       host->data_status = pending;
                        smp_wmb();
                        set_bit(EVENT_DATA_ERROR, &host->pending_events);
-                       if (!(pending & (SDMMC_INT_DTO | SDMMC_INT_DCRC |
-                                        SDMMC_INT_SBE | SDMMC_INT_EBE)))
-                               tasklet_schedule(&host->tasklet);
+                       tasklet_schedule(&host->tasklet);
                }
 
                if (pending & SDMMC_INT_DATA_OVER) {
                        mci_writel(host, RINTSTS, SDMMC_INT_DATA_OVER);
                        if (!host->data_status)
-                               host->data_status = status;
+                               host->data_status = pending;
                        smp_wmb();
                        if (host->dir_status == DW_MCI_RECV_STATUS) {
                                if (host->sg != NULL)
@@ -1613,7 +1620,7 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id)
 
                if (pending & SDMMC_INT_CMD_DONE) {
                        mci_writel(host, RINTSTS, SDMMC_INT_CMD_DONE);
-                       dw_mci_cmd_interrupt(host, status);
+                       dw_mci_cmd_interrupt(host, pending);
                }
 
                if (pending & SDMMC_INT_CD) {
index a51f930..ad3fcea 100644 (file)
@@ -285,11 +285,11 @@ static irqreturn_t mxs_mmc_irq_handler(int irq, void *dev_id)
        writel(stat & MXS_MMC_IRQ_BITS,
               host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_CLR);
 
+       spin_unlock(&host->lock);
+
        if ((stat & BM_SSP_CTRL1_SDIO_IRQ) && (stat & BM_SSP_CTRL1_SDIO_IRQ_EN))
                mmc_signal_sdio_irq(host->mmc);
 
-       spin_unlock(&host->lock);
-
        if (stat & BM_SSP_CTRL1_RESP_TIMEOUT_IRQ)
                cmd->error = -ETIMEDOUT;
        else if (stat & BM_SSP_CTRL1_RESP_ERR_IRQ)
@@ -644,11 +644,6 @@ static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
                       host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET);
                writel(BM_SSP_CTRL1_SDIO_IRQ_EN,
                       host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_SET);
-
-               if (readl(host->base + HW_SSP_STATUS(host)) &
-                               BM_SSP_STATUS_SDIO_IRQ)
-                       mmc_signal_sdio_irq(host->mmc);
-
        } else {
                writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK,
                       host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR);
@@ -657,6 +652,11 @@ static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
        }
 
        spin_unlock_irqrestore(&host->lock, flags);
+
+       if (enable && readl(host->base + HW_SSP_STATUS(host)) &
+                       BM_SSP_STATUS_SDIO_IRQ)
+               mmc_signal_sdio_irq(host->mmc);
+
 }
 
 static const struct mmc_host_ops mxs_mmc_ops = {
index 50e08f0..c6259a8 100644 (file)
 #include <asm/io.h>
 #include <asm/irq.h>
 
-#include <plat/board.h>
 #include <plat/mmc.h>
 #include <asm/gpio.h>
 #include <plat/dma.h>
-#include <plat/mux.h>
 #include <plat/fpga.h>
 
 #define        OMAP_MMC_REG_CMD        0x00
@@ -668,7 +666,7 @@ mmc_omap_clk_timer(unsigned long data)
 static void
 mmc_omap_xfer_data(struct mmc_omap_host *host, int write)
 {
-       int n;
+       int n, nwords;
 
        if (host->buffer_bytes_left == 0) {
                host->sg_idx++;
@@ -678,15 +676,23 @@ mmc_omap_xfer_data(struct mmc_omap_host *host, int write)
        n = 64;
        if (n > host->buffer_bytes_left)
                n = host->buffer_bytes_left;
+
+       nwords = n / 2;
+       nwords += n & 1; /* handle odd number of bytes to transfer */
+
        host->buffer_bytes_left -= n;
        host->total_bytes_left -= n;
        host->data->bytes_xfered += n;
 
        if (write) {
-               __raw_writesw(host->virt_base + OMAP_MMC_REG(host, DATA), host->buffer, n);
+               __raw_writesw(host->virt_base + OMAP_MMC_REG(host, DATA),
+                             host->buffer, nwords);
        } else {
-               __raw_readsw(host->virt_base + OMAP_MMC_REG(host, DATA), host->buffer, n);
+               __raw_readsw(host->virt_base + OMAP_MMC_REG(host, DATA),
+                            host->buffer, nwords);
        }
+
+       host->buffer += nwords;
 }
 
 static inline void mmc_omap_report_irq(u16 status)
index 3a09f93..f871b31 100644 (file)
@@ -40,7 +40,6 @@
 #include <linux/regulator/consumer.h>
 #include <linux/pm_runtime.h>
 #include <mach/hardware.h>
-#include <plat/board.h>
 #include <plat/mmc.h>
 #include <plat/cpu.h>
 
index b97b2f5..d25f9ab 100644 (file)
@@ -48,14 +48,14 @@ static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
        int div = 1;
        u32 temp;
 
+       if (clock == 0)
+               goto out;
+
        temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL);
        temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN
                | ESDHC_CLOCK_MASK);
        sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
 
-       if (clock == 0)
-               goto out;
-
        while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
                pre_div *= 2;
 
index 0810ccc..5393c64 100644 (file)
@@ -27,7 +27,6 @@
 
 #include <asm/gpio.h>
 
-#include <mach/gpio-tegra.h>
 #include <mach/sdhci.h>
 
 #include "sdhci-pltfm.h"
index 861ca8f..a7040af 100644 (file)
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/nand.h>
 #include <linux/mtd/partitions.h>
+#include <linux/gpio.h>
+#include <linux/platform_data/gpio-omap.h>
+
 #include <asm/io.h>
-#include <mach/hardware.h>
 #include <asm/sizes.h>
-#include <linux/gpio.h>
-#include <plat/board-ams-delta.h>
+
+#include <mach/board-ams-delta.h>
+
+#include <mach/hardware.h>
 
 /*
  * MTD structure for E3 (Delta)
index c855e7c..d0d1bd4 100644 (file)
@@ -249,20 +249,20 @@ static int nand_dev_ready(struct mtd_info *mtd)
 int bcm_umi_nand_inithw(void)
 {
        /* Configure nand timing parameters */
-       REG_UMI_NAND_TCR &= ~0x7ffff;
-       REG_UMI_NAND_TCR |= HW_CFG_NAND_TCR;
+       writel(readl(&REG_UMI_NAND_TCR) & ~0x7ffff, &REG_UMI_NAND_TCR);
+       writel(readl(&REG_UMI_NAND_TCR) | HW_CFG_NAND_TCR, &REG_UMI_NAND_TCR);
 
 #if !defined(CONFIG_MTD_NAND_BCM_UMI_HWCS)
        /* enable software control of CS */
-       REG_UMI_NAND_TCR |= REG_UMI_NAND_TCR_CS_SWCTRL;
+       writel(readl(&REG_UMI_NAND_TCR) | REG_UMI_NAND_TCR_CS_SWCTRL, &REG_UMI_NAND_TCR);
 #endif
 
        /* keep NAND chip select asserted */
-       REG_UMI_NAND_RCSR |= REG_UMI_NAND_RCSR_CS_ASSERTED;
+       writel(readl(&REG_UMI_NAND_RCSR) | REG_UMI_NAND_RCSR_CS_ASSERTED, &REG_UMI_NAND_RCSR);
 
-       REG_UMI_NAND_TCR &= ~REG_UMI_NAND_TCR_WORD16;
+       writel(readl(&REG_UMI_NAND_TCR) & ~REG_UMI_NAND_TCR_WORD16, &REG_UMI_NAND_TCR);
        /* enable writes to flash */
-       REG_UMI_MMD_ICR |= REG_UMI_MMD_ICR_FLASH_WP;
+       writel(readl(&REG_UMI_MMD_ICR) | REG_UMI_MMD_ICR_FLASH_WP, &REG_UMI_MMD_ICR);
 
        writel(NAND_CMD_RESET, bcm_umi_io_base + REG_NAND_CMD_OFFSET);
        nand_bcm_umi_wait_till_ready();
index 198b304..d901866 100644 (file)
@@ -17,7 +17,7 @@
 /* ---- Include Files ---------------------------------------------------- */
 #include <mach/reg_umi.h>
 #include <mach/reg_nand.h>
-#include <cfg_global.h>
+#include <mach/cfg_global.h>
 
 /* ---- Constants and Types ---------------------------------------------- */
 #if (CFG_GLOBAL_CHIP_FAMILY == CFG_GLOBAL_CHIP_FAMILY_BCMRING)
@@ -48,7 +48,7 @@ int nand_bcm_umi_bch_correct_page(uint8_t *datap, uint8_t *readEccData,
 /* Check in device is ready */
 static inline int nand_bcm_umi_dev_ready(void)
 {
-       return REG_UMI_NAND_RCSR & REG_UMI_NAND_RCSR_RDY;
+       return readl(&REG_UMI_NAND_RCSR) & REG_UMI_NAND_RCSR_RDY;
 }
 
 /* Wait until device is ready */
@@ -62,10 +62,11 @@ static inline void nand_bcm_umi_wait_till_ready(void)
 static inline void nand_bcm_umi_hamming_enable_hwecc(void)
 {
        /* disable and reset ECC, 512 byte page */
-       REG_UMI_NAND_ECC_CSR &= ~(REG_UMI_NAND_ECC_CSR_ECC_ENABLE |
-               REG_UMI_NAND_ECC_CSR_256BYTE);
+       writel(readl(&REG_UMI_NAND_ECC_CSR) & ~(REG_UMI_NAND_ECC_CSR_ECC_ENABLE |
+               REG_UMI_NAND_ECC_CSR_256BYTE), &REG_UMI_NAND_ECC_CSR);
        /* enable ECC */
-       REG_UMI_NAND_ECC_CSR |= REG_UMI_NAND_ECC_CSR_ECC_ENABLE;
+       writel(readl(&REG_UMI_NAND_ECC_CSR) | REG_UMI_NAND_ECC_CSR_ECC_ENABLE,
+               &REG_UMI_NAND_ECC_CSR);
 }
 
 #if NAND_ECC_BCH
@@ -76,18 +77,18 @@ static inline void nand_bcm_umi_hamming_enable_hwecc(void)
 static inline void nand_bcm_umi_bch_enable_read_hwecc(void)
 {
        /* disable and reset ECC */
-       REG_UMI_BCH_CTRL_STATUS = REG_UMI_BCH_CTRL_STATUS_RD_ECC_VALID;
+       writel(REG_UMI_BCH_CTRL_STATUS_RD_ECC_VALID, &REG_UMI_BCH_CTRL_STATUS);
        /* Turn on ECC */
-       REG_UMI_BCH_CTRL_STATUS = REG_UMI_BCH_CTRL_STATUS_ECC_RD_EN;
+       writel(REG_UMI_BCH_CTRL_STATUS_ECC_RD_EN, &REG_UMI_BCH_CTRL_STATUS);
 }
 
 /* Enable BCH Write ECC */
 static inline void nand_bcm_umi_bch_enable_write_hwecc(void)
 {
        /* disable and reset ECC */
-       REG_UMI_BCH_CTRL_STATUS = REG_UMI_BCH_CTRL_STATUS_WR_ECC_VALID;
+       writel(REG_UMI_BCH_CTRL_STATUS_WR_ECC_VALID, &REG_UMI_BCH_CTRL_STATUS);
        /* Turn on ECC */
-       REG_UMI_BCH_CTRL_STATUS = REG_UMI_BCH_CTRL_STATUS_ECC_WR_EN;
+       writel(REG_UMI_BCH_CTRL_STATUS_ECC_WR_EN, &REG_UMI_BCH_CTRL_STATUS);
 }
 
 /* Config number of BCH ECC bytes */
@@ -99,9 +100,9 @@ static inline void nand_bcm_umi_bch_config_ecc(uint8_t numEccBytes)
        uint32_t numBits = numEccBytes * 8;
 
        /* disable and reset ECC */
-       REG_UMI_BCH_CTRL_STATUS =
-           REG_UMI_BCH_CTRL_STATUS_WR_ECC_VALID |
-           REG_UMI_BCH_CTRL_STATUS_RD_ECC_VALID;
+       writel(REG_UMI_BCH_CTRL_STATUS_WR_ECC_VALID |
+              REG_UMI_BCH_CTRL_STATUS_RD_ECC_VALID,
+              &REG_UMI_BCH_CTRL_STATUS);
 
        /* Every correctible bit requires 13 ECC bits */
        tValue = (uint32_t) (numBits / ECC_BITS_PER_CORRECTABLE_BIT);
@@ -113,23 +114,21 @@ static inline void nand_bcm_umi_bch_config_ecc(uint8_t numEccBytes)
        kValue = nValue - (tValue * ECC_BITS_PER_CORRECTABLE_BIT);
 
        /* Write the settings */
-       REG_UMI_BCH_N = nValue;
-       REG_UMI_BCH_T = tValue;
-       REG_UMI_BCH_K = kValue;
+       writel(nValue, &REG_UMI_BCH_N);
+       writel(tValue, &REG_UMI_BCH_T);
+       writel(kValue, &REG_UMI_BCH_K);
 }
 
 /* Pause during ECC read calculation to skip bytes in OOB */
 static inline void nand_bcm_umi_bch_pause_read_ecc_calc(void)
 {
-       REG_UMI_BCH_CTRL_STATUS =
-           REG_UMI_BCH_CTRL_STATUS_ECC_RD_EN |
-           REG_UMI_BCH_CTRL_STATUS_PAUSE_ECC_DEC;
+       writel(REG_UMI_BCH_CTRL_STATUS_ECC_RD_EN | REG_UMI_BCH_CTRL_STATUS_PAUSE_ECC_DEC, &REG_UMI_BCH_CTRL_STATUS);
 }
 
 /* Resume during ECC read calculation after skipping bytes in OOB */
 static inline void nand_bcm_umi_bch_resume_read_ecc_calc(void)
 {
-       REG_UMI_BCH_CTRL_STATUS = REG_UMI_BCH_CTRL_STATUS_ECC_RD_EN;
+       writel(REG_UMI_BCH_CTRL_STATUS_ECC_RD_EN, &REG_UMI_BCH_CTRL_STATUS);
 }
 
 /* Poll read ECC calc to check when hardware completes */
@@ -139,7 +138,7 @@ static inline uint32_t nand_bcm_umi_bch_poll_read_ecc_calc(void)
 
        do {
                /* wait for ECC to be valid */
-               regVal = REG_UMI_BCH_CTRL_STATUS;
+               regVal = readl(&REG_UMI_BCH_CTRL_STATUS);
        } while ((regVal & REG_UMI_BCH_CTRL_STATUS_RD_ECC_VALID) == 0);
 
        return regVal;
@@ -149,7 +148,7 @@ static inline uint32_t nand_bcm_umi_bch_poll_read_ecc_calc(void)
 static inline void nand_bcm_umi_bch_poll_write_ecc_calc(void)
 {
        /* wait for ECC to be valid */
-       while ((REG_UMI_BCH_CTRL_STATUS & REG_UMI_BCH_CTRL_STATUS_WR_ECC_VALID)
+       while ((readl(&REG_UMI_BCH_CTRL_STATUS) & REG_UMI_BCH_CTRL_STATUS_WR_ECC_VALID)
               == 0)
                ;
 }
@@ -170,9 +169,9 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize,
        if (pageSize != NAND_DATA_ACCESS_SIZE) {
                /* skip BI */
 #if defined(__KERNEL__) && !defined(STANDALONE)
-               *oobp++ = REG_NAND_DATA8;
+               *oobp++ = readb(&REG_NAND_DATA8);
 #else
-               REG_NAND_DATA8;
+               readb(&REG_NAND_DATA8);
 #endif
                numToRead--;
        }
@@ -180,9 +179,9 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize,
        while (numToRead > numEccBytes) {
                /* skip free oob region */
 #if defined(__KERNEL__) && !defined(STANDALONE)
-               *oobp++ = REG_NAND_DATA8;
+               *oobp++ = readb(&REG_NAND_DATA8);
 #else
-               REG_NAND_DATA8;
+               readb(&REG_NAND_DATA8);
 #endif
                numToRead--;
        }
@@ -193,11 +192,11 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize,
 
                while (numToRead > 11) {
 #if defined(__KERNEL__) && !defined(STANDALONE)
-                       *oobp = REG_NAND_DATA8;
+                       *oobp = readb(&REG_NAND_DATA8);
                        eccCalc[eccPos++] = *oobp;
                        oobp++;
 #else
-                       eccCalc[eccPos++] = REG_NAND_DATA8;
+                       eccCalc[eccPos++] = readb(&REG_NAND_DATA8);
 #endif
                        numToRead--;
                }
@@ -207,9 +206,9 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize,
                if (numToRead == 11) {
                        /* read BI */
 #if defined(__KERNEL__) && !defined(STANDALONE)
-                       *oobp++ = REG_NAND_DATA8;
+                       *oobp++ = readb(&REG_NAND_DATA8);
 #else
-                       REG_NAND_DATA8;
+                       readb(&REG_NAND_DATA8);
 #endif
                        numToRead--;
                }
@@ -219,11 +218,11 @@ static inline void nand_bcm_umi_bch_read_oobEcc(uint32_t pageSize,
        nand_bcm_umi_bch_resume_read_ecc_calc();
        while (numToRead) {
 #if defined(__KERNEL__) && !defined(STANDALONE)
-               *oobp = REG_NAND_DATA8;
+               *oobp = readb(&REG_NAND_DATA8);
                eccCalc[eccPos++] = *oobp;
                oobp++;
 #else
-               eccCalc[eccPos++] = REG_NAND_DATA8;
+               eccCalc[eccPos++] = readb(&REG_NAND_DATA8);
 #endif
                numToRead--;
        }
@@ -255,7 +254,7 @@ static inline void nand_bcm_umi_bch_write_oobEcc(uint32_t pageSize,
        if (pageSize == NAND_DATA_ACCESS_SIZE) {
                /* Now fill in the ECC bytes */
                if (numEccBytes >= 13)
-                       eccVal = REG_UMI_BCH_WR_ECC_3;
+                       eccVal = readl(&REG_UMI_BCH_WR_ECC_3);
 
                /* Usually we skip CM in oob[0,1] */
                NAND_BCM_UMI_ECC_WRITE(numEccBytes, 15, &oobp[0],
@@ -268,7 +267,7 @@ static inline void nand_bcm_umi_bch_write_oobEcc(uint32_t pageSize,
                        eccVal & 0xff); /* ECC 12 */
 
                if (numEccBytes >= 9)
-                       eccVal = REG_UMI_BCH_WR_ECC_2;
+                       eccVal = readl(&REG_UMI_BCH_WR_ECC_2);
 
                NAND_BCM_UMI_ECC_WRITE(numEccBytes, 12, &oobp[3],
                        (eccVal >> 24) & 0xff); /* ECC11 */
@@ -281,7 +280,7 @@ static inline void nand_bcm_umi_bch_write_oobEcc(uint32_t pageSize,
 
                /* Now fill in the ECC bytes */
                if (numEccBytes >= 13)
-                       eccVal = REG_UMI_BCH_WR_ECC_3;
+                       eccVal = readl(&REG_UMI_BCH_WR_ECC_3);
 
                /* Usually skip CM in oob[1,2] */
                NAND_BCM_UMI_ECC_WRITE(numEccBytes, 15, &oobp[1],
@@ -294,7 +293,7 @@ static inline void nand_bcm_umi_bch_write_oobEcc(uint32_t pageSize,
                        eccVal & 0xff); /* ECC12 */
 
                if (numEccBytes >= 9)
-                       eccVal = REG_UMI_BCH_WR_ECC_2;
+                       eccVal = readl(&REG_UMI_BCH_WR_ECC_2);
 
                NAND_BCM_UMI_ECC_WRITE(numEccBytes, 12, &oobp[4],
                        (eccVal >> 24) & 0xff); /* ECC11 */
@@ -309,7 +308,7 @@ static inline void nand_bcm_umi_bch_write_oobEcc(uint32_t pageSize,
                eccVal & 0xff); /* ECC8 */
 
        if (numEccBytes >= 5)
-               eccVal = REG_UMI_BCH_WR_ECC_1;
+               eccVal = readl(&REG_UMI_BCH_WR_ECC_1);
 
        NAND_BCM_UMI_ECC_WRITE(numEccBytes, 8, &oobp[8],
                (eccVal >> 24) & 0xff); /* ECC7 */
@@ -321,7 +320,7 @@ static inline void nand_bcm_umi_bch_write_oobEcc(uint32_t pageSize,
                eccVal & 0xff); /* ECC4 */
 
        if (numEccBytes >= 1)
-               eccVal = REG_UMI_BCH_WR_ECC_0;
+               eccVal = readl(&REG_UMI_BCH_WR_ECC_0);
 
        NAND_BCM_UMI_ECC_WRITE(numEccBytes, 4, &oobp[12],
                (eccVal >> 24) & 0xff); /* ECC3 */
index ac4fd75..fc81112 100644 (file)
@@ -29,7 +29,7 @@
 
 #include <plat/dma.h>
 #include <plat/gpmc.h>
-#include <plat/nand.h>
+#include <linux/platform_data/mtd-nand-omap2.h>
 
 #define        DRIVER_NAME     "omap2-nand"
 #define        OMAP_NAND_TIMEOUT_MS    5000
 #define P4e_s(a)       (TF(a & NAND_Ecc_P4e)           << 0)
 #define P4o_s(a)       (TF(a & NAND_Ecc_P4o)           << 1)
 
+#define        PREFETCH_CONFIG1_CS_SHIFT       24
+#define        ECC_CONFIG_CS_SHIFT             1
+#define        CS_MASK                         0x7
+#define        ENABLE_PREFETCH                 (0x1 << 7)
+#define        DMA_MPU_MODE_SHIFT              2
+#define        ECCSIZE1_SHIFT                  22
+#define        ECC1RESULTSIZE                  0x1
+#define        ECCCLEAR                        0x100
+#define        ECC1                            0x1
+
 /* oob info generated runtime depending on ecc algorithm and layout selected */
 static struct nand_ecclayout omap_oobinfo;
 /* Define some generic bad / good block scan pattern which are used
@@ -124,15 +134,18 @@ struct omap_nand_info {
 
        int                             gpmc_cs;
        unsigned long                   phys_base;
+       unsigned long                   mem_size;
        struct completion               comp;
        struct dma_chan                 *dma;
-       int                             gpmc_irq;
+       int                             gpmc_irq_fifo;
+       int                             gpmc_irq_count;
        enum {
                OMAP_NAND_IO_READ = 0,  /* read */
                OMAP_NAND_IO_WRITE,     /* write */
        } iomode;
        u_char                          *buf;
        int                                     buf_len;
+       struct gpmc_nand_regs           reg;
 
 #ifdef CONFIG_MTD_NAND_OMAP_BCH
        struct bch_control             *bch;
@@ -141,6 +154,63 @@ struct omap_nand_info {
 };
 
 /**
+ * omap_prefetch_enable - configures and starts prefetch transfer
+ * @cs: cs (chip select) number
+ * @fifo_th: fifo threshold to be used for read/ write
+ * @dma_mode: dma mode enable (1) or disable (0)
+ * @u32_count: number of bytes to be transferred
+ * @is_write: prefetch read(0) or write post(1) mode
+ */
+static int omap_prefetch_enable(int cs, int fifo_th, int dma_mode,
+       unsigned int u32_count, int is_write, struct omap_nand_info *info)
+{
+       u32 val;
+
+       if (fifo_th > PREFETCH_FIFOTHRESHOLD_MAX)
+               return -1;
+
+       if (readl(info->reg.gpmc_prefetch_control))
+               return -EBUSY;
+
+       /* Set the amount of bytes to be prefetched */
+       writel(u32_count, info->reg.gpmc_prefetch_config2);
+
+       /* Set dma/mpu mode, the prefetch read / post write and
+        * enable the engine. Set which cs is has requested for.
+        */
+       val = ((cs << PREFETCH_CONFIG1_CS_SHIFT) |
+               PREFETCH_FIFOTHRESHOLD(fifo_th) | ENABLE_PREFETCH |
+               (dma_mode << DMA_MPU_MODE_SHIFT) | (0x1 & is_write));
+       writel(val, info->reg.gpmc_prefetch_config1);
+
+       /*  Start the prefetch engine */
+       writel(0x1, info->reg.gpmc_prefetch_control);
+
+       return 0;
+}
+
+/**
+ * omap_prefetch_reset - disables and stops the prefetch engine
+ */
+static int omap_prefetch_reset(int cs, struct omap_nand_info *info)
+{
+       u32 config1;
+
+       /* check if the same module/cs is trying to reset */
+       config1 = readl(info->reg.gpmc_prefetch_config1);
+       if (((config1 >> PREFETCH_CONFIG1_CS_SHIFT) & CS_MASK) != cs)
+               return -EINVAL;
+
+       /* Stop the PFPW engine */
+       writel(0x0, info->reg.gpmc_prefetch_control);
+
+       /* Reset/disable the PFPW engine */
+       writel(0x0, info->reg.gpmc_prefetch_config1);
+
+       return 0;
+}
+
+/**
  * omap_hwcontrol - hardware specific access to control-lines
  * @mtd: MTD device structure
  * @cmd: command to device
@@ -158,13 +228,13 @@ static void omap_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
 
        if (cmd != NAND_CMD_NONE) {
                if (ctrl & NAND_CLE)
-                       gpmc_nand_write(info->gpmc_cs, GPMC_NAND_COMMAND, cmd);
+                       writeb(cmd, info->reg.gpmc_nand_command);
 
                else if (ctrl & NAND_ALE)
-                       gpmc_nand_write(info->gpmc_cs, GPMC_NAND_ADDRESS, cmd);
+                       writeb(cmd, info->reg.gpmc_nand_address);
 
                else /* NAND_NCE */
-                       gpmc_nand_write(info->gpmc_cs, GPMC_NAND_DATA, cmd);
+                       writeb(cmd, info->reg.gpmc_nand_data);
        }
 }
 
@@ -198,7 +268,8 @@ static void omap_write_buf8(struct mtd_info *mtd, const u_char *buf, int len)
                iowrite8(*p++, info->nand.IO_ADDR_W);
                /* wait until buffer is available for write */
                do {
-                       status = gpmc_read_status(GPMC_STATUS_BUFFER);
+                       status = readl(info->reg.gpmc_status) &
+                                       GPMC_STATUS_BUFF_EMPTY;
                } while (!status);
        }
 }
@@ -235,7 +306,8 @@ static void omap_write_buf16(struct mtd_info *mtd, const u_char * buf, int len)
                iowrite16(*p++, info->nand.IO_ADDR_W);
                /* wait until buffer is available for write */
                do {
-                       status = gpmc_read_status(GPMC_STATUS_BUFFER);
+                       status = readl(info->reg.gpmc_status) &
+                                       GPMC_STATUS_BUFF_EMPTY;
                } while (!status);
        }
 }
@@ -265,8 +337,8 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len)
        }
 
        /* configure and start prefetch transfer */
-       ret = gpmc_prefetch_enable(info->gpmc_cs,
-                       PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x0);
+       ret = omap_prefetch_enable(info->gpmc_cs,
+                       PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x0, info);
        if (ret) {
                /* PFPW engine is busy, use cpu copy method */
                if (info->nand.options & NAND_BUSWIDTH_16)
@@ -275,14 +347,15 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len)
                        omap_read_buf8(mtd, (u_char *)p, len);
        } else {
                do {
-                       r_count = gpmc_read_status(GPMC_PREFETCH_FIFO_CNT);
+                       r_count = readl(info->reg.gpmc_prefetch_status);
+                       r_count = GPMC_PREFETCH_STATUS_FIFO_CNT(r_count);
                        r_count = r_count >> 2;
                        ioread32_rep(info->nand.IO_ADDR_R, p, r_count);
                        p += r_count;
                        len -= r_count << 2;
                } while (len);
                /* disable and stop the PFPW engine */
-               gpmc_prefetch_reset(info->gpmc_cs);
+               omap_prefetch_reset(info->gpmc_cs, info);
        }
 }
 
@@ -301,6 +374,7 @@ static void omap_write_buf_pref(struct mtd_info *mtd,
        int i = 0, ret = 0;
        u16 *p = (u16 *)buf;
        unsigned long tim, limit;
+       u32 val;
 
        /* take care of subpage writes */
        if (len % 2 != 0) {
@@ -310,8 +384,8 @@ static void omap_write_buf_pref(struct mtd_info *mtd,
        }
 
        /*  configure and start prefetch transfer */
-       ret = gpmc_prefetch_enable(info->gpmc_cs,
-                       PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x1);
+       ret = omap_prefetch_enable(info->gpmc_cs,
+                       PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x1, info);
        if (ret) {
                /* PFPW engine is busy, use cpu copy method */
                if (info->nand.options & NAND_BUSWIDTH_16)
@@ -320,7 +394,8 @@ static void omap_write_buf_pref(struct mtd_info *mtd,
                        omap_write_buf8(mtd, (u_char *)p, len);
        } else {
                while (len) {
-                       w_count = gpmc_read_status(GPMC_PREFETCH_FIFO_CNT);
+                       w_count = readl(info->reg.gpmc_prefetch_status);
+                       w_count = GPMC_PREFETCH_STATUS_FIFO_CNT(w_count);
                        w_count = w_count >> 1;
                        for (i = 0; (i < w_count) && len; i++, len -= 2)
                                iowrite16(*p++, info->nand.IO_ADDR_W);
@@ -329,11 +404,14 @@ static void omap_write_buf_pref(struct mtd_info *mtd,
                tim = 0;
                limit = (loops_per_jiffy *
                                        msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
-               while (gpmc_read_status(GPMC_PREFETCH_COUNT) && (tim++ < limit))
+               do {
                        cpu_relax();
+                       val = readl(info->reg.gpmc_prefetch_status);
+                       val = GPMC_PREFETCH_STATUS_COUNT(val);
+               } while (val && (tim++ < limit));
 
                /* disable and stop the PFPW engine */
-               gpmc_prefetch_reset(info->gpmc_cs);
+               omap_prefetch_reset(info->gpmc_cs, info);
        }
 }
 
@@ -365,6 +443,7 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
        unsigned long tim, limit;
        unsigned n;
        int ret;
+       u32 val;
 
        if (addr >= high_memory) {
                struct page *p1;
@@ -396,9 +475,9 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
        tx->callback_param = &info->comp;
        dmaengine_submit(tx);
 
-       /* configure and start prefetch transfer */
-       ret = gpmc_prefetch_enable(info->gpmc_cs,
-               PREFETCH_FIFOTHRESHOLD_MAX, 0x1, len, is_write);
+       /*  configure and start prefetch transfer */
+       ret = omap_prefetch_enable(info->gpmc_cs,
+               PREFETCH_FIFOTHRESHOLD_MAX, 0x1, len, is_write, info);
        if (ret)
                /* PFPW engine is busy, use cpu copy method */
                goto out_copy_unmap;
@@ -410,11 +489,15 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr,
        wait_for_completion(&info->comp);
        tim = 0;
        limit = (loops_per_jiffy * msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
-       while (gpmc_read_status(GPMC_PREFETCH_COUNT) && (tim++ < limit))
+
+       do {
                cpu_relax();
+               val = readl(info->reg.gpmc_prefetch_status);
+               val = GPMC_PREFETCH_STATUS_COUNT(val);
+       } while (val && (tim++ < limit));
 
        /* disable and stop the PFPW engine */
-       gpmc_prefetch_reset(info->gpmc_cs);
+       omap_prefetch_reset(info->gpmc_cs, info);
 
        dma_unmap_sg(info->dma->device->dev, &sg, 1, dir);
        return 0;
@@ -471,13 +554,12 @@ static irqreturn_t omap_nand_irq(int this_irq, void *dev)
 {
        struct omap_nand_info *info = (struct omap_nand_info *) dev;
        u32 bytes;
-       u32 irq_stat;
 
-       irq_stat = gpmc_read_status(GPMC_GET_IRQ_STATUS);
-       bytes = gpmc_read_status(GPMC_PREFETCH_FIFO_CNT);
+       bytes = readl(info->reg.gpmc_prefetch_status);
+       bytes = GPMC_PREFETCH_STATUS_FIFO_CNT(bytes);
        bytes = bytes  & 0xFFFC; /* io in multiple of 4 bytes */
        if (info->iomode == OMAP_NAND_IO_WRITE) { /* checks for write io */
-               if (irq_stat & 0x2)
+               if (this_irq == info->gpmc_irq_count)
                        goto done;
 
                if (info->buf_len && (info->buf_len < bytes))
@@ -494,20 +576,17 @@ static irqreturn_t omap_nand_irq(int this_irq, void *dev)
                                                (u32 *)info->buf, bytes >> 2);
                info->buf = info->buf + bytes;
 
-               if (irq_stat & 0x2)
+               if (this_irq == info->gpmc_irq_count)
                        goto done;
        }
-       gpmc_cs_configure(info->gpmc_cs, GPMC_SET_IRQ_STATUS, irq_stat);
 
        return IRQ_HANDLED;
 
 done:
        complete(&info->comp);
-       /* disable irq */
-       gpmc_cs_configure(info->gpmc_cs, GPMC_ENABLE_IRQ, 0);
 
-       /* clear status */
-       gpmc_cs_configure(info->gpmc_cs, GPMC_SET_IRQ_STATUS, irq_stat);
+       disable_irq_nosync(info->gpmc_irq_fifo);
+       disable_irq_nosync(info->gpmc_irq_count);
 
        return IRQ_HANDLED;
 }
@@ -534,22 +613,22 @@ static void omap_read_buf_irq_pref(struct mtd_info *mtd, u_char *buf, int len)
        init_completion(&info->comp);
 
        /*  configure and start prefetch transfer */
-       ret = gpmc_prefetch_enable(info->gpmc_cs,
-                       PREFETCH_FIFOTHRESHOLD_MAX/2, 0x0, len, 0x0);
+       ret = omap_prefetch_enable(info->gpmc_cs,
+                       PREFETCH_FIFOTHRESHOLD_MAX/2, 0x0, len, 0x0, info);
        if (ret)
                /* PFPW engine is busy, use cpu copy method */
                goto out_copy;
 
        info->buf_len = len;
-       /* enable irq */
-       gpmc_cs_configure(info->gpmc_cs, GPMC_ENABLE_IRQ,
-               (GPMC_IRQ_FIFOEVENTENABLE | GPMC_IRQ_COUNT_EVENT));
+
+       enable_irq(info->gpmc_irq_count);
+       enable_irq(info->gpmc_irq_fifo);
 
        /* waiting for read to complete */
        wait_for_completion(&info->comp);
 
        /* disable and stop the PFPW engine */
-       gpmc_prefetch_reset(info->gpmc_cs);
+       omap_prefetch_reset(info->gpmc_cs, info);
        return;
 
 out_copy:
@@ -572,6 +651,7 @@ static void omap_write_buf_irq_pref(struct mtd_info *mtd,
                                                struct omap_nand_info, mtd);
        int ret = 0;
        unsigned long tim, limit;
+       u32 val;
 
        if (len <= mtd->oobsize) {
                omap_write_buf_pref(mtd, buf, len);
@@ -583,27 +663,31 @@ static void omap_write_buf_irq_pref(struct mtd_info *mtd,
        init_completion(&info->comp);
 
        /* configure and start prefetch transfer : size=24 */
-       ret = gpmc_prefetch_enable(info->gpmc_cs,
-                       (PREFETCH_FIFOTHRESHOLD_MAX * 3) / 8, 0x0, len, 0x1);
+       ret = omap_prefetch_enable(info->gpmc_cs,
+               (PREFETCH_FIFOTHRESHOLD_MAX * 3) / 8, 0x0, len, 0x1, info);
        if (ret)
                /* PFPW engine is busy, use cpu copy method */
                goto out_copy;
 
        info->buf_len = len;
-       /* enable irq */
-       gpmc_cs_configure(info->gpmc_cs, GPMC_ENABLE_IRQ,
-                       (GPMC_IRQ_FIFOEVENTENABLE | GPMC_IRQ_COUNT_EVENT));
+
+       enable_irq(info->gpmc_irq_count);
+       enable_irq(info->gpmc_irq_fifo);
 
        /* waiting for write to complete */
        wait_for_completion(&info->comp);
+
        /* wait for data to flushed-out before reset the prefetch */
        tim = 0;
        limit = (loops_per_jiffy *  msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS));
-       while (gpmc_read_status(GPMC_PREFETCH_COUNT) && (tim++ < limit))
+       do {
+               val = readl(info->reg.gpmc_prefetch_status);
+               val = GPMC_PREFETCH_STATUS_COUNT(val);
                cpu_relax();
+       } while (val && (tim++ < limit));
 
        /* disable and stop the PFPW engine */
-       gpmc_prefetch_reset(info->gpmc_cs);
+       omap_prefetch_reset(info->gpmc_cs, info);
        return;
 
 out_copy:
@@ -843,7 +927,20 @@ static int omap_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
 {
        struct omap_nand_info *info = container_of(mtd, struct omap_nand_info,
                                                        mtd);
-       return gpmc_calculate_ecc(info->gpmc_cs, dat, ecc_code);
+       u32 val;
+
+       val = readl(info->reg.gpmc_ecc_config);
+       if (((val >> ECC_CONFIG_CS_SHIFT)  & ~CS_MASK) != info->gpmc_cs)
+               return -EINVAL;
+
+       /* read ecc result */
+       val = readl(info->reg.gpmc_ecc1_result);
+       *ecc_code++ = val;          /* P128e, ..., P1e */
+       *ecc_code++ = val >> 16;    /* P128o, ..., P1o */
+       /* P2048o, P1024o, P512o, P256o, P2048e, P1024e, P512e, P256e */
+       *ecc_code++ = ((val >> 8) & 0x0f) | ((val >> 20) & 0xf0);
+
+       return 0;
 }
 
 /**
@@ -857,8 +954,34 @@ static void omap_enable_hwecc(struct mtd_info *mtd, int mode)
                                                        mtd);
        struct nand_chip *chip = mtd->priv;
        unsigned int dev_width = (chip->options & NAND_BUSWIDTH_16) ? 1 : 0;
+       u32 val;
+
+       /* clear ecc and enable bits */
+       val = ECCCLEAR | ECC1;
+       writel(val, info->reg.gpmc_ecc_control);
+
+       /* program ecc and result sizes */
+       val = ((((info->nand.ecc.size >> 1) - 1) << ECCSIZE1_SHIFT) |
+                        ECC1RESULTSIZE);
+       writel(val, info->reg.gpmc_ecc_size_config);
 
-       gpmc_enable_hwecc(info->gpmc_cs, mode, dev_width, info->nand.ecc.size);
+       switch (mode) {
+       case NAND_ECC_READ:
+       case NAND_ECC_WRITE:
+               writel(ECCCLEAR | ECC1, info->reg.gpmc_ecc_control);
+               break;
+       case NAND_ECC_READSYN:
+               writel(ECCCLEAR, info->reg.gpmc_ecc_control);
+               break;
+       default:
+               dev_info(&info->pdev->dev,
+                       "error: unrecognized Mode[%d]!\n", mode);
+               break;
+       }
+
+       /* (ECC 16 or 8 bit col) | ( CS  )  | ECC Enable */
+       val = (dev_width << 7) | (info->gpmc_cs << 1) | (0x1);
+       writel(val, info->reg.gpmc_ecc_config);
 }
 
 /**
@@ -886,10 +1009,9 @@ static int omap_wait(struct mtd_info *mtd, struct nand_chip *chip)
        else
                timeo += (HZ * 20) / 1000;
 
-       gpmc_nand_write(info->gpmc_cs,
-                       GPMC_NAND_COMMAND, (NAND_CMD_STATUS & 0xFF));
+       writeb(NAND_CMD_STATUS & 0xFF, info->reg.gpmc_nand_command);
        while (time_before(jiffies, timeo)) {
-               status = gpmc_nand_read(info->gpmc_cs, GPMC_NAND_DATA);
+               status = readb(info->reg.gpmc_nand_data);
                if (status & NAND_STATUS_READY)
                        break;
                cond_resched();
@@ -909,22 +1031,13 @@ static int omap_dev_ready(struct mtd_info *mtd)
        struct omap_nand_info *info = container_of(mtd, struct omap_nand_info,
                                                        mtd);
 
-       val = gpmc_read_status(GPMC_GET_IRQ_STATUS);
+       val = readl(info->reg.gpmc_status);
+
        if ((val & 0x100) == 0x100) {
-               /* Clear IRQ Interrupt */
-               val |= 0x100;
-               val &= ~(0x0);
-               gpmc_cs_configure(info->gpmc_cs, GPMC_SET_IRQ_STATUS, val);
+               return 1;
        } else {
-               unsigned int cnt = 0;
-               while (cnt++ < 0x1FF) {
-                       if  ((val & 0x100) == 0x100)
-                               return 0;
-                       val = gpmc_read_status(GPMC_GET_IRQ_STATUS);
-               }
+               return 0;
        }
-
-       return 1;
 }
 
 #ifdef CONFIG_MTD_NAND_OMAP_BCH
@@ -1155,6 +1268,7 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
        int                             i, offset;
        dma_cap_mask_t mask;
        unsigned sig;
+       struct resource                 *res;
 
        pdata = pdev->dev.platform_data;
        if (pdata == NULL) {
@@ -1174,7 +1288,7 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
        info->pdev = pdev;
 
        info->gpmc_cs           = pdata->cs;
-       info->phys_base         = pdata->phys_base;
+       info->reg               = pdata->reg;
 
        info->mtd.priv          = &info->nand;
        info->mtd.name          = dev_name(&pdev->dev);
@@ -1183,16 +1297,23 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
        info->nand.options      = pdata->devsize;
        info->nand.options      |= NAND_SKIP_BBTSCAN;
 
-       /* NAND write protect off */
-       gpmc_cs_configure(info->gpmc_cs, GPMC_CONFIG_WP, 0);
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (res == NULL) {
+               err = -EINVAL;
+               dev_err(&pdev->dev, "error getting memory resource\n");
+               goto out_free_info;
+       }
+
+       info->phys_base = res->start;
+       info->mem_size = resource_size(res);
 
-       if (!request_mem_region(info->phys_base, NAND_IO_SIZE,
+       if (!request_mem_region(info->phys_base, info->mem_size,
                                pdev->dev.driver->name)) {
                err = -EBUSY;
                goto out_free_info;
        }
 
-       info->nand.IO_ADDR_R = ioremap(info->phys_base, NAND_IO_SIZE);
+       info->nand.IO_ADDR_R = ioremap(info->phys_base, info->mem_size);
        if (!info->nand.IO_ADDR_R) {
                err = -ENOMEM;
                goto out_release_mem_region;
@@ -1265,17 +1386,39 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
                break;
 
        case NAND_OMAP_PREFETCH_IRQ:
-               err = request_irq(pdata->gpmc_irq,
-                               omap_nand_irq, IRQF_SHARED, "gpmc-nand", info);
+               info->gpmc_irq_fifo = platform_get_irq(pdev, 0);
+               if (info->gpmc_irq_fifo <= 0) {
+                       dev_err(&pdev->dev, "error getting fifo irq\n");
+                       err = -ENODEV;
+                       goto out_release_mem_region;
+               }
+               err = request_irq(info->gpmc_irq_fifo,  omap_nand_irq,
+                                       IRQF_SHARED, "gpmc-nand-fifo", info);
                if (err) {
                        dev_err(&pdev->dev, "requesting irq(%d) error:%d",
-                                                       pdata->gpmc_irq, err);
+                                               info->gpmc_irq_fifo, err);
+                       info->gpmc_irq_fifo = 0;
+                       goto out_release_mem_region;
+               }
+
+               info->gpmc_irq_count = platform_get_irq(pdev, 1);
+               if (info->gpmc_irq_count <= 0) {
+                       dev_err(&pdev->dev, "error getting count irq\n");
+                       err = -ENODEV;
+                       goto out_release_mem_region;
+               }
+               err = request_irq(info->gpmc_irq_count, omap_nand_irq,
+                                       IRQF_SHARED, "gpmc-nand-count", info);
+               if (err) {
+                       dev_err(&pdev->dev, "requesting irq(%d) error:%d",
+                                               info->gpmc_irq_count, err);
+                       info->gpmc_irq_count = 0;
                        goto out_release_mem_region;
-               } else {
-                       info->gpmc_irq       = pdata->gpmc_irq;
-                       info->nand.read_buf  = omap_read_buf_irq_pref;
-                       info->nand.write_buf = omap_write_buf_irq_pref;
                }
+
+               info->nand.read_buf  = omap_read_buf_irq_pref;
+               info->nand.write_buf = omap_write_buf_irq_pref;
+
                break;
 
        default:
@@ -1363,7 +1506,11 @@ static int __devinit omap_nand_probe(struct platform_device *pdev)
 out_release_mem_region:
        if (info->dma)
                dma_release_channel(info->dma);
-       release_mem_region(info->phys_base, NAND_IO_SIZE);
+       if (info->gpmc_irq_count > 0)
+               free_irq(info->gpmc_irq_count, info);
+       if (info->gpmc_irq_fifo > 0)
+               free_irq(info->gpmc_irq_fifo, info);
+       release_mem_region(info->phys_base, info->mem_size);
 out_free_info:
        kfree(info);
 
@@ -1381,8 +1528,10 @@ static int omap_nand_remove(struct platform_device *pdev)
        if (info->dma)
                dma_release_channel(info->dma);
 
-       if (info->gpmc_irq)
-               free_irq(info->gpmc_irq, info);
+       if (info->gpmc_irq_count > 0)
+               free_irq(info->gpmc_irq_count, info);
+       if (info->gpmc_irq_fifo > 0)
+               free_irq(info->gpmc_irq_fifo, info);
 
        /* Release NAND device, its internal structures and partitions */
        nand_release(&info->mtd);
index 252aaef..d944d6e 100644 (file)
@@ -22,6 +22,8 @@
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
 
 #include <mach/dma.h>
 #include <plat/pxa3xx_nand.h>
@@ -1032,7 +1034,7 @@ static int alloc_nand_resource(struct platform_device *pdev)
        struct pxa3xx_nand_platform_data *pdata;
        struct pxa3xx_nand_info *info;
        struct pxa3xx_nand_host *host;
-       struct nand_chip *chip;
+       struct nand_chip *chip = NULL;
        struct mtd_info *mtd;
        struct resource *r;
        int ret, irq, cs;
@@ -1081,21 +1083,31 @@ static int alloc_nand_resource(struct platform_device *pdev)
        }
        clk_enable(info->clk);
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
-       if (r == NULL) {
-               dev_err(&pdev->dev, "no resource defined for data DMA\n");
-               ret = -ENXIO;
-               goto fail_put_clk;
-       }
-       info->drcmr_dat = r->start;
+       /*
+        * This is a dirty hack to make this driver work from devicetree
+        * bindings. It can be removed once we have a prober DMA controller
+        * framework for DT.
+        */
+       if (pdev->dev.of_node && cpu_is_pxa3xx()) {
+               info->drcmr_dat = 97;
+               info->drcmr_cmd = 99;
+       } else {
+               r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
+               if (r == NULL) {
+                       dev_err(&pdev->dev, "no resource defined for data DMA\n");
+                       ret = -ENXIO;
+                       goto fail_put_clk;
+               }
+               info->drcmr_dat = r->start;
 
-       r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
-       if (r == NULL) {
-               dev_err(&pdev->dev, "no resource defined for command DMA\n");
-               ret = -ENXIO;
-               goto fail_put_clk;
+               r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
+               if (r == NULL) {
+                       dev_err(&pdev->dev, "no resource defined for command DMA\n");
+                       ret = -ENXIO;
+                       goto fail_put_clk;
+               }
+               info->drcmr_cmd = r->start;
        }
-       info->drcmr_cmd = r->start;
 
        irq = platform_get_irq(pdev, 0);
        if (irq < 0) {
@@ -1200,12 +1212,55 @@ static int pxa3xx_nand_remove(struct platform_device *pdev)
        return 0;
 }
 
+#ifdef CONFIG_OF
+static struct of_device_id pxa3xx_nand_dt_ids[] = {
+       { .compatible = "marvell,pxa3xx-nand" },
+       {}
+};
+MODULE_DEVICE_TABLE(of, i2c_pxa_dt_ids);
+
+static int pxa3xx_nand_probe_dt(struct platform_device *pdev)
+{
+       struct pxa3xx_nand_platform_data *pdata;
+       struct device_node *np = pdev->dev.of_node;
+       const struct of_device_id *of_id =
+                       of_match_device(pxa3xx_nand_dt_ids, &pdev->dev);
+
+       if (!of_id)
+               return 0;
+
+       pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata)
+               return -ENOMEM;
+
+       if (of_get_property(np, "marvell,nand-enable-arbiter", NULL))
+               pdata->enable_arbiter = 1;
+       if (of_get_property(np, "marvell,nand-keep-config", NULL))
+               pdata->keep_config = 1;
+       of_property_read_u32(np, "num-cs", &pdata->num_cs);
+
+       pdev->dev.platform_data = pdata;
+
+       return 0;
+}
+#else
+static inline int pxa3xx_nand_probe_dt(struct platform_device *pdev)
+{
+       return 0;
+}
+#endif
+
 static int pxa3xx_nand_probe(struct platform_device *pdev)
 {
        struct pxa3xx_nand_platform_data *pdata;
+       struct mtd_part_parser_data ppdata = {};
        struct pxa3xx_nand_info *info;
        int ret, cs, probe_success;
 
+       ret = pxa3xx_nand_probe_dt(pdev);
+       if (ret)
+               return ret;
+
        pdata = pdev->dev.platform_data;
        if (!pdata) {
                dev_err(&pdev->dev, "no platform data defined\n");
@@ -1229,8 +1284,9 @@ static int pxa3xx_nand_probe(struct platform_device *pdev)
                        continue;
                }
 
+               ppdata.of_node = pdev->dev.of_node;
                ret = mtd_device_parse_register(info->host[cs]->mtd, NULL,
-                                               NULL, pdata->parts[cs],
+                                               &ppdata, pdata->parts[cs],
                                                pdata->nr_parts[cs]);
                if (!ret)
                        probe_success = 1;
@@ -1306,6 +1362,7 @@ static int pxa3xx_nand_resume(struct platform_device *pdev)
 static struct platform_driver pxa3xx_nand_driver = {
        .driver = {
                .name   = "pxa3xx-nand",
+               .of_match_table = of_match_ptr(pxa3xx_nand_dt_ids),
        },
        .probe          = pxa3xx_nand_probe,
        .remove         = pxa3xx_nand_remove,
index 398a827..1961be9 100644 (file)
 
 #include <asm/mach/flash.h>
 #include <plat/gpmc.h>
-#include <plat/onenand.h>
+#include <linux/platform_data/mtd-onenand-omap2.h>
 #include <asm/gpio.h>
 
 #include <plat/dma.h>
-
-#include <plat/board.h>
+#include <plat/cpu.h>
 
 #define DRIVER_NAME "omap2-onenand"
 
-#define ONENAND_IO_SIZE                SZ_128K
 #define ONENAND_BUFRAM_SIZE    (1024 * 5)
 
 struct omap2_onenand {
        struct platform_device *pdev;
        int gpmc_cs;
        unsigned long phys_base;
+       unsigned int mem_size;
        int gpio_irq;
        struct mtd_info mtd;
        struct onenand_chip onenand;
@@ -626,6 +625,7 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
        struct omap2_onenand *c;
        struct onenand_chip *this;
        int r;
+       struct resource *res;
 
        pdata = pdev->dev.platform_data;
        if (pdata == NULL) {
@@ -647,20 +647,24 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev)
                c->gpio_irq = 0;
        }
 
-       r = gpmc_cs_request(c->gpmc_cs, ONENAND_IO_SIZE, &c->phys_base);
-       if (r < 0) {
-               dev_err(&pdev->dev, "Cannot request GPMC CS\n");
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (res == NULL) {
+               r = -EINVAL;
+               dev_err(&pdev->dev, "error getting memory resource\n");
                goto err_kfree;
        }
 
-       if (request_mem_region(c->phys_base, ONENAND_IO_SIZE,
+       c->phys_base = res->start;
+       c->mem_size = resource_size(res);
+
+       if (request_mem_region(c->phys_base, c->mem_size,
                               pdev->dev.driver->name) == NULL) {
-               dev_err(&pdev->dev, "Cannot reserve memory region at 0x%08lx, "
-                       "size: 0x%x\n", c->phys_base, ONENAND_IO_SIZE);
+               dev_err(&pdev->dev, "Cannot reserve memory region at 0x%08lx, size: 0x%x\n",
+                                               c->phys_base, c->mem_size);
                r = -EBUSY;
-               goto err_free_cs;
+               goto err_kfree;
        }
-       c->onenand.base = ioremap(c->phys_base, ONENAND_IO_SIZE);
+       c->onenand.base = ioremap(c->phys_base, c->mem_size);
        if (c->onenand.base == NULL) {
                r = -ENOMEM;
                goto err_release_mem_region;
@@ -776,9 +780,7 @@ err_release_gpio:
 err_iounmap:
        iounmap(c->onenand.base);
 err_release_mem_region:
-       release_mem_region(c->phys_base, ONENAND_IO_SIZE);
-err_free_cs:
-       gpmc_cs_free(c->gpmc_cs);
+       release_mem_region(c->phys_base, c->mem_size);
 err_kfree:
        kfree(c);
 
@@ -800,7 +802,7 @@ static int __devexit omap2_onenand_remove(struct platform_device *pdev)
                gpio_free(c->gpio_irq);
        }
        iounmap(c->onenand.base);
-       release_mem_region(c->phys_base, ONENAND_IO_SIZE);
+       release_mem_region(c->phys_base, c->mem_size);
        gpmc_cs_free(c->gpmc_cs);
        kfree(c);
 
index 437bc19..568307c 100644 (file)
@@ -340,7 +340,7 @@ retry:
         * of this LEB as it will be deleted and freed in 'ubi_add_to_av()'.
         */
        err = ubi_add_to_av(ubi, ai, new_aeb->pnum, new_aeb->ec, vid_hdr, 0);
-       kfree(new_aeb);
+       kmem_cache_free(ai->aeb_slab_cache, new_aeb);
        ubi_free_vid_hdr(ubi, vid_hdr);
        return err;
 
@@ -353,7 +353,7 @@ write_error:
                list_add(&new_aeb->u.list, &ai->erase);
                goto retry;
        }
-       kfree(new_aeb);
+       kmem_cache_free(ai->aeb_slab_cache, new_aeb);
 out_free:
        ubi_free_vid_hdr(ubi, vid_hdr);
        return err;
index a580db2..26e7129 100644 (file)
 #define INSTRUCTION_LOAD_TXB(n)        (0x40 + 2 * (n))
 #define INSTRUCTION_READ_RXB(n)        (((n) == 0) ? 0x90 : 0x94)
 #define INSTRUCTION_RESET      0xC0
+#define RTS_TXB0               0x01
+#define RTS_TXB1               0x02
+#define RTS_TXB2               0x04
+#define INSTRUCTION_RTS(n)     (0x80 | ((n) & 0x07))
+
 
 /* MPC251x registers */
 #define CANSTAT              0x0e
@@ -397,6 +402,7 @@ static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf,
 static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame,
                          int tx_buf_idx)
 {
+       struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev);
        u32 sid, eid, exide, rtr;
        u8 buf[SPI_TRANSFER_BUF_LEN];
 
@@ -418,7 +424,10 @@ static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame,
        buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc;
        memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc);
        mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx);
-       mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx), TXBCTRL_TXREQ);
+
+       /* use INSTRUCTION_RTS, to avoid "repeated frame problem" */
+       priv->spi_tx_buf[0] = INSTRUCTION_RTS(1 << tx_buf_idx);
+       mcp251x_spi_trans(priv->spi, 1);
 }
 
 static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf,
index 4f50145..662c5f7 100644 (file)
@@ -109,7 +109,9 @@ static int sp_probe(struct platform_device *pdev)
        priv = netdev_priv(dev);
 
        dev->irq = res_irq->start;
-       priv->irq_flags = res_irq->flags & (IRQF_TRIGGER_MASK | IRQF_SHARED);
+       priv->irq_flags = res_irq->flags & IRQF_TRIGGER_MASK;
+       if (res_irq->flags & IORESOURCE_IRQ_SHAREABLE)
+               priv->irq_flags |= IRQF_SHARED;
        priv->reg_base = addr;
        /* The CAN clock frequency is half the oscillator clock frequency */
        priv->can.clock.freq = pdata->osc_freq / 2;
index 3105961..b595d34 100644 (file)
@@ -150,7 +150,7 @@ int softing_load_fw(const char *file, struct softing *card,
        const uint8_t *mem, *end, *dat;
        uint16_t type, len;
        uint32_t addr;
-       uint8_t *buf = NULL;
+       uint8_t *buf = NULL, *new_buf;
        int buflen = 0;
        int8_t type_end = 0;
 
@@ -199,11 +199,12 @@ int softing_load_fw(const char *file, struct softing *card,
                if (len > buflen) {
                        /* align buflen */
                        buflen = (len + (1024-1)) & ~(1024-1);
-                       buf = krealloc(buf, buflen, GFP_KERNEL);
-                       if (!buf) {
+                       new_buf = krealloc(buf, buflen, GFP_KERNEL);
+                       if (!new_buf) {
                                ret = -ENOMEM;
                                goto failed;
                        }
+                       buf = new_buf;
                }
                /* verify record data */
                memcpy_fromio(buf, &dpram[addr + offset], len);
index 463b9ec..6d1a24a 100644 (file)
@@ -1708,9 +1708,6 @@ struct bnx2x_func_init_params {
                        continue;               \
                else
 
-#define for_each_napi_rx_queue(bp, var) \
-       for ((var) = 0; (var) < bp->num_napi_queues; (var)++)
-
 /* Skip OOO FP */
 #define for_each_tx_queue(bp, var) \
        for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \
index e879e19..af20c6e 100644 (file)
@@ -2046,6 +2046,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
         */
        bnx2x_setup_tc(bp->dev, bp->max_cos);
 
+       /* Add all NAPI objects */
+       bnx2x_add_all_napi(bp);
        bnx2x_napi_enable(bp);
 
        /* set pf load just before approaching the MCP */
@@ -2408,6 +2410,8 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode)
 
                /* Disable HW interrupts, NAPI */
                bnx2x_netif_stop(bp, 1);
+               /* Delete all NAPI objects */
+               bnx2x_del_all_napi(bp);
 
                /* Release IRQs */
                bnx2x_free_irq(bp);
index dfa757e..dfd86a5 100644 (file)
@@ -710,17 +710,15 @@ static inline u16 bnx2x_tx_avail(struct bnx2x *bp,
        prod = txdata->tx_bd_prod;
        cons = txdata->tx_bd_cons;
 
-       /* NUM_TX_RINGS = number of "next-page" entries
-          It will be used as a threshold */
-       used = SUB_S16(prod, cons) + (s16)NUM_TX_RINGS;
+       used = SUB_S16(prod, cons);
 
 #ifdef BNX2X_STOP_ON_ERROR
        WARN_ON(used < 0);
-       WARN_ON(used > bp->tx_ring_size);
-       WARN_ON((bp->tx_ring_size - used) > MAX_TX_AVAIL);
+       WARN_ON(used > txdata->tx_ring_size);
+       WARN_ON((txdata->tx_ring_size - used) > MAX_TX_AVAIL);
 #endif
 
-       return (s16)(bp->tx_ring_size) - used;
+       return (s16)(txdata->tx_ring_size) - used;
 }
 
 static inline int bnx2x_tx_queue_has_work(struct bnx2x_fp_txdata *txdata)
@@ -792,7 +790,7 @@ static inline void bnx2x_add_all_napi(struct bnx2x *bp)
        bp->num_napi_queues = bp->num_queues;
 
        /* Add NAPI objects */
-       for_each_napi_rx_queue(bp, i)
+       for_each_rx_queue(bp, i)
                netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi),
                               bnx2x_poll, BNX2X_NAPI_WEIGHT);
 }
@@ -801,7 +799,7 @@ static inline void bnx2x_del_all_napi(struct bnx2x *bp)
 {
        int i;
 
-       for_each_napi_rx_queue(bp, i)
+       for_each_rx_queue(bp, i)
                netif_napi_del(&bnx2x_fp(bp, i, napi));
 }
 
@@ -1088,6 +1086,7 @@ static inline void bnx2x_init_txdata(struct bnx2x *bp,
        txdata->txq_index = txq_index;
        txdata->tx_cons_sb = tx_cons_sb;
        txdata->parent_fp = fp;
+       txdata->tx_ring_size = IS_FCOE_FP(fp) ? MAX_TX_AVAIL : bp->tx_ring_size;
 
        DP(NETIF_MSG_IFUP, "created tx data cid %d, txq %d\n",
           txdata->cid, txdata->txq_index);
index 3e4cff9..b926f58 100644 (file)
@@ -401,11 +401,11 @@ static const struct reg_addr reg_addrs[] = {
        { 0x70000, 8, RI_ALL_ONLINE },
        { 0x70020, 8184, RI_ALL_OFFLINE },
        { 0x78000, 8192, RI_E3E3B0_OFFLINE },
-       { 0x85000, 3, RI_ALL_ONLINE },
-       { 0x8501c, 7, RI_ALL_ONLINE },
-       { 0x85048, 1, RI_ALL_ONLINE },
-       { 0x85200, 32, RI_ALL_ONLINE },
-       { 0xb0000, 16384, RI_E1H_ONLINE },
+       { 0x85000, 3, RI_ALL_OFFLINE },
+       { 0x8501c, 7, RI_ALL_OFFLINE },
+       { 0x85048, 1, RI_ALL_OFFLINE },
+       { 0x85200, 32, RI_ALL_OFFLINE },
+       { 0xb0000, 16384, RI_E1H_OFFLINE },
        { 0xc1000, 7, RI_ALL_ONLINE },
        { 0xc103c, 2, RI_E2E3E3B0_ONLINE },
        { 0xc1800, 2, RI_ALL_ONLINE },
@@ -581,17 +581,12 @@ static const struct reg_addr reg_addrs[] = {
        { 0x140188, 3, RI_E1E1HE2E3_ONLINE },
        { 0x140194, 13, RI_ALL_ONLINE },
        { 0x140200, 6, RI_E1E1HE2E3_ONLINE },
-       { 0x140220, 4, RI_E2E3_ONLINE },
-       { 0x140240, 4, RI_E2E3_ONLINE },
        { 0x140260, 4, RI_E2E3_ONLINE },
        { 0x140280, 4, RI_E2E3_ONLINE },
-       { 0x1402a0, 4, RI_E2E3_ONLINE },
-       { 0x1402c0, 4, RI_E2E3_ONLINE },
        { 0x1402e0, 2, RI_E2E3_ONLINE },
        { 0x1402e8, 2, RI_E2E3E3B0_ONLINE },
        { 0x1402f0, 9, RI_E2E3_ONLINE },
        { 0x140314, 44, RI_E3B0_ONLINE },
-       { 0x1403d0, 70, RI_E3B0_ONLINE },
        { 0x144000, 4, RI_E1E1H_ONLINE },
        { 0x148000, 4, RI_E1E1H_ONLINE },
        { 0x14c000, 4, RI_E1E1H_ONLINE },
@@ -704,7 +699,6 @@ static const struct reg_addr reg_addrs[] = {
        { 0x180398, 1, RI_E2E3E3B0_ONLINE },
        { 0x1803a0, 5, RI_E2E3E3B0_ONLINE },
        { 0x1803b4, 2, RI_E3E3B0_ONLINE },
-       { 0x180400, 1, RI_ALL_ONLINE },
        { 0x180404, 255, RI_E1E1H_OFFLINE },
        { 0x181000, 4, RI_ALL_ONLINE },
        { 0x181010, 1020, RI_ALL_OFFLINE },
@@ -800,9 +794,9 @@ static const struct reg_addr reg_addrs[] = {
        { 0x1b905c, 1, RI_E3E3B0_ONLINE },
        { 0x1b9064, 1, RI_E3B0_ONLINE },
        { 0x1b9080, 10, RI_E3B0_ONLINE },
-       { 0x1b9400, 14, RI_E2E3E3B0_ONLINE },
-       { 0x1b943c, 19, RI_E2E3E3B0_ONLINE },
-       { 0x1b9490, 10, RI_E2E3E3B0_ONLINE },
+       { 0x1b9400, 14, RI_E2E3E3B0_OFFLINE },
+       { 0x1b943c, 19, RI_E2E3E3B0_OFFLINE },
+       { 0x1b9490, 10, RI_E2E3E3B0_OFFLINE },
        { 0x1c0000, 2, RI_ALL_ONLINE },
        { 0x200000, 65, RI_ALL_ONLINE },
        { 0x20014c, 2, RI_E1HE2E3E3B0_ONLINE },
@@ -814,7 +808,6 @@ static const struct reg_addr reg_addrs[] = {
        { 0x200398, 1, RI_E2E3E3B0_ONLINE },
        { 0x2003a0, 1, RI_E2E3E3B0_ONLINE },
        { 0x2003a8, 2, RI_E2E3E3B0_ONLINE },
-       { 0x200400, 1, RI_ALL_ONLINE },
        { 0x200404, 255, RI_E1E1H_OFFLINE },
        { 0x202000, 4, RI_ALL_ONLINE },
        { 0x202010, 2044, RI_ALL_OFFLINE },
@@ -921,7 +914,6 @@ static const struct reg_addr reg_addrs[] = {
        { 0x280398, 1, RI_E2E3E3B0_ONLINE },
        { 0x2803a0, 1, RI_E2E3E3B0_ONLINE },
        { 0x2803a8, 2, RI_E2E3E3B0_ONLINE },
-       { 0x280400, 1, RI_ALL_ONLINE },
        { 0x280404, 255, RI_E1E1H_OFFLINE },
        { 0x282000, 4, RI_ALL_ONLINE },
        { 0x282010, 2044, RI_ALL_OFFLINE },
@@ -1031,7 +1023,6 @@ static const struct reg_addr reg_addrs[] = {
        { 0x300398, 1, RI_E2E3E3B0_ONLINE },
        { 0x3003a0, 1, RI_E2E3E3B0_ONLINE },
        { 0x3003a8, 2, RI_E2E3E3B0_ONLINE },
-       { 0x300400, 1, RI_ALL_ONLINE },
        { 0x300404, 255, RI_E1E1H_OFFLINE },
        { 0x302000, 4, RI_ALL_ONLINE },
        { 0x302010, 2044, RI_ALL_OFFLINE },
index fc4e0e3..ebf40cd 100644 (file)
@@ -775,7 +775,7 @@ static void bnx2x_get_regs(struct net_device *dev,
        struct bnx2x *bp = netdev_priv(dev);
        struct dump_hdr dump_hdr = {0};
 
-       regs->version = 0;
+       regs->version = 1;
        memset(p, 0, regs->len);
 
        if (!netif_running(bp->dev))
@@ -1587,6 +1587,12 @@ static int bnx2x_set_pauseparam(struct net_device *dev,
                        bp->link_params.req_flow_ctrl[cfg_idx] =
                                BNX2X_FLOW_CTRL_AUTO;
                }
+               bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_NONE;
+               if (epause->rx_pause)
+                       bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_RX;
+
+               if (epause->tx_pause)
+                       bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_TX;
        }
 
        DP(BNX2X_MSG_ETHTOOL,
@@ -2888,11 +2894,9 @@ static void bnx2x_get_channels(struct net_device *dev,
  */
 static void bnx2x_change_num_queues(struct bnx2x *bp, int num_rss)
 {
-       bnx2x_del_all_napi(bp);
        bnx2x_disable_msi(bp);
        BNX2X_NUM_QUEUES(bp) = num_rss + NON_ETH_CONTEXT_USE;
        bnx2x_set_int_mode(bp);
-       bnx2x_add_all_napi(bp);
 }
 
 /**
index f4beb46..b046beb 100644 (file)
@@ -2667,9 +2667,11 @@ int bnx2x_update_pfc(struct link_params *params,
                return bnx2x_status;
 
        DP(NETIF_MSG_LINK, "About to update PFC in BMAC\n");
-       if (CHIP_IS_E3(bp))
-               bnx2x_update_pfc_xmac(params, vars, 0);
-       else {
+
+       if (CHIP_IS_E3(bp)) {
+               if (vars->mac_type == MAC_TYPE_XMAC)
+                       bnx2x_update_pfc_xmac(params, vars, 0);
+       } else {
                val = REG_RD(bp, MISC_REG_RESET_REG_2);
                if ((val &
                     (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port))
@@ -5432,7 +5434,7 @@ static int bnx2x_get_link_speed_duplex(struct bnx2x_phy *phy,
                switch (speed_mask) {
                case GP_STATUS_10M:
                        vars->line_speed = SPEED_10;
-                       if (vars->duplex == DUPLEX_FULL)
+                       if (is_duplex == DUPLEX_FULL)
                                vars->link_status |= LINK_10TFD;
                        else
                                vars->link_status |= LINK_10THD;
@@ -5440,7 +5442,7 @@ static int bnx2x_get_link_speed_duplex(struct bnx2x_phy *phy,
 
                case GP_STATUS_100M:
                        vars->line_speed = SPEED_100;
-                       if (vars->duplex == DUPLEX_FULL)
+                       if (is_duplex == DUPLEX_FULL)
                                vars->link_status |= LINK_100TXFD;
                        else
                                vars->link_status |= LINK_100TXHD;
@@ -5449,7 +5451,7 @@ static int bnx2x_get_link_speed_duplex(struct bnx2x_phy *phy,
                case GP_STATUS_1G:
                case GP_STATUS_1G_KX:
                        vars->line_speed = SPEED_1000;
-                       if (vars->duplex == DUPLEX_FULL)
+                       if (is_duplex == DUPLEX_FULL)
                                vars->link_status |= LINK_1000TFD;
                        else
                                vars->link_status |= LINK_1000THD;
@@ -5457,7 +5459,7 @@ static int bnx2x_get_link_speed_duplex(struct bnx2x_phy *phy,
 
                case GP_STATUS_2_5G:
                        vars->line_speed = SPEED_2500;
-                       if (vars->duplex == DUPLEX_FULL)
+                       if (is_duplex == DUPLEX_FULL)
                                vars->link_status |= LINK_2500TFD;
                        else
                                vars->link_status |= LINK_2500THD;
@@ -5531,6 +5533,7 @@ static int bnx2x_link_settings_status(struct bnx2x_phy *phy,
 
        if (gp_status & MDIO_GP_STATUS_TOP_AN_STATUS1_LINK_STATUS) {
                if (SINGLE_MEDIA_DIRECT(params)) {
+                       vars->duplex = duplex;
                        bnx2x_flow_ctrl_resolve(phy, params, vars, gp_status);
                        if (phy->req_line_speed == SPEED_AUTO_NEG)
                                bnx2x_xgxs_an_resolve(phy, params, vars,
@@ -5625,6 +5628,7 @@ static int bnx2x_warpcore_read_status(struct bnx2x_phy *phy,
                                        LINK_STATUS_PARALLEL_DETECTION_USED;
                        }
                        bnx2x_ext_phy_resolve_fc(phy, params, vars);
+                       vars->duplex = duplex;
                }
        }
 
index 02b5a34..211753e 100644 (file)
@@ -7561,8 +7561,14 @@ int bnx2x_set_mac_one(struct bnx2x *bp, u8 *mac,
        }
 
        rc = bnx2x_config_vlan_mac(bp, &ramrod_param);
-       if (rc < 0)
+
+       if (rc == -EEXIST) {
+               DP(BNX2X_MSG_SP, "Failed to schedule ADD operations: %d\n", rc);
+               /* do not treat adding same MAC as error */
+               rc = 0;
+       } else if (rc < 0)
                BNX2X_ERR("%s MAC failed\n", (set ? "Set" : "Del"));
+
        return rc;
 }
 
@@ -8427,6 +8433,8 @@ unload_error:
 
        /* Disable HW interrupts, NAPI */
        bnx2x_netif_stop(bp, 1);
+       /* Delete all NAPI objects */
+       bnx2x_del_all_napi(bp);
 
        /* Release IRQs */
        bnx2x_free_irq(bp);
@@ -10292,13 +10300,11 @@ static void __devinit bnx2x_get_fcoe_info(struct bnx2x *bp)
                                dev_info.port_hw_config[port].
                                 fcoe_wwn_node_name_lower);
        } else if (!IS_MF_SD(bp)) {
-               u32 cfg = MF_CFG_RD(bp, func_ext_config[func].func_cfg);
-
                /*
                 * Read the WWN info only if the FCoE feature is enabled for
                 * this function.
                 */
-               if (cfg & MACP_FUNC_CFG_FLAGS_FCOE_OFFLOAD)
+               if (BNX2X_MF_EXT_PROTOCOL_FCOE(bp) && !CHIP_IS_E1x(bp))
                        bnx2x_get_ext_wwn_info(bp, func);
 
        } else if (IS_MF_FCOE_SD(bp))
@@ -11071,7 +11077,14 @@ static int bnx2x_set_uc_list(struct bnx2x *bp)
        netdev_for_each_uc_addr(ha, dev) {
                rc = bnx2x_set_mac_one(bp, bnx2x_uc_addr(ha), mac_obj, true,
                                       BNX2X_UC_LIST_MAC, &ramrod_flags);
-               if (rc < 0) {
+               if (rc == -EEXIST) {
+                       DP(BNX2X_MSG_SP,
+                          "Failed to schedule ADD operations: %d\n", rc);
+                       /* do not treat adding same MAC as error */
+                       rc = 0;
+
+               } else if (rc < 0) {
+
                        BNX2X_ERR("Failed to schedule ADD operations: %d\n",
                                  rc);
                        return rc;
@@ -11229,10 +11242,12 @@ static int bnx2x_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 static void poll_bnx2x(struct net_device *dev)
 {
        struct bnx2x *bp = netdev_priv(dev);
+       int i;
 
-       disable_irq(bp->pdev->irq);
-       bnx2x_interrupt(bp->pdev->irq, dev);
-       enable_irq(bp->pdev->irq);
+       for_each_eth_queue(bp, i) {
+               struct bnx2x_fastpath *fp = &bp->fp[i];
+               napi_schedule(&bnx2x_fp(bp, fp->index, napi));
+       }
 }
 #endif
 
@@ -11899,9 +11914,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,
         */
        bnx2x_set_int_mode(bp);
 
-       /* Add all NAPI objects */
-       bnx2x_add_all_napi(bp);
-
        rc = register_netdev(dev);
        if (rc) {
                dev_err(&pdev->dev, "Cannot register net device\n");
@@ -11976,9 +11988,6 @@ static void __devexit bnx2x_remove_one(struct pci_dev *pdev)
 
        unregister_netdev(dev);
 
-       /* Delete all NAPI objects */
-       bnx2x_del_all_napi(bp);
-
        /* Power on: we can't let PCI layer write to us while we are in D3 */
        bnx2x_set_power_state(bp, PCI_D0);
 
@@ -12025,6 +12034,8 @@ static int bnx2x_eeh_nic_unload(struct bnx2x *bp)
        bnx2x_tx_disable(bp);
 
        bnx2x_netif_stop(bp, 0);
+       /* Delete all NAPI objects */
+       bnx2x_del_all_napi(bp);
 
        del_timer_sync(&bp->timer);
 
index 332db64..a1d0446 100644 (file)
@@ -101,6 +101,11 @@ static void bnx2x_hw_stats_post(struct bnx2x *bp)
        if (CHIP_REV_IS_SLOW(bp))
                return;
 
+       /* Update MCP's statistics if possible */
+       if (bp->func_stx)
+               memcpy(bnx2x_sp(bp, func_stats), &bp->func_stats,
+                      sizeof(bp->func_stats));
+
        /* loader */
        if (bp->executer_idx) {
                int loader_idx = PMF_DMAE_C(bp);
@@ -128,8 +133,6 @@ static void bnx2x_hw_stats_post(struct bnx2x *bp)
 
        } else if (bp->func_stx) {
                *stats_comp = 0;
-               memcpy(bnx2x_sp(bp, func_stats), &bp->func_stats,
-                      sizeof(bp->func_stats));
                bnx2x_post_dmae(bp, dmae, INIT_DMAE_C(bp));
        }
 }
@@ -1151,9 +1154,11 @@ static void bnx2x_stats_update(struct bnx2x *bp)
        if (bp->port.pmf)
                bnx2x_hw_stats_update(bp);
 
-       if (bnx2x_storm_stats_update(bp) && (bp->stats_pending++ == 3)) {
-               BNX2X_ERR("storm stats were not updated for 3 times\n");
-               bnx2x_panic();
+       if (bnx2x_storm_stats_update(bp)) {
+               if (bp->stats_pending++ == 3) {
+                       BNX2X_ERR("storm stats were not updated for 3 times\n");
+                       bnx2x_panic();
+               }
                return;
        }
 
index 845b202..1384469 100644 (file)
@@ -1243,6 +1243,7 @@ static void set_multicast_list(struct net_device *dev)
 {
        struct net_local *lp = netdev_priv(dev);
        unsigned long flags;
+       u16 cfg;
 
        spin_lock_irqsave(&lp->lock, flags);
        if (dev->flags & IFF_PROMISC)
@@ -1260,11 +1261,10 @@ static void set_multicast_list(struct net_device *dev)
        /* in promiscuous mode, we accept errored packets,
         * so we have to enable interrupts on them also
         */
-       writereg(dev, PP_RxCFG,
-                (lp->curr_rx_cfg |
-                 (lp->rx_mode == RX_ALL_ACCEPT)
-                 ? (RX_CRC_ERROR_ENBL | RX_RUNT_ENBL | RX_EXTRA_DATA_ENBL)
-                 : 0));
+       cfg = lp->curr_rx_cfg;
+       if (lp->rx_mode == RX_ALL_ACCEPT)
+               cfg |= RX_CRC_ERROR_ENBL | RX_RUNT_ENBL | RX_EXTRA_DATA_ENBL;
+       writereg(dev, PP_RxCFG, cfg);
        spin_unlock_irqrestore(&lp->lock, flags);
 }
 
index 7fac97b..8c63d06 100644 (file)
@@ -259,7 +259,7 @@ int be_process_mcc(struct be_adapter *adapter)
        int num = 0, status = 0;
        struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
 
-       spin_lock_bh(&adapter->mcc_cq_lock);
+       spin_lock(&adapter->mcc_cq_lock);
        while ((compl = be_mcc_compl_get(adapter))) {
                if (compl->flags & CQE_FLAGS_ASYNC_MASK) {
                        /* Interpret flags as an async trailer */
@@ -280,7 +280,7 @@ int be_process_mcc(struct be_adapter *adapter)
        if (num)
                be_cq_notify(adapter, mcc_obj->cq.id, mcc_obj->rearm_cq, num);
 
-       spin_unlock_bh(&adapter->mcc_cq_lock);
+       spin_unlock(&adapter->mcc_cq_lock);
        return status;
 }
 
@@ -295,7 +295,9 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
                if (be_error(adapter))
                        return -EIO;
 
+               local_bh_disable();
                status = be_process_mcc(adapter);
+               local_bh_enable();
 
                if (atomic_read(&mcc_obj->q.used) == 0)
                        break;
index 90a903d..78b8aa8 100644 (file)
@@ -3763,7 +3763,9 @@ static void be_worker(struct work_struct *work)
        /* when interrupts are not yet enabled, just reap any pending
        * mcc completions */
        if (!netif_running(adapter->netdev)) {
+               local_bh_disable();
                be_process_mcc(adapter);
+               local_bh_enable();
                goto reschedule;
        }
 
index 4605f72..d3233f5 100644 (file)
@@ -1041,7 +1041,7 @@ static int gfar_probe(struct platform_device *ofdev)
 
        if (priv->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) {
                dev->hw_features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
-               dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
+               dev->features |= NETIF_F_HW_VLAN_RX;
        }
 
        if (priv->device_flags & FSL_GIANFAR_DEV_HAS_EXTENDED_HASH) {
index bd1f1ef..ba4e0ce 100644 (file)
@@ -139,8 +139,11 @@ struct znet_private {
 /* Only one can be built-in;-> */
 static struct net_device *znet_dev;
 
+#define NETIDBLK_MAGIC         "NETIDBLK"
+#define NETIDBLK_MAGIC_SIZE    8
+
 struct netidblk {
-       char magic[8];          /* The magic number (string) "NETIDBLK" */
+       char magic[NETIDBLK_MAGIC_SIZE];        /* The magic number (string) "NETIDBLK" */
        unsigned char netid[8]; /* The physical station address */
        char nettype, globalopt;
        char vendor[8];         /* The machine vendor and product name. */
@@ -373,14 +376,16 @@ static int __init znet_probe (void)
        struct znet_private *znet;
        struct net_device *dev;
        char *p;
+       char *plast = phys_to_virt(0x100000 - NETIDBLK_MAGIC_SIZE);
        int err = -ENOMEM;
 
        /* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */
-       for(p = (char *)phys_to_virt(0xf0000); p < (char *)phys_to_virt(0x100000); p++)
-               if (*p == 'N'  &&  strncmp(p, "NETIDBLK", 8) == 0)
+       for(p = (char *)phys_to_virt(0xf0000); p <= plast; p++)
+               if (*p == 'N' &&
+                   strncmp(p, NETIDBLK_MAGIC, NETIDBLK_MAGIC_SIZE) == 0)
                        break;
 
-       if (p >= (char *)phys_to_virt(0x100000)) {
+       if (p > plast) {
                if (znet_debug > 1)
                        printk(KERN_INFO "No Z-Note ethernet adaptor found.\n");
                return -ENODEV;
index 9010cea..b68d28a 100644 (file)
@@ -472,14 +472,9 @@ static void ibmveth_cleanup(struct ibmveth_adapter *adapter)
        }
 
        if (adapter->rx_queue.queue_addr != NULL) {
-               if (!dma_mapping_error(dev, adapter->rx_queue.queue_dma)) {
-                       dma_unmap_single(dev,
-                                       adapter->rx_queue.queue_dma,
-                                       adapter->rx_queue.queue_len,
-                                       DMA_BIDIRECTIONAL);
-                       adapter->rx_queue.queue_dma = DMA_ERROR_CODE;
-               }
-               kfree(adapter->rx_queue.queue_addr);
+               dma_free_coherent(dev, adapter->rx_queue.queue_len,
+                                 adapter->rx_queue.queue_addr,
+                                 adapter->rx_queue.queue_dma);
                adapter->rx_queue.queue_addr = NULL;
        }
 
@@ -556,10 +551,13 @@ static int ibmveth_open(struct net_device *netdev)
                goto err_out;
        }
 
+       dev = &adapter->vdev->dev;
+
        adapter->rx_queue.queue_len = sizeof(struct ibmveth_rx_q_entry) *
                                                rxq_entries;
-       adapter->rx_queue.queue_addr = kmalloc(adapter->rx_queue.queue_len,
-                                               GFP_KERNEL);
+       adapter->rx_queue.queue_addr =
+           dma_alloc_coherent(dev, adapter->rx_queue.queue_len,
+                              &adapter->rx_queue.queue_dma, GFP_KERNEL);
 
        if (!adapter->rx_queue.queue_addr) {
                netdev_err(netdev, "unable to allocate rx queue pages\n");
@@ -567,19 +565,13 @@ static int ibmveth_open(struct net_device *netdev)
                goto err_out;
        }
 
-       dev = &adapter->vdev->dev;
-
        adapter->buffer_list_dma = dma_map_single(dev,
                        adapter->buffer_list_addr, 4096, DMA_BIDIRECTIONAL);
        adapter->filter_list_dma = dma_map_single(dev,
                        adapter->filter_list_addr, 4096, DMA_BIDIRECTIONAL);
-       adapter->rx_queue.queue_dma = dma_map_single(dev,
-                       adapter->rx_queue.queue_addr,
-                       adapter->rx_queue.queue_len, DMA_BIDIRECTIONAL);
 
        if ((dma_mapping_error(dev, adapter->buffer_list_dma)) ||
-           (dma_mapping_error(dev, adapter->filter_list_dma)) ||
-           (dma_mapping_error(dev, adapter->rx_queue.queue_dma))) {
+           (dma_mapping_error(dev, adapter->filter_list_dma))) {
                netdev_err(netdev, "unable to map filter or buffer list "
                           "pages\n");
                rc = -ENOMEM;
index cd15332..cb3356c 100644 (file)
@@ -310,6 +310,7 @@ struct e1000_adapter {
         */
        struct e1000_ring *tx_ring /* One per active queue */
                                                ____cacheline_aligned_in_smp;
+       u32 tx_fifo_limit;
 
        struct napi_struct napi;
 
index 46c3b1f..d01a099 100644 (file)
@@ -3517,6 +3517,15 @@ void e1000e_reset(struct e1000_adapter *adapter)
        }
 
        /*
+        * Alignment of Tx data is on an arbitrary byte boundary with the
+        * maximum size per Tx descriptor limited only to the transmit
+        * allocation of the packet buffer minus 96 bytes with an upper
+        * limit of 24KB due to receive synchronization limitations.
+        */
+       adapter->tx_fifo_limit = min_t(u32, ((er32(PBA) >> 16) << 10) - 96,
+                                      24 << 10);
+
+       /*
         * Disable Adaptive Interrupt Moderation if 2 full packets cannot
         * fit in receive buffer.
         */
@@ -4785,12 +4794,9 @@ static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb)
        return 1;
 }
 
-#define E1000_MAX_PER_TXD      8192
-#define E1000_MAX_TXD_PWR      12
-
 static int e1000_tx_map(struct e1000_ring *tx_ring, struct sk_buff *skb,
                        unsigned int first, unsigned int max_per_txd,
-                       unsigned int nr_frags, unsigned int mss)
+                       unsigned int nr_frags)
 {
        struct e1000_adapter *adapter = tx_ring->adapter;
        struct pci_dev *pdev = adapter->pdev;
@@ -5023,20 +5029,19 @@ static int __e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size)
 
 static int e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size)
 {
+       BUG_ON(size > tx_ring->count);
+
        if (e1000_desc_unused(tx_ring) >= size)
                return 0;
        return __e1000_maybe_stop_tx(tx_ring, size);
 }
 
-#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1)
 static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
                                    struct net_device *netdev)
 {
        struct e1000_adapter *adapter = netdev_priv(netdev);
        struct e1000_ring *tx_ring = adapter->tx_ring;
        unsigned int first;
-       unsigned int max_per_txd = E1000_MAX_PER_TXD;
-       unsigned int max_txd_pwr = E1000_MAX_TXD_PWR;
        unsigned int tx_flags = 0;
        unsigned int len = skb_headlen(skb);
        unsigned int nr_frags;
@@ -5056,18 +5061,8 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
        }
 
        mss = skb_shinfo(skb)->gso_size;
-       /*
-        * The controller does a simple calculation to
-        * make sure there is enough room in the FIFO before
-        * initiating the DMA for each buffer.  The calc is:
-        * 4 = ceil(buffer len/mss).  To make sure we don't
-        * overrun the FIFO, adjust the max buffer len if mss
-        * drops.
-        */
        if (mss) {
                u8 hdr_len;
-               max_per_txd = min(mss << 2, max_per_txd);
-               max_txd_pwr = fls(max_per_txd) - 1;
 
                /*
                 * TSO Workaround for 82571/2/3 Controllers -- if skb->data
@@ -5097,12 +5092,12 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
                count++;
        count++;
 
-       count += TXD_USE_COUNT(len, max_txd_pwr);
+       count += DIV_ROUND_UP(len, adapter->tx_fifo_limit);
 
        nr_frags = skb_shinfo(skb)->nr_frags;
        for (f = 0; f < nr_frags; f++)
-               count += TXD_USE_COUNT(skb_frag_size(&skb_shinfo(skb)->frags[f]),
-                                      max_txd_pwr);
+               count += DIV_ROUND_UP(skb_frag_size(&skb_shinfo(skb)->frags[f]),
+                                     adapter->tx_fifo_limit);
 
        if (adapter->hw.mac.tx_pkt_filtering)
                e1000_transfer_dhcp_info(adapter, skb);
@@ -5144,15 +5139,18 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,
                tx_flags |= E1000_TX_FLAGS_NO_FCS;
 
        /* if count is 0 then mapping error has occurred */
-       count = e1000_tx_map(tx_ring, skb, first, max_per_txd, nr_frags, mss);
+       count = e1000_tx_map(tx_ring, skb, first, adapter->tx_fifo_limit,
+                            nr_frags);
        if (count) {
                skb_tx_timestamp(skb);
 
                netdev_sent_queue(netdev, skb->len);
                e1000_tx_queue(tx_ring, tx_flags, count);
                /* Make sure there is space in the ring for the next send. */
-               e1000_maybe_stop_tx(tx_ring, MAX_SKB_FRAGS + 2);
-
+               e1000_maybe_stop_tx(tx_ring,
+                                   (MAX_SKB_FRAGS *
+                                    DIV_ROUND_UP(PAGE_SIZE,
+                                                 adapter->tx_fifo_limit) + 2));
        } else {
                dev_kfree_skb_any(skb);
                tx_ring->buffer_info[first].time_stamp = 0;
@@ -6327,8 +6325,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
        adapter->hw.phy.autoneg_advertised = 0x2f;
 
        /* ring size defaults */
-       adapter->rx_ring->count = 256;
-       adapter->tx_ring->count = 256;
+       adapter->rx_ring->count = E1000_DEFAULT_RXD;
+       adapter->tx_ring->count = E1000_DEFAULT_TXD;
 
        /*
         * Initial Wake on LAN setting - If APM wake is enabled in
index 827b72d..2f816c6 100644 (file)
@@ -1234,13 +1234,13 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
                                mlx4_info(dev, "non-primary physical function, skipping.\n");
                        else
                                mlx4_err(dev, "QUERY_FW command failed, aborting.\n");
-                       goto unmap_bf;
+                       return err;
                }
 
                err = mlx4_load_fw(dev);
                if (err) {
                        mlx4_err(dev, "Failed to start FW, aborting.\n");
-                       goto unmap_bf;
+                       return err;
                }
 
                mlx4_cfg.log_pg_sz_m = 1;
@@ -1304,7 +1304,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
                err = mlx4_init_slave(dev);
                if (err) {
                        mlx4_err(dev, "Failed to initialize slave\n");
-                       goto unmap_bf;
+                       return err;
                }
 
                err = mlx4_slave_cap(dev);
@@ -1324,7 +1324,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
        err = mlx4_QUERY_ADAPTER(dev, &adapter);
        if (err) {
                mlx4_err(dev, "QUERY_ADAPTER command failed, aborting.\n");
-               goto err_close;
+               goto unmap_bf;
        }
 
        priv->eq_table.inta_pin = adapter.inta_pin;
@@ -1332,6 +1332,9 @@ static int mlx4_init_hca(struct mlx4_dev *dev)
 
        return 0;
 
+unmap_bf:
+       unmap_bf_area(dev);
+
 err_close:
        mlx4_close_hca(dev);
 
@@ -1344,8 +1347,6 @@ err_stop_fw:
                mlx4_UNMAP_FA(dev);
                mlx4_free_icm(dev, priv->fw.fw_icm, 0);
        }
-unmap_bf:
-       unmap_bf_area(dev);
        return err;
 }
 
@@ -1996,7 +1997,8 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
        }
 
 slave_start:
-       if (mlx4_cmd_init(dev)) {
+       err = mlx4_cmd_init(dev);
+       if (err) {
                mlx4_err(dev, "Failed to init command interface, aborting.\n");
                goto err_sriov;
        }
index a018ea2..e151c21 100644 (file)
@@ -137,11 +137,11 @@ static int mlx4_GID_HASH(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox,
        return err;
 }
 
-static struct mlx4_promisc_qp *get_promisc_qp(struct mlx4_dev *dev, u8 pf_num,
+static struct mlx4_promisc_qp *get_promisc_qp(struct mlx4_dev *dev, u8 port,
                                              enum mlx4_steer_type steer,
                                              u32 qpn)
 {
-       struct mlx4_steer *s_steer = &mlx4_priv(dev)->steer[pf_num];
+       struct mlx4_steer *s_steer = &mlx4_priv(dev)->steer[port - 1];
        struct mlx4_promisc_qp *pqp;
 
        list_for_each_entry(pqp, &s_steer->promisc_qps[steer], list) {
@@ -182,7 +182,7 @@ static int new_steering_entry(struct mlx4_dev *dev, u8 port,
        /* If the given qpn is also a promisc qp,
         * it should be inserted to duplicates list
         */
-       pqp = get_promisc_qp(dev, 0, steer, qpn);
+       pqp = get_promisc_qp(dev, port, steer, qpn);
        if (pqp) {
                dqp = kmalloc(sizeof *dqp, GFP_KERNEL);
                if (!dqp) {
@@ -256,7 +256,7 @@ static int existing_steering_entry(struct mlx4_dev *dev, u8 port,
 
        s_steer = &mlx4_priv(dev)->steer[port - 1];
 
-       pqp = get_promisc_qp(dev, 0, steer, qpn);
+       pqp = get_promisc_qp(dev, port, steer, qpn);
        if (!pqp)
                return 0; /* nothing to do */
 
@@ -302,7 +302,7 @@ static bool check_duplicate_entry(struct mlx4_dev *dev, u8 port,
        s_steer = &mlx4_priv(dev)->steer[port - 1];
 
        /* if qp is not promisc, it cannot be duplicated */
-       if (!get_promisc_qp(dev, 0, steer, qpn))
+       if (!get_promisc_qp(dev, port, steer, qpn))
                return false;
 
        /* The qp is promisc qp so it is a duplicate on this index
@@ -352,7 +352,7 @@ static bool can_remove_steering_entry(struct mlx4_dev *dev, u8 port,
        members_count = be32_to_cpu(mgm->members_count) & 0xffffff;
        for (i = 0;  i < members_count; i++) {
                qpn = be32_to_cpu(mgm->qp[i]) & MGM_QPN_MASK;
-               if (!get_promisc_qp(dev, 0, steer, qpn) && qpn != tqpn) {
+               if (!get_promisc_qp(dev, port, steer, qpn) && qpn != tqpn) {
                        /* the qp is not promisc, the entry can't be removed */
                        goto out;
                }
@@ -398,7 +398,7 @@ static int add_promisc_qp(struct mlx4_dev *dev, u8 port,
 
        mutex_lock(&priv->mcg_table.mutex);
 
-       if (get_promisc_qp(dev, 0, steer, qpn)) {
+       if (get_promisc_qp(dev, port, steer, qpn)) {
                err = 0;  /* Noting to do, already exists */
                goto out_mutex;
        }
@@ -503,7 +503,7 @@ static int remove_promisc_qp(struct mlx4_dev *dev, u8 port,
        s_steer = &mlx4_priv(dev)->steer[port - 1];
        mutex_lock(&priv->mcg_table.mutex);
 
-       pqp = get_promisc_qp(dev, 0, steer, qpn);
+       pqp = get_promisc_qp(dev, port, steer, qpn);
        if (unlikely(!pqp)) {
                mlx4_warn(dev, "QP %x is not promiscuous QP\n", qpn);
                /* nothing to do */
@@ -650,13 +650,6 @@ static int find_entry(struct mlx4_dev *dev, u8 port,
        return err;
 }
 
-struct mlx4_net_trans_rule_hw_ctrl {
-       __be32 ctrl;
-       __be32 vf_vep_port;
-       __be32 qpn;
-       __be32 reserved;
-};
-
 static void trans_rule_ctrl_to_hw(struct mlx4_net_trans_rule *ctrl,
                                  struct mlx4_net_trans_rule_hw_ctrl *hw)
 {
@@ -680,87 +673,18 @@ static void trans_rule_ctrl_to_hw(struct mlx4_net_trans_rule *ctrl,
        hw->qpn = cpu_to_be32(ctrl->qpn);
 }
 
-struct mlx4_net_trans_rule_hw_ib {
-       u8      size;
-       u8      rsvd1;
-       __be16  id;
-       u32     rsvd2;
-       __be32  qpn;
-       __be32  qpn_mask;
-       u8      dst_gid[16];
-       u8      dst_gid_msk[16];
-} __packed;
-
-struct mlx4_net_trans_rule_hw_eth {
-       u8      size;
-       u8      rsvd;
-       __be16  id;
-       u8      rsvd1[6];
-       u8      dst_mac[6];
-       u16     rsvd2;
-       u8      dst_mac_msk[6];
-       u16     rsvd3;
-       u8      src_mac[6];
-       u16     rsvd4;
-       u8      src_mac_msk[6];
-       u8      rsvd5;
-       u8      ether_type_enable;
-       __be16  ether_type;
-       __be16  vlan_id_msk;
-       __be16  vlan_id;
-} __packed;
-
-struct mlx4_net_trans_rule_hw_tcp_udp {
-       u8      size;
-       u8      rsvd;
-       __be16  id;
-       __be16  rsvd1[3];
-       __be16  dst_port;
-       __be16  rsvd2;
-       __be16  dst_port_msk;
-       __be16  rsvd3;
-       __be16  src_port;
-       __be16  rsvd4;
-       __be16  src_port_msk;
-} __packed;
-
-struct mlx4_net_trans_rule_hw_ipv4 {
-       u8      size;
-       u8      rsvd;
-       __be16  id;
-       __be32  rsvd1;
-       __be32  dst_ip;
-       __be32  dst_ip_msk;
-       __be32  src_ip;
-       __be32  src_ip_msk;
-} __packed;
-
-struct _rule_hw {
-       union {
-               struct {
-                       u8 size;
-                       u8 rsvd;
-                       __be16 id;
-               };
-               struct mlx4_net_trans_rule_hw_eth eth;
-               struct mlx4_net_trans_rule_hw_ib ib;
-               struct mlx4_net_trans_rule_hw_ipv4 ipv4;
-               struct mlx4_net_trans_rule_hw_tcp_udp tcp_udp;
-       };
+const u16 __sw_id_hw[] = {
+       [MLX4_NET_TRANS_RULE_ID_ETH]     = 0xE001,
+       [MLX4_NET_TRANS_RULE_ID_IB]      = 0xE005,
+       [MLX4_NET_TRANS_RULE_ID_IPV6]    = 0xE003,
+       [MLX4_NET_TRANS_RULE_ID_IPV4]    = 0xE002,
+       [MLX4_NET_TRANS_RULE_ID_TCP]     = 0xE004,
+       [MLX4_NET_TRANS_RULE_ID_UDP]     = 0xE006
 };
 
 static int parse_trans_rule(struct mlx4_dev *dev, struct mlx4_spec_list *spec,
                            struct _rule_hw *rule_hw)
 {
-       static const u16 __sw_id_hw[] = {
-               [MLX4_NET_TRANS_RULE_ID_ETH]     = 0xE001,
-               [MLX4_NET_TRANS_RULE_ID_IB]      = 0xE005,
-               [MLX4_NET_TRANS_RULE_ID_IPV6]    = 0xE003,
-               [MLX4_NET_TRANS_RULE_ID_IPV4]    = 0xE002,
-               [MLX4_NET_TRANS_RULE_ID_TCP]     = 0xE004,
-               [MLX4_NET_TRANS_RULE_ID_UDP]     = 0xE006
-       };
-
        static const size_t __rule_hw_sz[] = {
                [MLX4_NET_TRANS_RULE_ID_ETH] =
                        sizeof(struct mlx4_net_trans_rule_hw_eth),
index 4d9df8f..dba69d9 100644 (file)
@@ -690,6 +690,82 @@ struct mlx4_steer {
        struct list_head steer_entries[MLX4_NUM_STEERS];
 };
 
+struct mlx4_net_trans_rule_hw_ctrl {
+       __be32 ctrl;
+       __be32 vf_vep_port;
+       __be32 qpn;
+       __be32 reserved;
+};
+
+struct mlx4_net_trans_rule_hw_ib {
+       u8 size;
+       u8 rsvd1;
+       __be16 id;
+       u32 rsvd2;
+       __be32 qpn;
+       __be32 qpn_mask;
+       u8 dst_gid[16];
+       u8 dst_gid_msk[16];
+} __packed;
+
+struct mlx4_net_trans_rule_hw_eth {
+       u8      size;
+       u8      rsvd;
+       __be16  id;
+       u8      rsvd1[6];
+       u8      dst_mac[6];
+       u16     rsvd2;
+       u8      dst_mac_msk[6];
+       u16     rsvd3;
+       u8      src_mac[6];
+       u16     rsvd4;
+       u8      src_mac_msk[6];
+       u8      rsvd5;
+       u8      ether_type_enable;
+       __be16  ether_type;
+       __be16  vlan_id_msk;
+       __be16  vlan_id;
+} __packed;
+
+struct mlx4_net_trans_rule_hw_tcp_udp {
+       u8      size;
+       u8      rsvd;
+       __be16  id;
+       __be16  rsvd1[3];
+       __be16  dst_port;
+       __be16  rsvd2;
+       __be16  dst_port_msk;
+       __be16  rsvd3;
+       __be16  src_port;
+       __be16  rsvd4;
+       __be16  src_port_msk;
+} __packed;
+
+struct mlx4_net_trans_rule_hw_ipv4 {
+       u8      size;
+       u8      rsvd;
+       __be16  id;
+       __be32  rsvd1;
+       __be32  dst_ip;
+       __be32  dst_ip_msk;
+       __be32  src_ip;
+       __be32  src_ip_msk;
+} __packed;
+
+struct _rule_hw {
+       union {
+               struct {
+                       u8 size;
+                       u8 rsvd;
+                       __be16 id;
+               };
+               struct mlx4_net_trans_rule_hw_eth eth;
+               struct mlx4_net_trans_rule_hw_ib ib;
+               struct mlx4_net_trans_rule_hw_ipv4 ipv4;
+               struct mlx4_net_trans_rule_hw_tcp_udp tcp_udp;
+       };
+};
+
 struct mlx4_priv {
        struct mlx4_dev         dev;
 
index 94ceddd..293c9e8 100644 (file)
@@ -42,6 +42,7 @@
 #include <linux/mlx4/cmd.h>
 #include <linux/mlx4/qp.h>
 #include <linux/if_ether.h>
+#include <linux/etherdevice.h>
 
 #include "mlx4.h"
 #include "fw.h"
@@ -2776,18 +2777,133 @@ ex_put:
        return err;
 }
 
+/*
+ * MAC validation for Flow Steering rules.
+ * VF can attach rules only with a mac address which is assigned to it.
+ */
+static int validate_eth_header_mac(int slave, struct _rule_hw *eth_header,
+                                  struct list_head *rlist)
+{
+       struct mac_res *res, *tmp;
+       __be64 be_mac;
+
+       /* make sure it isn't multicast or broadcast mac*/
+       if (!is_multicast_ether_addr(eth_header->eth.dst_mac) &&
+           !is_broadcast_ether_addr(eth_header->eth.dst_mac)) {
+               list_for_each_entry_safe(res, tmp, rlist, list) {
+                       be_mac = cpu_to_be64(res->mac << 16);
+                       if (!memcmp(&be_mac, eth_header->eth.dst_mac, ETH_ALEN))
+                               return 0;
+               }
+               pr_err("MAC %pM doesn't belong to VF %d, Steering rule rejected\n",
+                      eth_header->eth.dst_mac, slave);
+               return -EINVAL;
+       }
+       return 0;
+}
+
+/*
+ * In case of missing eth header, append eth header with a MAC address
+ * assigned to the VF.
+ */
+static int add_eth_header(struct mlx4_dev *dev, int slave,
+                         struct mlx4_cmd_mailbox *inbox,
+                         struct list_head *rlist, int header_id)
+{
+       struct mac_res *res, *tmp;
+       u8 port;
+       struct mlx4_net_trans_rule_hw_ctrl *ctrl;
+       struct mlx4_net_trans_rule_hw_eth *eth_header;
+       struct mlx4_net_trans_rule_hw_ipv4 *ip_header;
+       struct mlx4_net_trans_rule_hw_tcp_udp *l4_header;
+       __be64 be_mac = 0;
+       __be64 mac_msk = cpu_to_be64(MLX4_MAC_MASK << 16);
+
+       ctrl = (struct mlx4_net_trans_rule_hw_ctrl *)inbox->buf;
+       port = be32_to_cpu(ctrl->vf_vep_port) & 0xff;
+       eth_header = (struct mlx4_net_trans_rule_hw_eth *)(ctrl + 1);
+
+       /* Clear a space in the inbox for eth header */
+       switch (header_id) {
+       case MLX4_NET_TRANS_RULE_ID_IPV4:
+               ip_header =
+                       (struct mlx4_net_trans_rule_hw_ipv4 *)(eth_header + 1);
+               memmove(ip_header, eth_header,
+                       sizeof(*ip_header) + sizeof(*l4_header));
+               break;
+       case MLX4_NET_TRANS_RULE_ID_TCP:
+       case MLX4_NET_TRANS_RULE_ID_UDP:
+               l4_header = (struct mlx4_net_trans_rule_hw_tcp_udp *)
+                           (eth_header + 1);
+               memmove(l4_header, eth_header, sizeof(*l4_header));
+               break;
+       default:
+               return -EINVAL;
+       }
+       list_for_each_entry_safe(res, tmp, rlist, list) {
+               if (port == res->port) {
+                       be_mac = cpu_to_be64(res->mac << 16);
+                       break;
+               }
+       }
+       if (!be_mac) {
+               pr_err("Failed adding eth header to FS rule, Can't find matching MAC for port %d .\n",
+                      port);
+               return -EINVAL;
+       }
+
+       memset(eth_header, 0, sizeof(*eth_header));
+       eth_header->size = sizeof(*eth_header) >> 2;
+       eth_header->id = cpu_to_be16(__sw_id_hw[MLX4_NET_TRANS_RULE_ID_ETH]);
+       memcpy(eth_header->dst_mac, &be_mac, ETH_ALEN);
+       memcpy(eth_header->dst_mac_msk, &mac_msk, ETH_ALEN);
+
+       return 0;
+
+}
+
 int mlx4_QP_FLOW_STEERING_ATTACH_wrapper(struct mlx4_dev *dev, int slave,
                                         struct mlx4_vhcr *vhcr,
                                         struct mlx4_cmd_mailbox *inbox,
                                         struct mlx4_cmd_mailbox *outbox,
                                         struct mlx4_cmd_info *cmd)
 {
+
+       struct mlx4_priv *priv = mlx4_priv(dev);
+       struct mlx4_resource_tracker *tracker = &priv->mfunc.master.res_tracker;
+       struct list_head *rlist = &tracker->slave_list[slave].res_list[RES_MAC];
        int err;
+       struct mlx4_net_trans_rule_hw_ctrl *ctrl;
+       struct _rule_hw  *rule_header;
+       int header_id;
 
        if (dev->caps.steering_mode !=
            MLX4_STEERING_MODE_DEVICE_MANAGED)
                return -EOPNOTSUPP;
 
+       ctrl = (struct mlx4_net_trans_rule_hw_ctrl *)inbox->buf;
+       rule_header = (struct _rule_hw *)(ctrl + 1);
+       header_id = map_hw_to_sw_id(be16_to_cpu(rule_header->id));
+
+       switch (header_id) {
+       case MLX4_NET_TRANS_RULE_ID_ETH:
+               if (validate_eth_header_mac(slave, rule_header, rlist))
+                       return -EINVAL;
+               break;
+       case MLX4_NET_TRANS_RULE_ID_IPV4:
+       case MLX4_NET_TRANS_RULE_ID_TCP:
+       case MLX4_NET_TRANS_RULE_ID_UDP:
+               pr_warn("Can't attach FS rule without L2 headers, adding L2 header.\n");
+               if (add_eth_header(dev, slave, inbox, rlist, header_id))
+                       return -EINVAL;
+               vhcr->in_modifier +=
+                       sizeof(struct mlx4_net_trans_rule_hw_eth) >> 2;
+               break;
+       default:
+               pr_err("Corrupted mailbox.\n");
+               return -EINVAL;
+       }
+
        err = mlx4_cmd_imm(dev, inbox->dma, &vhcr->out_param,
                           vhcr->in_modifier, 0,
                           MLX4_QP_FLOW_STEERING_ATTACH, MLX4_CMD_TIME_CLASS_A,
index bb8c822..4d15bf4 100644 (file)
@@ -751,6 +751,7 @@ static int __devinit sgiseeq_probe(struct platform_device *pdev)
        sp->srings = sr;
        sp->rx_desc = sp->srings->rxvector;
        sp->tx_desc = sp->srings->txvector;
+       spin_lock_init(&sp->tx_lock);
 
        /* A couple calculations now, saves many cycles later. */
        setup_rx_ring(dev, sp->rx_desc, SEEQ_RX_BUFFERS);
index 8cba2df..5faedd8 100644 (file)
@@ -863,8 +863,8 @@ static int efx_ethtool_get_class_rule(struct efx_nic *efx,
                                       &ip_entry->ip4dst, &ip_entry->pdst);
        if (rc != 0) {
                rc = efx_filter_get_ipv4_full(
-                       &spec, &proto, &ip_entry->ip4src, &ip_entry->psrc,
-                       &ip_entry->ip4dst, &ip_entry->pdst);
+                       &spec, &proto, &ip_entry->ip4dst, &ip_entry->pdst,
+                       &ip_entry->ip4src, &ip_entry->psrc);
                EFX_WARN_ON_PARANOID(rc);
                ip_mask->ip4src = ~0;
                ip_mask->psrc = ~0;
index b5ba308..3e5519a 100644 (file)
@@ -1147,15 +1147,17 @@ static void __devinit ioc3_8250_register(struct ioc3_uartregs __iomem *uart)
 {
 #define COSMISC_CONSTANT 6
 
-       struct uart_port port = {
-               .irq            = 0,
-               .flags          = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
-               .iotype         = UPIO_MEM,
-               .regshift       = 0,
-               .uartclk        = (22000000 << 1) / COSMISC_CONSTANT,
-
-               .membase        = (unsigned char __iomem *) uart,
-               .mapbase        = (unsigned long) uart,
+       struct uart_8250_port port = {
+               .port = {
+                       .irq            = 0,
+                       .flags          = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
+                       .iotype         = UPIO_MEM,
+                       .regshift       = 0,
+                       .uartclk        = (22000000 << 1) / COSMISC_CONSTANT,
+
+                       .membase        = (unsigned char __iomem *) uart,
+                       .mapbase        = (unsigned long) uart,
+                }
        };
        unsigned char lcr;
 
@@ -1164,7 +1166,7 @@ static void __devinit ioc3_8250_register(struct ioc3_uartregs __iomem *uart)
        uart->iu_scr = COSMISC_CONSTANT,
        uart->iu_lcr = lcr;
        uart->iu_lcr;
-       serial8250_register_port(&port);
+       serial8250_register_8250_port(&port);
 }
 
 static void __devinit ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3)
index e2d0832..719be39 100644 (file)
@@ -22,6 +22,9 @@
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
 
+#ifndef __COMMON_H__
+#define __COMMON_H__
+
 #include <linux/etherdevice.h>
 #include <linux/netdevice.h>
 #include <linux/phy.h>
@@ -366,3 +369,5 @@ extern void stmmac_set_mac(void __iomem *ioaddr, bool enable);
 
 extern void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr);
 extern const struct stmmac_ring_mode_ops ring_mode_ops;
+
+#endif /* __COMMON_H__ */
index 9820ec8..223adf9 100644 (file)
 
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
+
+#ifndef __DESCS_H__
+#define __DESCS_H__
+
 struct dma_desc {
        /* Receive descriptor */
        union {
@@ -166,3 +170,5 @@ enum tdes_csum_insertion {
                                         * is not calculated */
        cic_full = 3,           /* IP header and pseudoheader */
 };
+
+#endif /* __DESCS_H__ */
index dd8d6e1..7ee9499 100644 (file)
@@ -27,6 +27,9 @@
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
 
+#ifndef __DESC_COM_H__
+#define __DESC_COM_H__
+
 #if defined(CONFIG_STMMAC_RING)
 static inline void ehn_desc_rx_set_on_ring_chain(struct dma_desc *p, int end)
 {
@@ -124,3 +127,5 @@ static inline void norm_set_tx_desc_len(struct dma_desc *p, int len)
        p->des01.tx.buffer1_size = len;
 }
 #endif
+
+#endif /* __DESC_COM_H__ */
index 7c6d857..2ec6aea 100644 (file)
@@ -22,6 +22,9 @@
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
 
+#ifndef __DWMAC100_H__
+#define __DWMAC100_H__
+
 #include <linux/phy.h>
 #include "common.h"
 
@@ -119,3 +122,5 @@ enum ttc_control {
 #define DMA_MISSED_FRAME_M_CNTR        0x0000ffff      /* Missed Frame Couinter */
 
 extern const struct stmmac_dma_ops dwmac100_dma_ops;
+
+#endif /* __DWMAC100_H__ */
index f90fcb5..0e4cace 100644 (file)
@@ -19,6 +19,8 @@
 
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
+#ifndef __DWMAC1000_H__
+#define __DWMAC1000_H__
 
 #include <linux/phy.h>
 #include "common.h"
@@ -229,6 +231,7 @@ enum rtc_control {
 #define GMAC_MMC_RX_CSUM_OFFLOAD   0x208
 
 /* Synopsys Core versions */
-#define        DWMAC_CORE_3_40 34
+#define        DWMAC_CORE_3_40 0x34
 
 extern const struct stmmac_dma_ops dwmac1000_dma_ops;
+#endif /* __DWMAC1000_H__ */
index e678ce3..e49c9a0 100644 (file)
@@ -22,6 +22,9 @@
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
 
+#ifndef __DWMAC_DMA_H__
+#define __DWMAC_DMA_H__
+
 /* DMA CRS Control and Status Register Mapping */
 #define DMA_BUS_MODE           0x00001000      /* Bus Mode */
 #define DMA_XMT_POLL_DEMAND    0x00001004      /* Transmit Poll Demand */
@@ -109,3 +112,5 @@ extern void dwmac_dma_start_rx(void __iomem *ioaddr);
 extern void dwmac_dma_stop_rx(void __iomem *ioaddr);
 extern int dwmac_dma_interrupt(void __iomem *ioaddr,
                                struct stmmac_extra_stats *x);
+
+#endif /* __DWMAC_DMA_H__ */
index a383520..67995ef 100644 (file)
@@ -22,6 +22,9 @@
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
 
+#ifndef __MMC_H__
+#define __MMC_H__
+
 /* MMC control register */
 /* When set, all counter are reset */
 #define MMC_CNTRL_COUNTER_RESET                0x1
@@ -129,3 +132,5 @@ struct stmmac_counters {
 extern void dwmac_mmc_ctrl(void __iomem *ioaddr, unsigned int mode);
 extern void dwmac_mmc_intr_all_mask(void __iomem *ioaddr);
 extern void dwmac_mmc_read(void __iomem *ioaddr, struct stmmac_counters *mmc);
+
+#endif /* __MMC_H__ */
index c07cfe9..0c74a70 100644 (file)
@@ -33,7 +33,7 @@
 #define MMC_TX_INTR            0x00000108      /* MMC TX Interrupt */
 #define MMC_RX_INTR_MASK       0x0000010c      /* MMC Interrupt Mask */
 #define MMC_TX_INTR_MASK       0x00000110      /* MMC Interrupt Mask */
-#define MMC_DEFAUL_MASK                0xffffffff
+#define MMC_DEFAULT_MASK               0xffffffff
 
 /* MMC TX counter registers */
 
@@ -147,8 +147,8 @@ void dwmac_mmc_ctrl(void __iomem *ioaddr, unsigned int mode)
 /* To mask all all interrupts.*/
 void dwmac_mmc_intr_all_mask(void __iomem *ioaddr)
 {
-       writel(MMC_DEFAUL_MASK, ioaddr + MMC_RX_INTR_MASK);
-       writel(MMC_DEFAUL_MASK, ioaddr + MMC_TX_INTR_MASK);
+       writel(MMC_DEFAULT_MASK, ioaddr + MMC_RX_INTR_MASK);
+       writel(MMC_DEFAULT_MASK, ioaddr + MMC_TX_INTR_MASK);
 }
 
 /* This reads the MAC core counters (if actaully supported).
index f2d3665..e872e1d 100644 (file)
@@ -20,6 +20,9 @@
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
 
+#ifndef __STMMAC_H__
+#define __STMMAC_H__
+
 #define STMMAC_RESOURCE_NAME   "stmmaceth"
 #define DRV_MODULE_VERSION     "March_2012"
 
@@ -166,3 +169,5 @@ static inline void stmmac_unregister_pci(void)
 {
 }
 #endif /* CONFIG_STMMAC_PCI */
+
+#endif /* __STMMAC_H__ */
index 6863590..aea9b14 100644 (file)
@@ -21,6 +21,8 @@
 
   Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
 *******************************************************************************/
+#ifndef __STMMAC_TIMER_H__
+#define __STMMAC_TIMER_H__
 
 struct stmmac_timer {
        void (*timer_start) (unsigned int new_freq);
@@ -40,3 +42,5 @@ void stmmac_schedule(struct net_device *dev);
 extern int tmu2_register_user(void *fnt, void *data);
 extern void tmu2_unregister_user(void);
 #endif
+
+#endif /* __STMMAC_TIMER_H__ */
index cd7ee20..a9ca4a0 100644 (file)
@@ -394,8 +394,10 @@ static int __devexit davinci_mdio_remove(struct platform_device *pdev)
        struct device *dev = &pdev->dev;
        struct davinci_mdio_data *data = dev_get_drvdata(dev);
 
-       if (data->bus)
+       if (data->bus) {
+               mdiobus_unregister(data->bus);
                mdiobus_free(data->bus);
+       }
 
        if (data->clk)
                clk_put(data->clk);
index 24d8566..441b4dc 100644 (file)
@@ -673,7 +673,7 @@ void smt_add_para(struct s_smc *smc, struct s_pcon *pcon, u_short para,
                        sm_pm_get_ls(smc,port_to_mib(smc,port))) ;
                break ;
        case SMT_P_REASON :
-               * (u_long *) to = 0 ;
+               *(u32 *)to = 0 ;
                sp_len = 4 ;
                goto sp_done ;
        case SMT_P1033 :                        /* time stamp */
index 3352b24..30087ca 100644 (file)
@@ -124,8 +124,8 @@ static int irtty_change_speed(struct sir_dev *dev, unsigned speed)
        tty = priv->tty;
 
        mutex_lock(&tty->termios_mutex);
-       old_termios = *(tty->termios);
-       cflag = tty->termios->c_cflag;
+       old_termios = tty->termios;
+       cflag = tty->termios.c_cflag;
        tty_encode_baud_rate(tty, speed, speed);
        if (tty->ops->set_termios)
                tty->ops->set_termios(tty, &old_termios);
@@ -281,15 +281,15 @@ static inline void irtty_stop_receiver(struct tty_struct *tty, int stop)
        int cflag;
 
        mutex_lock(&tty->termios_mutex);
-       old_termios = *(tty->termios);
-       cflag = tty->termios->c_cflag;
+       old_termios = tty->termios;
+       cflag = tty->termios.c_cflag;
        
        if (stop)
                cflag &= ~CREAD;
        else
                cflag |= CREAD;
 
-       tty->termios->c_cflag = cflag;
+       tty->termios.c_cflag = cflag;
        if (tty->ops->set_termios)
                tty->ops->set_termios(tty, &old_termios);
        mutex_unlock(&tty->termios_mutex);
index 62f30b4..605a4ba 100644 (file)
@@ -1107,7 +1107,6 @@ static void _hso_serial_set_termios(struct tty_struct *tty,
                                    struct ktermios *old)
 {
        struct hso_serial *serial = tty->driver_data;
-       struct ktermios *termios;
 
        if (!serial) {
                printk(KERN_ERR "%s: no tty structures", __func__);
@@ -1119,16 +1118,15 @@ static void _hso_serial_set_termios(struct tty_struct *tty,
        /*
         *      Fix up unsupported bits
         */
-       termios = tty->termios;
-       termios->c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */
+       tty->termios.c_iflag &= ~IXON; /* disable enable XON/XOFF flow control */
 
-       termios->c_cflag &=
+       tty->termios.c_cflag &=
                ~(CSIZE         /* no size */
                | PARENB        /* disable parity bit */
                | CBAUD         /* clear current baud rate */
                | CBAUDEX);     /* clear current buad rate */
 
-       termios->c_cflag |= CS8;        /* character size 8 bits */
+       tty->termios.c_cflag |= CS8;    /* character size 8 bits */
 
        /* baud rate 115200 */
        tty_encode_baud_rate(tty, 115200, 115200);
@@ -1425,14 +1423,14 @@ static void hso_serial_set_termios(struct tty_struct *tty, struct ktermios *old)
 
        if (old)
                D5("Termios called with: cflags new[%d] - old[%d]",
-                  tty->termios->c_cflag, old->c_cflag);
+                  tty->termios.c_cflag, old->c_cflag);
 
        /* the actual setup */
        spin_lock_irqsave(&serial->serial_lock, flags);
        if (serial->port.count)
                _hso_serial_set_termios(tty, old);
        else
-               tty->termios = old;
+               tty->termios = *old;
        spin_unlock_irqrestore(&serial->serial_lock, flags);
 
        /* done */
@@ -2289,9 +2287,11 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
        if (minor < 0)
                goto exit;
 
+       tty_port_init(&serial->port);
+
        /* register our minor number */
-       serial->parent->dev = tty_register_device(tty_drv, minor,
-                                       &serial->parent->interface->dev);
+       serial->parent->dev = tty_port_register_device(&serial->port, tty_drv,
+                       minor, &serial->parent->interface->dev);
        dev = serial->parent->dev;
        dev_set_drvdata(dev, serial->parent);
        i = device_create_file(dev, &dev_attr_hsotype);
@@ -2300,7 +2300,6 @@ static int hso_serial_common_create(struct hso_serial *serial, int num_urbs,
        serial->minor = minor;
        serial->magic = HSO_SERIAL_MAGIC;
        spin_lock_init(&serial->serial_lock);
-       tty_port_init(&serial->port);
        serial->num_rx_urbs = num_urbs;
 
        /* RX, allocate urb and initialize */
index 328397c..b1ba68f 100644 (file)
@@ -297,7 +297,7 @@ static int qmi_wwan_suspend(struct usb_interface *intf, pm_message_t message)
        if (ret < 0)
                goto err;
 
-       if (info->subdriver && info->subdriver->suspend)
+       if (intf == info->control && info->subdriver && info->subdriver->suspend)
                ret = info->subdriver->suspend(intf, message);
        if (ret < 0)
                usbnet_resume(intf);
@@ -310,13 +310,14 @@ static int qmi_wwan_resume(struct usb_interface *intf)
        struct usbnet *dev = usb_get_intfdata(intf);
        struct qmi_wwan_state *info = (void *)&dev->data;
        int ret = 0;
+       bool callsub = (intf == info->control && info->subdriver && info->subdriver->resume);
 
-       if (info->subdriver && info->subdriver->resume)
+       if (callsub)
                ret = info->subdriver->resume(intf);
        if (ret < 0)
                goto err;
        ret = usbnet_resume(intf);
-       if (ret < 0 && info->subdriver && info->subdriver->resume && info->subdriver->suspend)
+       if (ret < 0 && callsub && info->subdriver->suspend)
                info->subdriver->suspend(intf, PMSG_SUSPEND);
 err:
        return ret;
@@ -398,7 +399,6 @@ static const struct usb_device_id products[] = {
        /* 4. Gobi 1000 devices */
        {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)},    /* Acer Gobi Modem Device */
        {QMI_GOBI1K_DEVICE(0x03f0, 0x1f1d)},    /* HP un2400 Gobi Modem Device */
-       {QMI_GOBI1K_DEVICE(0x03f0, 0x371d)},    /* HP un2430 Mobile Broadband Module */
        {QMI_GOBI1K_DEVICE(0x04da, 0x250d)},    /* Panasonic Gobi Modem device */
        {QMI_GOBI1K_DEVICE(0x413c, 0x8172)},    /* Dell Gobi Modem device */
        {QMI_GOBI1K_DEVICE(0x1410, 0xa001)},    /* Novatel Gobi Modem device */
@@ -413,7 +413,9 @@ static const struct usb_device_id products[] = {
 
        /* 5. Gobi 2000 and 3000 devices */
        {QMI_GOBI_DEVICE(0x413c, 0x8186)},      /* Dell Gobi 2000 Modem device (N0218, VU936) */
+       {QMI_GOBI_DEVICE(0x413c, 0x8194)},      /* Dell Gobi 3000 Composite */
        {QMI_GOBI_DEVICE(0x05c6, 0x920b)},      /* Generic Gobi 2000 Modem device */
+       {QMI_GOBI_DEVICE(0x05c6, 0x920d)},      /* Gobi 3000 Composite */
        {QMI_GOBI_DEVICE(0x05c6, 0x9225)},      /* Sony Gobi 2000 Modem device (N0279, VU730) */
        {QMI_GOBI_DEVICE(0x05c6, 0x9245)},      /* Samsung Gobi 2000 Modem device (VL176) */
        {QMI_GOBI_DEVICE(0x03f0, 0x251d)},      /* HP Gobi 2000 Modem device (VP412) */
@@ -438,9 +440,12 @@ static const struct usb_device_id products[] = {
        {QMI_GOBI_DEVICE(0x16d8, 0x8002)},      /* CMDTech Gobi 2000 Modem device (VU922) */
        {QMI_GOBI_DEVICE(0x05c6, 0x9205)},      /* Gobi 2000 Modem device */
        {QMI_GOBI_DEVICE(0x1199, 0x9013)},      /* Sierra Wireless Gobi 3000 Modem device (MC8355) */
+       {QMI_GOBI_DEVICE(0x03f0, 0x371d)},      /* HP un2430 Mobile Broadband Module */
        {QMI_GOBI_DEVICE(0x1199, 0x9015)},      /* Sierra Wireless Gobi 3000 Modem device */
        {QMI_GOBI_DEVICE(0x1199, 0x9019)},      /* Sierra Wireless Gobi 3000 Modem device */
        {QMI_GOBI_DEVICE(0x1199, 0x901b)},      /* Sierra Wireless MC7770 */
+       {QMI_GOBI_DEVICE(0x12d1, 0x14f1)},      /* Sony Gobi 3000 Composite */
+       {QMI_GOBI_DEVICE(0x1410, 0xa021)},      /* Foxconn Gobi 3000 Modem device (Novatel E396) */
 
        { }                                     /* END */
 };
index 7be49ea..8e22417 100644 (file)
@@ -656,7 +656,7 @@ static int sierra_net_get_fw_attr(struct usbnet *dev, u16 *datap)
                return -EIO;
        }
 
-       *datap = *attrdata;
+       *datap = le16_to_cpu(*attrdata);
 
        kfree(attrdata);
        return result;
index 8531c1c..fc9f578 100644 (file)
@@ -1201,19 +1201,26 @@ deferred:
 }
 EXPORT_SYMBOL_GPL(usbnet_start_xmit);
 
-static void rx_alloc_submit(struct usbnet *dev, gfp_t flags)
+static int rx_alloc_submit(struct usbnet *dev, gfp_t flags)
 {
        struct urb      *urb;
        int             i;
+       int             ret = 0;
 
        /* don't refill the queue all at once */
        for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) {
                urb = usb_alloc_urb(0, flags);
                if (urb != NULL) {
-                       if (rx_submit(dev, urb, flags) == -ENOLINK)
-                               return;
+                       ret = rx_submit(dev, urb, flags);
+                       if (ret)
+                               goto err;
+               } else {
+                       ret = -ENOMEM;
+                       goto err;
                }
        }
+err:
+       return ret;
 }
 
 /*-------------------------------------------------------------------------*/
@@ -1257,7 +1264,8 @@ static void usbnet_bh (unsigned long param)
                int     temp = dev->rxq.qlen;
 
                if (temp < RX_QLEN(dev)) {
-                       rx_alloc_submit(dev, GFP_ATOMIC);
+                       if (rx_alloc_submit(dev, GFP_ATOMIC) == -ENOLINK)
+                               return;
                        if (temp != dev->rxq.qlen)
                                netif_dbg(dev, link, dev->net,
                                          "rxqlen %d --> %d\n",
@@ -1573,7 +1581,7 @@ int usbnet_resume (struct usb_interface *intf)
                                netif_device_present(dev->net) &&
                                !timer_pending(&dev->delay) &&
                                !test_bit(EVENT_RX_HALT, &dev->flags))
-                                       rx_alloc_submit(dev, GFP_KERNEL);
+                                       rx_alloc_submit(dev, GFP_NOIO);
 
                        if (!(dev->txq.qlen >= TX_QLEN(dev)))
                                netif_tx_wake_all_queues(dev->net);
index aaaca9a..3f575af 100644 (file)
@@ -10,6 +10,7 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <linux/module.h>
 #include <linux/bitops.h>
 #include <linux/cdev.h>
 #include <linux/dma-mapping.h>
index 4026c90..b7e0258 100644 (file)
@@ -1482,7 +1482,7 @@ ath5k_eeprom_read_target_rate_pwr_info(struct ath5k_hw *ah, unsigned int mode)
        case AR5K_EEPROM_MODE_11A:
                offset += AR5K_EEPROM_TARGET_PWR_OFF_11A(ee->ee_version);
                rate_pcal_info = ee->ee_rate_tpwr_a;
-               ee->ee_rate_target_pwr_num[mode] = AR5K_EEPROM_N_5GHZ_CHAN;
+               ee->ee_rate_target_pwr_num[mode] = AR5K_EEPROM_N_5GHZ_RATE_CHAN;
                break;
        case AR5K_EEPROM_MODE_11B:
                offset += AR5K_EEPROM_TARGET_PWR_OFF_11B(ee->ee_version);
index dc2bcfe..94a9bbe 100644 (file)
 #define AR5K_EEPROM_EEP_DELTA          10
 #define AR5K_EEPROM_N_MODES            3
 #define AR5K_EEPROM_N_5GHZ_CHAN                10
+#define AR5K_EEPROM_N_5GHZ_RATE_CHAN   8
 #define AR5K_EEPROM_N_2GHZ_CHAN                3
 #define AR5K_EEPROM_N_2GHZ_CHAN_2413   4
 #define        AR5K_EEPROM_N_2GHZ_CHAN_MAX     4
index 2c9f7d7..0ed3846 100644 (file)
@@ -142,6 +142,7 @@ static int ar9003_paprd_setup_single_table(struct ath_hw *ah)
        };
        int training_power;
        int i, val;
+       u32 am2pm_mask = ah->paprd_ratemask;
 
        if (IS_CHAN_2GHZ(ah->curchan))
                training_power = ar9003_get_training_power_2g(ah);
@@ -158,10 +159,13 @@ static int ar9003_paprd_setup_single_table(struct ath_hw *ah)
        }
        ah->paprd_training_power = training_power;
 
+       if (AR_SREV_9330(ah))
+               am2pm_mask = 0;
+
        REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK,
                      ah->paprd_ratemask);
        REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK,
-                     ah->paprd_ratemask);
+                     am2pm_mask);
        REG_RMW_FIELD(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK,
                      ah->paprd_ratemask_ht40);
 
@@ -782,6 +786,102 @@ int ar9003_paprd_setup_gain_table(struct ath_hw *ah, int chain)
 }
 EXPORT_SYMBOL(ar9003_paprd_setup_gain_table);
 
+static bool ar9003_paprd_retrain_pa_in(struct ath_hw *ah,
+                                      struct ath9k_hw_cal_data *caldata,
+                                      int chain)
+{
+       u32 *pa_in = caldata->pa_table[chain];
+       int capdiv_offset, quick_drop_offset;
+       int capdiv2g, quick_drop;
+       int count = 0;
+       int i;
+
+       if (!AR_SREV_9485(ah) && !AR_SREV_9330(ah))
+               return false;
+
+       capdiv2g = REG_READ_FIELD(ah, AR_PHY_65NM_CH0_TXRF3,
+                                 AR_PHY_65NM_CH0_TXRF3_CAPDIV2G);
+
+       quick_drop = REG_READ_FIELD(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
+                                   AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP);
+
+       if (quick_drop)
+               quick_drop -= 0x40;
+
+       for (i = 0; i < NUM_BIN + 1; i++) {
+               if (pa_in[i] == 1400)
+                       count++;
+       }
+
+       if (AR_SREV_9485(ah)) {
+               if (pa_in[23] < 800) {
+                       capdiv_offset = (int)((1000 - pa_in[23] + 75) / 150);
+                       capdiv2g += capdiv_offset;
+                       if (capdiv2g > 7) {
+                               capdiv2g = 7;
+                               if (pa_in[23] < 600) {
+                                       quick_drop++;
+                                       if (quick_drop > 0)
+                                               quick_drop = 0;
+                               }
+                       }
+               } else if (pa_in[23] == 1400) {
+                       quick_drop_offset = min_t(int, count / 3, 2);
+                       quick_drop += quick_drop_offset;
+                       capdiv2g += quick_drop_offset / 2;
+
+                       if (capdiv2g > 7)
+                               capdiv2g = 7;
+
+                       if (quick_drop > 0) {
+                               quick_drop = 0;
+                               capdiv2g -= quick_drop_offset;
+                               if (capdiv2g < 0)
+                                       capdiv2g = 0;
+                       }
+               } else {
+                       return false;
+               }
+       } else if (AR_SREV_9330(ah)) {
+               if (pa_in[23] < 1000) {
+                       capdiv_offset = (1000 - pa_in[23]) / 100;
+                       capdiv2g += capdiv_offset;
+                       if (capdiv_offset > 3) {
+                               capdiv_offset = 1;
+                               quick_drop--;
+                       }
+
+                       capdiv2g += capdiv_offset;
+                       if (capdiv2g > 6)
+                               capdiv2g = 6;
+                       if (quick_drop < -4)
+                               quick_drop = -4;
+               } else if (pa_in[23] == 1400) {
+                       if (count > 3) {
+                               quick_drop++;
+                               capdiv2g -= count / 4;
+                               if (quick_drop > -2)
+                                       quick_drop = -2;
+                       } else {
+                               capdiv2g--;
+                       }
+
+                       if (capdiv2g < 0)
+                               capdiv2g = 0;
+               } else {
+                       return false;
+               }
+       }
+
+       REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_TXRF3,
+                     AR_PHY_65NM_CH0_TXRF3_CAPDIV2G, capdiv2g);
+       REG_RMW_FIELD(ah, AR_PHY_PAPRD_TRAINER_CNTL3,
+                     AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP,
+                     quick_drop);
+
+       return true;
+}
+
 int ar9003_paprd_create_curve(struct ath_hw *ah,
                              struct ath9k_hw_cal_data *caldata, int chain)
 {
@@ -817,6 +917,9 @@ int ar9003_paprd_create_curve(struct ath_hw *ah,
        if (!create_pa_curve(data_L, data_U, pa_table, small_signal_gain))
                status = -2;
 
+       if (ar9003_paprd_retrain_pa_in(ah, caldata, chain))
+               status = -EINPROGRESS;
+
        REG_CLR_BIT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
                    AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE);
 
index 7bfbaf0..84d3d49 100644 (file)
 #define AR_PHY_AIC_CTRL_4_B0   (AR_SM_BASE + 0x4c0)
 #define AR_PHY_AIC_STAT_2_B0   (AR_SM_BASE + 0x4cc)
 
+#define AR_PHY_65NM_CH0_TXRF3       0x16048
+#define AR_PHY_65NM_CH0_TXRF3_CAPDIV2G         0x0000001e
+#define AR_PHY_65NM_CH0_TXRF3_CAPDIV2G_S       1
+
 #define AR_PHY_65NM_CH0_SYNTH4      0x1608c
 #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT   (AR_SREV_9462(ah) ? 0x00000001 : 0x00000002)
 #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S (AR_SREV_9462(ah) ? 0 : 1)
index bacdb8f..9f83f71 100644 (file)
@@ -341,7 +341,8 @@ void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc)
 {
        struct ath_btcoex *btcoex = &sc->btcoex;
 
-       ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer);
+       if (btcoex->hw_timer_enabled)
+               ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer);
 }
 
 u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen)
index 60b6a9d..48af401 100644 (file)
@@ -463,9 +463,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah)
                ah->config.spurchans[i][1] = AR_NO_SPUR;
        }
 
-       /* PAPRD needs some more work to be enabled */
-       ah->config.paprd_disable = 1;
-
        ah->config.rx_intr_mitigation = true;
        ah->config.pcieSerDesWrite = true;
 
@@ -978,9 +975,6 @@ static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,
        else
                imr_reg |= AR_IMR_TXOK;
 
-       if (opmode == NL80211_IFTYPE_AP)
-               imr_reg |= AR_IMR_MIB;
-
        ENABLE_REGWRITE_BUFFER(ah);
 
        REG_WRITE(ah, AR_IMR, imr_reg);
@@ -1778,6 +1772,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
                /* Operating channel changed, reset channel calibration data */
                memset(caldata, 0, sizeof(*caldata));
                ath9k_init_nfcal_hist_buffer(ah, chan);
+       } else if (caldata) {
+               caldata->paprd_packet_sent = false;
        }
        ah->noise = ath9k_hw_getchan_noise(ah, chan);
 
@@ -2502,7 +2498,8 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah)
                pCap->tx_desc_len = sizeof(struct ar9003_txc);
                pCap->txs_len = sizeof(struct ar9003_txs);
                if (!ah->config.paprd_disable &&
-                   ah->eep_ops->get_eeprom(ah, EEP_PAPRD))
+                   ah->eep_ops->get_eeprom(ah, EEP_PAPRD) &&
+                   !AR_SREV_9462(ah))
                        pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;
        } else {
                pCap->tx_desc_len = sizeof(struct ath_desc);
index ce7332c..6599a75 100644 (file)
@@ -405,6 +405,7 @@ struct ath9k_hw_cal_data {
        int8_t iCoff;
        int8_t qCoff;
        bool rtt_done;
+       bool paprd_packet_sent;
        bool paprd_done;
        bool nfcal_pending;
        bool nfcal_interference;
index d4549e9..825a29c 100644 (file)
@@ -254,8 +254,9 @@ void ath_paprd_calibrate(struct work_struct *work)
        int chain_ok = 0;
        int chain;
        int len = 1800;
+       int ret;
 
-       if (!caldata)
+       if (!caldata || !caldata->paprd_packet_sent || caldata->paprd_done)
                return;
 
        ath9k_ps_wakeup(sc);
@@ -282,13 +283,6 @@ void ath_paprd_calibrate(struct work_struct *work)
                        continue;
 
                chain_ok = 0;
-
-               ath_dbg(common, CALIBRATE,
-                       "Sending PAPRD frame for thermal measurement on chain %d\n",
-                       chain);
-               if (!ath_paprd_send_frame(sc, skb, chain))
-                       goto fail_paprd;
-
                ar9003_paprd_setup_gain_table(ah, chain);
 
                ath_dbg(common, CALIBRATE,
@@ -302,7 +296,13 @@ void ath_paprd_calibrate(struct work_struct *work)
                        break;
                }
 
-               if (ar9003_paprd_create_curve(ah, caldata, chain)) {
+               ret = ar9003_paprd_create_curve(ah, caldata, chain);
+               if (ret == -EINPROGRESS) {
+                       ath_dbg(common, CALIBRATE,
+                               "PAPRD curve on chain %d needs to be re-trained\n",
+                               chain);
+                       break;
+               } else if (ret) {
                        ath_dbg(common, CALIBRATE,
                                "PAPRD create curve failed on chain %d\n",
                                chain);
index 2c9da6b..0d4155a 100644 (file)
@@ -2018,6 +2018,9 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
 
        ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb);
 
+       if (sc->sc_ah->caldata)
+               sc->sc_ah->caldata->paprd_packet_sent = true;
+
        if (!(tx_flags & ATH_TX_ERROR))
                /* Frame was ACKed */
                tx_info->flags |= IEEE80211_TX_STAT_ACK;
index a299d42..58f89fa 100644 (file)
@@ -519,7 +519,7 @@ static void brcmf_usb_tx_complete(struct urb *urb)
        else
                devinfo->bus_pub.bus->dstats.tx_errors++;
 
-       dev_kfree_skb(req->skb);
+       brcmu_pkt_buf_free_skb(req->skb);
        req->skb = NULL;
        brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req);
 
@@ -540,7 +540,7 @@ static void brcmf_usb_rx_complete(struct urb *urb)
                devinfo->bus_pub.bus->dstats.rx_packets++;
        } else {
                devinfo->bus_pub.bus->dstats.rx_errors++;
-               dev_kfree_skb(skb);
+               brcmu_pkt_buf_free_skb(skb);
                brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
                return;
        }
@@ -550,13 +550,15 @@ static void brcmf_usb_rx_complete(struct urb *urb)
                if (brcmf_proto_hdrpull(devinfo->dev, &ifidx, skb) != 0) {
                        brcmf_dbg(ERROR, "rx protocol error\n");
                        brcmu_pkt_buf_free_skb(skb);
+                       brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
                        devinfo->bus_pub.bus->dstats.rx_errors++;
                } else {
                        brcmf_rx_packet(devinfo->dev, ifidx, skb);
                        brcmf_usb_rx_refill(devinfo, req);
                }
        } else {
-               dev_kfree_skb(skb);
+               brcmu_pkt_buf_free_skb(skb);
+               brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
        }
        return;
 
@@ -581,14 +583,13 @@ static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
        usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->rx_pipe,
                          skb->data, skb_tailroom(skb), brcmf_usb_rx_complete,
                          req);
-       req->urb->transfer_flags |= URB_ZERO_PACKET;
        req->devinfo = devinfo;
+       brcmf_usb_enq(devinfo, &devinfo->rx_postq, req);
 
        ret = usb_submit_urb(req->urb, GFP_ATOMIC);
-       if (ret == 0) {
-               brcmf_usb_enq(devinfo, &devinfo->rx_postq, req);
-       } else {
-               dev_kfree_skb(req->skb);
+       if (ret) {
+               brcmf_usb_del_fromq(devinfo, req);
+               brcmu_pkt_buf_free_skb(req->skb);
                req->skb = NULL;
                brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req);
        }
@@ -683,23 +684,22 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
 
        req = brcmf_usb_deq(devinfo, &devinfo->tx_freeq);
        if (!req) {
+               brcmu_pkt_buf_free_skb(skb);
                brcmf_dbg(ERROR, "no req to send\n");
                return -ENOMEM;
        }
-       if (!req->urb) {
-               brcmf_dbg(ERROR, "no urb for req %p\n", req);
-               return -ENOBUFS;
-       }
 
        req->skb = skb;
        req->devinfo = devinfo;
        usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
                          skb->data, skb->len, brcmf_usb_tx_complete, req);
        req->urb->transfer_flags |= URB_ZERO_PACKET;
+       brcmf_usb_enq(devinfo, &devinfo->tx_postq, req);
        ret = usb_submit_urb(req->urb, GFP_ATOMIC);
-       if (!ret) {
-               brcmf_usb_enq(devinfo, &devinfo->tx_postq, req);
-       } else {
+       if (ret) {
+               brcmf_dbg(ERROR, "brcmf_usb_tx usb_submit_urb FAILED\n");
+               brcmf_usb_del_fromq(devinfo, req);
+               brcmu_pkt_buf_free_skb(req->skb);
                req->skb = NULL;
                brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req);
        }
index 28c5fbb..c36e923 100644 (file)
@@ -1876,16 +1876,17 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
        }
 
        if (test_bit(WL_STATUS_CONNECTED, &cfg_priv->status)) {
-               scb_val.val = cpu_to_le32(0);
+               memset(&scb_val, 0, sizeof(scb_val));
                err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_RSSI, &scb_val,
                                      sizeof(struct brcmf_scb_val_le));
-               if (err)
+               if (err) {
                        WL_ERR("Could not get rssi (%d)\n", err);
-
-               rssi = le32_to_cpu(scb_val.val);
-               sinfo->filled |= STATION_INFO_SIGNAL;
-               sinfo->signal = rssi;
-               WL_CONN("RSSI %d dBm\n", rssi);
+               } else {
+                       rssi = le32_to_cpu(scb_val.val);
+                       sinfo->filled |= STATION_INFO_SIGNAL;
+                       sinfo->signal = rssi;
+                       WL_CONN("RSSI %d dBm\n", rssi);
+               }
        }
 
 done:
index 192ad5c..a5edebe 100644 (file)
@@ -1233,6 +1233,9 @@ uint brcms_reset(struct brcms_info *wl)
        /* dpc will not be rescheduled */
        wl->resched = false;
 
+       /* inform publicly that interface is down */
+       wl->pub->up = false;
+
        return 0;
 }
 
index 95aa8e1..83324b3 100644 (file)
@@ -2042,7 +2042,8 @@ static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status)
                return;
        }
        len = ETH_ALEN;
-       ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, &bssid, &len);
+       ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, bssid,
+                                 &len);
        if (ret) {
                IPW_DEBUG_INFO("failed querying ordinals at line %d\n",
                               __LINE__);
index 46782f1..a47b306 100644 (file)
@@ -124,6 +124,9 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file,
        const struct fw_img *img;
        size_t bufsz;
 
+       if (!iwl_is_ready_rf(priv))
+               return -EAGAIN;
+
        /* default is to dump the entire data segment */
        if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) {
                priv->dbgfs_sram_offset = 0x800000;
index d9694c5..4ffc18d 100644 (file)
@@ -350,7 +350,7 @@ int iwl_queue_space(const struct iwl_queue *q);
 /*****************************************************
 * Error handling
 ******************************************************/
-int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display);
+int iwl_dump_fh(struct iwl_trans *trans, char **buf);
 void iwl_dump_csr(struct iwl_trans *trans);
 
 /*****************************************************
index 39a6ca1..d1a61ba 100644 (file)
@@ -555,7 +555,7 @@ static void iwl_irq_handle_error(struct iwl_trans *trans)
        }
 
        iwl_dump_csr(trans);
-       iwl_dump_fh(trans, NULL, false);
+       iwl_dump_fh(trans, NULL);
 
        iwl_op_mode_nic_error(trans->op_mode);
 }
index 939c2f7..1e86ea2 100644 (file)
@@ -1649,13 +1649,9 @@ static const char *get_fh_string(int cmd)
 #undef IWL_CMD
 }
 
-int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display)
+int iwl_dump_fh(struct iwl_trans *trans, char **buf)
 {
        int i;
-#ifdef CONFIG_IWLWIFI_DEBUG
-       int pos = 0;
-       size_t bufsz = 0;
-#endif
        static const u32 fh_tbl[] = {
                FH_RSCSR_CHNL0_STTS_WPTR_REG,
                FH_RSCSR_CHNL0_RBDCB_BASE_REG,
@@ -1667,29 +1663,35 @@ int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display)
                FH_TSSR_TX_STATUS_REG,
                FH_TSSR_TX_ERROR_REG
        };
-#ifdef CONFIG_IWLWIFI_DEBUG
-       if (display) {
-               bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40;
+
+#ifdef CONFIG_IWLWIFI_DEBUGFS
+       if (buf) {
+               int pos = 0;
+               size_t bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40;
+
                *buf = kmalloc(bufsz, GFP_KERNEL);
                if (!*buf)
                        return -ENOMEM;
+
                pos += scnprintf(*buf + pos, bufsz - pos,
                                "FH register values:\n");
-               for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) {
+
+               for (i = 0; i < ARRAY_SIZE(fh_tbl); i++)
                        pos += scnprintf(*buf + pos, bufsz - pos,
                                "  %34s: 0X%08x\n",
                                get_fh_string(fh_tbl[i]),
                                iwl_read_direct32(trans, fh_tbl[i]));
-               }
+
                return pos;
        }
 #endif
+
        IWL_ERR(trans, "FH register values:\n");
-       for (i = 0; i <  ARRAY_SIZE(fh_tbl); i++) {
+       for (i = 0; i <  ARRAY_SIZE(fh_tbl); i++)
                IWL_ERR(trans, "  %34s: 0X%08x\n",
                        get_fh_string(fh_tbl[i]),
                        iwl_read_direct32(trans, fh_tbl[i]));
-       }
+
        return 0;
 }
 
@@ -1982,11 +1984,11 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file,
                                     size_t count, loff_t *ppos)
 {
        struct iwl_trans *trans = file->private_data;
-       char *buf;
+       char *buf = NULL;
        int pos = 0;
        ssize_t ret = -EFAULT;
 
-       ret = pos = iwl_dump_fh(trans, &buf, true);
+       ret = pos = iwl_dump_fh(trans, &buf);
        if (buf) {
                ret = simple_read_from_buffer(user_buf,
                                              count, ppos, buf, pos);
index e970897..4cb2343 100644 (file)
@@ -1326,6 +1326,11 @@ static int if_sdio_suspend(struct device *dev)
 
        mmc_pm_flag_t flags = sdio_get_host_pm_caps(func);
 
+       /* If we're powered off anyway, just let the mmc layer remove the
+        * card. */
+       if (!lbs_iface_active(card->priv))
+               return -ENOSYS;
+
        dev_info(dev, "%s: suspend: PM flags = 0x%x\n",
                 sdio_func_id(func), flags);
 
index c68adec..565527a 100644 (file)
@@ -170,7 +170,20 @@ static int mwifiex_dnld_cmd_to_fw(struct mwifiex_private *priv,
        cmd_code = le16_to_cpu(host_cmd->command);
        cmd_size = le16_to_cpu(host_cmd->size);
 
-       skb_trim(cmd_node->cmd_skb, cmd_size);
+       /* Adjust skb length */
+       if (cmd_node->cmd_skb->len > cmd_size)
+               /*
+                * cmd_size is less than sizeof(struct host_cmd_ds_command).
+                * Trim off the unused portion.
+                */
+               skb_trim(cmd_node->cmd_skb, cmd_size);
+       else if (cmd_node->cmd_skb->len < cmd_size)
+               /*
+                * cmd_size is larger than sizeof(struct host_cmd_ds_command)
+                * because we have appended custom IE TLV. Increase skb length
+                * accordingly.
+                */
+               skb_put(cmd_node->cmd_skb, cmd_size - cmd_node->cmd_skb->len);
 
        do_gettimeofday(&tstamp);
        dev_dbg(adapter->dev, "cmd: DNLD_CMD: (%lu.%lu): %#x, act %#x, len %d,"
index 8b9dbd7..64328af 100644 (file)
@@ -1611,6 +1611,7 @@ static int rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
        int retval;
+       u32 reg;
 
        /*
         * Allocate eeprom data.
@@ -1624,6 +1625,14 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev)
                return retval;
 
        /*
+        * Enable rfkill polling by setting GPIO direction of the
+        * rfkill switch GPIO pin correctly.
+        */
+       rt2x00pci_register_read(rt2x00dev, GPIOCSR, &reg);
+       rt2x00_set_field32(&reg, GPIOCSR_BIT8, 1);
+       rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg);
+
+       /*
         * Initialize hw specifications.
         */
        retval = rt2400pci_probe_hw_mode(rt2x00dev);
index d3a4a68..7564ae9 100644 (file)
 #define GPIOCSR_BIT5                   FIELD32(0x00000020)
 #define GPIOCSR_BIT6                   FIELD32(0x00000040)
 #define GPIOCSR_BIT7                   FIELD32(0x00000080)
+#define GPIOCSR_BIT8                   FIELD32(0x00000100)
 
 /*
  * BBPPCSR: BBP Pin control register.
index d2cf8a4..3de0406 100644 (file)
@@ -1929,6 +1929,7 @@ static int rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
        int retval;
+       u32 reg;
 
        /*
         * Allocate eeprom data.
@@ -1942,6 +1943,14 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev)
                return retval;
 
        /*
+        * Enable rfkill polling by setting GPIO direction of the
+        * rfkill switch GPIO pin correctly.
+        */
+       rt2x00pci_register_read(rt2x00dev, GPIOCSR, &reg);
+       rt2x00_set_field32(&reg, GPIOCSR_DIR0, 1);
+       rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg);
+
+       /*
         * Initialize hw specifications.
         */
        retval = rt2500pci_probe_hw_mode(rt2x00dev);
index 3aae36b..89fee31 100644 (file)
@@ -283,7 +283,7 @@ static int rt2500usb_rfkill_poll(struct rt2x00_dev *rt2x00dev)
        u16 reg;
 
        rt2500usb_register_read(rt2x00dev, MAC_CSR19, &reg);
-       return rt2x00_get_field32(reg, MAC_CSR19_BIT7);
+       return rt2x00_get_field16(reg, MAC_CSR19_BIT7);
 }
 
 #ifdef CONFIG_RT2X00_LIB_LEDS
@@ -1768,6 +1768,7 @@ static int rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
        int retval;
+       u16 reg;
 
        /*
         * Allocate eeprom data.
@@ -1781,6 +1782,14 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev)
                return retval;
 
        /*
+        * Enable rfkill polling by setting GPIO direction of the
+        * rfkill switch GPIO pin correctly.
+        */
+       rt2500usb_register_read(rt2x00dev, MAC_CSR19, &reg);
+       rt2x00_set_field16(&reg, MAC_CSR19_BIT8, 0);
+       rt2500usb_register_write(rt2x00dev, MAC_CSR19, reg);
+
+       /*
         * Initialize hw specifications.
         */
        retval = rt2500usb_probe_hw_mode(rt2x00dev);
index b493306..196bd51 100644 (file)
  * MAC_CSR19: GPIO control register.
  */
 #define MAC_CSR19                      0x0426
-#define MAC_CSR19_BIT0                 FIELD32(0x0001)
-#define MAC_CSR19_BIT1                 FIELD32(0x0002)
-#define MAC_CSR19_BIT2                 FIELD32(0x0004)
-#define MAC_CSR19_BIT3                 FIELD32(0x0008)
-#define MAC_CSR19_BIT4                 FIELD32(0x0010)
-#define MAC_CSR19_BIT5                 FIELD32(0x0020)
-#define MAC_CSR19_BIT6                 FIELD32(0x0040)
-#define MAC_CSR19_BIT7                 FIELD32(0x0080)
+#define MAC_CSR19_BIT0                 FIELD16(0x0001)
+#define MAC_CSR19_BIT1                 FIELD16(0x0002)
+#define MAC_CSR19_BIT2                 FIELD16(0x0004)
+#define MAC_CSR19_BIT3                 FIELD16(0x0008)
+#define MAC_CSR19_BIT4                 FIELD16(0x0010)
+#define MAC_CSR19_BIT5                 FIELD16(0x0020)
+#define MAC_CSR19_BIT6                 FIELD16(0x0040)
+#define MAC_CSR19_BIT7                 FIELD16(0x0080)
+#define MAC_CSR19_BIT8                 FIELD16(0x0100)
 
 /*
  * MAC_CSR20: LED control register.
index cb8c2ac..b93516d 100644 (file)
@@ -4089,6 +4089,7 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
                rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
                msleep(1);
                rt2800_register_read(rt2x00dev, LDO_CFG0, &reg);
+               rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 0);
                rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
                rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
        }
index 98aa426..4765bbd 100644 (file)
@@ -983,6 +983,7 @@ static int rt2800pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
 static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
        int retval;
+       u32 reg;
 
        /*
         * Allocate eeprom data.
@@ -996,6 +997,14 @@ static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev)
                return retval;
 
        /*
+        * Enable rfkill polling by setting GPIO direction of the
+        * rfkill switch GPIO pin correctly.
+        */
+       rt2x00pci_register_read(rt2x00dev, GPIO_CTRL_CFG, &reg);
+       rt2x00_set_field32(&reg, GPIO_CTRL_CFG_GPIOD_BIT2, 1);
+       rt2x00pci_register_write(rt2x00dev, GPIO_CTRL_CFG, reg);
+
+       /*
         * Initialize hw specifications.
         */
        retval = rt2800_probe_hw_mode(rt2x00dev);
index 6cf3365..6b4226b 100644 (file)
@@ -667,8 +667,16 @@ static void rt2800usb_fill_rxdone(struct queue_entry *entry,
        skb_pull(entry->skb, RXINFO_DESC_SIZE);
 
        /*
-        * FIXME: we need to check for rx_pkt_len validity
+        * Check for rx_pkt_len validity. Return if invalid, leaving
+        * rxdesc->size zeroed out by the upper level.
         */
+       if (unlikely(rx_pkt_len == 0 ||
+                       rx_pkt_len > entry->queue->data_size)) {
+               ERROR(entry->queue->rt2x00dev,
+                       "Bad frame size %d, forcing to 0\n", rx_pkt_len);
+               return;
+       }
+
        rxd = (__le32 *)(entry->skb->data + rx_pkt_len);
 
        /*
@@ -736,6 +744,7 @@ static int rt2800usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
 static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
        int retval;
+       u32 reg;
 
        /*
         * Allocate eeprom data.
@@ -749,6 +758,14 @@ static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev)
                return retval;
 
        /*
+        * Enable rfkill polling by setting GPIO direction of the
+        * rfkill switch GPIO pin correctly.
+        */
+       rt2x00usb_register_read(rt2x00dev, GPIO_CTRL_CFG, &reg);
+       rt2x00_set_field32(&reg, GPIO_CTRL_CFG_GPIOD_BIT2, 1);
+       rt2x00usb_register_write(rt2x00dev, GPIO_CTRL_CFG, reg);
+
+       /*
         * Initialize hw specifications.
         */
        retval = rt2800_probe_hw_mode(rt2x00dev);
@@ -1157,6 +1174,8 @@ static struct usb_device_id rt2800usb_device_table[] = {
        { USB_DEVICE(0x1690, 0x0744) },
        { USB_DEVICE(0x1690, 0x0761) },
        { USB_DEVICE(0x1690, 0x0764) },
+       /* ASUS */
+       { USB_DEVICE(0x0b05, 0x179d) },
        /* Cisco */
        { USB_DEVICE(0x167b, 0x4001) },
        /* EnGenius */
@@ -1222,7 +1241,6 @@ static struct usb_device_id rt2800usb_device_table[] = {
        { USB_DEVICE(0x0b05, 0x1760) },
        { USB_DEVICE(0x0b05, 0x1761) },
        { USB_DEVICE(0x0b05, 0x1790) },
-       { USB_DEVICE(0x0b05, 0x179d) },
        /* AzureWave */
        { USB_DEVICE(0x13d3, 0x3262) },
        { USB_DEVICE(0x13d3, 0x3284) },
index a6b88bd..3f07e36 100644 (file)
@@ -629,7 +629,7 @@ void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp)
         */
        if (unlikely(rxdesc.size == 0 ||
                     rxdesc.size > entry->queue->data_size)) {
-               WARNING(rt2x00dev, "Wrong frame size %d max %d.\n",
+               ERROR(rt2x00dev, "Wrong frame size %d max %d.\n",
                        rxdesc.size, entry->queue->data_size);
                dev_kfree_skb(entry->skb);
                goto renew_skb;
index 3f7bc5c..b8ec961 100644 (file)
@@ -2832,6 +2832,7 @@ static int rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
        int retval;
+       u32 reg;
 
        /*
         * Disable power saving.
@@ -2850,6 +2851,14 @@ static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev)
                return retval;
 
        /*
+        * Enable rfkill polling by setting GPIO direction of the
+        * rfkill switch GPIO pin correctly.
+        */
+       rt2x00pci_register_read(rt2x00dev, MAC_CSR13, &reg);
+       rt2x00_set_field32(&reg, MAC_CSR13_BIT13, 1);
+       rt2x00pci_register_write(rt2x00dev, MAC_CSR13, reg);
+
+       /*
         * Initialize hw specifications.
         */
        retval = rt61pci_probe_hw_mode(rt2x00dev);
index e3cd6db..8f3da5a 100644 (file)
@@ -372,6 +372,7 @@ struct hw_pairwise_ta_entry {
 #define MAC_CSR13_BIT10                        FIELD32(0x00000400)
 #define MAC_CSR13_BIT11                        FIELD32(0x00000800)
 #define MAC_CSR13_BIT12                        FIELD32(0x00001000)
+#define MAC_CSR13_BIT13                        FIELD32(0x00002000)
 
 /*
  * MAC_CSR14: LED control register.
index ba6e434..248436c 100644 (file)
@@ -2177,6 +2177,7 @@ static int rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
 static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev)
 {
        int retval;
+       u32 reg;
 
        /*
         * Allocate eeprom data.
@@ -2190,6 +2191,14 @@ static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev)
                return retval;
 
        /*
+        * Enable rfkill polling by setting GPIO direction of the
+        * rfkill switch GPIO pin correctly.
+        */
+       rt2x00usb_register_read(rt2x00dev, MAC_CSR13, &reg);
+       rt2x00_set_field32(&reg, MAC_CSR13_BIT15, 0);
+       rt2x00usb_register_write(rt2x00dev, MAC_CSR13, reg);
+
+       /*
         * Initialize hw specifications.
         */
        retval = rt73usb_probe_hw_mode(rt2x00dev);
index 9f6b470..df1cc11 100644 (file)
@@ -282,6 +282,9 @@ struct hw_pairwise_ta_entry {
 #define MAC_CSR13_BIT10                        FIELD32(0x00000400)
 #define MAC_CSR13_BIT11                        FIELD32(0x00000800)
 #define MAC_CSR13_BIT12                        FIELD32(0x00001000)
+#define MAC_CSR13_BIT13                        FIELD32(0x00002000)
+#define MAC_CSR13_BIT14                        FIELD32(0x00004000)
+#define MAC_CSR13_BIT15                        FIELD32(0x00008000)
 
 /*
  * MAC_CSR14: LED control register.
index 3089990..650f79a 100644 (file)
@@ -57,8 +57,7 @@
 static const struct ethtool_ops xennet_ethtool_ops;
 
 struct netfront_cb {
-       struct page *page;
-       unsigned offset;
+       int pull_to;
 };
 
 #define NETFRONT_SKB_CB(skb)   ((struct netfront_cb *)((skb)->cb))
@@ -867,15 +866,9 @@ static int handle_incoming_queue(struct net_device *dev,
        struct sk_buff *skb;
 
        while ((skb = __skb_dequeue(rxq)) != NULL) {
-               struct page *page = NETFRONT_SKB_CB(skb)->page;
-               void *vaddr = page_address(page);
-               unsigned offset = NETFRONT_SKB_CB(skb)->offset;
-
-               memcpy(skb->data, vaddr + offset,
-                      skb_headlen(skb));
+               int pull_to = NETFRONT_SKB_CB(skb)->pull_to;
 
-               if (page != skb_frag_page(&skb_shinfo(skb)->frags[0]))
-                       __free_page(page);
+               __pskb_pull_tail(skb, pull_to - skb_headlen(skb));
 
                /* Ethernet work: Delayed to here as it peeks the header. */
                skb->protocol = eth_type_trans(skb, dev);
@@ -913,7 +906,6 @@ static int xennet_poll(struct napi_struct *napi, int budget)
        struct sk_buff_head errq;
        struct sk_buff_head tmpq;
        unsigned long flags;
-       unsigned int len;
        int err;
 
        spin_lock(&np->rx_lock);
@@ -955,24 +947,13 @@ err:
                        }
                }
 
-               NETFRONT_SKB_CB(skb)->page =
-                       skb_frag_page(&skb_shinfo(skb)->frags[0]);
-               NETFRONT_SKB_CB(skb)->offset = rx->offset;
-
-               len = rx->status;
-               if (len > RX_COPY_THRESHOLD)
-                       len = RX_COPY_THRESHOLD;
-               skb_put(skb, len);
+               NETFRONT_SKB_CB(skb)->pull_to = rx->status;
+               if (NETFRONT_SKB_CB(skb)->pull_to > RX_COPY_THRESHOLD)
+                       NETFRONT_SKB_CB(skb)->pull_to = RX_COPY_THRESHOLD;
 
-               if (rx->status > len) {
-                       skb_shinfo(skb)->frags[0].page_offset =
-                               rx->offset + len;
-                       skb_frag_size_set(&skb_shinfo(skb)->frags[0], rx->status - len);
-                       skb->data_len = rx->status - len;
-               } else {
-                       __skb_fill_page_desc(skb, 0, NULL, 0, 0);
-                       skb_shinfo(skb)->nr_frags = 0;
-               }
+               skb_shinfo(skb)->frags[0].page_offset = rx->offset;
+               skb_frag_size_set(&skb_shinfo(skb)->frags[0], rx->status);
+               skb->data_len = rx->status;
 
                i = xennet_fill_frags(np, skb, &tmpq);
 
@@ -999,7 +980,7 @@ err:
                 * receive throughout using the standard receive
                 * buffer size was cut by 25%(!!!).
                 */
-               skb->truesize += skb->data_len - (RX_COPY_THRESHOLD - len);
+               skb->truesize += skb->data_len - RX_COPY_THRESHOLD;
                skb->len += skb->data_len;
 
                if (rx->flags & XEN_NETRXF_csum_blank)
index 5d6de38..352f961 100644 (file)
@@ -271,6 +271,7 @@ struct parport *__devinit parport_gsc_probe_port (unsigned long base,
        if (!parport_SPP_supported (p)) {
                /* No port. */
                kfree (priv);
+               kfree(ops);
                return NULL;
        }
        parport_PS2_supported (p);
index e9c3227..1631eea 100644 (file)
@@ -62,6 +62,7 @@ enum parport_pc_pci_cards {
        timedia_9079a,
        timedia_9079b,
        timedia_9079c,
+       wch_ch353_2s1p,
 };
 
 /* each element directly indexed from enum list, above */
@@ -145,6 +146,7 @@ static struct parport_pc_pci cards[] __devinitdata = {
        /* timedia_9079a */             { 1, { { 2, 3 }, } },
        /* timedia_9079b */             { 1, { { 2, 3 }, } },
        /* timedia_9079c */             { 1, { { 2, 3 }, } },
+       /* wch_ch353_2s1p*/             { 1, { { 2, -1}, } },
 };
 
 static struct pci_device_id parport_serial_pci_tbl[] = {
@@ -243,7 +245,8 @@ static struct pci_device_id parport_serial_pci_tbl[] = {
        { 0x1409, 0x7168, 0x1409, 0xb079, 0, 0, timedia_9079a },
        { 0x1409, 0x7168, 0x1409, 0xc079, 0, 0, timedia_9079b },
        { 0x1409, 0x7168, 0x1409, 0xd079, 0, 0, timedia_9079c },
-
+       /* WCH CARDS */
+       { 0x4348, 0x7053, 0x4348, 0x3253, 0, 0, wch_ch353_2s1p},
        { 0, } /* terminate list */
 };
 MODULE_DEVICE_TABLE(pci,parport_serial_pci_tbl);
@@ -460,6 +463,12 @@ static struct pciserial_board pci_parport_serial_boards[] __devinitdata = {
                .base_baud      = 921600,
                .uart_offset    = 8,
        },
+       [wch_ch353_2s1p] = {
+               .flags          = FL_BASE0|FL_BASE_BARS,
+               .num_ports      = 2,
+               .base_baud      = 115200,
+               .uart_offset    = 8,
+       },
 };
 
 struct parport_serial_private {
index 5270f1a..d6fd6b6 100644 (file)
@@ -280,8 +280,12 @@ static long local_pci_probe(void *_ddi)
 {
        struct drv_dev_and_id *ddi = _ddi;
        struct device *dev = &ddi->dev->dev;
+       struct device *parent = dev->parent;
        int rc;
 
+       /* The parent bridge must be in active state when probing */
+       if (parent)
+               pm_runtime_get_sync(parent);
        /* Unbound PCI devices are always set to disabled and suspended.
         * During probe, the device is set to enabled and active and the
         * usage count is incremented.  If the driver supports runtime PM,
@@ -298,6 +302,8 @@ static long local_pci_probe(void *_ddi)
                pm_runtime_set_suspended(dev);
                pm_runtime_put_noidle(dev);
        }
+       if (parent)
+               pm_runtime_put(parent);
        return rc;
 }
 
index 6869009..02d107b 100644 (file)
@@ -458,6 +458,40 @@ boot_vga_show(struct device *dev, struct device_attribute *attr, char *buf)
 }
 struct device_attribute vga_attr = __ATTR_RO(boot_vga);
 
+static void
+pci_config_pm_runtime_get(struct pci_dev *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device *parent = dev->parent;
+
+       if (parent)
+               pm_runtime_get_sync(parent);
+       pm_runtime_get_noresume(dev);
+       /*
+        * pdev->current_state is set to PCI_D3cold during suspending,
+        * so wait until suspending completes
+        */
+       pm_runtime_barrier(dev);
+       /*
+        * Only need to resume devices in D3cold, because config
+        * registers are still accessible for devices suspended but
+        * not in D3cold.
+        */
+       if (pdev->current_state == PCI_D3cold)
+               pm_runtime_resume(dev);
+}
+
+static void
+pci_config_pm_runtime_put(struct pci_dev *pdev)
+{
+       struct device *dev = &pdev->dev;
+       struct device *parent = dev->parent;
+
+       pm_runtime_put(dev);
+       if (parent)
+               pm_runtime_put_sync(parent);
+}
+
 static ssize_t
 pci_read_config(struct file *filp, struct kobject *kobj,
                struct bin_attribute *bin_attr,
@@ -484,6 +518,8 @@ pci_read_config(struct file *filp, struct kobject *kobj,
                size = count;
        }
 
+       pci_config_pm_runtime_get(dev);
+
        if ((off & 1) && size) {
                u8 val;
                pci_user_read_config_byte(dev, off, &val);
@@ -529,6 +565,8 @@ pci_read_config(struct file *filp, struct kobject *kobj,
                --size;
        }
 
+       pci_config_pm_runtime_put(dev);
+
        return count;
 }
 
@@ -549,6 +587,8 @@ pci_write_config(struct file* filp, struct kobject *kobj,
                count = size;
        }
        
+       pci_config_pm_runtime_get(dev);
+
        if ((off & 1) && size) {
                pci_user_write_config_byte(dev, off, data[off - init_off]);
                off++;
@@ -587,6 +627,8 @@ pci_write_config(struct file* filp, struct kobject *kobj,
                --size;
        }
 
+       pci_config_pm_runtime_put(dev);
+
        return count;
 }
 
index f3ea977..ab4bf5a 100644 (file)
@@ -1941,6 +1941,7 @@ void pci_pm_init(struct pci_dev *dev)
        dev->pm_cap = pm;
        dev->d3_delay = PCI_PM_D3_WAIT;
        dev->d3cold_delay = PCI_PM_D3COLD_WAIT;
+       dev->d3cold_allowed = true;
 
        dev->d1_support = false;
        dev->d2_support = false;
index 3a7eefc..e76b447 100644 (file)
@@ -140,9 +140,17 @@ static int pcie_port_runtime_resume(struct device *dev)
 {
        return 0;
 }
+
+static int pcie_port_runtime_idle(struct device *dev)
+{
+       /* Delay for a short while to prevent too frequent suspend/resume */
+       pm_schedule_suspend(dev, 10);
+       return -EBUSY;
+}
 #else
 #define pcie_port_runtime_suspend      NULL
 #define pcie_port_runtime_resume       NULL
+#define pcie_port_runtime_idle         NULL
 #endif
 
 static const struct dev_pm_ops pcie_portdrv_pm_ops = {
@@ -155,6 +163,7 @@ static const struct dev_pm_ops pcie_portdrv_pm_ops = {
        .resume_noirq   = pcie_port_resume_noirq,
        .runtime_suspend = pcie_port_runtime_suspend,
        .runtime_resume = pcie_port_runtime_resume,
+       .runtime_idle   = pcie_port_runtime_idle,
 };
 
 #define PCIE_PORTDRV_PM_OPS    (&pcie_portdrv_pm_ops)
@@ -200,6 +209,11 @@ static int __devinit pcie_portdrv_probe(struct pci_dev *dev,
                return status;
 
        pci_save_state(dev);
+       /*
+        * D3cold may not work properly on some PCIe port, so disable
+        * it by default.
+        */
+       dev->d3cold_allowed = false;
        if (!pci_match_id(port_runtime_pm_black_list, dev))
                pm_runtime_put_noidle(&dev->dev);
 
index 6c143b4..9f8a6b7 100644 (file)
@@ -144,15 +144,13 @@ static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar)
        case PCI_BASE_ADDRESS_MEM_TYPE_32:
                break;
        case PCI_BASE_ADDRESS_MEM_TYPE_1M:
-               dev_info(&dev->dev, "1M mem BAR treated as 32-bit BAR\n");
+               /* 1M mem BAR treated as 32-bit BAR */
                break;
        case PCI_BASE_ADDRESS_MEM_TYPE_64:
                flags |= IORESOURCE_MEM_64;
                break;
        default:
-               dev_warn(&dev->dev,
-                        "mem unknown type %x treated as 32-bit BAR\n",
-                        mem_type);
+               /* mem unknown type treated as 32-bit BAR */
                break;
        }
        return flags;
@@ -173,9 +171,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
        u32 l, sz, mask;
        u16 orig_cmd;
        struct pci_bus_region region;
+       bool bar_too_big = false, bar_disabled = false;
 
        mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
 
+       /* No printks while decoding is disabled! */
        if (!dev->mmio_always_on) {
                pci_read_config_word(dev, PCI_COMMAND, &orig_cmd);
                pci_write_config_word(dev, PCI_COMMAND,
@@ -240,8 +240,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                        goto fail;
 
                if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) {
-                       dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n",
-                               pos);
+                       bar_too_big = true;
                        goto fail;
                }
 
@@ -252,12 +251,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                        region.start = 0;
                        region.end = sz64;
                        pcibios_bus_to_resource(dev, res, &region);
+                       bar_disabled = true;
                } else {
                        region.start = l64;
                        region.end = l64 + sz64;
                        pcibios_bus_to_resource(dev, res, &region);
-                       dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n",
-                                  pos, res);
                }
        } else {
                sz = pci_size(l, sz, mask);
@@ -268,18 +266,23 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                region.start = l;
                region.end = l + sz;
                pcibios_bus_to_resource(dev, res, &region);
-
-               dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res);
        }
 
- out:
+       goto out;
+
+
+fail:
+       res->flags = 0;
+out:
        if (!dev->mmio_always_on)
                pci_write_config_word(dev, PCI_COMMAND, orig_cmd);
 
+       if (bar_too_big)
+               dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n", pos);
+       if (res->flags && !bar_disabled)
+               dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res);
+
        return (res->flags & IORESOURCE_MEM_64) ? 1 : 0;
- fail:
-       res->flags = 0;
-       goto out;
 }
 
 static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
index 0ad06a3..fa74efe 100644 (file)
@@ -24,7 +24,7 @@
 #include <asm/io.h>
 #include <asm/sizes.h>
 
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/tc.h>
 
 
index cc0f00d..b446c96 100644 (file)
@@ -1,11 +1,8 @@
 /*
  * U300 GPIO module.
  *
- * Copyright (C) 2007-2011 ST-Ericsson AB
+ * Copyright (C) 2007-2012 ST-Ericsson AB
  * License terms: GNU General Public License (GPL) version 2
- * This can driver either of the two basic GPIO cores
- * available in the U300 platforms:
- * COH 901 335   - Used in DB3150 (U300 1.0) and DB3200 (U330 1.0)
  * COH 901 571/3 - Used in DB3210 (U365 2.0) and DB3350 (U335 1.0)
  * Author: Linus Walleij <linus.walleij@linaro.org>
  * Author: Jonas Aaberg <jonas.aberg@stericsson.com>
 #include <linux/slab.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/pinctrl/pinconf-generic.h>
-#include <mach/gpio-u300.h>
+#include <linux/platform_data/pinctrl-coh901.h>
 #include "pinctrl-coh901.h"
 
+#define U300_GPIO_PORT_STRIDE                          (0x30)
 /*
- * Register definitions for COH 901 335 variant
+ * Control Register 32bit (R/W)
+ * bit 15-9 (mask 0x0000FE00) contains the number of cores. 8*cores
+ * gives the number of GPIO pins.
+ * bit 8-2  (mask 0x000001FC) contains the core version ID.
  */
-#define U300_335_PORT_STRIDE                           (0x1C)
-/* Port X Pin Data Register 32bit, this is both input and output (R/W) */
-#define U300_335_PXPDIR                                        (0x00)
-#define U300_335_PXPDOR                                        (0x00)
-/* Port X Pin Config Register 32bit (R/W) */
-#define U300_335_PXPCR                                 (0x04)
-/* This register layout is the same in both blocks */
+#define U300_GPIO_CR                                   (0x00)
+#define U300_GPIO_CR_SYNC_SEL_ENABLE                   (0x00000002UL)
+#define U300_GPIO_CR_BLOCK_CLKRQ_ENABLE                        (0x00000001UL)
+#define U300_GPIO_PXPDIR                               (0x04)
+#define U300_GPIO_PXPDOR                               (0x08)
+#define U300_GPIO_PXPCR                                        (0x0C)
 #define U300_GPIO_PXPCR_ALL_PINS_MODE_MASK             (0x0000FFFFUL)
 #define U300_GPIO_PXPCR_PIN_MODE_MASK                  (0x00000003UL)
 #define U300_GPIO_PXPCR_PIN_MODE_SHIFT                 (0x00000002UL)
 #define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL      (0x00000001UL)
 #define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_DRAIN     (0x00000002UL)
 #define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_SOURCE    (0x00000003UL)
-/* Port X Interrupt Event Register 32bit (R/W) */
-#define U300_335_PXIEV                                 (0x08)
-/* Port X Interrupt Enable Register 32bit (R/W) */
-#define U300_335_PXIEN                                 (0x0C)
-/* Port X Interrupt Force Register 32bit (R/W) */
-#define U300_335_PXIFR                                 (0x10)
-/* Port X Interrupt Config Register 32bit (R/W) */
-#define U300_335_PXICR                                 (0x14)
-/* This register layout is the same in both blocks */
+#define U300_GPIO_PXPER                                        (0x10)
+#define U300_GPIO_PXPER_ALL_PULL_UP_DISABLE_MASK       (0x000000FFUL)
+#define U300_GPIO_PXPER_PULL_UP_DISABLE                        (0x00000001UL)
+#define U300_GPIO_PXIEV                                        (0x14)
+#define U300_GPIO_PXIEN                                        (0x18)
+#define U300_GPIO_PXIFR                                        (0x1C)
+#define U300_GPIO_PXICR                                        (0x20)
 #define U300_GPIO_PXICR_ALL_IRQ_CONFIG_MASK            (0x000000FFUL)
 #define U300_GPIO_PXICR_IRQ_CONFIG_MASK                        (0x00000001UL)
 #define U300_GPIO_PXICR_IRQ_CONFIG_FALLING_EDGE                (0x00000000UL)
 #define U300_GPIO_PXICR_IRQ_CONFIG_RISING_EDGE         (0x00000001UL)
-/* Port X Pull-up Enable Register 32bit (R/W) */
-#define U300_335_PXPER                                 (0x18)
-/* This register layout is the same in both blocks */
-#define U300_GPIO_PXPER_ALL_PULL_UP_DISABLE_MASK       (0x000000FFUL)
-#define U300_GPIO_PXPER_PULL_UP_DISABLE                        (0x00000001UL)
-/* Control Register 32bit (R/W) */
-#define U300_335_CR                                    (0x54)
-#define U300_335_CR_BLOCK_CLOCK_ENABLE                 (0x00000001UL)
-
-/*
- * Register definitions for COH 901 571 / 3 variant
- */
-#define U300_571_PORT_STRIDE                           (0x30)
-/*
- * Control Register 32bit (R/W)
- * bit 15-9 (mask 0x0000FE00) contains the number of cores. 8*cores
- * gives the number of GPIO pins.
- * bit 8-2  (mask 0x000001FC) contains the core version ID.
- */
-#define U300_571_CR                                    (0x00)
-#define U300_571_CR_SYNC_SEL_ENABLE                    (0x00000002UL)
-#define U300_571_CR_BLOCK_CLKRQ_ENABLE                 (0x00000001UL)
-/*
- * These registers have the same layout and function as the corresponding
- * COH 901 335 registers, just at different offset.
- */
-#define U300_571_PXPDIR                                        (0x04)
-#define U300_571_PXPDOR                                        (0x08)
-#define U300_571_PXPCR                                 (0x0C)
-#define U300_571_PXPER                                 (0x10)
-#define U300_571_PXIEV                                 (0x14)
-#define U300_571_PXIEN                                 (0x18)
-#define U300_571_PXIFR                                 (0x1C)
-#define U300_571_PXICR                                 (0x20)
 
 /* 8 bits per port, no version has more than 7 ports */
 #define U300_GPIO_PINS_PER_PORT 8
@@ -149,8 +113,6 @@ struct u300_gpio_confdata {
 
 /* BS335 has seven ports of 8 bits each = GPIO pins 0..55 */
 #define BS335_GPIO_NUM_PORTS 7
-/* BS365 has five ports of 8 bits each = GPIO pins 0..39 */
-#define BS365_GPIO_NUM_PORTS 5
 
 #define U300_FLOATING_INPUT { \
        .bias_mode = PIN_CONFIG_BIAS_HIGH_IMPEDANCE, \
@@ -172,7 +134,6 @@ struct u300_gpio_confdata {
        .outval = 1, \
 }
 
-
 /* Initial configuration */
 static const struct __initconst u300_gpio_confdata
 bs335_gpio_config[BS335_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = {
@@ -255,66 +216,6 @@ bs335_gpio_config[BS335_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = {
        }
 };
 
-static const struct __initconst u300_gpio_confdata
-bs365_gpio_config[BS365_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = {
-       /* Port 0, pins 0-7 */
-       {
-               U300_FLOATING_INPUT,
-               U300_OUTPUT_LOW,
-               U300_FLOATING_INPUT,
-               U300_OUTPUT_LOW,
-               U300_OUTPUT_LOW,
-               U300_OUTPUT_LOW,
-               U300_PULL_UP_INPUT,
-               U300_FLOATING_INPUT,
-       },
-       /* Port 1, pins 0-7 */
-       {
-               U300_OUTPUT_LOW,
-               U300_FLOATING_INPUT,
-               U300_OUTPUT_LOW,
-               U300_FLOATING_INPUT,
-               U300_FLOATING_INPUT,
-               U300_OUTPUT_HIGH,
-               U300_OUTPUT_LOW,
-               U300_OUTPUT_LOW,
-       },
-       /* Port 2, pins 0-7 */
-       {
-               U300_FLOATING_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_OUTPUT_LOW,
-               U300_OUTPUT_LOW,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-       },
-       /* Port 3, pins 0-7 */
-       {
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-       },
-       /* Port 4, pins 0-7 */
-       {
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               U300_PULL_UP_INPUT,
-               /* These 4 pins doesn't exist on DB3210 */
-               U300_OUTPUT_LOW,
-               U300_OUTPUT_LOW,
-               U300_OUTPUT_LOW,
-               U300_OUTPUT_LOW,
-       }
-};
-
 /**
  * to_u300_gpio() - get the pointer to u300_gpio
  * @chip: the gpio chip member of the structure u300_gpio
@@ -716,13 +617,7 @@ static void __init u300_gpio_init_coh901571(struct u300_gpio *gpio,
                        const struct u300_gpio_confdata *conf;
                        int offset = (i*8) + j;
 
-                       if (plat->variant == U300_GPIO_COH901571_3_BS335)
-                               conf = &bs335_gpio_config[i][j];
-                       else if (plat->variant == U300_GPIO_COH901571_3_BS365)
-                               conf = &bs365_gpio_config[i][j];
-                       else
-                               break;
-
+                       conf = &bs335_gpio_config[i][j];
                        u300_gpio_init_pin(gpio, offset, conf);
                }
        }
@@ -796,50 +691,27 @@ static int __init u300_gpio_probe(struct platform_device *pdev)
                goto err_no_ioremap;
        }
 
-       if (plat->variant == U300_GPIO_COH901335) {
-               dev_info(gpio->dev,
-                        "initializing GPIO Controller COH 901 335\n");
-               gpio->stride = U300_335_PORT_STRIDE;
-               gpio->pcr = U300_335_PXPCR;
-               gpio->dor = U300_335_PXPDOR;
-               gpio->dir = U300_335_PXPDIR;
-               gpio->per = U300_335_PXPER;
-               gpio->icr = U300_335_PXICR;
-               gpio->ien = U300_335_PXIEN;
-               gpio->iev = U300_335_PXIEV;
-               ifr = U300_335_PXIFR;
-
-               /* Turn on the GPIO block */
-               writel(U300_335_CR_BLOCK_CLOCK_ENABLE,
-                      gpio->base + U300_335_CR);
-       } else if (plat->variant == U300_GPIO_COH901571_3_BS335 ||
-                  plat->variant == U300_GPIO_COH901571_3_BS365) {
-               dev_info(gpio->dev,
-                        "initializing GPIO Controller COH 901 571/3\n");
-               gpio->stride = U300_571_PORT_STRIDE;
-               gpio->pcr = U300_571_PXPCR;
-               gpio->dor = U300_571_PXPDOR;
-               gpio->dir = U300_571_PXPDIR;
-               gpio->per = U300_571_PXPER;
-               gpio->icr = U300_571_PXICR;
-               gpio->ien = U300_571_PXIEN;
-               gpio->iev = U300_571_PXIEV;
-               ifr = U300_571_PXIFR;
-
-               val = readl(gpio->base + U300_571_CR);
-               dev_info(gpio->dev, "COH901571/3 block version: %d, " \
-                        "number of cores: %d totalling %d pins\n",
-                        ((val & 0x000001FC) >> 2),
-                        ((val & 0x0000FE00) >> 9),
-                        ((val & 0x0000FE00) >> 9) * 8);
-               writel(U300_571_CR_BLOCK_CLKRQ_ENABLE,
-                      gpio->base + U300_571_CR);
-               u300_gpio_init_coh901571(gpio, plat);
-       } else {
-               dev_err(gpio->dev, "unknown block variant\n");
-               err = -ENODEV;
-               goto err_unknown_variant;
-       }
+       dev_info(gpio->dev,
+                "initializing GPIO Controller COH 901 571/3\n");
+       gpio->stride = U300_GPIO_PORT_STRIDE;
+       gpio->pcr = U300_GPIO_PXPCR;
+       gpio->dor = U300_GPIO_PXPDOR;
+       gpio->dir = U300_GPIO_PXPDIR;
+       gpio->per = U300_GPIO_PXPER;
+       gpio->icr = U300_GPIO_PXICR;
+       gpio->ien = U300_GPIO_PXIEN;
+       gpio->iev = U300_GPIO_PXIEV;
+       ifr = U300_GPIO_PXIFR;
+
+       val = readl(gpio->base + U300_GPIO_CR);
+       dev_info(gpio->dev, "COH901571/3 block version: %d, " \
+                "number of cores: %d totalling %d pins\n",
+                ((val & 0x000001FC) >> 2),
+                ((val & 0x0000FE00) >> 9),
+                ((val & 0x0000FE00) >> 9) * 8);
+       writel(U300_GPIO_CR_BLOCK_CLKRQ_ENABLE,
+              gpio->base + U300_GPIO_CR);
+       u300_gpio_init_coh901571(gpio, plat);
 
        /* Add each port with its IRQ separately */
        INIT_LIST_HEAD(&gpio->port_list);
@@ -906,7 +778,6 @@ err_no_pinctrl:
 err_no_chip:
 err_no_port:
        u300_gpio_free_ports(gpio);
-err_unknown_variant:
        iounmap(gpio->base);
 err_no_ioremap:
        release_mem_region(gpio->memres->start, resource_size(gpio->memres));
@@ -923,16 +794,11 @@ err_no_clk:
 
 static int __exit u300_gpio_remove(struct platform_device *pdev)
 {
-       struct u300_gpio_platform *plat = dev_get_platdata(&pdev->dev);
        struct u300_gpio *gpio = platform_get_drvdata(pdev);
        int err;
 
        /* Turn off the GPIO block */
-       if (plat->variant == U300_GPIO_COH901335)
-               writel(0x00000000U, gpio->base + U300_335_CR);
-       if (plat->variant == U300_GPIO_COH901571_3_BS335 ||
-           plat->variant == U300_GPIO_COH901571_3_BS365)
-               writel(0x00000000U, gpio->base + U300_571_CR);
+       writel(0x00000000U, gpio->base + U300_GPIO_CR);
 
        err = gpiochip_remove(&gpio->chip);
        if (err < 0) {
index 7fca6ce..304360c 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/pinctrl/pinmux.h>
 #include <linux/pinctrl/consumer.h>
+#include <linux/pinctrl/machine.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/of_device.h>
@@ -916,11 +917,66 @@ static void sirfsoc_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s
        seq_printf(s, " " DRIVER_NAME);
 }
 
+static int sirfsoc_dt_node_to_map(struct pinctrl_dev *pctldev,
+                                struct device_node *np_config,
+                                struct pinctrl_map **map, unsigned *num_maps)
+{
+       struct sirfsoc_pmx *spmx = pinctrl_dev_get_drvdata(pctldev);
+       struct device_node *np;
+       struct property *prop;
+       const char *function, *group;
+       int ret, index = 0, count = 0;
+
+       /* calculate number of maps required */
+       for_each_child_of_node(np_config, np) {
+               ret = of_property_read_string(np, "sirf,function", &function);
+               if (ret < 0)
+                       return ret;
+
+               ret = of_property_count_strings(np, "sirf,pins");
+               if (ret < 0)
+                       return ret;
+
+               count += ret;
+       }
+
+       if (!count) {
+               dev_err(spmx->dev, "No child nodes passed via DT\n");
+               return -ENODEV;
+       }
+
+       *map = kzalloc(sizeof(**map) * count, GFP_KERNEL);
+       if (!*map)
+               return -ENOMEM;
+
+       for_each_child_of_node(np_config, np) {
+               of_property_read_string(np, "sirf,function", &function);
+               of_property_for_each_string(np, "sirf,pins", prop, group) {
+                       (*map)[index].type = PIN_MAP_TYPE_MUX_GROUP;
+                       (*map)[index].data.mux.group = group;
+                       (*map)[index].data.mux.function = function;
+                       index++;
+               }
+       }
+
+       *num_maps = count;
+
+       return 0;
+}
+
+static void sirfsoc_dt_free_map(struct pinctrl_dev *pctldev,
+               struct pinctrl_map *map, unsigned num_maps)
+{
+       kfree(map);
+}
+
 static struct pinctrl_ops sirfsoc_pctrl_ops = {
        .get_groups_count = sirfsoc_get_groups_count,
        .get_group_name = sirfsoc_get_group_name,
        .get_group_pins = sirfsoc_get_group_pins,
        .pin_dbg_show = sirfsoc_pin_dbg_show,
+       .dt_node_to_map = sirfsoc_dt_node_to_map,
+       .dt_free_map = sirfsoc_dt_free_map,
 };
 
 struct sirfsoc_pmx_func {
@@ -1221,7 +1277,7 @@ out_no_gpio_remap:
 }
 
 static const struct of_device_id pinmux_ids[] __devinitconst = {
-       { .compatible = "sirf,prima2-gpio-pinmux" },
+       { .compatible = "sirf,prima2-pinctrl" },
        {}
 };
 
index 3782e1c..934d861 100644 (file)
@@ -2196,10 +2196,8 @@ static int __init acer_wmi_init(void)
                interface->capability &= ~ACER_CAP_BRIGHTNESS;
                pr_info("Brightness must be controlled by acpi video driver\n");
        } else {
-#ifdef CONFIG_ACPI_VIDEO
                pr_info("Disabling ACPI video driver\n");
                acpi_video_unregister();
-#endif
        }
 
        if (wmi_has_guid(WMID_GUID3)) {
index dfb1a92..db8f638 100644 (file)
@@ -101,7 +101,7 @@ static void gmux_pio_write32(struct apple_gmux_data *gmux_data, int port,
 
        for (i = 0; i < 4; i++) {
                tmpval = (val >> (i * 8)) & 0xff;
-               outb(tmpval, port + i);
+               outb(tmpval, gmux_data->iostart + port + i);
        }
 }
 
@@ -142,8 +142,9 @@ static u8 gmux_index_read8(struct apple_gmux_data *gmux_data, int port)
        u8 val;
 
        mutex_lock(&gmux_data->index_lock);
-       outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ);
        gmux_index_wait_ready(gmux_data);
+       outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ);
+       gmux_index_wait_complete(gmux_data);
        val = inb(gmux_data->iostart + GMUX_PORT_VALUE);
        mutex_unlock(&gmux_data->index_lock);
 
@@ -166,8 +167,9 @@ static u32 gmux_index_read32(struct apple_gmux_data *gmux_data, int port)
        u32 val;
 
        mutex_lock(&gmux_data->index_lock);
-       outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ);
        gmux_index_wait_ready(gmux_data);
+       outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ);
+       gmux_index_wait_complete(gmux_data);
        val = inl(gmux_data->iostart + GMUX_PORT_VALUE);
        mutex_unlock(&gmux_data->index_lock);
 
@@ -461,18 +463,22 @@ static int __devinit gmux_probe(struct pnp_dev *pnp,
        ver_release = gmux_read8(gmux_data, GMUX_PORT_VERSION_RELEASE);
        if (ver_major == 0xff && ver_minor == 0xff && ver_release == 0xff) {
                if (gmux_is_indexed(gmux_data)) {
+                       u32 version;
                        mutex_init(&gmux_data->index_lock);
                        gmux_data->indexed = true;
+                       version = gmux_read32(gmux_data,
+                               GMUX_PORT_VERSION_MAJOR);
+                       ver_major = (version >> 24) & 0xff;
+                       ver_minor = (version >> 16) & 0xff;
+                       ver_release = (version >> 8) & 0xff;
                } else {
                        pr_info("gmux device not present\n");
                        ret = -ENODEV;
                        goto err_release;
                }
-               pr_info("Found indexed gmux\n");
-       } else {
-               pr_info("Found gmux version %d.%d.%d\n", ver_major, ver_minor,
-                       ver_release);
        }
+       pr_info("Found gmux version %d.%d.%d [%s]\n", ver_major, ver_minor,
+               ver_release, (gmux_data->indexed ? "indexed" : "classic"));
 
        memset(&props, 0, sizeof(props));
        props.type = BACKLIGHT_PLATFORM;
@@ -505,9 +511,7 @@ static int __devinit gmux_probe(struct pnp_dev *pnp,
         * Disable the other backlight choices.
         */
        acpi_video_dmi_promote_vendor();
-#if defined (CONFIG_ACPI_VIDEO) || defined (CONFIG_ACPI_VIDEO_MODULE)
        acpi_video_unregister();
-#endif
        apple_bl_unregister();
 
        gmux_data->power_state = VGA_SWITCHEROO_ON;
@@ -593,9 +597,7 @@ static void __devexit gmux_remove(struct pnp_dev *pnp)
        kfree(gmux_data);
 
        acpi_video_dmi_demote_vendor();
-#if defined (CONFIG_ACPI_VIDEO) || defined (CONFIG_ACPI_VIDEO_MODULE)
        acpi_video_register();
-#endif
        apple_bl_register();
 }
 
index e38f91b..4b568df 100644 (file)
@@ -85,7 +85,7 @@ static char *wled_type = "unknown";
 static char *bled_type = "unknown";
 
 module_param(wled_type, charp, 0444);
-MODULE_PARM_DESC(wlan_status, "Set the wled type on boot "
+MODULE_PARM_DESC(wled_type, "Set the wled type on boot "
                 "(unknown, led or rfkill). "
                 "default is unknown");
 
@@ -863,9 +863,9 @@ static ssize_t show_infos(struct device *dev,
         * The significance of others is yet to be found.
         * If we don't find the method, we assume the device are present.
         */
-       rv = acpi_evaluate_integer(asus->handle, "HRWS", NULL, &temp);
+       rv = acpi_evaluate_integer(asus->handle, "HWRS", NULL, &temp);
        if (!ACPI_FAILURE(rv))
-               len += sprintf(page + len, "HRWS value         : %#x\n",
+               len += sprintf(page + len, "HWRS value         : %#x\n",
                               (uint) temp);
        /*
         * Another value for userspace: the ASYM method returns 0x02 for
@@ -1751,9 +1751,9 @@ static int asus_laptop_get_info(struct asus_laptop *asus)
         * The significance of others is yet to be found.
         */
        status =
-           acpi_evaluate_integer(asus->handle, "HRWS", NULL, &hwrs_result);
+           acpi_evaluate_integer(asus->handle, "HWRS", NULL, &hwrs_result);
        if (!ACPI_FAILURE(status))
-               pr_notice("  HRWS returned %x", (int)hwrs_result);
+               pr_notice("  HWRS returned %x", (int)hwrs_result);
 
        if (!acpi_check_handle(asus->handle, METHOD_WL_STATUS, NULL))
                asus->have_rsts = true;
index 2eb9fe8..c0e9ff4 100644 (file)
@@ -47,9 +47,7 @@
 #include <linux/thermal.h>
 #include <acpi/acpi_bus.h>
 #include <acpi/acpi_drivers.h>
-#ifdef CONFIG_ACPI_VIDEO
 #include <acpi/video.h>
-#endif
 
 #include "asus-wmi.h"
 
@@ -1704,10 +1702,8 @@ static int asus_wmi_add(struct platform_device *pdev)
        if (asus->driver->quirks->wmi_backlight_power)
                acpi_video_dmi_promote_vendor();
        if (!acpi_video_backlight_support()) {
-#ifdef CONFIG_ACPI_VIDEO
                pr_info("Disabling ACPI video driver\n");
                acpi_video_unregister();
-#endif
                err = asus_wmi_backlight_init(asus);
                if (err && err != -ENODEV)
                        goto fail_backlight;
index dab91b4..5ca2641 100644 (file)
@@ -610,12 +610,12 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle)
 
                if (!bus) {
                        pr_warn("Unable to find PCI bus 1?\n");
-                       goto out_unlock;
+                       goto out_put_dev;
                }
 
                if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) {
                        pr_err("Unable to read PCI config space?\n");
-                       goto out_unlock;
+                       goto out_put_dev;
                }
 
                absent = (l == 0xffffffff);
@@ -627,7 +627,7 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle)
                                absent ? "absent" : "present");
                        pr_warn("skipped wireless hotplug as probably "
                                "inappropriate for this model\n");
-                       goto out_unlock;
+                       goto out_put_dev;
                }
 
                if (!blocked) {
@@ -635,7 +635,7 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle)
                        if (dev) {
                                /* Device already present */
                                pci_dev_put(dev);
-                               goto out_unlock;
+                               goto out_put_dev;
                        }
                        dev = pci_scan_single_device(bus, 0);
                        if (dev) {
@@ -650,6 +650,8 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle)
                                pci_dev_put(dev);
                        }
                }
+out_put_dev:
+               pci_dev_put(port);
        }
 
 out_unlock:
index c1ca7bc..dd90d15 100644 (file)
@@ -26,9 +26,7 @@
 #include <linux/seq_file.h>
 #include <linux/debugfs.h>
 #include <linux/ctype.h>
-#ifdef CONFIG_ACPI_VIDEO
 #include <acpi/video.h>
-#endif
 
 /*
  * This driver is needed because a number of Samsung laptops do not hook
@@ -1558,9 +1556,7 @@ static int __init samsung_init(void)
                samsung->handle_backlight = false;
        } else if (samsung->quirks->broken_acpi_video) {
                pr_info("Disabling ACPI video driver\n");
-#ifdef CONFIG_ACPI_VIDEO
                acpi_video_unregister();
-#endif
        }
 #endif
 
index 80e3779..52daaa8 100644 (file)
@@ -545,7 +545,7 @@ TPACPI_HANDLE(hkey, ec, "\\_SB.HKEY",       /* 600e/x, 770e, 770x */
  */
 
 static int acpi_evalf(acpi_handle handle,
-                     void *res, char *method, char *fmt, ...)
+                     int *res, char *method, char *fmt, ...)
 {
        char *fmt0 = fmt;
        struct acpi_object_list params;
@@ -606,7 +606,7 @@ static int acpi_evalf(acpi_handle handle,
                success = (status == AE_OK &&
                           out_obj.type == ACPI_TYPE_INTEGER);
                if (success && res)
-                       *(int *)res = out_obj.integer.value;
+                       *res = out_obj.integer.value;
                break;
        case 'v':               /* void */
                success = status == AE_OK;
@@ -7386,17 +7386,18 @@ static int fan_get_status(u8 *status)
         * Add TPACPI_FAN_RD_ACPI_FANS ? */
 
        switch (fan_status_access_mode) {
-       case TPACPI_FAN_RD_ACPI_GFAN:
+       case TPACPI_FAN_RD_ACPI_GFAN: {
                /* 570, 600e/x, 770e, 770x */
+               int res;
 
-               if (unlikely(!acpi_evalf(gfan_handle, &s, NULL, "d")))
+               if (unlikely(!acpi_evalf(gfan_handle, &res, NULL, "d")))
                        return -EIO;
 
                if (likely(status))
-                       *status = s & 0x07;
+                       *status = res & 0x07;
 
                break;
-
+       }
        case TPACPI_FAN_RD_TPEC:
                /* all except 570, 600e/x, 770e, 770x */
                if (unlikely(!acpi_ec_read(fan_status_offset, &s)))
index 44efc6e..d4957b4 100644 (file)
@@ -27,6 +27,8 @@
 #include <linux/pm_runtime.h>
 #include <linux/power/smartreflex.h>
 
+#include <plat/cpu.h>
+
 #define SMARTREFLEX_NAME_LEN   16
 #define NVALUE_NAME_LEN                40
 #define SR_DISABLE_TIMEOUT     200
index 0b66d0f..4b66889 100644 (file)
@@ -100,6 +100,13 @@ static int ecap_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
                writel(period_cycles, pc->mmio_base + CAP3);
        }
 
+       if (!test_bit(PWMF_ENABLED, &pwm->flags)) {
+               reg_val = readw(pc->mmio_base + ECCTL2);
+               /* Disable APWM mode to put APWM output Low */
+               reg_val &= ~ECCTL2_APWM_MODE;
+               writew(reg_val, pc->mmio_base + ECCTL2);
+       }
+
        pm_runtime_put_sync(pc->chip.dev);
        return 0;
 }
index c3756d1..b1996bc 100644 (file)
@@ -104,6 +104,7 @@ struct ehrpwm_pwm_chip {
        struct pwm_chip chip;
        unsigned int    clk_rate;
        void __iomem    *mmio_base;
+       unsigned long period_cycles[NUM_PWM_CHANNEL];
 };
 
 static inline struct ehrpwm_pwm_chip *to_ehrpwm_pwm_chip(struct pwm_chip *chip)
@@ -210,6 +211,7 @@ static int ehrpwm_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
        unsigned long long c;
        unsigned long period_cycles, duty_cycles;
        unsigned short ps_divval, tb_divval;
+       int i;
 
        if (period_ns < 0 || duty_ns < 0 || period_ns > NSEC_PER_SEC)
                return -ERANGE;
@@ -229,6 +231,28 @@ static int ehrpwm_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
                duty_cycles = (unsigned long)c;
        }
 
+       /*
+        * Period values should be same for multiple PWM channels as IP uses
+        * same period register for multiple channels.
+        */
+       for (i = 0; i < NUM_PWM_CHANNEL; i++) {
+               if (pc->period_cycles[i] &&
+                               (pc->period_cycles[i] != period_cycles)) {
+                       /*
+                        * Allow channel to reconfigure period if no other
+                        * channels being configured.
+                        */
+                       if (i == pwm->hwpwm)
+                               continue;
+
+                       dev_err(chip->dev, "Period value conflicts with channel %d\n",
+                                       i);
+                       return -EINVAL;
+               }
+       }
+
+       pc->period_cycles[pwm->hwpwm] = period_cycles;
+
        /* Configure clock prescaler to support Low frequency PWM wave */
        if (set_prescale_div(period_cycles/PERIOD_MAX, &ps_divval,
                                &tb_divval)) {
@@ -320,10 +344,15 @@ static void ehrpwm_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
 
 static void ehrpwm_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
 {
+       struct ehrpwm_pwm_chip *pc = to_ehrpwm_pwm_chip(chip);
+
        if (test_bit(PWMF_ENABLED, &pwm->flags)) {
                dev_warn(chip->dev, "Removing PWM device without disabling\n");
                pm_runtime_put_sync(chip->dev);
        }
+
+       /* set period value to zero on free */
+       pc->period_cycles[pwm->hwpwm] = 0;
 }
 
 static const struct pwm_ops ehrpwm_pwm_ops = {
index 6caa222..ab00cab 100644 (file)
@@ -22,6 +22,7 @@
 #include <linux/err.h>
 #include <linux/platform_device.h>
 
+#include <linux/regulator/of_regulator.h>
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
 #include <linux/mfd/tps65217.h>
@@ -281,37 +282,130 @@ static const struct regulator_desc regulators[] = {
                           NULL),
 };
 
+#ifdef CONFIG_OF
+static struct of_regulator_match reg_matches[] = {
+       { .name = "dcdc1", .driver_data = (void *)TPS65217_DCDC_1 },
+       { .name = "dcdc2", .driver_data = (void *)TPS65217_DCDC_2 },
+       { .name = "dcdc3", .driver_data = (void *)TPS65217_DCDC_3 },
+       { .name = "ldo1", .driver_data = (void *)TPS65217_LDO_1 },
+       { .name = "ldo2", .driver_data = (void *)TPS65217_LDO_2 },
+       { .name = "ldo3", .driver_data = (void *)TPS65217_LDO_3 },
+       { .name = "ldo4", .driver_data = (void *)TPS65217_LDO_4 },
+};
+
+static struct tps65217_board *tps65217_parse_dt(struct platform_device *pdev)
+{
+       struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent);
+       struct device_node *node = tps->dev->of_node;
+       struct tps65217_board *pdata;
+       struct device_node *regs;
+       int i, count;
+
+       regs = of_find_node_by_name(node, "regulators");
+       if (!regs)
+               return NULL;
+
+       count = of_regulator_match(pdev->dev.parent, regs,
+                               reg_matches, TPS65217_NUM_REGULATOR);
+       of_node_put(regs);
+       if ((count < 0) || (count > TPS65217_NUM_REGULATOR))
+               return NULL;
+
+       pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
+       if (!pdata)
+               return NULL;
+
+       for (i = 0; i < count; i++) {
+               if (!reg_matches[i].init_data || !reg_matches[i].of_node)
+                       continue;
+
+               pdata->tps65217_init_data[i] = reg_matches[i].init_data;
+               pdata->of_node[i] = reg_matches[i].of_node;
+       }
+
+       return pdata;
+}
+#else
+static struct tps65217_board *tps65217_parse_dt(struct platform_device *pdev)
+{
+       return NULL;
+}
+#endif
+
 static int __devinit tps65217_regulator_probe(struct platform_device *pdev)
 {
+       struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent);
+       struct tps65217_board *pdata = dev_get_platdata(tps->dev);
+       struct regulator_init_data *reg_data;
        struct regulator_dev *rdev;
-       struct tps65217 *tps;
-       struct tps_info *info = &tps65217_pmic_regs[pdev->id];
        struct regulator_config config = { };
+       int i, ret;
 
-       /* Already set by core driver */
-       tps = dev_to_tps65217(pdev->dev.parent);
-       tps->info[pdev->id] = info;
+       if (tps->dev->of_node)
+               pdata = tps65217_parse_dt(pdev);
 
-       config.dev = &pdev->dev;
-       config.of_node = pdev->dev.of_node;
-       config.init_data = pdev->dev.platform_data;
-       config.driver_data = tps;
+       if (!pdata) {
+               dev_err(&pdev->dev, "Platform data not found\n");
+               return -EINVAL;
+       }
 
-       rdev = regulator_register(&regulators[pdev->id], &config);
-       if (IS_ERR(rdev))
-               return PTR_ERR(rdev);
+       if (tps65217_chip_id(tps) != TPS65217) {
+               dev_err(&pdev->dev, "Invalid tps chip version\n");
+               return -ENODEV;
+       }
 
-       platform_set_drvdata(pdev, rdev);
+       platform_set_drvdata(pdev, tps);
 
+       for (i = 0; i < TPS65217_NUM_REGULATOR; i++) {
+
+               reg_data = pdata->tps65217_init_data[i];
+
+               /*
+                * Regulator API handles empty constraints but not NULL
+                * constraints
+                */
+               if (!reg_data)
+                       continue;
+
+               /* Register the regulators */
+               tps->info[i] = &tps65217_pmic_regs[i];
+
+               config.dev = tps->dev;
+               config.init_data = reg_data;
+               config.driver_data = tps;
+               config.regmap = tps->regmap;
+               if (tps->dev->of_node)
+                       config.of_node = pdata->of_node[i];
+
+               rdev = regulator_register(&regulators[i], &config);
+               if (IS_ERR(rdev)) {
+                       dev_err(tps->dev, "failed to register %s regulator\n",
+                               pdev->name);
+                       ret = PTR_ERR(rdev);
+                       goto err_unregister_regulator;
+               }
+
+               /* Save regulator for cleanup */
+               tps->rdev[i] = rdev;
+       }
        return 0;
+
+err_unregister_regulator:
+       while (--i >= 0)
+               regulator_unregister(tps->rdev[i]);
+
+       return ret;
 }
 
 static int __devexit tps65217_regulator_remove(struct platform_device *pdev)
 {
-       struct regulator_dev *rdev = platform_get_drvdata(pdev);
+       struct tps65217 *tps = platform_get_drvdata(pdev);
+       unsigned int i;
+
+       for (i = 0; i < TPS65217_NUM_REGULATOR; i++)
+               regulator_unregister(tps->rdev[i]);
 
        platform_set_drvdata(pdev, NULL);
-       regulator_unregister(rdev);
 
        return 0;
 }
index 19241fc..8212526 100644 (file)
@@ -162,6 +162,9 @@ static struct regulator_ops tps6586x_regulator_ops = {
        .disable = tps6586x_regulator_disable,
 };
 
+static struct regulator_ops tps6586x_sys_regulator_ops = {
+};
+
 static const unsigned int tps6586x_ldo0_voltages[] = {
        1200000, 1500000, 1800000, 2500000, 2700000, 2850000, 3100000, 3300000,
 };
@@ -230,15 +233,28 @@ static const unsigned int tps6586x_dvm_voltages[] = {
        TPS6586X_REGULATOR_DVM_GOREG(goreg, gobit)                      \
 }
 
+#define TPS6586X_SYS_REGULATOR()                                       \
+{                                                                      \
+       .desc   = {                                                     \
+               .supply_name = "sys",                                   \
+               .name   = "REG-SYS",                                    \
+               .ops    = &tps6586x_sys_regulator_ops,                  \
+               .type   = REGULATOR_VOLTAGE,                            \
+               .id     = TPS6586X_ID_SYS,                              \
+               .owner  = THIS_MODULE,                                  \
+       },                                                              \
+}
+
 static struct tps6586x_regulator tps6586x_regulator[] = {
+       TPS6586X_SYS_REGULATOR(),
        TPS6586X_LDO(LDO_0, "vinldo01", ldo0, SUPPLYV1, 5, 3, ENC, 0, END, 0),
        TPS6586X_LDO(LDO_3, "vinldo23", ldo, SUPPLYV4, 0, 3, ENC, 2, END, 2),
-       TPS6586X_LDO(LDO_5, NULL, ldo, SUPPLYV6, 0, 3, ENE, 6, ENE, 6),
+       TPS6586X_LDO(LDO_5, "REG-SYS", ldo, SUPPLYV6, 0, 3, ENE, 6, ENE, 6),
        TPS6586X_LDO(LDO_6, "vinldo678", ldo, SUPPLYV3, 0, 3, ENC, 4, END, 4),
        TPS6586X_LDO(LDO_7, "vinldo678", ldo, SUPPLYV3, 3, 3, ENC, 5, END, 5),
        TPS6586X_LDO(LDO_8, "vinldo678", ldo, SUPPLYV2, 5, 3, ENC, 6, END, 6),
        TPS6586X_LDO(LDO_9, "vinldo9", ldo, SUPPLYV6, 3, 3, ENE, 7, ENE, 7),
-       TPS6586X_LDO(LDO_RTC, NULL, ldo, SUPPLYV4, 3, 3, V4, 7, V4, 7),
+       TPS6586X_LDO(LDO_RTC, "REG-SYS", ldo, SUPPLYV4, 3, 3, V4, 7, V4, 7),
        TPS6586X_LDO(LDO_1, "vinldo01", dvm, SUPPLYV1, 0, 5, ENC, 1, END, 1),
        TPS6586X_LDO(SM_2, "vin-sm2", sm2, SUPPLYV2, 0, 5, ENC, 7, END, 7),
 
index a1f7ac1..b54504e 100644 (file)
@@ -29,7 +29,7 @@
 #include <linux/remoteproc.h>
 
 #include <plat/mailbox.h>
-#include <plat/remoteproc.h>
+#include <linux/platform_data/remoteproc-omap.h>
 
 #include "omap_remoteproc.h"
 #include "remoteproc_internal.h"
index 8318689..1dd61f4 100644 (file)
@@ -58,6 +58,7 @@ struct sam9_rtc {
        struct rtc_device       *rtcdev;
        u32                     imr;
        void __iomem            *gpbr;
+       int                     irq;
 };
 
 #define rtt_readl(rtc, field) \
@@ -292,7 +293,7 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev)
 {
        struct resource *r, *r_gpbr;
        struct sam9_rtc *rtc;
-       int             ret;
+       int             ret, irq;
        u32             mr;
 
        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -302,10 +303,18 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
+       irq = platform_get_irq(pdev, 0);
+       if (irq < 0) {
+               dev_err(&pdev->dev, "failed to get interrupt resource\n");
+               return irq;
+       }
+
        rtc = kzalloc(sizeof *rtc, GFP_KERNEL);
        if (!rtc)
                return -ENOMEM;
 
+       rtc->irq = irq;
+
        /* platform setup code should have handled this; sigh */
        if (!device_can_wakeup(&pdev->dev))
                device_init_wakeup(&pdev->dev, 1);
@@ -345,11 +354,10 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev)
        }
 
        /* register irq handler after we know what name we'll use */
-       ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt,
-                               IRQF_SHARED,
+       ret = request_irq(rtc->irq, at91_rtc_interrupt, IRQF_SHARED,
                                dev_name(&rtc->rtcdev->dev), rtc);
        if (ret) {
-               dev_dbg(&pdev->dev, "can't share IRQ %d?\n", AT91_ID_SYS);
+               dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq);
                rtc_device_unregister(rtc->rtcdev);
                goto fail_register;
        }
@@ -386,7 +394,7 @@ static int __devexit at91_rtc_remove(struct platform_device *pdev)
 
        /* disable all interrupts */
        rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN));
-       free_irq(AT91_ID_SYS, rtc);
+       free_irq(rtc->irq, rtc);
 
        rtc_device_unregister(rtc->rtcdev);
 
@@ -423,7 +431,7 @@ static int at91_rtc_suspend(struct platform_device *pdev,
        rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN);
        if (rtc->imr) {
                if (device_may_wakeup(&pdev->dev) && (mr & AT91_RTT_ALMIEN)) {
-                       enable_irq_wake(AT91_ID_SYS);
+                       enable_irq_wake(rtc->irq);
                        /* don't let RTTINC cause wakeups */
                        if (mr & AT91_RTT_RTTINCIEN)
                                rtt_writel(rtc, MR, mr & ~AT91_RTT_RTTINCIEN);
@@ -441,7 +449,7 @@ static int at91_rtc_resume(struct platform_device *pdev)
 
        if (rtc->imr) {
                if (device_may_wakeup(&pdev->dev))
-                       disable_irq_wake(AT91_ID_SYS);
+                       disable_irq_wake(rtc->irq);
                mr = rtt_readl(rtc, MR);
                rtt_writel(rtc, MR, mr | rtc->imr);
        }
index 0075c8f..f771b2e 100644 (file)
@@ -27,6 +27,8 @@
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/slab.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
 
 #include <mach/hardware.h>
 
@@ -396,6 +398,14 @@ static int __exit pxa_rtc_remove(struct platform_device *pdev)
        return 0;
 }
 
+#ifdef CONFIG_OF
+static struct of_device_id pxa_rtc_dt_ids[] = {
+       { .compatible = "marvell,pxa-rtc" },
+       {}
+};
+MODULE_DEVICE_TABLE(of, pxa_rtc_dt_ids);
+#endif
+
 #ifdef CONFIG_PM
 static int pxa_rtc_suspend(struct device *dev)
 {
@@ -425,6 +435,7 @@ static struct platform_driver pxa_rtc_driver = {
        .remove         = __exit_p(pxa_rtc_remove),
        .driver         = {
                .name   = "pxa-rtc",
+               .of_match_table = of_match_ptr(pxa_rtc_dt_ids),
 #ifdef CONFIG_PM
                .pm     = &pxa_rtc_pm_ops,
 #endif
index 6c0116d..9ffb6d5 100644 (file)
@@ -716,10 +716,17 @@ static int raw3215_probe (struct ccw_device *cdev)
 static void raw3215_remove (struct ccw_device *cdev)
 {
        struct raw3215_info *raw;
+       unsigned int line;
 
        ccw_device_set_offline(cdev);
        raw = dev_get_drvdata(&cdev->dev);
        if (raw) {
+               spin_lock(&raw3215_device_lock);
+               for (line = 0; line < NR_3215; line++)
+                       if (raw3215[line] == raw)
+                               break;
+               raw3215[line] = NULL;
+               spin_unlock(&raw3215_device_lock);
                dev_set_drvdata(&cdev->dev, NULL);
                raw3215_free_info(raw);
        }
@@ -935,6 +942,19 @@ static int __init con3215_init(void)
 console_initcall(con3215_init);
 #endif
 
+static int tty3215_install(struct tty_driver *driver, struct tty_struct *tty)
+{
+       struct raw3215_info *raw;
+
+       raw = raw3215[tty->index];
+       if (raw == NULL)
+               return -ENODEV;
+
+       tty->driver_data = raw;
+
+       return tty_port_install(&raw->port, driver, tty);
+}
+
 /*
  * tty3215_open
  *
@@ -942,14 +962,9 @@ console_initcall(con3215_init);
  */
 static int tty3215_open(struct tty_struct *tty, struct file * filp)
 {
-       struct raw3215_info *raw;
+       struct raw3215_info *raw = tty->driver_data;
        int retval;
 
-       raw = raw3215[tty->index];
-       if (raw == NULL)
-               return -ENODEV;
-
-       tty->driver_data = raw;
        tty_port_tty_set(&raw->port, tty);
 
        tty->low_latency = 0;  /* don't use bottom half for pushing chars */
@@ -1110,6 +1125,7 @@ static void tty3215_start(struct tty_struct *tty)
 }
 
 static const struct tty_operations tty3215_ops = {
+       .install = tty3215_install,
        .open = tty3215_open,
        .close = tty3215_close,
        .write = tty3215_write,
index 0792c85..30ec09e 100644 (file)
@@ -567,6 +567,7 @@ sclp_tty_init(void)
        driver->init_termios.c_lflag = ISIG | ECHO;
        driver->flags = TTY_DRIVER_REAL_RAW;
        tty_set_operations(driver, &sclp_ops);
+       tty_port_link_device(&sclp_port, driver, 0);
        rc = tty_register_driver(driver);
        if (rc) {
                put_tty_driver(driver);
index edfc0fd..7e60f3d 100644 (file)
@@ -691,6 +691,7 @@ static int __init sclp_vt220_tty_init(void)
        driver->init_termios = tty_std_termios;
        driver->flags = TTY_DRIVER_REAL_RAW;
        tty_set_operations(driver, &sclp_vt220_ops);
+       tty_port_link_device(&sclp_vt220_port, driver, 0);
 
        rc = tty_register_driver(driver);
        if (rc)
index 1928f34..482ee02 100644 (file)
@@ -842,17 +842,14 @@ static struct raw3270_fn tty3270_fn = {
 };
 
 /*
- * This routine is called whenever a 3270 tty is opened.
+ * This routine is called whenever a 3270 tty is opened first time.
  */
-static int
-tty3270_open(struct tty_struct *tty, struct file * filp)
+static int tty3270_install(struct tty_driver *driver, struct tty_struct *tty)
 {
        struct raw3270_view *view;
        struct tty3270 *tp;
        int i, rc;
 
-       if (tty->count > 1)
-               return 0;
        /* Check if the tty3270 is already there. */
        view = raw3270_find_view(&tty3270_fn,
                                  tty->index + RAW3270_FIRSTMINOR);
@@ -865,7 +862,7 @@ tty3270_open(struct tty_struct *tty, struct file * filp)
                /* why to reassign? */
                tty_port_tty_set(&tp->port, tty);
                tp->inattr = TF_INPUT;
-               return 0;
+               return tty_port_install(&tp->port, driver, tty);
        }
        if (tty3270_max_index < tty->index + 1)
                tty3270_max_index = tty->index + 1;
@@ -895,7 +892,6 @@ tty3270_open(struct tty_struct *tty, struct file * filp)
 
        tty_port_tty_set(&tp->port, tty);
        tty->low_latency = 0;
-       tty->driver_data = tp;
        tty->winsize.ws_row = tp->view.rows - 2;
        tty->winsize.ws_col = tp->view.cols;
 
@@ -915,6 +911,15 @@ tty3270_open(struct tty_struct *tty, struct file * filp)
        kbd_ascebc(tp->kbd, tp->view.ascebc);
 
        raw3270_activate_view(&tp->view);
+
+       rc = tty_port_install(&tp->port, driver, tty);
+       if (rc) {
+               raw3270_put_view(&tp->view);
+               return rc;
+       }
+
+       tty->driver_data = tp;
+
        return 0;
 }
 
@@ -932,10 +937,17 @@ tty3270_close(struct tty_struct *tty, struct file * filp)
        if (tp) {
                tty->driver_data = NULL;
                tty_port_tty_set(&tp->port, NULL);
-               raw3270_put_view(&tp->view);
        }
 }
 
+static void tty3270_cleanup(struct tty_struct *tty)
+{
+       struct tty3270 *tp = tty->driver_data;
+
+       if (tp)
+               raw3270_put_view(&tp->view);
+}
+
 /*
  * We always have room.
  */
@@ -1737,7 +1749,8 @@ static long tty3270_compat_ioctl(struct tty_struct *tty,
 #endif
 
 static const struct tty_operations tty3270_ops = {
-       .open = tty3270_open,
+       .install = tty3270_install,
+       .cleanup = tty3270_cleanup,
        .close = tty3270_close,
        .write = tty3270_write,
        .put_char = tty3270_put_char,
@@ -1781,7 +1794,7 @@ static int __init tty3270_init(void)
        driver->type = TTY_DRIVER_TYPE_SYSTEM;
        driver->subtype = SYSTEM_TYPE_TTY;
        driver->init_termios = tty_std_termios;
-       driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_DYNAMIC_DEV;
+       driver->flags = TTY_DRIVER_RESET_TERMIOS;
        tty_set_operations(driver, &tty3270_ops);
        ret = tty_register_driver(driver);
        if (ret) {
@@ -1800,6 +1813,7 @@ tty3270_exit(void)
        driver = tty3270_driver;
        tty3270_driver = NULL;
        tty_unregister_driver(driver);
+       put_tty_driver(driver);
        tty3270_del_views();
 }
 
index dc27598..ed38454 100644 (file)
@@ -4066,7 +4066,6 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        spin_lock_init(&instance->cmd_pool_lock);
        spin_lock_init(&instance->hba_lock);
        spin_lock_init(&instance->completion_lock);
-       spin_lock_init(&poll_aen_lock);
 
        mutex_init(&instance->aen_mutex);
        mutex_init(&instance->reset_mutex);
@@ -5392,6 +5391,8 @@ static int __init megasas_init(void)
        printk(KERN_INFO "megasas: %s %s\n", MEGASAS_VERSION,
               MEGASAS_EXT_VERSION);
 
+       spin_lock_init(&poll_aen_lock);
+
        support_poll_for_event = 2;
        support_device_change = 1;
 
index 9d46fcb..b25757d 100644 (file)
@@ -2424,10 +2424,13 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc,  int sleep_flag)
        }
 
        /* command line tunables  for max controller queue depth */
-       if (max_queue_depth != -1)
-               max_request_credit = (max_queue_depth < facts->RequestCredit)
-                   ? max_queue_depth : facts->RequestCredit;
-       else
+       if (max_queue_depth != -1 && max_queue_depth != 0) {
+               max_request_credit = min_t(u16, max_queue_depth +
+                       ioc->hi_priority_depth + ioc->internal_depth,
+                       facts->RequestCredit);
+               if (max_request_credit > MAX_HBA_QUEUE_DEPTH)
+                       max_request_credit =  MAX_HBA_QUEUE_DEPTH;
+       } else
                max_request_credit = min_t(u16, facts->RequestCredit,
                    MAX_HBA_QUEUE_DEPTH);
 
@@ -2502,7 +2505,7 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc,  int sleep_flag)
        /* set the scsi host can_queue depth
         * with some internal commands that could be outstanding
         */
-       ioc->shost->can_queue = ioc->scsiio_depth - (2);
+       ioc->shost->can_queue = ioc->scsiio_depth;
        dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "scsi host: "
            "can_queue depth (%d)\n", ioc->name, ioc->shost->can_queue));
 
index 4a6381c..de2337f 100644 (file)
@@ -42,6 +42,8 @@
 
 #include <trace/events/scsi.h>
 
+static void scsi_eh_done(struct scsi_cmnd *scmd);
+
 #define SENSE_TIMEOUT          (10*HZ)
 
 /*
@@ -241,6 +243,14 @@ static int scsi_check_sense(struct scsi_cmnd *scmd)
        if (! scsi_command_normalize_sense(scmd, &sshdr))
                return FAILED;  /* no valid sense data */
 
+       if (scmd->cmnd[0] == TEST_UNIT_READY && scmd->scsi_done != scsi_eh_done)
+               /*
+                * nasty: for mid-layer issued TURs, we need to return the
+                * actual sense data without any recovery attempt.  For eh
+                * issued ones, we need to try to recover and interpret
+                */
+               return SUCCESS;
+
        if (scsi_sense_is_deferred(&sshdr))
                return NEEDS_RETRY;
 
index ffd7773..faa790f 100644 (file)
@@ -776,7 +776,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
        }
 
        if (req->cmd_type == REQ_TYPE_BLOCK_PC) { /* SG_IO ioctl from block level */
-               req->errors = result;
                if (result) {
                        if (sense_valid && req->sense) {
                                /*
@@ -792,6 +791,10 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
                        if (!sense_deferred)
                                error = __scsi_error_from_host_byte(cmd, result);
                }
+               /*
+                * __scsi_error_from_host_byte may have reset the host_byte
+                */
+               req->errors = cmd->result;
 
                req->resid_len = scsi_get_resid(cmd);
 
index 56a9379..d947ffc 100644 (file)
@@ -764,6 +764,16 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result,
        sdev->model = (char *) (sdev->inquiry + 16);
        sdev->rev = (char *) (sdev->inquiry + 32);
 
+       if (strncmp(sdev->vendor, "ATA     ", 8) == 0) {
+               /*
+                * sata emulation layer device.  This is a hack to work around
+                * the SATL power management specifications which state that
+                * when the SATL detects the device has gone into standby
+                * mode, it shall respond with NOT READY.
+                */
+               sdev->allow_restart = 1;
+       }
+
        if (*bflags & BLIST_ISROM) {
                sdev->type = TYPE_ROM;
                sdev->removable = 1;
index 5f84b55..2d198a0 100644 (file)
@@ -366,7 +366,7 @@ config SPI_STMP3XXX
 
 config SPI_TEGRA
        tristate "Nvidia Tegra SPI controller"
-       depends on ARCH_TEGRA && (TEGRA_SYSTEM_DMA || TEGRA20_APB_DMA)
+       depends on ARCH_TEGRA && TEGRA20_APB_DMA
        help
          SPI driver for NVidia Tegra SoCs
 
index 9b0d716..0a94d9d 100644 (file)
@@ -52,8 +52,9 @@
 #include <asm/io.h>
 #include <asm/mach-types.h>
 
-#include <plat/mux.h>
-#include <plat/omap7xx.h>      /* OMAP7XX_IO_CONF registers */
+#include <mach/mux.h>
+
+#include <mach/omap7xx.h>      /* OMAP7XX_IO_CONF registers */
 
 
 /* FIXME address is now a platform device resource,
index b2fb141..b9b7ad0 100644 (file)
@@ -42,7 +42,7 @@
 #include <linux/spi/spi.h>
 
 #include <plat/clock.h>
-#include <plat/mcspi.h>
+#include <linux/platform_data/spi-omap2-mcspi.h>
 
 #define OMAP2_MCSPI_MAX_FREQ           48000000
 #define SPI_AUTOSUSPEND_TIMEOUT                2000
index ef52c1c..488d9b6 100644 (file)
@@ -164,23 +164,15 @@ struct spi_tegra_data {
         * for the generic case.
         */
        int                     dma_req_len;
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-       struct tegra_dma_req    rx_dma_req;
-       struct tegra_dma_channel *rx_dma;
-#else
        struct dma_chan         *rx_dma;
        struct dma_slave_config sconfig;
        struct dma_async_tx_descriptor  *rx_dma_desc;
        dma_cookie_t            rx_cookie;
-#endif
        u32                     *rx_bb;
        dma_addr_t              rx_bb_phys;
 };
 
-#if !defined(CONFIG_TEGRA_SYSTEM_DMA)
 static void tegra_spi_rx_dma_complete(void *args);
-#endif
-
 static inline unsigned long spi_tegra_readl(struct spi_tegra_data *tspi,
                                            unsigned long reg)
 {
@@ -204,10 +196,6 @@ static void spi_tegra_go(struct spi_tegra_data *tspi)
        val &= ~SLINK_DMA_BLOCK_SIZE(~0) & ~SLINK_DMA_EN;
        val |= SLINK_DMA_BLOCK_SIZE(tspi->dma_req_len / 4 - 1);
        spi_tegra_writel(tspi, val, SLINK_DMA_CTL);
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-       tspi->rx_dma_req.size = tspi->dma_req_len;
-       tegra_dma_enqueue_req(tspi->rx_dma, &tspi->rx_dma_req);
-#else
        tspi->rx_dma_desc = dmaengine_prep_slave_single(tspi->rx_dma,
                                tspi->rx_bb_phys, tspi->dma_req_len,
                                DMA_DEV_TO_MEM, DMA_PREP_INTERRUPT);
@@ -219,7 +207,6 @@ static void spi_tegra_go(struct spi_tegra_data *tspi)
        tspi->rx_dma_desc->callback_param = tspi;
        tspi->rx_cookie = dmaengine_submit(tspi->rx_dma_desc);
        dma_async_issue_pending(tspi->rx_dma);
-#endif
 
        val |= SLINK_DMA_EN;
        spi_tegra_writel(tspi, val, SLINK_DMA_CTL);
@@ -405,19 +392,12 @@ static void handle_spi_rx_dma_complete(struct spi_tegra_data *tspi)
 
        spin_unlock_irqrestore(&tspi->lock, flags);
 }
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-static void tegra_spi_rx_dma_complete(struct tegra_dma_req *req)
-{
-       struct spi_tegra_data *tspi = req->dev;
-       handle_spi_rx_dma_complete(tspi);
-}
-#else
+
 static void tegra_spi_rx_dma_complete(void *args)
 {
        struct spi_tegra_data *tspi = args;
        handle_spi_rx_dma_complete(tspi);
 }
-#endif
 
 static int spi_tegra_setup(struct spi_device *spi)
 {
@@ -509,9 +489,7 @@ static int __devinit spi_tegra_probe(struct platform_device *pdev)
        struct spi_tegra_data   *tspi;
        struct resource         *r;
        int ret;
-#if !defined(CONFIG_TEGRA_SYSTEM_DMA)
        dma_cap_mask_t mask;
-#endif
 
        master = spi_alloc_master(&pdev->dev, sizeof *tspi);
        if (master == NULL) {
@@ -563,14 +541,6 @@ static int __devinit spi_tegra_probe(struct platform_device *pdev)
 
        INIT_LIST_HEAD(&tspi->queue);
 
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-       tspi->rx_dma = tegra_dma_allocate_channel(TEGRA_DMA_MODE_ONESHOT);
-       if (!tspi->rx_dma) {
-               dev_err(&pdev->dev, "can not allocate rx dma channel\n");
-               ret = -ENODEV;
-               goto err3;
-       }
-#else
        dma_cap_zero(mask);
        dma_cap_set(DMA_SLAVE, mask);
        tspi->rx_dma = dma_request_channel(mask, NULL, NULL);
@@ -580,8 +550,6 @@ static int __devinit spi_tegra_probe(struct platform_device *pdev)
                goto err3;
        }
 
-#endif
-
        tspi->rx_bb = dma_alloc_coherent(&pdev->dev, sizeof(u32) * BB_LEN,
                                         &tspi->rx_bb_phys, GFP_KERNEL);
        if (!tspi->rx_bb) {
@@ -590,17 +558,6 @@ static int __devinit spi_tegra_probe(struct platform_device *pdev)
                goto err4;
        }
 
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-       tspi->rx_dma_req.complete = tegra_spi_rx_dma_complete;
-       tspi->rx_dma_req.to_memory = 1;
-       tspi->rx_dma_req.dest_addr = tspi->rx_bb_phys;
-       tspi->rx_dma_req.dest_bus_width = 32;
-       tspi->rx_dma_req.source_addr = tspi->phys + SLINK_RX_FIFO;
-       tspi->rx_dma_req.source_bus_width = 32;
-       tspi->rx_dma_req.source_wrap = 4;
-       tspi->rx_dma_req.req_sel = spi_tegra_req_sels[pdev->id];
-       tspi->rx_dma_req.dev = tspi;
-#else
        /* Dmaengine Dma slave config */
        tspi->sconfig.src_addr = tspi->phys + SLINK_RX_FIFO;
        tspi->sconfig.dst_addr = tspi->phys + SLINK_RX_FIFO;
@@ -616,7 +573,6 @@ static int __devinit spi_tegra_probe(struct platform_device *pdev)
                        ret);
                goto err4;
        }
-#endif
 
        master->dev.of_node = pdev->dev.of_node;
        ret = spi_register_master(master);
@@ -630,11 +586,7 @@ err5:
        dma_free_coherent(&pdev->dev, sizeof(u32) * BB_LEN,
                          tspi->rx_bb, tspi->rx_bb_phys);
 err4:
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-       tegra_dma_free_channel(tspi->rx_dma);
-#else
        dma_release_channel(tspi->rx_dma);
-#endif
 err3:
        clk_put(tspi->clk);
 err2:
@@ -656,12 +608,7 @@ static int __devexit spi_tegra_remove(struct platform_device *pdev)
        tspi = spi_master_get_devdata(master);
 
        spi_unregister_master(master);
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-       tegra_dma_free_channel(tspi->rx_dma);
-#else
        dma_release_channel(tspi->rx_dma);
-#endif
-
        dma_free_coherent(&pdev->dev, sizeof(u32) * BB_LEN,
                          tspi->rx_bb, tspi->rx_bb_phys);
 
index d0cafd6..f2ffd96 100644 (file)
@@ -51,10 +51,12 @@ enum android_alarm_return_flags {
 #define ANDROID_ALARM_WAIT                  _IO('a', 1)
 
 #define ALARM_IOW(c, type, size)            _IOW('a', (c) | ((type) << 4), size)
+#define ALARM_IOR(c, type, size)            _IOR('a', (c) | ((type) << 4), size)
+
 /* Set alarm */
 #define ANDROID_ALARM_SET(type)             ALARM_IOW(2, type, struct timespec)
 #define ANDROID_ALARM_SET_AND_WAIT(type)    ALARM_IOW(3, type, struct timespec)
-#define ANDROID_ALARM_GET_TIME(type)        ALARM_IOW(4, type, struct timespec)
+#define ANDROID_ALARM_GET_TIME(type)        ALARM_IOR(4, type, struct timespec)
 #define ANDROID_ALARM_SET_RTC               _IOW('a', 5, struct timespec)
 #define ANDROID_ALARM_BASE_CMD(cmd)         (cmd & ~(_IOC(0, 0, 0xf0, 0)))
 #define ANDROID_ALARM_IOCTL_TO_TYPE(cmd)    (_IOC_NR(cmd) >> 4)
index 6c81e37..cc8931f 100644 (file)
@@ -1412,6 +1412,13 @@ static int __devinit dio200_attach_pci(struct comedi_device *dev,
                dev_err(dev->class_dev, "BUG! cannot determine board type!\n");
                return -EINVAL;
        }
+       /*
+        * Need to 'get' the PCI device to match the 'put' in dio200_detach().
+        * TODO: Remove the pci_dev_get() and matching pci_dev_put() once
+        * support for manual attachment of PCI devices via dio200_attach()
+        * has been removed.
+        */
+       pci_dev_get(pci_dev);
        return dio200_pci_common_attach(dev, pci_dev);
 }
 
index aabba98..f502879 100644 (file)
@@ -565,6 +565,13 @@ static int __devinit pc236_attach_pci(struct comedi_device *dev,
                dev_err(dev->class_dev, "BUG! cannot determine board type!\n");
                return -EINVAL;
        }
+       /*
+        * Need to 'get' the PCI device to match the 'put' in pc236_detach().
+        * TODO: Remove the pci_dev_get() and matching pci_dev_put() once
+        * support for manual attachment of PCI devices via pc236_attach()
+        * has been removed.
+        */
+       pci_dev_get(pci_dev);
        return pc236_pci_common_attach(dev, pci_dev);
 }
 
index 40ec1ff..8191c4e 100644 (file)
@@ -298,6 +298,13 @@ static int __devinit pc263_attach_pci(struct comedi_device *dev,
                dev_err(dev->class_dev, "BUG! cannot determine board type!\n");
                return -EINVAL;
        }
+       /*
+        * Need to 'get' the PCI device to match the 'put' in pc263_detach().
+        * TODO: Remove the pci_dev_get() and matching pci_dev_put() once
+        * support for manual attachment of PCI devices via pc263_attach()
+        * has been removed.
+        */
+       pci_dev_get(pci_dev);
        return pc263_pci_common_attach(dev, pci_dev);
 }
 
index 4e17f13..8bf109e 100644 (file)
@@ -1503,6 +1503,13 @@ pci224_attach_pci(struct comedi_device *dev, struct pci_dev *pci_dev)
                        DRIVER_NAME ": BUG! cannot determine board type!\n");
                return -EINVAL;
        }
+       /*
+        * Need to 'get' the PCI device to match the 'put' in pci224_detach().
+        * TODO: Remove the pci_dev_get() and matching pci_dev_put() once
+        * support for manual attachment of PCI devices via pci224_attach()
+        * has been removed.
+        */
+       pci_dev_get(pci_dev);
        return pci224_attach_common(dev, pci_dev, NULL);
 }
 
index 1b67d0c..66e74bd 100644 (file)
@@ -2925,6 +2925,13 @@ static int __devinit pci230_attach_pci(struct comedi_device *dev,
                        "amplc_pci230: BUG! cannot determine board type!\n");
                return -EINVAL;
        }
+       /*
+        * Need to 'get' the PCI device to match the 'put' in pci230_detach().
+        * TODO: Remove the pci_dev_get() and matching pci_dev_put() once
+        * support for manual attachment of PCI devices via pci230_attach()
+        * has been removed.
+        */
+       pci_dev_get(pci_dev);
        return pci230_attach_common(dev, pci_dev);
 }
 
index 874e02e..67a914a 100644 (file)
@@ -378,7 +378,7 @@ das08jr_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s,
        int chan;
 
        lsb = data[0] & 0xff;
-       msb = (data[0] >> 8) & 0xf;
+       msb = (data[0] >> 8) & 0xff;
 
        chan = CR_CHAN(insn->chanspec);
 
@@ -623,7 +623,7 @@ static const struct das08_board_struct das08_boards[] = {
                .ai = das08_ai_rinsn,
                .ai_nbits = 16,
                .ai_pg = das08_pg_none,
-               .ai_encoding = das08_encode12,
+               .ai_encoding = das08_encode16,
                .ao = das08jr_ao_winsn,
                .ao_nbits = 16,
                .di = das08jr_di_rbits,
@@ -922,6 +922,13 @@ das08_attach_pci(struct comedi_device *dev, struct pci_dev *pdev)
                dev_err(dev->class_dev, "BUG! cannot determine board type!\n");
                return -EINVAL;
        }
+       /*
+        * Need to 'get' the PCI device to match the 'put' in das08_detach().
+        * TODO: Remove the pci_dev_get() and matching pci_dev_put() once
+        * support for manual attachment of PCI devices via das08_attach()
+        * has been removed.
+        */
+       pci_dev_get(pdev);
        return das08_pci_attach_common(dev, pdev);
 }
 
index 18d108f..f3da590 100644 (file)
@@ -121,8 +121,10 @@ static int lis3l02dq_get_buffer_element(struct iio_dev *indio_dev,
        if (rx_array == NULL)
                return -ENOMEM;
        ret = lis3l02dq_read_all(indio_dev, rx_array);
-       if (ret < 0)
+       if (ret < 0) {
+               kfree(rx_array);
                return ret;
+       }
        for (i = 0; i < scan_count; i++)
                data[i] = combine_8_to_16(rx_array[i*4+1],
                                        rx_array[i*4+3]);
index 0958372..19a064d 100644 (file)
@@ -647,6 +647,8 @@ static ssize_t ad7192_write_frequency(struct device *dev,
        ret = strict_strtoul(buf, 10, &lval);
        if (ret)
                return ret;
+       if (lval == 0)
+               return -EINVAL;
 
        mutex_lock(&indio_dev->mlock);
        if (iio_buffer_enabled(indio_dev)) {
index 93aa431..eb8e9d6 100644 (file)
@@ -195,6 +195,8 @@ static ssize_t adis16260_write_frequency(struct device *dev,
        ret = strict_strtol(buf, 10, &val);
        if (ret)
                return ret;
+       if (val == 0)
+               return -EINVAL;
 
        mutex_lock(&indio_dev->mlock);
        if (spi_get_device_id(st->us)) {
index 1f4c177..a618327 100644 (file)
@@ -234,6 +234,8 @@ static ssize_t adis16400_write_frequency(struct device *dev,
        ret = strict_strtol(buf, 10, &val);
        if (ret)
                return ret;
+       if (val == 0)
+               return -EINVAL;
 
        mutex_lock(&indio_dev->mlock);
 
index f04ece7..3ccff18 100644 (file)
@@ -425,6 +425,8 @@ static ssize_t ade7753_write_frequency(struct device *dev,
        ret = strict_strtol(buf, 10, &val);
        if (ret)
                return ret;
+       if (val == 0)
+               return -EINVAL;
 
        mutex_lock(&indio_dev->mlock);
 
index 6cee28a..abb1e9c 100644 (file)
@@ -445,6 +445,8 @@ static ssize_t ade7754_write_frequency(struct device *dev,
        ret = strict_strtol(buf, 10, &val);
        if (ret)
                return ret;
+       if (val == 0)
+               return -EINVAL;
 
        mutex_lock(&indio_dev->mlock);
 
index b3f7e0f..eb0a2a9 100644 (file)
@@ -385,6 +385,8 @@ static ssize_t ade7759_write_frequency(struct device *dev,
        ret = strict_strtol(buf, 10, &val);
        if (ret)
                return ret;
+       if (val == 0)
+               return -EINVAL;
 
        mutex_lock(&indio_dev->mlock);
 
index fd0e301..a68d981 100644 (file)
@@ -502,7 +502,7 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr,
                ipoctal->pointer_read[i] = 0;
                ipoctal->pointer_write[i] = 0;
                ipoctal->nb_bytes[i] = 0;
-               tty_register_device(tty, i, NULL);
+               tty_port_register_device(&ipoctal->tty_port[i], tty, i, NULL);
 
                /*
                 * Enable again the RX. TX will be enabled when
@@ -617,7 +617,7 @@ static void ipoctal_set_termios(struct tty_struct *tty,
        struct ipoctal *ipoctal = tty->driver_data;
        speed_t baud;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        /* Disable and reset everything before change the setup */
        ipoctal_write_io_reg(ipoctal, &ipoctal->chan_regs[channel].u.w.cr,
@@ -643,7 +643,7 @@ static void ipoctal_set_termios(struct tty_struct *tty,
        default:
                mr1 |= MR1_CHRL_8_BITS;
                /* By default, select CS8 */
-               tty->termios->c_cflag = (cflag & ~CSIZE) | CS8;
+               tty->termios.c_cflag = (cflag & ~CSIZE) | CS8;
                break;
        }
 
@@ -657,7 +657,7 @@ static void ipoctal_set_termios(struct tty_struct *tty,
                mr1 |= MR1_PARITY_OFF;
 
        /* Mark or space parity is not supported */
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        /* Set stop bits */
        if (cflag & CSTOPB)
@@ -690,10 +690,10 @@ static void ipoctal_set_termios(struct tty_struct *tty,
        }
 
        baud = tty_get_baud_rate(tty);
-       tty_termios_encode_baud_rate(tty->termios, baud, baud);
+       tty_termios_encode_baud_rate(&tty->termios, baud, baud);
 
        /* Set baud rate */
-       switch (tty->termios->c_ospeed) {
+       switch (baud) {
        case 75:
                csr |= TX_CLK_75 | RX_CLK_75;
                break;
@@ -734,7 +734,7 @@ static void ipoctal_set_termios(struct tty_struct *tty,
        default:
                csr |= TX_CLK_38400 | RX_CLK_38400;
                /* In case of default, we establish 38400 bps */
-               tty_termios_encode_baud_rate(tty->termios, 38400, 38400);
+               tty_termios_encode_baud_rate(&tty->termios, 38400, 38400);
                break;
        }
 
index 695ea35..d0a7e40 100644 (file)
@@ -837,7 +837,7 @@ static int __devinit tegra_nvec_probe(struct platform_device *pdev)
        }
 
        ret = mfd_add_devices(nvec->dev, -1, nvec_devices,
-                             ARRAY_SIZE(nvec_devices), base, 0);
+                             ARRAY_SIZE(nvec_devices), base, 0, NULL);
        if (ret)
                dev_err(nvec->dev, "error adding subdevices\n");
 
index 5e2856c..55e9c86 100644 (file)
@@ -48,13 +48,20 @@ static inline void copy_timings_omap_to_drm(struct drm_display_mode *mode,
        mode->vsync_end = mode->vsync_start + timings->vsw;
        mode->vtotal = mode->vsync_end + timings->vbp;
 
-       /* note: whether or not it is interlaced, +/- h/vsync, etc,
-        * which should be set in the mode flags, is not exposed in
-        * the omap_video_timings struct.. but hdmi driver tracks
-        * those separately so all we have to have to set the mode
-        * is the way to recover these timings values, and the
-        * omap_dss_driver would do the rest.
-        */
+       mode->flags = 0;
+
+       if (timings->interlace)
+               mode->flags |= DRM_MODE_FLAG_INTERLACE;
+
+       if (timings->hsync_level == OMAPDSS_SIG_ACTIVE_HIGH)
+               mode->flags |= DRM_MODE_FLAG_PHSYNC;
+       else
+               mode->flags |= DRM_MODE_FLAG_NHSYNC;
+
+       if (timings->vsync_level == OMAPDSS_SIG_ACTIVE_HIGH)
+               mode->flags |= DRM_MODE_FLAG_PVSYNC;
+       else
+               mode->flags |= DRM_MODE_FLAG_NVSYNC;
 }
 
 static inline void copy_timings_drm_to_omap(struct omap_video_timings *timings,
@@ -71,6 +78,22 @@ static inline void copy_timings_drm_to_omap(struct omap_video_timings *timings,
        timings->vfp = mode->vsync_start - mode->vdisplay;
        timings->vsw = mode->vsync_end - mode->vsync_start;
        timings->vbp = mode->vtotal - mode->vsync_end;
+
+       timings->interlace = !!(mode->flags & DRM_MODE_FLAG_INTERLACE);
+
+       if (mode->flags & DRM_MODE_FLAG_PHSYNC)
+               timings->hsync_level = OMAPDSS_SIG_ACTIVE_HIGH;
+       else
+               timings->hsync_level = OMAPDSS_SIG_ACTIVE_LOW;
+
+       if (mode->flags & DRM_MODE_FLAG_PVSYNC)
+               timings->vsync_level = OMAPDSS_SIG_ACTIVE_HIGH;
+       else
+               timings->vsync_level = OMAPDSS_SIG_ACTIVE_LOW;
+
+       timings->data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE;
+       timings->de_level = OMAPDSS_SIG_ACTIVE_HIGH;
+       timings->sync_pclk_edge = OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES;
 }
 
 static void omap_connector_dpms(struct drm_connector *connector, int mode)
@@ -187,7 +210,7 @@ static int omap_connector_get_modes(struct drm_connector *connector)
                }
        } else {
                struct drm_display_mode *mode = drm_mode_create(dev);
-               struct omap_video_timings timings;
+               struct omap_video_timings timings = {0};
 
                dssdrv->get_timings(dssdev, &timings);
 
@@ -291,7 +314,7 @@ void omap_connector_mode_set(struct drm_connector *connector,
        struct omap_connector *omap_connector = to_omap_connector(connector);
        struct omap_dss_device *dssdev = omap_connector->dssdev;
        struct omap_dss_driver *dssdrv = dssdev->driver;
-       struct omap_video_timings timings;
+       struct omap_video_timings timings = {0};
 
        copy_timings_drm_to_omap(&timings, mode);
 
index d983219..758ce0a 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/cdev.h>
 #include <linux/uaccess.h>
 #include <linux/netdevice.h>
+#include <linux/etherdevice.h>
 #include <linux/poll.h>
 #include <linux/sched.h>
 #include "ozconfig.h"
@@ -213,7 +214,7 @@ static int oz_set_active_pd(u8 *addr)
                if (old_pd)
                        oz_pd_put(old_pd);
        } else {
-               if (!memcmp(addr, "\0\0\0\0\0\0", sizeof(addr))) {
+               if (is_zero_ether_addr(addr)) {
                        spin_lock_bh(&g_cdev.lock);
                        pd = g_cdev.active_pd;
                        g_cdev.active_pd = 0;
index 0e26d5f..495ee12 100644 (file)
@@ -117,13 +117,8 @@ void r8712_recv_indicatepkt(struct _adapter *padapter,
        if (skb == NULL)
                goto _recv_indicatepkt_drop;
        skb->data = precv_frame->u.hdr.rx_data;
-#ifdef NET_SKBUFF_DATA_USES_OFFSET
-       skb->tail = (sk_buff_data_t)(precv_frame->u.hdr.rx_tail -
-                    precv_frame->u.hdr.rx_head);
-#else
-       skb->tail = (sk_buff_data_t)precv_frame->u.hdr.rx_tail;
-#endif
        skb->len = precv_frame->u.hdr.len;
+       skb_set_tail_pointer(skb, skb->len);
        if ((pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1))
                skb->ip_summed = CHECKSUM_UNNECESSARY;
        else
index 8a362f7..c90de96 100644 (file)
@@ -315,10 +315,8 @@ static void qt_read_bulk_callback(struct urb *urb)
        }
 
        tty = tty_port_tty_get(&port->port);
-       if (!tty) {
-               dbg("%s - bad tty pointer - exiting", __func__);
+       if (!tty)
                return;
-       }
 
        data = urb->transfer_buffer;
 
@@ -364,7 +362,7 @@ static void qt_read_bulk_callback(struct urb *urb)
                goto exit;
        }
 
-       if (tty && RxCount) {
+       if (RxCount) {
                flag_data = 0;
                for (i = 0; i < RxCount; ++i) {
                        /* Look ahead code here */
@@ -428,7 +426,7 @@ static void qt_read_bulk_callback(struct urb *urb)
                dbg("%s - failed resubmitting read urb, error %d",
                    __func__, result);
        else {
-               if (tty && RxCount) {
+               if (RxCount) {
                        tty_flip_buffer_push(tty);
                        tty_schedule_flip(tty);
                }
@@ -897,8 +895,6 @@ static int qt_open(struct tty_struct *tty,
         * Put this here to make it responsive to stty and defaults set by
         * the tty layer
         */
-       /* FIXME: is this needed? */
-       /* qt_set_termios(tty, port, NULL); */
 
        /*  Check to see if we've set up our endpoint info yet */
        if (port0->open_ports == 1) {
@@ -1195,7 +1191,7 @@ static void qt_set_termios(struct tty_struct *tty,
                           struct usb_serial_port *port,
                           struct ktermios *old_termios)
 {
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        unsigned char new_LCR = 0;
        unsigned int cflag = termios->c_cflag;
        unsigned int index;
@@ -1204,7 +1200,7 @@ static void qt_set_termios(struct tty_struct *tty,
 
        index = tty->index - port->serial->minor;
 
-       switch (cflag) {
+       switch (cflag & CSIZE) {
        case CS5:
                new_LCR |= SERIAL_5_DATA;
                break;
@@ -1215,6 +1211,8 @@ static void qt_set_termios(struct tty_struct *tty,
                new_LCR |= SERIAL_7_DATA;
                break;
        default:
+               termios->c_cflag &= ~CSIZE;
+               termios->c_cflag |= CS8;
        case CS8:
                new_LCR |= SERIAL_8_DATA;
                break;
@@ -1301,7 +1299,7 @@ static void qt_set_termios(struct tty_struct *tty,
                        dbg(__FILE__ "BoxSetSW_FlowCtrl (diabling) failed\n");
 
        }
-       tty->termios->c_cflag &= ~CMSPAR;
+       termios->c_cflag &= ~CMSPAR;
        /* FIXME: Error cases should be returning the actual bits changed only */
 }
 
index 614271f..55d68b5 100644 (file)
@@ -1,8 +1,7 @@
 #ifndef _SPEAKUP_SERIAL_H
 #define _SPEAKUP_SERIAL_H
 
-#include <linux/serial.h>      /* for rs_table, serial constants &
-                                  serial_uart_config */
+#include <linux/serial.h>      /* for rs_table, serial constants */
 #include <linux/serial_reg.h>  /* for more serial constants */
 #ifndef __sparc__
 #include <asm/serial.h>
index c7df34e..7d056bd 100644 (file)
@@ -21,7 +21,7 @@
 /*  ----------------------------------- Host OS */
 #include <dspbridge/host_os.h>
 #include <plat/dmtimer.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 /*  ----------------------------------- DSP/BIOS Bridge */
 #include <dspbridge/dbdefs.h>
index f9609ce..7bf55c4 100644 (file)
@@ -16,7 +16,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#include <plat/dsp.h>
+#include <linux/platform_data/dsp-omap.h>
 
 #include <linux/types.h>
 /*  ----------------------------------- Host OS */
index 16a4aaf..55675b7 100644 (file)
@@ -19,7 +19,7 @@
 /*  ----------------------------------- Host OS */
 #include <dspbridge/host_os.h>
 
-#include <plat/dsp.h>
+#include <linux/platform_data/dsp-omap.h>
 
 /*  ----------------------------------- DSP/BIOS Bridge */
 #include <dspbridge/dbdefs.h>
index 7fda10c..f53ed98 100644 (file)
@@ -16,7 +16,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#include <plat/dsp.h>
+#include <linux/platform_data/dsp-omap.h>
 
 /*  ----------------------------------- DSP/BIOS Bridge */
 #include <dspbridge/dbdefs.h>
index 870f934..453ef74 100644 (file)
@@ -25,7 +25,7 @@
 #include <dspbridge/host_os.h>
 
 
-#define OMAP34XX_WDT3_BASE             (L4_PER_34XX_BASE + 0x30000)
+#define INT_34XX_WDT3_IRQ              (36 + NR_IRQS)
 
 static struct dsp_wdt_setting dsp_wdt;
 
index 3cac014..49c9b66 100644 (file)
@@ -16,7 +16,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#include <plat/dsp.h>
+#include <linux/platform_data/dsp-omap.h>
 
 #include <linux/types.h>
 #include <linux/platform_device.h>
index e4bdf2a..3aa895e 100644 (file)
@@ -200,7 +200,7 @@ s_vProcessRxMACHeader (
     } else if (!compare_ether_addr(pbyRxBuffer, &pDevice->abySNAP_RFC1042[0])) {
         cbHeaderSize += 6;
         pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize);
-       if ((*pwType == cpu_to_le16(ETH_P_IPX)) ||
+       if ((*pwType == cpu_to_be16(ETH_P_IPX)) ||
            (*pwType == cpu_to_le16(0xF380))) {
                cbHeaderSize -= 8;
             pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize);
index bb46452..b6e04e7 100644 (file)
@@ -1699,7 +1699,7 @@ s_bPacketToWirelessUsb(
     // 802.1H
     if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) {
        if (pDevice->dwDiagRefCount == 0) {
-               if ((psEthHeader->wType == cpu_to_le16(ETH_P_IPX)) ||
+               if ((psEthHeader->wType == cpu_to_be16(ETH_P_IPX)) ||
                    (psEthHeader->wType == cpu_to_le16(0xF380))) {
                        memcpy((PBYTE) (pbyPayloadHead),
                               abySNAP_Bridgetunnel, 6);
@@ -2838,10 +2838,10 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb)
     Packet_Type = skb->data[ETH_HLEN+1];
     Descriptor_type = skb->data[ETH_HLEN+1+1+2];
     Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]);
-    if (pDevice->sTxEthHeader.wType == cpu_to_le16(ETH_P_PAE)) {
-       /* 802.1x OR eapol-key challenge frame transfer */
-       if (((Protocol_Version == 1) || (Protocol_Version == 2)) &&
-               (Packet_Type == 3)) {
+       if (pDevice->sTxEthHeader.wType == cpu_to_be16(ETH_P_PAE)) {
+               /* 802.1x OR eapol-key challenge frame transfer */
+               if (((Protocol_Version == 1) || (Protocol_Version == 2)) &&
+                       (Packet_Type == 3)) {
                         bTxeapol_key = TRUE;
                        if(!(Key_info & BIT3) &&  //WPA or RSN group-key challenge
                           (Key_info & BIT8) && (Key_info & BIT9)) {    //send 2/2 key
@@ -2987,19 +2987,19 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb)
         }
     }
 
-    if (pDevice->sTxEthHeader.wType == cpu_to_le16(ETH_P_PAE)) {
-        if (pDevice->byBBType != BB_TYPE_11A) {
-            pDevice->wCurrentRate = RATE_1M;
-            pDevice->byACKRate = RATE_1M;
-            pDevice->byTopCCKBasicRate = RATE_1M;
-            pDevice->byTopOFDMBasicRate = RATE_6M;
-        } else {
-            pDevice->wCurrentRate = RATE_6M;
-            pDevice->byACKRate = RATE_6M;
-            pDevice->byTopCCKBasicRate = RATE_1M;
-            pDevice->byTopOFDMBasicRate = RATE_6M;
-        }
-    }
+       if (pDevice->sTxEthHeader.wType == cpu_to_be16(ETH_P_PAE)) {
+               if (pDevice->byBBType != BB_TYPE_11A) {
+                       pDevice->wCurrentRate = RATE_1M;
+                       pDevice->byACKRate = RATE_1M;
+                       pDevice->byTopCCKBasicRate = RATE_1M;
+                       pDevice->byTopOFDMBasicRate = RATE_6M;
+               } else {
+                       pDevice->wCurrentRate = RATE_6M;
+                       pDevice->byACKRate = RATE_6M;
+                       pDevice->byTopCCKBasicRate = RATE_1M;
+                       pDevice->byTopOFDMBasicRate = RATE_6M;
+               }
+       }
 
     DBG_PRT(MSG_LEVEL_DEBUG,
            KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n",
@@ -3015,7 +3015,7 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb)
 
     if (bNeedEncryption == TRUE) {
         DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType));
-       if ((pDevice->sTxEthHeader.wType) == cpu_to_le16(ETH_P_PAE)) {
+       if ((pDevice->sTxEthHeader.wType) == cpu_to_be16(ETH_P_PAE)) {
                bNeedEncryption = FALSE;
             DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType));
             if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) {
index fabff4d..0970127 100644 (file)
@@ -327,9 +327,9 @@ int prism2_get_station(struct wiphy *wiphy, struct net_device *dev,
        return result;
 }
 
-int prism2_scan(struct wiphy *wiphy, struct net_device *dev,
-               struct cfg80211_scan_request *request)
+int prism2_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
 {
+       struct net_device *dev = request->wdev->netdev;
        struct prism2_wiphy_private *priv = wiphy_priv(wiphy);
        wlandevice_t *wlandev = dev->ml_priv;
        struct p80211msg_dot11req_scan msg1;
index c214977..52b43b7 100644 (file)
@@ -1251,13 +1251,12 @@ static int zcache_pampd_get_data_and_free(char *data, size_t *bufsize, bool raw,
                                        void *pampd, struct tmem_pool *pool,
                                        struct tmem_oid *oid, uint32_t index)
 {
-       int ret = 0;
-
        BUG_ON(!is_ephemeral(pool));
-       zbud_decompress((struct page *)(data), pampd);
+       if (zbud_decompress((struct page *)(data), pampd) < 0)
+               return -EINVAL;
        zbud_free_and_delist((struct zbud_hdr *)pampd);
        atomic_dec(&zcache_curr_eph_pampd_count);
-       return ret;
+       return 0;
 }
 
 /*
index 0694d9b..6aba439 100644 (file)
@@ -221,6 +221,7 @@ static int iscsi_login_zero_tsih_s1(
 {
        struct iscsi_session *sess = NULL;
        struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf;
+       int ret;
 
        sess = kzalloc(sizeof(struct iscsi_session), GFP_KERNEL);
        if (!sess) {
@@ -257,9 +258,17 @@ static int iscsi_login_zero_tsih_s1(
                return -ENOMEM;
        }
        spin_lock(&sess_idr_lock);
-       idr_get_new(&sess_idr, NULL, &sess->session_index);
+       ret = idr_get_new(&sess_idr, NULL, &sess->session_index);
        spin_unlock(&sess_idr_lock);
 
+       if (ret < 0) {
+               pr_err("idr_get_new() for sess_idr failed\n");
+               iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
+                               ISCSI_LOGIN_STATUS_NO_RESOURCES);
+               kfree(sess);
+               return -ENOMEM;
+       }
+
        sess->creation_time = get_jiffies_64();
        spin_lock_init(&sess->session_stats_lock);
        /*
index 9179997..41641ba 100644 (file)
@@ -218,6 +218,13 @@ int target_emulate_set_target_port_groups(struct se_cmd *cmd)
                cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
                return -EINVAL;
        }
+       if (cmd->data_length < 4) {
+               pr_warn("SET TARGET PORT GROUPS parameter list length %u too"
+                       " small\n", cmd->data_length);
+               cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
+               return -EINVAL;
+       }
+
        buf = transport_kmap_data_sg(cmd);
 
        /*
index cf2c66f..9fc9a60 100644 (file)
@@ -669,6 +669,13 @@ int target_report_luns(struct se_cmd *se_cmd)
        unsigned char *buf;
        u32 lun_count = 0, offset = 8, i;
 
+       if (se_cmd->data_length < 16) {
+               pr_warn("REPORT LUNS allocation length %u too small\n",
+                       se_cmd->data_length);
+               se_cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
+               return -EINVAL;
+       }
+
        buf = transport_kmap_data_sg(se_cmd);
        if (!buf)
                return -ENOMEM;
index 76db75e..9ba4954 100644 (file)
@@ -325,17 +325,30 @@ static int iblock_execute_unmap(struct se_cmd *cmd)
        struct iblock_dev *ibd = dev->dev_ptr;
        unsigned char *buf, *ptr = NULL;
        sector_t lba;
-       int size = cmd->data_length;
+       int size;
        u32 range;
        int ret = 0;
        int dl, bd_dl;
 
+       if (cmd->data_length < 8) {
+               pr_warn("UNMAP parameter list length %u too small\n",
+                       cmd->data_length);
+               cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
+               return -EINVAL;
+       }
+
        buf = transport_kmap_data_sg(cmd);
 
        dl = get_unaligned_be16(&buf[0]);
        bd_dl = get_unaligned_be16(&buf[2]);
 
-       size = min(size - 8, bd_dl);
+       size = cmd->data_length - 8;
+       if (bd_dl > size)
+               pr_warn("UNMAP parameter list length %u too small, ignoring bd_dl %u\n",
+                       cmd->data_length, bd_dl);
+       else
+               size = bd_dl;
+
        if (size / 16 > dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count) {
                cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
                ret = -EINVAL;
index 1e94650..956c84c 100644 (file)
@@ -1540,6 +1540,14 @@ static int core_scsi3_decode_spec_i_port(
        tidh_new->dest_local_nexus = 1;
        list_add_tail(&tidh_new->dest_list, &tid_dest_list);
 
+       if (cmd->data_length < 28) {
+               pr_warn("SPC-PR: Received PR OUT parameter list"
+                       " length too small: %u\n", cmd->data_length);
+               cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST;
+               ret = -EINVAL;
+               goto out;
+       }
+
        buf = transport_kmap_data_sg(cmd);
        /*
         * For a PERSISTENT RESERVE OUT specify initiator ports payload,
index 5552fa7..9d7ce3d 100644 (file)
@@ -667,7 +667,8 @@ static void pscsi_free_device(void *p)
        kfree(pdv);
 }
 
-static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg)
+static void pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg,
+                                    unsigned char *sense_buffer)
 {
        struct pscsi_dev_virt *pdv = cmd->se_dev->dev_ptr;
        struct scsi_device *sd = pdv->pdv_sd;
@@ -679,7 +680,7 @@ static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg)
         * not been allocated because TCM is handling the emulation directly.
         */
        if (!pt)
-               return 0;
+               return;
 
        cdb = &pt->pscsi_cdb[0];
        result = pt->pscsi_result;
@@ -687,11 +688,11 @@ static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg)
         * Hack to make sure that Write-Protect modepage is set if R/O mode is
         * forced.
         */
+       if (!cmd->se_deve || !cmd->data_length)
+               goto after_mode_sense;
+
        if (((cdb[0] == MODE_SENSE) || (cdb[0] == MODE_SENSE_10)) &&
             (status_byte(result) << 1) == SAM_STAT_GOOD) {
-               if (!cmd->se_deve)
-                       goto after_mode_sense;
-
                if (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY) {
                        unsigned char *buf = transport_kmap_data_sg(cmd);
 
@@ -708,7 +709,7 @@ static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg)
        }
 after_mode_sense:
 
-       if (sd->type != TYPE_TAPE)
+       if (sd->type != TYPE_TAPE || !cmd->data_length)
                goto after_mode_select;
 
        /*
@@ -750,10 +751,10 @@ after_mode_sense:
        }
 after_mode_select:
 
-       if (status_byte(result) & CHECK_CONDITION)
-               return 1;
-
-       return 0;
+       if (sense_buffer && (status_byte(result) & CHECK_CONDITION)) {
+               memcpy(sense_buffer, pt->pscsi_sense, TRANSPORT_SENSE_BUFFER);
+               cmd->se_cmd_flags |= SCF_TRANSPORT_TASK_SENSE;
+       }
 }
 
 enum {
@@ -1184,13 +1185,6 @@ fail:
        return -ENOMEM;
 }
 
-static unsigned char *pscsi_get_sense_buffer(struct se_cmd *cmd)
-{
-       struct pscsi_plugin_task *pt = cmd->priv;
-
-       return pt->pscsi_sense;
-}
-
 /*     pscsi_get_device_rev():
  *
  *
@@ -1273,7 +1267,6 @@ static struct se_subsystem_api pscsi_template = {
        .check_configfs_dev_params = pscsi_check_configfs_dev_params,
        .set_configfs_dev_params = pscsi_set_configfs_dev_params,
        .show_configfs_dev_params = pscsi_show_configfs_dev_params,
-       .get_sense_buffer       = pscsi_get_sense_buffer,
        .get_device_rev         = pscsi_get_device_rev,
        .get_device_type        = pscsi_get_device_type,
        .get_blocks             = pscsi_get_blocks,
index 4c861de..388a922 100644 (file)
@@ -877,9 +877,11 @@ static int spc_emulate_modesense(struct se_cmd *cmd)
 static int spc_emulate_request_sense(struct se_cmd *cmd)
 {
        unsigned char *cdb = cmd->t_task_cdb;
-       unsigned char *buf;
+       unsigned char *rbuf;
        u8 ua_asc = 0, ua_ascq = 0;
-       int err = 0;
+       unsigned char buf[SE_SENSE_BUF];
+
+       memset(buf, 0, SE_SENSE_BUF);
 
        if (cdb[1] & 0x01) {
                pr_err("REQUEST_SENSE description emulation not"
@@ -888,20 +890,21 @@ static int spc_emulate_request_sense(struct se_cmd *cmd)
                return -ENOSYS;
        }
 
-       buf = transport_kmap_data_sg(cmd);
-
-       if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) {
+       rbuf = transport_kmap_data_sg(cmd);
+       if (cmd->scsi_sense_reason != 0) {
+               /*
+                * Out of memory.  We will fail with CHECK CONDITION, so
+                * we must not clear the unit attention condition.
+                */
+               target_complete_cmd(cmd, CHECK_CONDITION);
+               return 0;
+       } else if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) {
                /*
                 * CURRENT ERROR, UNIT ATTENTION
                 */
                buf[0] = 0x70;
                buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION;
 
-               if (cmd->data_length < 18) {
-                       buf[7] = 0x00;
-                       err = -EINVAL;
-                       goto end;
-               }
                /*
                 * The Additional Sense Code (ASC) from the UNIT ATTENTION
                 */
@@ -915,11 +918,6 @@ static int spc_emulate_request_sense(struct se_cmd *cmd)
                buf[0] = 0x70;
                buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE;
 
-               if (cmd->data_length < 18) {
-                       buf[7] = 0x00;
-                       err = -EINVAL;
-                       goto end;
-               }
                /*
                 * NO ADDITIONAL SENSE INFORMATION
                 */
@@ -927,8 +925,11 @@ static int spc_emulate_request_sense(struct se_cmd *cmd)
                buf[7] = 0x0A;
        }
 
-end:
-       transport_kunmap_data_sg(cmd);
+       if (rbuf) {
+               memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length));
+               transport_kunmap_data_sg(cmd);
+       }
+
        target_complete_cmd(cmd, GOOD);
        return 0;
 }
index 4de3186..269f544 100644 (file)
@@ -567,6 +567,34 @@ static void target_complete_failure_work(struct work_struct *work)
        transport_generic_request_failure(cmd);
 }
 
+/*
+ * Used when asking transport to copy Sense Data from the underlying
+ * Linux/SCSI struct scsi_cmnd
+ */
+static unsigned char *transport_get_sense_buffer(struct se_cmd *cmd)
+{
+       unsigned char *buffer = cmd->sense_buffer;
+       struct se_device *dev = cmd->se_dev;
+       u32 offset = 0;
+
+       WARN_ON(!cmd->se_lun);
+
+       if (!dev)
+               return NULL;
+
+       if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION)
+               return NULL;
+
+       offset = cmd->se_tfo->set_fabric_sense_len(cmd, TRANSPORT_SENSE_BUFFER);
+
+       /* Automatically padded */
+       cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER + offset;
+
+       pr_debug("HBA_[%u]_PLUG[%s]: Requesting sense for SAM STATUS: 0x%02x\n",
+               dev->se_hba->hba_id, dev->transport->name, cmd->scsi_status);
+       return &buffer[offset];
+}
+
 void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)
 {
        struct se_device *dev = cmd->se_dev;
@@ -580,11 +608,11 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)
        cmd->transport_state &= ~CMD_T_BUSY;
 
        if (dev && dev->transport->transport_complete) {
-               if (dev->transport->transport_complete(cmd,
-                               cmd->t_data_sg) != 0) {
-                       cmd->se_cmd_flags |= SCF_TRANSPORT_TASK_SENSE;
+               dev->transport->transport_complete(cmd,
+                               cmd->t_data_sg,
+                               transport_get_sense_buffer(cmd));
+               if (cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE)
                        success = 1;
-               }
        }
 
        /*
@@ -1181,15 +1209,20 @@ int target_cmd_size_check(struct se_cmd *cmd, unsigned int size)
                        /* Returns CHECK_CONDITION + INVALID_CDB_FIELD */
                        goto out_invalid_cdb_field;
                }
-
+               /*
+                * For the overflow case keep the existing fabric provided
+                * ->data_length.  Otherwise for the underflow case, reset
+                * ->data_length to the smaller SCSI expected data transfer
+                * length.
+                */
                if (size > cmd->data_length) {
                        cmd->se_cmd_flags |= SCF_OVERFLOW_BIT;
                        cmd->residual_count = (size - cmd->data_length);
                } else {
                        cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT;
                        cmd->residual_count = (cmd->data_length - size);
+                       cmd->data_length = size;
                }
-               cmd->data_length = size;
        }
 
        return 0;
@@ -1816,61 +1849,6 @@ execute:
 EXPORT_SYMBOL(target_execute_cmd);
 
 /*
- * Used to obtain Sense Data from underlying Linux/SCSI struct scsi_cmnd
- */
-static int transport_get_sense_data(struct se_cmd *cmd)
-{
-       unsigned char *buffer = cmd->sense_buffer, *sense_buffer = NULL;
-       struct se_device *dev = cmd->se_dev;
-       unsigned long flags;
-       u32 offset = 0;
-
-       WARN_ON(!cmd->se_lun);
-
-       if (!dev)
-               return 0;
-
-       spin_lock_irqsave(&cmd->t_state_lock, flags);
-       if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) {
-               spin_unlock_irqrestore(&cmd->t_state_lock, flags);
-               return 0;
-       }
-
-       if (!(cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE))
-               goto out;
-
-       if (!dev->transport->get_sense_buffer) {
-               pr_err("dev->transport->get_sense_buffer is NULL\n");
-               goto out;
-       }
-
-       sense_buffer = dev->transport->get_sense_buffer(cmd);
-       if (!sense_buffer) {
-               pr_err("ITT 0x%08x cmd %p: Unable to locate"
-                       " sense buffer for task with sense\n",
-                       cmd->se_tfo->get_task_tag(cmd), cmd);
-               goto out;
-       }
-
-       spin_unlock_irqrestore(&cmd->t_state_lock, flags);
-
-       offset = cmd->se_tfo->set_fabric_sense_len(cmd, TRANSPORT_SENSE_BUFFER);
-
-       memcpy(&buffer[offset], sense_buffer, TRANSPORT_SENSE_BUFFER);
-
-       /* Automatically padded */
-       cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER + offset;
-
-       pr_debug("HBA_[%u]_PLUG[%s]: Set SAM STATUS: 0x%02x and sense\n",
-               dev->se_hba->hba_id, dev->transport->name, cmd->scsi_status);
-       return 0;
-
-out:
-       spin_unlock_irqrestore(&cmd->t_state_lock, flags);
-       return -1;
-}
-
-/*
  * Process all commands up to the last received ORDERED task attribute which
  * requires another blocking boundary
  */
@@ -1985,7 +1963,7 @@ static void transport_handle_queue_full(
 static void target_complete_ok_work(struct work_struct *work)
 {
        struct se_cmd *cmd = container_of(work, struct se_cmd, work);
-       int reason = 0, ret;
+       int ret;
 
        /*
         * Check if we need to move delayed/dormant tasks from cmds on the
@@ -2002,23 +1980,19 @@ static void target_complete_ok_work(struct work_struct *work)
                schedule_work(&cmd->se_dev->qf_work_queue);
 
        /*
-        * Check if we need to retrieve a sense buffer from
+        * Check if we need to send a sense buffer from
         * the struct se_cmd in question.
         */
        if (cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) {
-               if (transport_get_sense_data(cmd) < 0)
-                       reason = TCM_NON_EXISTENT_LUN;
-
-               if (cmd->scsi_status) {
-                       ret = transport_send_check_condition_and_sense(
-                                       cmd, reason, 1);
-                       if (ret == -EAGAIN || ret == -ENOMEM)
-                               goto queue_full;
+               WARN_ON(!cmd->scsi_status);
+               ret = transport_send_check_condition_and_sense(
+                                       cmd, 0, 1);
+               if (ret == -EAGAIN || ret == -ENOMEM)
+                       goto queue_full;
 
-                       transport_lun_remove_cmd(cmd);
-                       transport_cmd_check_stop_to_fabric(cmd);
-                       return;
-               }
+               transport_lun_remove_cmd(cmd);
+               transport_cmd_check_stop_to_fabric(cmd);
+               return;
        }
        /*
         * Check for a callback, used by amongst other things
@@ -2216,7 +2190,6 @@ void *transport_kmap_data_sg(struct se_cmd *cmd)
        struct page **pages;
        int i;
 
-       BUG_ON(!sg);
        /*
         * We need to take into account a possible offset here for fabrics like
         * tcm_loop who may be using a contig buffer from the SCSI midlayer for
@@ -2224,13 +2197,17 @@ void *transport_kmap_data_sg(struct se_cmd *cmd)
         */
        if (!cmd->t_data_nents)
                return NULL;
-       else if (cmd->t_data_nents == 1)
+
+       BUG_ON(!sg);
+       if (cmd->t_data_nents == 1)
                return kmap(sg_page(sg)) + sg->offset;
 
        /* >1 page. use vmap */
        pages = kmalloc(sizeof(*pages) * cmd->t_data_nents, GFP_KERNEL);
-       if (!pages)
+       if (!pages) {
+               cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
                return NULL;
+       }
 
        /* convert sg[] to pages[] */
        for_each_sg(cmd->t_data_sg, sg, cmd->t_data_nents, i) {
@@ -2239,8 +2216,10 @@ void *transport_kmap_data_sg(struct se_cmd *cmd)
 
        cmd->t_data_vmap = vmap(pages, cmd->t_data_nents,  VM_MAP, PAGE_KERNEL);
        kfree(pages);
-       if (!cmd->t_data_vmap)
+       if (!cmd->t_data_vmap) {
+               cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
                return NULL;
+       }
 
        return cmd->t_data_vmap + cmd->t_data_sg[0].offset;
 }
@@ -2326,19 +2305,14 @@ int transport_generic_new_cmd(struct se_cmd *cmd)
         * into the fabric for data transfers, go ahead and complete it right
         * away.
         */
-       if (!cmd->data_length) {
+       if (!cmd->data_length &&
+           cmd->t_task_cdb[0] != REQUEST_SENSE &&
+           cmd->se_dev->transport->transport_type != TRANSPORT_PLUGIN_PHBA_PDEV) {
                spin_lock_irq(&cmd->t_state_lock);
                cmd->t_state = TRANSPORT_COMPLETE;
                cmd->transport_state |= CMD_T_ACTIVE;
                spin_unlock_irq(&cmd->t_state_lock);
 
-               if (cmd->t_task_cdb[0] == REQUEST_SENSE) {
-                       u8 ua_asc = 0, ua_ascq = 0;
-
-                       core_scsi3_ua_clear_for_request_sense(cmd,
-                                       &ua_asc, &ua_ascq);
-               }
-
                INIT_WORK(&cmd->work, target_complete_ok_work);
                queue_work(target_completion_wq, &cmd->work);
                return 0;
index 6cc4358..42d0a25 100644 (file)
@@ -420,7 +420,7 @@ static void check_modem_status(struct serial_state *info)
                                tty_hangup(port->tty);
                }
        }
-       if (port->flags & ASYNC_CTS_FLOW) {
+       if (tty_port_cts_enabled(port)) {
                if (port->tty->hw_stopped) {
                        if (!(status & SER_CTS)) {
 #if (defined(SERIAL_DEBUG_INTR) || defined(SERIAL_DEBUG_FLOW))
@@ -646,7 +646,7 @@ static void shutdown(struct tty_struct *tty, struct serial_state *info)
        custom.adkcon = AC_UARTBRK;
        mb();
 
-       if (tty->termios->c_cflag & HUPCL)
+       if (tty->termios.c_cflag & HUPCL)
                info->MCR &= ~(SER_DTR|SER_RTS);
        rtsdtr_ctrl(info->MCR);
 
@@ -670,7 +670,7 @@ static void change_speed(struct tty_struct *tty, struct serial_state *info,
        int     bits;
        unsigned long   flags;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        /* Byte size is always 8 bits plus parity bit if requested */
 
@@ -707,8 +707,8 @@ static void change_speed(struct tty_struct *tty, struct serial_state *info,
        /* If the quotient is zero refuse the change */
        if (!quot && old_termios) {
                /* FIXME: Will need updating for new tty in the end */
-               tty->termios->c_cflag &= ~CBAUD;
-               tty->termios->c_cflag |= (old_termios->c_cflag & CBAUD);
+               tty->termios.c_cflag &= ~CBAUD;
+               tty->termios.c_cflag |= (old_termios->c_cflag & CBAUD);
                baud = tty_get_baud_rate(tty);
                if (!baud)
                        baud = 9600;
@@ -984,7 +984,7 @@ static void rs_throttle(struct tty_struct * tty)
        if (I_IXOFF(tty))
                rs_send_xchar(tty, STOP_CHAR(tty));
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                info->MCR &= ~SER_RTS;
 
        local_irq_save(flags);
@@ -1012,7 +1012,7 @@ static void rs_unthrottle(struct tty_struct * tty)
                else
                        rs_send_xchar(tty, START_CHAR(tty));
        }
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                info->MCR |= SER_RTS;
        local_irq_save(flags);
        rtsdtr_ctrl(info->MCR);
@@ -1033,7 +1033,7 @@ static int get_serial_info(struct tty_struct *tty, struct serial_state *state,
        if (!retinfo)
                return -EFAULT;
        memset(&tmp, 0, sizeof(tmp));
-       tty_lock();
+       tty_lock(tty);
        tmp.line = tty->index;
        tmp.port = state->port;
        tmp.flags = state->tport.flags;
@@ -1042,7 +1042,7 @@ static int get_serial_info(struct tty_struct *tty, struct serial_state *state,
        tmp.close_delay = state->tport.close_delay;
        tmp.closing_wait = state->tport.closing_wait;
        tmp.custom_divisor = state->custom_divisor;
-       tty_unlock();
+       tty_unlock(tty);
        if (copy_to_user(retinfo,&tmp,sizeof(*retinfo)))
                return -EFAULT;
        return 0;
@@ -1059,12 +1059,12 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state,
        if (copy_from_user(&new_serial,new_info,sizeof(new_serial)))
                return -EFAULT;
 
-       tty_lock();
+       tty_lock(tty);
        change_spd = ((new_serial.flags ^ port->flags) & ASYNC_SPD_MASK) ||
                new_serial.custom_divisor != state->custom_divisor;
        if (new_serial.irq || new_serial.port != state->port ||
                        new_serial.xmit_fifo_size != state->xmit_fifo_size) {
-               tty_unlock();
+               tty_unlock(tty);
                return -EINVAL;
        }
   
@@ -1074,7 +1074,7 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state,
                    (new_serial.xmit_fifo_size != state->xmit_fifo_size) ||
                    ((new_serial.flags & ~ASYNC_USR_MASK) !=
                     (port->flags & ~ASYNC_USR_MASK))) {
-                       tty_unlock();
+                       tty_unlock(tty);
                        return -EPERM;
                }
                port->flags = ((port->flags & ~ASYNC_USR_MASK) |
@@ -1084,7 +1084,7 @@ static int set_serial_info(struct tty_struct *tty, struct serial_state *state,
        }
 
        if (new_serial.baud_base < 9600) {
-               tty_unlock();
+               tty_unlock(tty);
                return -EINVAL;
        }
 
@@ -1116,7 +1116,7 @@ check_and_exit:
                }
        } else
                retval = startup(tty, state);
-       tty_unlock();
+       tty_unlock(tty);
        return retval;
 }
 
@@ -1330,7 +1330,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 {
        struct serial_state *info = tty->driver_data;
        unsigned long flags;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
        change_speed(tty, info, old_termios);
 
@@ -1347,7 +1347,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
        if (!(old_termios->c_cflag & CBAUD) &&
            (cflag & CBAUD)) {
                info->MCR |= SER_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) || 
+               if (!(tty->termios.c_cflag & CRTSCTS) || 
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        info->MCR |= SER_RTS;
                }
@@ -1358,7 +1358,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
        /* Handle turning off CRTSCTS */
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                rs_start(tty);
        }
@@ -1371,7 +1371,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
         * or not.  Hence, this may change.....
         */
        if (!(old_termios->c_cflag & CLOCAL) &&
-           (tty->termios->c_cflag & CLOCAL))
+           (tty->termios.c_cflag & CLOCAL))
                wake_up_interruptible(&info->open_wait);
 #endif
 }
@@ -1710,10 +1710,6 @@ static int __init amiga_serial_probe(struct platform_device *pdev)
        serial_driver->flags = TTY_DRIVER_REAL_RAW;
        tty_set_operations(serial_driver, &serial_ops);
 
-       error = tty_register_driver(serial_driver);
-       if (error)
-               goto fail_put_tty_driver;
-
        state = rs_table;
        state->port = (int)&custom.serdatr; /* Just to give it a value */
        state->custom_divisor = 0;
@@ -1724,6 +1720,11 @@ static int __init amiga_serial_probe(struct platform_device *pdev)
        state->icount.overrun = state->icount.brk = 0;
        tty_port_init(&state->tport);
        state->tport.ops = &amiga_port_ops;
+       tty_port_link_device(&state->tport, serial_driver, 0);
+
+       error = tty_register_driver(serial_driver);
+       if (error)
+               goto fail_put_tty_driver;
 
        printk(KERN_INFO "ttyS0 is the amiga builtin serial port\n");
 
index 61fc74f..02b7d3a 100644 (file)
@@ -263,6 +263,7 @@ static int __init bfin_jc_init(void)
        bfin_jc_driver->subtype      = SERIAL_TYPE_NORMAL;
        bfin_jc_driver->init_termios = tty_std_termios;
        tty_set_operations(bfin_jc_driver, &bfin_jc_ops);
+       tty_port_link_device(&port, bfin_jc_driver, 0);
 
        ret = tty_register_driver(bfin_jc_driver);
        if (ret)
index e61cabd..0a6a0bc 100644 (file)
@@ -727,7 +727,7 @@ static void cyy_chip_modem(struct cyclades_card *cinfo, int chip,
                else
                        tty_hangup(tty);
        }
-       if ((mdm_change & CyCTS) && (info->port.flags & ASYNC_CTS_FLOW)) {
+       if ((mdm_change & CyCTS) && tty_port_cts_enabled(&info->port)) {
                if (tty->hw_stopped) {
                        if (mdm_status & CyCTS) {
                                /* cy_start isn't used
@@ -1459,7 +1459,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty)
                        info->port.xmit_buf = NULL;
                        free_page((unsigned long)temp);
                }
-               if (tty->termios->c_cflag & HUPCL)
+               if (tty->termios.c_cflag & HUPCL)
                        cyy_change_rts_dtr(info, 0, TIOCM_RTS | TIOCM_DTR);
 
                cyy_issue_cmd(info, CyCHAN_CTL | CyDIS_RCVR);
@@ -1488,7 +1488,7 @@ static void cy_shutdown(struct cyclades_port *info, struct tty_struct *tty)
                        free_page((unsigned long)temp);
                }
 
-               if (tty->termios->c_cflag & HUPCL)
+               if (tty->termios.c_cflag & HUPCL)
                        tty_port_lower_dtr_rts(&info->port);
 
                set_bit(TTY_IO_ERROR, &tty->flags);
@@ -1599,7 +1599,7 @@ static int cy_open(struct tty_struct *tty, struct file *filp)
         * If the port is the middle of closing, bail out now
         */
        if (tty_hung_up_p(filp) || (info->port.flags & ASYNC_CLOSING)) {
-               wait_event_interruptible_tty(info->port.close_wait,
+               wait_event_interruptible_tty(tty, info->port.close_wait,
                                !(info->port.flags & ASYNC_CLOSING));
                return (info->port.flags & ASYNC_HUP_NOTIFY) ? -EAGAIN: -ERESTARTSYS;
        }
@@ -1999,14 +1999,11 @@ static void cy_set_line_char(struct cyclades_port *info, struct tty_struct *tty)
        int baud, baud_rate = 0;
        int i;
 
-       if (!tty->termios) /* XXX can this happen at all? */
-               return;
-
        if (info->line == -1)
                return;
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        /*
         * Set up the tty->alt_speed kludge
@@ -2825,7 +2822,7 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
        cy_set_line_char(info, tty);
 
        if ((old_termios->c_cflag & CRTSCTS) &&
-                       !(tty->termios->c_cflag & CRTSCTS)) {
+                       !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                cy_start(tty);
        }
@@ -2837,7 +2834,7 @@ static void cy_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
         * or not.  Hence, this may change.....
         */
        if (!(old_termios->c_cflag & CLOCAL) &&
-           (tty->termios->c_cflag & CLOCAL))
+           (tty->termios.c_cflag & CLOCAL))
                wake_up_interruptible(&info->port.open_wait);
 #endif
 }                              /* cy_set_termios */
@@ -2899,7 +2896,7 @@ static void cy_throttle(struct tty_struct *tty)
                        info->throttle = 1;
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                if (!cy_is_Z(card)) {
                        spin_lock_irqsave(&card->card_lock, flags);
                        cyy_change_rts_dtr(info, 0, TIOCM_RTS);
@@ -2938,7 +2935,7 @@ static void cy_unthrottle(struct tty_struct *tty)
                        cy_send_xchar(tty, START_CHAR(tty));
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                card = info->card;
                if (!cy_is_Z(card)) {
                        spin_lock_irqsave(&card->card_lock, flags);
@@ -3289,9 +3286,10 @@ static unsigned short __devinit cyy_init_card(void __iomem *true_base_addr,
 static int __init cy_detect_isa(void)
 {
 #ifdef CONFIG_ISA
+       struct cyclades_card *card;
        unsigned short cy_isa_irq, nboard;
        void __iomem *cy_isa_address;
-       unsigned short i, j, cy_isa_nchan;
+       unsigned short i, j, k, cy_isa_nchan;
        int isparam = 0;
 
        nboard = 0;
@@ -3349,7 +3347,8 @@ static int __init cy_detect_isa(void)
                }
                /* fill the next cy_card structure available */
                for (j = 0; j < NR_CARDS; j++) {
-                       if (cy_card[j].base_addr == NULL)
+                       card = &cy_card[j];
+                       if (card->base_addr == NULL)
                                break;
                }
                if (j == NR_CARDS) {    /* no more cy_cards available */
@@ -3363,7 +3362,7 @@ static int __init cy_detect_isa(void)
 
                /* allocate IRQ */
                if (request_irq(cy_isa_irq, cyy_interrupt,
-                               0, "Cyclom-Y", &cy_card[j])) {
+                               0, "Cyclom-Y", card)) {
                        printk(KERN_ERR "Cyclom-Y/ISA found at 0x%lx, but "
                                "could not allocate IRQ#%d.\n",
                                (unsigned long)cy_isa_address, cy_isa_irq);
@@ -3372,16 +3371,16 @@ static int __init cy_detect_isa(void)
                }
 
                /* set cy_card */
-               cy_card[j].base_addr = cy_isa_address;
-               cy_card[j].ctl_addr.p9050 = NULL;
-               cy_card[j].irq = (int)cy_isa_irq;
-               cy_card[j].bus_index = 0;
-               cy_card[j].first_line = cy_next_channel;
-               cy_card[j].num_chips = cy_isa_nchan / CyPORTS_PER_CHIP;
-               cy_card[j].nports = cy_isa_nchan;
-               if (cy_init_card(&cy_card[j])) {
-                       cy_card[j].base_addr = NULL;
-                       free_irq(cy_isa_irq, &cy_card[j]);
+               card->base_addr = cy_isa_address;
+               card->ctl_addr.p9050 = NULL;
+               card->irq = (int)cy_isa_irq;
+               card->bus_index = 0;
+               card->first_line = cy_next_channel;
+               card->num_chips = cy_isa_nchan / CyPORTS_PER_CHIP;
+               card->nports = cy_isa_nchan;
+               if (cy_init_card(card)) {
+                       card->base_addr = NULL;
+                       free_irq(cy_isa_irq, card);
                        iounmap(cy_isa_address);
                        continue;
                }
@@ -3393,9 +3392,10 @@ static int __init cy_detect_isa(void)
                        (unsigned long)(cy_isa_address + (CyISA_Ywin - 1)),
                        cy_isa_irq, cy_isa_nchan, cy_next_channel);
 
-               for (j = cy_next_channel;
-                               j < cy_next_channel + cy_isa_nchan; j++)
-                       tty_register_device(cy_serial_driver, j, NULL);
+               for (k = 0, j = cy_next_channel;
+                               j < cy_next_channel + cy_isa_nchan; j++, k++)
+                       tty_port_register_device(&card->ports[k].port,
+                                       cy_serial_driver, j, NULL);
                cy_next_channel += cy_isa_nchan;
        }
        return nboard;
@@ -3695,10 +3695,11 @@ err:
 static int __devinit cy_pci_probe(struct pci_dev *pdev,
                const struct pci_device_id *ent)
 {
+       struct cyclades_card *card;
        void __iomem *addr0 = NULL, *addr2 = NULL;
        char *card_name = NULL;
        u32 uninitialized_var(mailbox);
-       unsigned int device_id, nchan = 0, card_no, i;
+       unsigned int device_id, nchan = 0, card_no, i, j;
        unsigned char plx_ver;
        int retval, irq;
 
@@ -3829,7 +3830,8 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
        }
        /* fill the next cy_card structure available */
        for (card_no = 0; card_no < NR_CARDS; card_no++) {
-               if (cy_card[card_no].base_addr == NULL)
+               card = &cy_card[card_no];
+               if (card->base_addr == NULL)
                        break;
        }
        if (card_no == NR_CARDS) {      /* no more cy_cards available */
@@ -3843,27 +3845,26 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
                        device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
                /* allocate IRQ */
                retval = request_irq(irq, cyy_interrupt,
-                               IRQF_SHARED, "Cyclom-Y", &cy_card[card_no]);
+                               IRQF_SHARED, "Cyclom-Y", card);
                if (retval) {
                        dev_err(&pdev->dev, "could not allocate IRQ\n");
                        goto err_unmap;
                }
-               cy_card[card_no].num_chips = nchan / CyPORTS_PER_CHIP;
+               card->num_chips = nchan / CyPORTS_PER_CHIP;
        } else {
                struct FIRM_ID __iomem *firm_id = addr2 + ID_ADDRESS;
                struct ZFW_CTRL __iomem *zfw_ctrl;
 
                zfw_ctrl = addr2 + (readl(&firm_id->zfwctrl_addr) & 0xfffff);
 
-               cy_card[card_no].hw_ver = mailbox;
-               cy_card[card_no].num_chips = (unsigned int)-1;
-               cy_card[card_no].board_ctrl = &zfw_ctrl->board_ctrl;
+               card->hw_ver = mailbox;
+               card->num_chips = (unsigned int)-1;
+               card->board_ctrl = &zfw_ctrl->board_ctrl;
 #ifdef CONFIG_CYZ_INTR
                /* allocate IRQ only if board has an IRQ */
                if (irq != 0 && irq != 255) {
                        retval = request_irq(irq, cyz_interrupt,
-                                       IRQF_SHARED, "Cyclades-Z",
-                                       &cy_card[card_no]);
+                                       IRQF_SHARED, "Cyclades-Z", card);
                        if (retval) {
                                dev_err(&pdev->dev, "could not allocate IRQ\n");
                                goto err_unmap;
@@ -3873,17 +3874,17 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
        }
 
        /* set cy_card */
-       cy_card[card_no].base_addr = addr2;
-       cy_card[card_no].ctl_addr.p9050 = addr0;
-       cy_card[card_no].irq = irq;
-       cy_card[card_no].bus_index = 1;
-       cy_card[card_no].first_line = cy_next_channel;
-       cy_card[card_no].nports = nchan;
-       retval = cy_init_card(&cy_card[card_no]);
+       card->base_addr = addr2;
+       card->ctl_addr.p9050 = addr0;
+       card->irq = irq;
+       card->bus_index = 1;
+       card->first_line = cy_next_channel;
+       card->nports = nchan;
+       retval = cy_init_card(card);
        if (retval)
                goto err_null;
 
-       pci_set_drvdata(pdev, &cy_card[card_no]);
+       pci_set_drvdata(pdev, card);
 
        if (device_id == PCI_DEVICE_ID_CYCLOM_Y_Lo ||
                        device_id == PCI_DEVICE_ID_CYCLOM_Y_Hi) {
@@ -3909,14 +3910,15 @@ static int __devinit cy_pci_probe(struct pci_dev *pdev,
 
        dev_info(&pdev->dev, "%s/PCI #%d found: %d channels starting from "
                "port %d.\n", card_name, card_no + 1, nchan, cy_next_channel);
-       for (i = cy_next_channel; i < cy_next_channel + nchan; i++)
-               tty_register_device(cy_serial_driver, i, &pdev->dev);
+       for (j = 0, i = cy_next_channel; i < cy_next_channel + nchan; i++, j++)
+               tty_port_register_device(&card->ports[j].port,
+                               cy_serial_driver, i, &pdev->dev);
        cy_next_channel += nchan;
 
        return 0;
 err_null:
-       cy_card[card_no].base_addr = NULL;
-       free_irq(irq, &cy_card[card_no]);
+       card->base_addr = NULL;
+       free_irq(irq, card);
 err_unmap:
        iounmap(addr0);
        if (addr2)
index 4813684..4ab936b 100644 (file)
@@ -738,16 +738,17 @@ static int __devinit ehv_bc_tty_probe(struct platform_device *pdev)
                goto error;
        }
 
-       bc->dev = tty_register_device(ehv_bc_driver, i, &pdev->dev);
+       tty_port_init(&bc->port);
+       bc->port.ops = &ehv_bc_tty_port_ops;
+
+       bc->dev = tty_port_register_device(&bc->port, ehv_bc_driver, i,
+                       &pdev->dev);
        if (IS_ERR(bc->dev)) {
                ret = PTR_ERR(bc->dev);
                dev_err(&pdev->dev, "could not register tty (ret=%i)\n", ret);
                goto error;
        }
 
-       tty_port_init(&bc->port);
-       bc->port.ops = &ehv_bc_tty_port_ops;
-
        dev_set_drvdata(&pdev->dev, bc);
 
        dev_info(&pdev->dev, "registered /dev/%s%u for byte channel %u\n",
index 2d691eb..7f80f15 100644 (file)
@@ -299,20 +299,33 @@ static void hvc_unthrottle(struct tty_struct *tty)
        hvc_kick();
 }
 
+static int hvc_install(struct tty_driver *driver, struct tty_struct *tty)
+{
+       struct hvc_struct *hp;
+       int rc;
+
+       /* Auto increments kref reference if found. */
+       if (!(hp = hvc_get_by_index(tty->index)))
+               return -ENODEV;
+
+       tty->driver_data = hp;
+
+       rc = tty_port_install(&hp->port, driver, tty);
+       if (rc)
+               tty_port_put(&hp->port);
+       return rc;
+}
+
 /*
  * The TTY interface won't be used until after the vio layer has exposed the vty
  * adapter to the kernel.
  */
 static int hvc_open(struct tty_struct *tty, struct file * filp)
 {
-       struct hvc_struct *hp;
+       struct hvc_struct *hp = tty->driver_data;
        unsigned long flags;
        int rc = 0;
 
-       /* Auto increments kref reference if found. */
-       if (!(hp = hvc_get_by_index(tty->index)))
-               return -ENODEV;
-
        spin_lock_irqsave(&hp->port.lock, flags);
        /* Check and then increment for fast path open. */
        if (hp->port.count++ > 0) {
@@ -322,7 +335,6 @@ static int hvc_open(struct tty_struct *tty, struct file * filp)
        } /* else count == 0 */
        spin_unlock_irqrestore(&hp->port.lock, flags);
 
-       tty->driver_data = hp;
        tty_port_tty_set(&hp->port, tty);
 
        if (hp->ops->notifier_add)
@@ -389,6 +401,11 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
                                hp->vtermno, hp->port.count);
                spin_unlock_irqrestore(&hp->port.lock, flags);
        }
+}
+
+static void hvc_cleanup(struct tty_struct *tty)
+{
+       struct hvc_struct *hp = tty->driver_data;
 
        tty_port_put(&hp->port);
 }
@@ -792,8 +809,10 @@ static void hvc_poll_put_char(struct tty_driver *driver, int line, char ch)
 #endif
 
 static const struct tty_operations hvc_ops = {
+       .install = hvc_install,
        .open = hvc_open,
        .close = hvc_close,
+       .cleanup = hvc_cleanup,
        .write = hvc_write,
        .hangup = hvc_hangup,
        .unthrottle = hvc_unthrottle,
index d56788c..cab5c7a 100644 (file)
@@ -1102,27 +1102,20 @@ static struct hvcs_struct *hvcs_get_by_index(int index)
        return NULL;
 }
 
-/*
- * This is invoked via the tty_open interface when a user app connects to the
- * /dev node.
- */
-static int hvcs_open(struct tty_struct *tty, struct file *filp)
+static int hvcs_install(struct tty_driver *driver, struct tty_struct *tty)
 {
        struct hvcs_struct *hvcsd;
-       int rc, retval = 0;
-       unsigned long flags;
-       unsigned int irq;
        struct vio_dev *vdev;
-       unsigned long unit_address;
-
-       if (tty->driver_data)
-               goto fast_open;
+       unsigned long unit_address, flags;
+       unsigned int irq;
+       int retval;
 
        /*
         * Is there a vty-server that shares the same index?
         * This function increments the kref index.
         */
-       if (!(hvcsd = hvcs_get_by_index(tty->index))) {
+       hvcsd = hvcs_get_by_index(tty->index);
+       if (!hvcsd) {
                printk(KERN_WARNING "HVCS: open failed, no device associated"
                                " with tty->index %d.\n", tty->index);
                return -ENODEV;
@@ -1130,11 +1123,16 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp)
 
        spin_lock_irqsave(&hvcsd->lock, flags);
 
-       if (hvcsd->connected == 0)
-               if ((retval = hvcs_partner_connect(hvcsd)))
-                       goto error_release;
+       if (hvcsd->connected == 0) {
+               retval = hvcs_partner_connect(hvcsd);
+               if (retval) {
+                       spin_unlock_irqrestore(&hvcsd->lock, flags);
+                       printk(KERN_WARNING "HVCS: partner connect failed.\n");
+                       goto err_put;
+               }
+       }
 
-       hvcsd->port.count = 1;
+       hvcsd->port.count = 0;
        hvcsd->port.tty = tty;
        tty->driver_data = hvcsd;
 
@@ -1155,37 +1153,48 @@ static int hvcs_open(struct tty_struct *tty, struct file *filp)
         * This must be done outside of the spinlock because it requests irqs
         * and will grab the spinlock and free the connection if it fails.
         */
-       if (((rc = hvcs_enable_device(hvcsd, unit_address, irq, vdev)))) {
-               tty_port_put(&hvcsd->port);
+       retval = hvcs_enable_device(hvcsd, unit_address, irq, vdev);
+       if (retval) {
                printk(KERN_WARNING "HVCS: enable device failed.\n");
-               return rc;
+               goto err_put;
        }
 
-       goto open_success;
+       retval = tty_port_install(&hvcsd->port, driver, tty);
+       if (retval)
+               goto err_irq;
 
-fast_open:
-       hvcsd = tty->driver_data;
+       return 0;
+err_irq:
+       spin_lock_irqsave(&hvcsd->lock, flags);
+       vio_disable_interrupts(hvcsd->vdev);
+       spin_unlock_irqrestore(&hvcsd->lock, flags);
+       free_irq(irq, hvcsd);
+err_put:
+       tty_port_put(&hvcsd->port);
+
+       return retval;
+}
+
+/*
+ * This is invoked via the tty_open interface when a user app connects to the
+ * /dev node.
+ */
+static int hvcs_open(struct tty_struct *tty, struct file *filp)
+{
+       struct hvcs_struct *hvcsd = tty->driver_data;
+       unsigned long flags;
 
        spin_lock_irqsave(&hvcsd->lock, flags);
-       tty_port_get(&hvcsd->port);
        hvcsd->port.count++;
        hvcsd->todo_mask |= HVCS_SCHED_READ;
        spin_unlock_irqrestore(&hvcsd->lock, flags);
 
-open_success:
        hvcs_kick();
 
        printk(KERN_INFO "HVCS: vty-server@%X connection opened.\n",
                hvcsd->vdev->unit_address );
 
        return 0;
-
-error_release:
-       spin_unlock_irqrestore(&hvcsd->lock, flags);
-       tty_port_put(&hvcsd->port);
-
-       printk(KERN_WARNING "HVCS: partner connect failed.\n");
-       return retval;
 }
 
 static void hvcs_close(struct tty_struct *tty, struct file *filp)
@@ -1236,7 +1245,6 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp)
                tty->driver_data = NULL;
 
                free_irq(irq, hvcsd);
-               tty_port_put(&hvcsd->port);
                return;
        } else if (hvcsd->port.count < 0) {
                printk(KERN_ERR "HVCS: vty-server@%X open_count: %d"
@@ -1245,6 +1253,12 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp)
        }
 
        spin_unlock_irqrestore(&hvcsd->lock, flags);
+}
+
+static void hvcs_cleanup(struct tty_struct * tty)
+{
+       struct hvcs_struct *hvcsd = tty->driver_data;
+
        tty_port_put(&hvcsd->port);
 }
 
@@ -1431,8 +1445,10 @@ static int hvcs_chars_in_buffer(struct tty_struct *tty)
 }
 
 static const struct tty_operations hvcs_ops = {
+       .install = hvcs_install,
        .open = hvcs_open,
        .close = hvcs_close,
+       .cleanup = hvcs_cleanup,
        .hangup = hvcs_hangup,
        .write = hvcs_write,
        .write_room = hvcs_write_room,
index 6f5bc49..0083bc1 100644 (file)
@@ -1080,6 +1080,8 @@ static int __init hvsi_init(void)
                struct hvsi_struct *hp = &hvsi_ports[i];
                int ret = 1;
 
+               tty_port_link_device(&hp->port, hvsi_driver, i);
+
                ret = request_irq(hp->virq, hvsi_interrupt, 0, "hvsi", hp);
                if (ret)
                        printk(KERN_ERR "HVSI: couldn't reserve irq 0x%x (error %i)\n",
index 59c135d..3396eb9 100644 (file)
@@ -400,7 +400,7 @@ void hvsilib_close(struct hvsi_priv *pv, struct hvc_struct *hp)
                spin_unlock_irqrestore(&hp->lock, flags);
 
                /* Clear our own DTR */
-               if (!pv->tty || (pv->tty->termios->c_cflag & HUPCL))
+               if (!pv->tty || (pv->tty->termios.c_cflag & HUPCL))
                        hvsilib_write_mctrl(pv, 0);
 
                /* Tear down the connection */
index f8b5fa0..160f0ad 100644 (file)
@@ -476,7 +476,7 @@ static int add_tty(int j,
        mutex_init(&ttys[j]->ipw_tty_mutex);
        tty_port_init(&ttys[j]->port);
 
-       tty_register_device(ipw_tty_driver, j, NULL);
+       tty_port_register_device(&ttys[j]->port, ipw_tty_driver, j, NULL);
        ipwireless_associate_network_tty(network, channel_idx, ttys[j]);
 
        if (secondary_channel_idx != -1)
index e1235ac..d7492e1 100644 (file)
@@ -600,7 +600,7 @@ static irqreturn_t isicom_interrupt(int irq, void *dev_id)
                                        port->status &= ~ISI_DCD;
                        }
 
-                       if (port->port.flags & ASYNC_CTS_FLOW) {
+                       if (tty_port_cts_enabled(&port->port)) {
                                if (tty->hw_stopped) {
                                        if (header & ISI_CTS) {
                                                port->port.tty->hw_stopped = 0;
@@ -702,7 +702,7 @@ static void isicom_config_port(struct tty_struct *tty)
 
                /* 1,2,3,4 => 57.6, 115.2, 230, 460 kbps resp. */
                if (baud < 1 || baud > 4)
-                       tty->termios->c_cflag &= ~CBAUDEX;
+                       tty->termios.c_cflag &= ~CBAUDEX;
                else
                        baud += 15;
        }
@@ -1196,8 +1196,8 @@ static void isicom_set_termios(struct tty_struct *tty,
        if (isicom_paranoia_check(port, tty->name, "isicom_set_termios"))
                return;
 
-       if (tty->termios->c_cflag == old_termios->c_cflag &&
-                       tty->termios->c_iflag == old_termios->c_iflag)
+       if (tty->termios.c_cflag == old_termios->c_cflag &&
+                       tty->termios.c_iflag == old_termios->c_iflag)
                return;
 
        spin_lock_irqsave(&port->card->card_lock, flags);
@@ -1205,7 +1205,7 @@ static void isicom_set_termios(struct tty_struct *tty,
        spin_unlock_irqrestore(&port->card->card_lock, flags);
 
        if ((old_termios->c_cflag & CRTSCTS) &&
-                       !(tty->termios->c_cflag & CRTSCTS)) {
+                       !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                isicom_start(tty);
        }
@@ -1611,7 +1611,8 @@ static int __devinit isicom_probe(struct pci_dev *pdev,
                goto errunri;
 
        for (index = 0; index < board->port_count; index++)
-               tty_register_device(isicom_normal, board->index * 16 + index,
+               tty_port_register_device(&board->ports[index].port,
+                               isicom_normal, board->index * 16 + index,
                                &pdev->dev);
 
        return 0;
index 324467d..56e616b 100644 (file)
@@ -169,6 +169,7 @@ static DEFINE_SPINLOCK(moxa_lock);
 static unsigned long baseaddr[MAX_BOARDS];
 static unsigned int type[MAX_BOARDS];
 static unsigned int numports[MAX_BOARDS];
+static struct tty_port moxa_service_port;
 
 MODULE_AUTHOR("William Chen");
 MODULE_DESCRIPTION("MOXA Intellio Family Multiport Board Device Driver");
@@ -367,10 +368,10 @@ static int moxa_ioctl(struct tty_struct *tty,
                                        tmp.dcd = 1;
 
                                ttyp = tty_port_tty_get(&p->port);
-                               if (!ttyp || !ttyp->termios)
+                               if (!ttyp)
                                        tmp.cflag = p->cflag;
                                else
-                                       tmp.cflag = ttyp->termios->c_cflag;
+                                       tmp.cflag = ttyp->termios.c_cflag;
                                tty_kref_put(ttyp);
 copy:
                                if (copy_to_user(argm, &tmp, sizeof(tmp)))
@@ -834,7 +835,7 @@ static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev)
        const struct firmware *fw;
        const char *file;
        struct moxa_port *p;
-       unsigned int i;
+       unsigned int i, first_idx;
        int ret;
 
        brd->ports = kcalloc(MAX_PORTS_PER_BOARD, sizeof(*brd->ports),
@@ -887,6 +888,11 @@ static int moxa_init_board(struct moxa_board_conf *brd, struct device *dev)
                mod_timer(&moxaTimer, jiffies + HZ / 50);
        spin_unlock_bh(&moxa_lock);
 
+       first_idx = (brd - moxa_boards) * MAX_PORTS_PER_BOARD;
+       for (i = 0; i < brd->numPorts; i++)
+               tty_port_register_device(&brd->ports[i].port, moxaDriver,
+                               first_idx + i, dev);
+
        return 0;
 err_free:
        kfree(brd->ports);
@@ -896,7 +902,7 @@ err:
 
 static void moxa_board_deinit(struct moxa_board_conf *brd)
 {
-       unsigned int a, opened;
+       unsigned int a, opened, first_idx;
 
        mutex_lock(&moxa_openlock);
        spin_lock_bh(&moxa_lock);
@@ -925,6 +931,10 @@ static void moxa_board_deinit(struct moxa_board_conf *brd)
                mutex_lock(&moxa_openlock);
        }
 
+       first_idx = (brd - moxa_boards) * MAX_PORTS_PER_BOARD;
+       for (a = 0; a < brd->numPorts; a++)
+               tty_unregister_device(moxaDriver, first_idx + a);
+
        iounmap(brd->basemem);
        brd->basemem = NULL;
        kfree(brd->ports);
@@ -967,6 +977,7 @@ static int __devinit moxa_pci_probe(struct pci_dev *pdev,
        board->basemem = ioremap_nocache(pci_resource_start(pdev, 2), 0x4000);
        if (board->basemem == NULL) {
                dev_err(&pdev->dev, "can't remap io space 2\n");
+               retval = -ENOMEM;
                goto err_reg;
        }
 
@@ -1031,9 +1042,14 @@ static int __init moxa_init(void)
 
        printk(KERN_INFO "MOXA Intellio family driver version %s\n",
                        MOXA_VERSION);
-       moxaDriver = alloc_tty_driver(MAX_PORTS + 1);
-       if (!moxaDriver)
-               return -ENOMEM;
+
+       tty_port_init(&moxa_service_port);
+
+       moxaDriver = tty_alloc_driver(MAX_PORTS + 1,
+                       TTY_DRIVER_REAL_RAW |
+                       TTY_DRIVER_DYNAMIC_DEV);
+       if (IS_ERR(moxaDriver))
+               return PTR_ERR(moxaDriver);
 
        moxaDriver->name = "ttyMX";
        moxaDriver->major = ttymajor;
@@ -1044,8 +1060,9 @@ static int __init moxa_init(void)
        moxaDriver->init_termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL | HUPCL;
        moxaDriver->init_termios.c_ispeed = 9600;
        moxaDriver->init_termios.c_ospeed = 9600;
-       moxaDriver->flags = TTY_DRIVER_REAL_RAW;
        tty_set_operations(moxaDriver, &moxa_ops);
+       /* Having one more port only for ioctls is ugly */
+       tty_port_link_device(&moxa_service_port, moxaDriver, MAX_PORTS);
 
        if (tty_register_driver(moxaDriver)) {
                printk(KERN_ERR "can't register MOXA Smartio tty driver!\n");
@@ -1178,7 +1195,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
        mutex_lock(&ch->port.mutex);
        if (!(ch->port.flags & ASYNC_INITIALIZED)) {
                ch->statusflags = 0;
-               moxa_set_tty_param(tty, tty->termios);
+               moxa_set_tty_param(tty, &tty->termios);
                MoxaPortLineCtrl(ch, 1, 1);
                MoxaPortEnable(ch);
                MoxaSetFifo(ch, ch->type == PORT_16550A);
@@ -1193,7 +1210,7 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
 static void moxa_close(struct tty_struct *tty, struct file *filp)
 {
        struct moxa_port *ch = tty->driver_data;
-       ch->cflag = tty->termios->c_cflag;
+       ch->cflag = tty->termios.c_cflag;
        tty_port_close(&ch->port, tty, filp);
 }
 
@@ -1464,7 +1481,7 @@ static void moxa_poll(unsigned long ignored)
 
 static void moxa_set_tty_param(struct tty_struct *tty, struct ktermios *old_termios)
 {
-       register struct ktermios *ts = tty->termios;
+       register struct ktermios *ts = &tty->termios;
        struct moxa_port *ch = tty->driver_data;
        int rts, cts, txflow, rxflow, xany, baud;
 
index 90cc680..cfda47d 100644 (file)
@@ -643,7 +643,7 @@ static int mxser_change_speed(struct tty_struct *tty,
        int ret = 0;
        unsigned char status;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
        if (!info->ioaddr)
                return ret;
 
@@ -830,7 +830,7 @@ static void mxser_check_modem_status(struct tty_struct *tty,
                        wake_up_interruptible(&port->port.open_wait);
        }
 
-       if (port->port.flags & ASYNC_CTS_FLOW) {
+       if (tty_port_cts_enabled(&port->port)) {
                if (tty->hw_stopped) {
                        if (status & UART_MSR_CTS) {
                                tty->hw_stopped = 0;
@@ -1520,10 +1520,10 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
                                
                                tty = tty_port_tty_get(port);
 
-                               if (!tty || !tty->termios)
+                               if (!tty)
                                        ms.cflag = ip->normal_termios.c_cflag;
                                else
-                                       ms.cflag = tty->termios->c_cflag;
+                                       ms.cflag = tty->termios.c_cflag;
                                tty_kref_put(tty);
                                spin_lock_irq(&ip->slock);
                                status = inb(ip->ioaddr + UART_MSR);
@@ -1589,13 +1589,13 @@ static int mxser_ioctl_special(unsigned int cmd, void __user *argp)
 
                                tty = tty_port_tty_get(&ip->port);
 
-                               if (!tty || !tty->termios) {
+                               if (!tty) {
                                        cflag = ip->normal_termios.c_cflag;
                                        iflag = ip->normal_termios.c_iflag;
                                        me->baudrate[p] = tty_termios_baud_rate(&ip->normal_termios);
                                } else {
-                                       cflag = tty->termios->c_cflag;
-                                       iflag = tty->termios->c_iflag;
+                                       cflag = tty->termios.c_cflag;
+                                       iflag = tty->termios.c_iflag;
                                        me->baudrate[p] = tty_get_baud_rate(tty);
                                }
                                tty_kref_put(tty);
@@ -1853,7 +1853,7 @@ static void mxser_stoprx(struct tty_struct *tty)
                }
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                info->MCR &= ~UART_MCR_RTS;
                outb(info->MCR, info->ioaddr + UART_MCR);
        }
@@ -1890,7 +1890,7 @@ static void mxser_unthrottle(struct tty_struct *tty)
                }
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                info->MCR |= UART_MCR_RTS;
                outb(info->MCR, info->ioaddr + UART_MCR);
        }
@@ -1939,14 +1939,14 @@ static void mxser_set_termios(struct tty_struct *tty, struct ktermios *old_termi
        spin_unlock_irqrestore(&info->slock, flags);
 
        if ((old_termios->c_cflag & CRTSCTS) &&
-                       !(tty->termios->c_cflag & CRTSCTS)) {
+                       !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                mxser_start(tty);
        }
 
        /* Handle sw stopped */
        if ((old_termios->c_iflag & IXON) &&
-                       !(tty->termios->c_iflag & IXON)) {
+                       !(tty->termios.c_iflag & IXON)) {
                tty->stopped = 0;
 
                if (info->board->chip_flag) {
@@ -2337,11 +2337,36 @@ static struct tty_port_operations mxser_port_ops = {
  * The MOXA Smartio/Industio serial driver boot-time initialization code!
  */
 
+static bool allow_overlapping_vector;
+module_param(allow_overlapping_vector, bool, S_IRUGO);
+MODULE_PARM_DESC(allow_overlapping_vector, "whether we allow ISA cards to be configured such that vector overlabs IO ports (default=no)");
+
+static bool mxser_overlapping_vector(struct mxser_board *brd)
+{
+       return allow_overlapping_vector &&
+               brd->vector >= brd->ports[0].ioaddr &&
+               brd->vector < brd->ports[0].ioaddr + 8 * brd->info->nports;
+}
+
+static int mxser_request_vector(struct mxser_board *brd)
+{
+       if (mxser_overlapping_vector(brd))
+               return 0;
+       return request_region(brd->vector, 1, "mxser(vector)") ? 0 : -EIO;
+}
+
+static void mxser_release_vector(struct mxser_board *brd)
+{
+       if (mxser_overlapping_vector(brd))
+               return;
+       release_region(brd->vector, 1);
+}
+
 static void mxser_release_ISA_res(struct mxser_board *brd)
 {
        free_irq(brd->irq, brd);
        release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
-       release_region(brd->vector, 1);
+       mxser_release_vector(brd);
 }
 
 static int __devinit mxser_initbrd(struct mxser_board *brd,
@@ -2396,7 +2421,7 @@ static int __devinit mxser_initbrd(struct mxser_board *brd,
 
 static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd)
 {
-       int id, i, bits;
+       int id, i, bits, ret;
        unsigned short regs[16], irq;
        unsigned char scratch, scratch2;
 
@@ -2492,13 +2517,15 @@ static int __init mxser_get_ISA_conf(int cap, struct mxser_board *brd)
                                8 * brd->info->nports - 1);
                return -EIO;
        }
-       if (!request_region(brd->vector, 1, "mxser(vector)")) {
+
+       ret = mxser_request_vector(brd);
+       if (ret) {
                release_region(brd->ports[0].ioaddr, 8 * brd->info->nports);
                printk(KERN_ERR "mxser: can't request interrupt vector region: "
                                "0x%.8lx-0x%.8lx\n",
                                brd->ports[0].ioaddr, brd->ports[0].ioaddr +
                                8 * brd->info->nports - 1);
-               return -EIO;
+               return ret;
        }
        return brd->info->nports;
 
@@ -2598,7 +2625,8 @@ static int __devinit mxser_probe(struct pci_dev *pdev,
                goto err_rel3;
 
        for (i = 0; i < brd->info->nports; i++)
-               tty_register_device(mxvar_sdriver, brd->idx + i, &pdev->dev);
+               tty_port_register_device(&brd->ports[i].port, mxvar_sdriver,
+                               brd->idx + i, &pdev->dev);
 
        pci_set_drvdata(pdev, brd);
 
@@ -2695,7 +2723,8 @@ static int __init mxser_module_init(void)
 
                brd->idx = m * MXSER_PORTS_PER_BOARD;
                for (i = 0; i < brd->info->nports; i++)
-                       tty_register_device(mxvar_sdriver, brd->idx + i, NULL);
+                       tty_port_register_device(&brd->ports[i].port,
+                                       mxvar_sdriver, brd->idx + i, NULL);
 
                m++;
        }
index c43b683..3e210a4 100644 (file)
@@ -108,7 +108,7 @@ struct gsm_mux_net {
  */
 
 struct gsm_msg {
-       struct gsm_msg *next;
+       struct list_head list;
        u8 addr;                /* DLCI address + flags */
        u8 ctrl;                /* Control byte + flags */
        unsigned int len;       /* Length of data block (can be zero) */
@@ -245,8 +245,7 @@ struct gsm_mux {
        unsigned int tx_bytes;          /* TX data outstanding */
 #define TX_THRESH_HI           8192
 #define TX_THRESH_LO           2048
-       struct gsm_msg *tx_head;        /* Pending data packets */
-       struct gsm_msg *tx_tail;
+       struct list_head tx_list;       /* Pending data packets */
 
        /* Control messages */
        struct timer_list t2_timer;     /* Retransmit timer for commands */
@@ -663,7 +662,7 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len,
        m->len = len;
        m->addr = addr;
        m->ctrl = ctrl;
-       m->next = NULL;
+       INIT_LIST_HEAD(&m->list);
        return m;
 }
 
@@ -673,22 +672,21 @@ static struct gsm_msg *gsm_data_alloc(struct gsm_mux *gsm, u8 addr, int len,
  *
  *     The tty device has called us to indicate that room has appeared in
  *     the transmit queue. Ram more data into the pipe if we have any
+ *     If we have been flow-stopped by a CMD_FCOFF, then we can only
+ *     send messages on DLCI0 until CMD_FCON
  *
  *     FIXME: lock against link layer control transmissions
  */
 
 static void gsm_data_kick(struct gsm_mux *gsm)
 {
-       struct gsm_msg *msg = gsm->tx_head;
+       struct gsm_msg *msg, *nmsg;
        int len;
        int skip_sof = 0;
 
-       /* FIXME: We need to apply this solely to data messages */
-       if (gsm->constipated)
-               return;
-
-       while (gsm->tx_head != NULL) {
-               msg = gsm->tx_head;
+       list_for_each_entry_safe(msg, nmsg, &gsm->tx_list, list) {
+               if (gsm->constipated && msg->addr)
+                       continue;
                if (gsm->encoding != 0) {
                        gsm->txframe[0] = GSM1_SOF;
                        len = gsm_stuff_frame(msg->data,
@@ -711,14 +709,13 @@ static void gsm_data_kick(struct gsm_mux *gsm)
                                                len - skip_sof) < 0)
                        break;
                /* FIXME: Can eliminate one SOF in many more cases */
-               gsm->tx_head = msg->next;
-               if (gsm->tx_head == NULL)
-                       gsm->tx_tail = NULL;
                gsm->tx_bytes -= msg->len;
-               kfree(msg);
                /* For a burst of frames skip the extra SOF within the
                   burst */
                skip_sof = 1;
+
+               list_del(&msg->list);
+               kfree(msg);
        }
 }
 
@@ -768,11 +765,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
        msg->data = dp;
 
        /* Add to the actual output queue */
-       if (gsm->tx_tail)
-               gsm->tx_tail->next = msg;
-       else
-               gsm->tx_head = msg;
-       gsm->tx_tail = msg;
+       list_add_tail(&msg->list, &gsm->tx_list);
        gsm->tx_bytes += msg->len;
        gsm_data_kick(gsm);
 }
@@ -875,7 +868,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
 
        /* dlci->skb is locked by tx_lock */
        if (dlci->skb == NULL) {
-               dlci->skb = skb_dequeue(&dlci->skb_list);
+               dlci->skb = skb_dequeue_tail(&dlci->skb_list);
                if (dlci->skb == NULL)
                        return 0;
                first = 1;
@@ -886,7 +879,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
        if (len > gsm->mtu) {
                if (dlci->adaption == 3) {
                        /* Over long frame, bin it */
-                       kfree_skb(dlci->skb);
+                       dev_kfree_skb_any(dlci->skb);
                        dlci->skb = NULL;
                        return 0;
                }
@@ -899,8 +892,11 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
 
        /* FIXME: need a timer or something to kick this so it can't
           get stuck with no work outstanding and no buffer free */
-       if (msg == NULL)
+       if (msg == NULL) {
+               skb_queue_tail(&dlci->skb_list, dlci->skb);
+               dlci->skb = NULL;
                return -ENOMEM;
+       }
        dp = msg->data;
 
        if (dlci->adaption == 4) { /* Interruptible framed (Packetised Data) */
@@ -912,7 +908,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
        skb_pull(dlci->skb, len);
        __gsm_data_queue(dlci, msg);
        if (last) {
-               kfree_skb(dlci->skb);
+               dev_kfree_skb_any(dlci->skb);
                dlci->skb = NULL;
        }
        return size;
@@ -971,16 +967,22 @@ static void gsm_dlci_data_sweep(struct gsm_mux *gsm)
 static void gsm_dlci_data_kick(struct gsm_dlci *dlci)
 {
        unsigned long flags;
+       int sweep;
+
+       if (dlci->constipated) 
+               return;
 
        spin_lock_irqsave(&dlci->gsm->tx_lock, flags);
        /* If we have nothing running then we need to fire up */
+       sweep = (dlci->gsm->tx_bytes < TX_THRESH_LO);
        if (dlci->gsm->tx_bytes == 0) {
                if (dlci->net)
                        gsm_dlci_data_output_framed(dlci->gsm, dlci);
                else
                        gsm_dlci_data_output(dlci->gsm, dlci);
-       } else if (dlci->gsm->tx_bytes < TX_THRESH_LO)
-               gsm_dlci_data_sweep(dlci->gsm);
+       }
+       if (sweep)
+               gsm_dlci_data_sweep(dlci->gsm);
        spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags);
 }
 
@@ -1027,6 +1029,7 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci,
 {
        int  mlines = 0;
        u8 brk = 0;
+       int fc;
 
        /* The modem status command can either contain one octet (v.24 signals)
           or two octets (v.24 signals + break signals). The length field will
@@ -1038,19 +1041,21 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci,
        else {
                brk = modem & 0x7f;
                modem = (modem >> 7) & 0x7f;
-       };
+       }
 
        /* Flow control/ready to communicate */
-       if (modem & MDM_FC) {
+       fc = (modem & MDM_FC) || !(modem & MDM_RTR);
+       if (fc && !dlci->constipated) {
                /* Need to throttle our output on this device */
                dlci->constipated = 1;
-       }
-       if (modem & MDM_RTC) {
-               mlines |= TIOCM_DSR | TIOCM_DTR;
+       } else if (!fc && dlci->constipated) {
                dlci->constipated = 0;
                gsm_dlci_data_kick(dlci);
        }
+
        /* Map modem bits */
+       if (modem & MDM_RTC)
+               mlines |= TIOCM_DSR | TIOCM_DTR;
        if (modem & MDM_RTR)
                mlines |= TIOCM_RTS | TIOCM_CTS;
        if (modem & MDM_IC)
@@ -1061,7 +1066,7 @@ static void gsm_process_modem(struct tty_struct *tty, struct gsm_dlci *dlci,
        /* Carrier drop -> hangup */
        if (tty) {
                if ((mlines & TIOCM_CD) == 0 && (dlci->modem_rx & TIOCM_CD))
-                       if (!(tty->termios->c_cflag & CLOCAL))
+                       if (!(tty->termios.c_cflag & CLOCAL))
                                tty_hangup(tty);
                if (brk & 0x01)
                        tty_insert_flip_char(tty, 0, TTY_BREAK);
@@ -1190,6 +1195,8 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
                                                        u8 *data, int clen)
 {
        u8 buf[1];
+       unsigned long flags;
+
        switch (command) {
        case CMD_CLD: {
                struct gsm_dlci *dlci = gsm->dlci[0];
@@ -1206,16 +1213,18 @@ static void gsm_control_message(struct gsm_mux *gsm, unsigned int command,
                gsm_control_reply(gsm, CMD_TEST, data, clen);
                break;
        case CMD_FCON:
-               /* Modem wants us to STFU */
-               gsm->constipated = 1;
-               gsm_control_reply(gsm, CMD_FCON, NULL, 0);
-               break;
-       case CMD_FCOFF:
                /* Modem can accept data again */
                gsm->constipated = 0;
-               gsm_control_reply(gsm, CMD_FCOFF, NULL, 0);
+               gsm_control_reply(gsm, CMD_FCON, NULL, 0);
                /* Kick the link in case it is idling */
+               spin_lock_irqsave(&gsm->tx_lock, flags);
                gsm_data_kick(gsm);
+               spin_unlock_irqrestore(&gsm->tx_lock, flags);
+               break;
+       case CMD_FCOFF:
+               /* Modem wants us to STFU */
+               gsm->constipated = 1;
+               gsm_control_reply(gsm, CMD_FCOFF, NULL, 0);
                break;
        case CMD_MSC:
                /* Out of band modem line change indicator for a DLCI */
@@ -1668,7 +1677,7 @@ static void gsm_dlci_free(struct kref *ref)
        dlci->gsm->dlci[dlci->addr] = NULL;
        kfifo_free(dlci->fifo);
        while ((dlci->skb = skb_dequeue(&dlci->skb_list)))
-               kfree_skb(dlci->skb);
+               dev_kfree_skb(dlci->skb);
        kfree(dlci);
 }
 
@@ -2007,7 +2016,7 @@ void gsm_cleanup_mux(struct gsm_mux *gsm)
 {
        int i;
        struct gsm_dlci *dlci = gsm->dlci[0];
-       struct gsm_msg *txq;
+       struct gsm_msg *txq, *ntxq;
        struct gsm_control *gc;
 
        gsm->dead = 1;
@@ -2042,11 +2051,9 @@ void gsm_cleanup_mux(struct gsm_mux *gsm)
                if (gsm->dlci[i])
                        gsm_dlci_release(gsm->dlci[i]);
        /* Now wipe the queues */
-       for (txq = gsm->tx_head; txq != NULL; txq = gsm->tx_head) {
-               gsm->tx_head = txq->next;
+       list_for_each_entry_safe(txq, ntxq, &gsm->tx_list, list)
                kfree(txq);
-       }
-       gsm->tx_tail = NULL;
+       INIT_LIST_HEAD(&gsm->tx_list);
 }
 EXPORT_SYMBOL_GPL(gsm_cleanup_mux);
 
@@ -2157,6 +2164,7 @@ struct gsm_mux *gsm_alloc_mux(void)
        }
        spin_lock_init(&gsm->lock);
        kref_init(&gsm->ref);
+       INIT_LIST_HEAD(&gsm->tx_list);
 
        gsm->t1 = T1;
        gsm->t2 = T2;
@@ -2273,7 +2281,7 @@ static void gsmld_receive_buf(struct tty_struct *tty, const unsigned char *cp,
                        gsm->error(gsm, *dp, flags);
                        break;
                default:
-                       WARN_ONCE("%s: unknown flag %d\n",
+                       WARN_ONCE(1, "%s: unknown flag %d\n",
                               tty_name(tty, buf), flags);
                        break;
                }
@@ -2377,12 +2385,12 @@ static void gsmld_write_wakeup(struct tty_struct *tty)
 
        /* Queue poll */
        clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
+       spin_lock_irqsave(&gsm->tx_lock, flags);
        gsm_data_kick(gsm);
        if (gsm->tx_bytes < TX_THRESH_LO) {
-               spin_lock_irqsave(&gsm->tx_lock, flags);
                gsm_dlci_data_sweep(gsm);
-               spin_unlock_irqrestore(&gsm->tx_lock, flags);
        }
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
 }
 
 /**
@@ -2868,14 +2876,14 @@ static const struct tty_port_operations gsm_port_ops = {
        .dtr_rts = gsm_dtr_rts,
 };
 
-
-static int gsmtty_open(struct tty_struct *tty, struct file *filp)
+static int gsmtty_install(struct tty_driver *driver, struct tty_struct *tty)
 {
        struct gsm_mux *gsm;
        struct gsm_dlci *dlci;
-       struct tty_port *port;
        unsigned int line = tty->index;
        unsigned int mux = line >> 6;
+       bool alloc = false;
+       int ret;
 
        line = line & 0x3F;
 
@@ -2889,14 +2897,35 @@ static int gsmtty_open(struct tty_struct *tty, struct file *filp)
        gsm = gsm_mux[mux];
        if (gsm->dead)
                return -EL2HLT;
+       /* If DLCI 0 is not yet fully open return an error. This is ok from a locking
+          perspective as we don't have to worry about this if DLCI0 is lost */
+       if (gsm->dlci[0] && gsm->dlci[0]->state != DLCI_OPEN) 
+               return -EL2NSYNC;
        dlci = gsm->dlci[line];
-       if (dlci == NULL)
+       if (dlci == NULL) {
+               alloc = true;
                dlci = gsm_dlci_alloc(gsm, line);
+       }
        if (dlci == NULL)
                return -ENOMEM;
-       port = &dlci->port;
-       port->count++;
+       ret = tty_port_install(&dlci->port, driver, tty);
+       if (ret) {
+               if (alloc)
+                       dlci_put(dlci);
+               return ret;
+       }
+
        tty->driver_data = dlci;
+
+       return 0;
+}
+
+static int gsmtty_open(struct tty_struct *tty, struct file *filp)
+{
+       struct gsm_dlci *dlci = tty->driver_data;
+       struct tty_port *port = &dlci->port;
+
+       port->count++;
        dlci_get(dlci);
        dlci_get(dlci->gsm->dlci[0]);
        mux_get(dlci->gsm);
@@ -3043,13 +3072,13 @@ static void gsmtty_set_termios(struct tty_struct *tty, struct ktermios *old)
           the RPN control message. This however rapidly gets nasty as we
           then have to remap modem signals each way according to whether
           our virtual cable is null modem etc .. */
-       tty_termios_copy_hw(tty->termios, old);
+       tty_termios_copy_hw(&tty->termios, old);
 }
 
 static void gsmtty_throttle(struct tty_struct *tty)
 {
        struct gsm_dlci *dlci = tty->driver_data;
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                dlci->modem_tx &= ~TIOCM_DTR;
        dlci->throttled = 1;
        /* Send an MSC with DTR cleared */
@@ -3059,7 +3088,7 @@ static void gsmtty_throttle(struct tty_struct *tty)
 static void gsmtty_unthrottle(struct tty_struct *tty)
 {
        struct gsm_dlci *dlci = tty->driver_data;
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                dlci->modem_tx |= TIOCM_DTR;
        dlci->throttled = 0;
        /* Send an MSC with DTR set */
@@ -3085,6 +3114,7 @@ static int gsmtty_break_ctl(struct tty_struct *tty, int state)
 
 /* Virtual ttys for the demux */
 static const struct tty_operations gsmtty_ops = {
+       .install                = gsmtty_install,
        .open                   = gsmtty_open,
        .close                  = gsmtty_close,
        .write                  = gsmtty_write,
index 5c6c314..1e64050 100644 (file)
@@ -1065,7 +1065,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
 
        TRACE_L("read()");
 
-       tty_lock();
+       tty_lock(tty);
 
        pClient = findClient(pInfo, task_pid(current));
        if (pClient) {
@@ -1077,7 +1077,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
                                goto unlock;
                        }
                        /* block until there is a message: */
-                       wait_event_interruptible_tty(pInfo->read_wait,
+                       wait_event_interruptible_tty(tty, pInfo->read_wait,
                                        (pMsg = remove_msg(pInfo, pClient)));
                }
 
@@ -1107,7 +1107,7 @@ static ssize_t r3964_read(struct tty_struct *tty, struct file *file,
        }
        ret = -EPERM;
 unlock:
-       tty_unlock();
+       tty_unlock(tty);
        return ret;
 }
 
@@ -1156,7 +1156,7 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file,
        pHeader->locks = 0;
        pHeader->owner = NULL;
 
-       tty_lock();
+       tty_lock(tty);
 
        pClient = findClient(pInfo, task_pid(current));
        if (pClient) {
@@ -1175,7 +1175,7 @@ static ssize_t r3964_write(struct tty_struct *tty, struct file *file,
        add_tx_queue(pInfo, pHeader);
        trigger_transmit(pInfo);
 
-       tty_unlock();
+       tty_unlock(tty);
 
        return 0;
 }
index ee1c268..8c0b7b4 100644 (file)
@@ -92,10 +92,18 @@ static inline int tty_put_user(struct tty_struct *tty, unsigned char x,
 
 static void n_tty_set_room(struct tty_struct *tty)
 {
-       /* tty->read_cnt is not read locked ? */
-       int     left = N_TTY_BUF_SIZE - tty->read_cnt - 1;
+       int left;
        int old_left;
 
+       /* tty->read_cnt is not read locked ? */
+       if (I_PARMRK(tty)) {
+               /* Multiply read_cnt by 3, since each byte might take up to
+                * three times as many spaces when PARMRK is set (depending on
+                * its flags, e.g. parity error). */
+               left = N_TTY_BUF_SIZE - tty->read_cnt * 3 - 1;
+       } else
+               left = N_TTY_BUF_SIZE - tty->read_cnt - 1;
+
        /*
         * If we are doing input canonicalization, and there are no
         * pending newlines, let characters through without limit, so
@@ -1432,6 +1440,12 @@ static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
         */
        if (tty->receive_room < TTY_THRESHOLD_THROTTLE)
                tty_throttle(tty);
+
+        /* FIXME: there is a tiny race here if the receive room check runs
+           before the other work executes and empties the buffer (upping
+           the receiving room and unthrottling. We then throttle and get
+           stuck. This has been observed and traced down by Vincent Pillet/
+           We need to address this when we sort out out the rx path locking */
 }
 
 int is_ignored(int sig)
@@ -1460,7 +1474,7 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
        BUG_ON(!tty);
 
        if (old)
-               canon_change = (old->c_lflag ^ tty->termios->c_lflag) & ICANON;
+               canon_change = (old->c_lflag ^ tty->termios.c_lflag) & ICANON;
        if (canon_change) {
                memset(&tty->read_flags, 0, sizeof tty->read_flags);
                tty->canon_head = tty->read_tail;
@@ -1728,7 +1742,8 @@ static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,
 
 do_it_again:
 
-       BUG_ON(!tty->read_buf);
+       if (WARN_ON(!tty->read_buf))
+               return -EAGAIN;
 
        c = job_control(tty, file);
        if (c < 0)
@@ -1832,13 +1847,13 @@ do_it_again:
 
                if (tty->icanon && !L_EXTPROC(tty)) {
                        /* N.B. avoid overrun if nr == 0 */
+                       spin_lock_irqsave(&tty->read_lock, flags);
                        while (nr && tty->read_cnt) {
                                int eol;
 
                                eol = test_and_clear_bit(tty->read_tail,
                                                tty->read_flags);
                                c = tty->read_buf[tty->read_tail];
-                               spin_lock_irqsave(&tty->read_lock, flags);
                                tty->read_tail = ((tty->read_tail+1) &
                                                  (N_TTY_BUF_SIZE-1));
                                tty->read_cnt--;
@@ -1856,15 +1871,19 @@ do_it_again:
                                        if (tty_put_user(tty, c, b++)) {
                                                retval = -EFAULT;
                                                b--;
+                                               spin_lock_irqsave(&tty->read_lock, flags);
                                                break;
                                        }
                                        nr--;
                                }
                                if (eol) {
                                        tty_audit_push(tty);
+                                       spin_lock_irqsave(&tty->read_lock, flags);
                                        break;
                                }
+                               spin_lock_irqsave(&tty->read_lock, flags);
                        }
+                       spin_unlock_irqrestore(&tty->read_lock, flags);
                        if (retval)
                                break;
                } else {
index e7592f9..b917c94 100644 (file)
@@ -1473,8 +1473,8 @@ static int __devinit nozomi_card_init(struct pci_dev *pdev,
                port->dc = dc;
                tty_port_init(&port->port);
                port->port.ops = &noz_tty_port_ops;
-               tty_dev = tty_register_device(ntty_driver, dc->index_start + i,
-                                                       &pdev->dev);
+               tty_dev = tty_port_register_device(&port->port, ntty_driver,
+                               dc->index_start + i, &pdev->dev);
 
                if (IS_ERR(tty_dev)) {
                        ret = PTR_ERR(tty_dev);
index 5505ffc..2bace84 100644 (file)
@@ -47,6 +47,7 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
        wake_up_interruptible(&tty->read_wait);
        wake_up_interruptible(&tty->write_wait);
        tty->packet = 0;
+       /* Review - krefs on tty_link ?? */
        if (!tty->link)
                return;
        tty->link->packet = 0;
@@ -62,9 +63,9 @@ static void pty_close(struct tty_struct *tty, struct file *filp)
                        mutex_unlock(&devpts_mutex);
                }
 #endif
-               tty_unlock();
+               tty_unlock(tty);
                tty_vhangup(tty->link);
-               tty_lock();
+               tty_lock(tty);
        }
 }
 
@@ -231,8 +232,8 @@ out:
 static void pty_set_termios(struct tty_struct *tty,
                                        struct ktermios *old_termios)
 {
-       tty->termios->c_cflag &= ~(CSIZE | PARENB);
-       tty->termios->c_cflag |= (CS8 | CREAD);
+       tty->termios.c_cflag &= ~(CSIZE | PARENB);
+       tty->termios.c_cflag |= (CS8 | CREAD);
 }
 
 /**
@@ -282,60 +283,110 @@ done:
        return 0;
 }
 
-/* Traditional BSD devices */
-#ifdef CONFIG_LEGACY_PTYS
-
-static int pty_install(struct tty_driver *driver, struct tty_struct *tty)
+/**
+ *     pty_common_install              -       set up the pty pair
+ *     @driver: the pty driver
+ *     @tty: the tty being instantiated
+ *     @bool: legacy, true if this is BSD style
+ *
+ *     Perform the initial set up for the tty/pty pair. Called from the
+ *     tty layer when the port is first opened.
+ *
+ *     Locking: the caller must hold the tty_mutex
+ */
+static int pty_common_install(struct tty_driver *driver, struct tty_struct *tty,
+               bool legacy)
 {
        struct tty_struct *o_tty;
+       struct tty_port *ports[2];
        int idx = tty->index;
-       int retval;
+       int retval = -ENOMEM;
 
        o_tty = alloc_tty_struct();
        if (!o_tty)
-               return -ENOMEM;
+               goto err;
+       ports[0] = kmalloc(sizeof **ports, GFP_KERNEL);
+       ports[1] = kmalloc(sizeof **ports, GFP_KERNEL);
+       if (!ports[0] || !ports[1])
+               goto err_free_tty;
        if (!try_module_get(driver->other->owner)) {
                /* This cannot in fact currently happen */
-               retval = -ENOMEM;
                goto err_free_tty;
        }
        initialize_tty_struct(o_tty, driver->other, idx);
 
-       /* We always use new tty termios data so we can do this
-          the easy way .. */
-       retval = tty_init_termios(tty);
-       if (retval)
-               goto err_deinit_tty;
-
-       retval = tty_init_termios(o_tty);
-       if (retval)
-               goto err_free_termios;
+       if (legacy) {
+               /* We always use new tty termios data so we can do this
+                  the easy way .. */
+               retval = tty_init_termios(tty);
+               if (retval)
+                       goto err_deinit_tty;
+
+               retval = tty_init_termios(o_tty);
+               if (retval)
+                       goto err_free_termios;
+
+               driver->other->ttys[idx] = o_tty;
+               driver->ttys[idx] = tty;
+       } else {
+               memset(&tty->termios_locked, 0, sizeof(tty->termios_locked));
+               tty->termios = driver->init_termios;
+               memset(&o_tty->termios_locked, 0, sizeof(tty->termios_locked));
+               o_tty->termios = driver->other->init_termios;
+       }
 
        /*
         * Everything allocated ... set up the o_tty structure.
         */
-       driver->other->ttys[idx] = o_tty;
        tty_driver_kref_get(driver->other);
        if (driver->subtype == PTY_TYPE_MASTER)
                o_tty->count++;
        /* Establish the links in both directions */
        tty->link   = o_tty;
        o_tty->link = tty;
+       tty_port_init(ports[0]);
+       tty_port_init(ports[1]);
+       o_tty->port = ports[0];
+       tty->port = ports[1];
 
        tty_driver_kref_get(driver);
        tty->count++;
-       driver->ttys[idx] = tty;
        return 0;
 err_free_termios:
-       tty_free_termios(tty);
+       if (legacy)
+               tty_free_termios(tty);
 err_deinit_tty:
        deinitialize_tty_struct(o_tty);
        module_put(o_tty->driver->owner);
 err_free_tty:
+       kfree(ports[0]);
+       kfree(ports[1]);
        free_tty_struct(o_tty);
+err:
        return retval;
 }
 
+static void pty_cleanup(struct tty_struct *tty)
+{
+       kfree(tty->port);
+}
+
+/* Traditional BSD devices */
+#ifdef CONFIG_LEGACY_PTYS
+
+static int pty_install(struct tty_driver *driver, struct tty_struct *tty)
+{
+       return pty_common_install(driver, tty, true);
+}
+
+static void pty_remove(struct tty_driver *driver, struct tty_struct *tty)
+{
+       struct tty_struct *pair = tty->link;
+       driver->ttys[tty->index] = NULL;
+       if (pair)
+               pair->driver->ttys[pair->index] = NULL;
+}
+
 static int pty_bsd_ioctl(struct tty_struct *tty,
                         unsigned int cmd, unsigned long arg)
 {
@@ -366,7 +417,9 @@ static const struct tty_operations master_pty_ops_bsd = {
        .unthrottle = pty_unthrottle,
        .set_termios = pty_set_termios,
        .ioctl = pty_bsd_ioctl,
-       .resize = pty_resize
+       .cleanup = pty_cleanup,
+       .resize = pty_resize,
+       .remove = pty_remove
 };
 
 static const struct tty_operations slave_pty_ops_bsd = {
@@ -379,7 +432,9 @@ static const struct tty_operations slave_pty_ops_bsd = {
        .chars_in_buffer = pty_chars_in_buffer,
        .unthrottle = pty_unthrottle,
        .set_termios = pty_set_termios,
-       .resize = pty_resize
+       .cleanup = pty_cleanup,
+       .resize = pty_resize,
+       .remove = pty_remove
 };
 
 static void __init legacy_pty_init(void)
@@ -389,12 +444,18 @@ static void __init legacy_pty_init(void)
        if (legacy_count <= 0)
                return;
 
-       pty_driver = alloc_tty_driver(legacy_count);
-       if (!pty_driver)
+       pty_driver = tty_alloc_driver(legacy_count,
+                       TTY_DRIVER_RESET_TERMIOS |
+                       TTY_DRIVER_REAL_RAW |
+                       TTY_DRIVER_DYNAMIC_ALLOC);
+       if (IS_ERR(pty_driver))
                panic("Couldn't allocate pty driver");
 
-       pty_slave_driver = alloc_tty_driver(legacy_count);
-       if (!pty_slave_driver)
+       pty_slave_driver = tty_alloc_driver(legacy_count,
+                       TTY_DRIVER_RESET_TERMIOS |
+                       TTY_DRIVER_REAL_RAW |
+                       TTY_DRIVER_DYNAMIC_ALLOC);
+       if (IS_ERR(pty_slave_driver))
                panic("Couldn't allocate pty slave driver");
 
        pty_driver->driver_name = "pty_master";
@@ -410,7 +471,6 @@ static void __init legacy_pty_init(void)
        pty_driver->init_termios.c_lflag = 0;
        pty_driver->init_termios.c_ispeed = 38400;
        pty_driver->init_termios.c_ospeed = 38400;
-       pty_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW;
        pty_driver->other = pty_slave_driver;
        tty_set_operations(pty_driver, &master_pty_ops_bsd);
 
@@ -424,8 +484,6 @@ static void __init legacy_pty_init(void)
        pty_slave_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
        pty_slave_driver->init_termios.c_ispeed = 38400;
        pty_slave_driver->init_termios.c_ospeed = 38400;
-       pty_slave_driver->flags = TTY_DRIVER_RESET_TERMIOS |
-                                       TTY_DRIVER_REAL_RAW;
        pty_slave_driver->other = pty_driver;
        tty_set_operations(pty_slave_driver, &slave_pty_ops_bsd);
 
@@ -497,78 +555,22 @@ static struct tty_struct *pts_unix98_lookup(struct tty_driver *driver,
        return tty;
 }
 
-static void pty_unix98_shutdown(struct tty_struct *tty)
-{
-       tty_driver_remove_tty(tty->driver, tty);
-       /* We have our own method as we don't use the tty index */
-       kfree(tty->termios);
-}
-
 /* We have no need to install and remove our tty objects as devpts does all
    the work for us */
 
 static int pty_unix98_install(struct tty_driver *driver, struct tty_struct *tty)
 {
-       struct tty_struct *o_tty;
-       int idx = tty->index;
-
-       o_tty = alloc_tty_struct();
-       if (!o_tty)
-               return -ENOMEM;
-       if (!try_module_get(driver->other->owner)) {
-               /* This cannot in fact currently happen */
-               goto err_free_tty;
-       }
-       initialize_tty_struct(o_tty, driver->other, idx);
-
-       tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
-       if (tty->termios == NULL)
-               goto err_free_mem;
-       *tty->termios = driver->init_termios;
-       tty->termios_locked = tty->termios + 1;
-
-       o_tty->termios = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
-       if (o_tty->termios == NULL)
-               goto err_free_mem;
-       *o_tty->termios = driver->other->init_termios;
-       o_tty->termios_locked = o_tty->termios + 1;
-
-       tty_driver_kref_get(driver->other);
-       if (driver->subtype == PTY_TYPE_MASTER)
-               o_tty->count++;
-       /* Establish the links in both directions */
-       tty->link   = o_tty;
-       o_tty->link = tty;
-       /*
-        * All structures have been allocated, so now we install them.
-        * Failures after this point use release_tty to clean up, so
-        * there's no need to null out the local pointers.
-        */
-       tty_driver_kref_get(driver);
-       tty->count++;
-       return 0;
-err_free_mem:
-       deinitialize_tty_struct(o_tty);
-       kfree(o_tty->termios);
-       kfree(tty->termios);
-       module_put(o_tty->driver->owner);
-err_free_tty:
-       free_tty_struct(o_tty);
-       return -ENOMEM;
-}
-
-static void ptm_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
-{
+       return pty_common_install(driver, tty, false);
 }
 
-static void pts_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
+static void pty_unix98_remove(struct tty_driver *driver, struct tty_struct *tty)
 {
 }
 
 static const struct tty_operations ptm_unix98_ops = {
        .lookup = ptm_unix98_lookup,
        .install = pty_unix98_install,
-       .remove = ptm_unix98_remove,
+       .remove = pty_unix98_remove,
        .open = pty_open,
        .close = pty_close,
        .write = pty_write,
@@ -578,14 +580,14 @@ static const struct tty_operations ptm_unix98_ops = {
        .unthrottle = pty_unthrottle,
        .set_termios = pty_set_termios,
        .ioctl = pty_unix98_ioctl,
-       .shutdown = pty_unix98_shutdown,
-       .resize = pty_resize
+       .resize = pty_resize,
+       .cleanup = pty_cleanup
 };
 
 static const struct tty_operations pty_unix98_ops = {
        .lookup = pts_unix98_lookup,
        .install = pty_unix98_install,
-       .remove = pts_unix98_remove,
+       .remove = pty_unix98_remove,
        .open = pty_open,
        .close = pty_close,
        .write = pty_write,
@@ -594,7 +596,7 @@ static const struct tty_operations pty_unix98_ops = {
        .chars_in_buffer = pty_chars_in_buffer,
        .unthrottle = pty_unthrottle,
        .set_termios = pty_set_termios,
-       .shutdown = pty_unix98_shutdown
+       .cleanup = pty_cleanup,
 };
 
 /**
@@ -622,26 +624,27 @@ static int ptmx_open(struct inode *inode, struct file *filp)
                return retval;
 
        /* find a device that is not in use. */
-       tty_lock();
+       mutex_lock(&devpts_mutex);
        index = devpts_new_index(inode);
-       tty_unlock();
        if (index < 0) {
                retval = index;
                goto err_file;
        }
 
+       mutex_unlock(&devpts_mutex);
+
        mutex_lock(&tty_mutex);
-       mutex_lock(&devpts_mutex);
        tty = tty_init_dev(ptm_driver, index);
-       mutex_unlock(&devpts_mutex);
-       tty_lock();
-       mutex_unlock(&tty_mutex);
 
        if (IS_ERR(tty)) {
                retval = PTR_ERR(tty);
                goto out;
        }
 
+       /* The tty returned here is locked so we can safely
+          drop the mutex */
+       mutex_unlock(&tty_mutex);
+
        set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */
 
        tty_add_file(tty, filp);
@@ -654,16 +657,17 @@ static int ptmx_open(struct inode *inode, struct file *filp)
        if (retval)
                goto err_release;
 
-       tty_unlock();
+       tty_unlock(tty);
        return 0;
 err_release:
-       tty_unlock();
+       tty_unlock(tty);
        tty_release(inode, filp);
        return retval;
 out:
+       mutex_unlock(&tty_mutex);
        devpts_kill_index(inode, index);
-       tty_unlock();
 err_file:
+        mutex_unlock(&devpts_mutex);
        tty_free_file(filp);
        return retval;
 }
@@ -672,11 +676,21 @@ static struct file_operations ptmx_fops;
 
 static void __init unix98_pty_init(void)
 {
-       ptm_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX);
-       if (!ptm_driver)
+       ptm_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
+                       TTY_DRIVER_RESET_TERMIOS |
+                       TTY_DRIVER_REAL_RAW |
+                       TTY_DRIVER_DYNAMIC_DEV |
+                       TTY_DRIVER_DEVPTS_MEM |
+                       TTY_DRIVER_DYNAMIC_ALLOC);
+       if (IS_ERR(ptm_driver))
                panic("Couldn't allocate Unix98 ptm driver");
-       pts_driver = alloc_tty_driver(NR_UNIX98_PTY_MAX);
-       if (!pts_driver)
+       pts_driver = tty_alloc_driver(NR_UNIX98_PTY_MAX,
+                       TTY_DRIVER_RESET_TERMIOS |
+                       TTY_DRIVER_REAL_RAW |
+                       TTY_DRIVER_DYNAMIC_DEV |
+                       TTY_DRIVER_DEVPTS_MEM |
+                       TTY_DRIVER_DYNAMIC_ALLOC);
+       if (IS_ERR(pts_driver))
                panic("Couldn't allocate Unix98 pts driver");
 
        ptm_driver->driver_name = "pty_master";
@@ -692,8 +706,6 @@ static void __init unix98_pty_init(void)
        ptm_driver->init_termios.c_lflag = 0;
        ptm_driver->init_termios.c_ispeed = 38400;
        ptm_driver->init_termios.c_ospeed = 38400;
-       ptm_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW |
-               TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM;
        ptm_driver->other = pts_driver;
        tty_set_operations(ptm_driver, &ptm_unix98_ops);
 
@@ -707,8 +719,6 @@ static void __init unix98_pty_init(void)
        pts_driver->init_termios.c_cflag = B38400 | CS8 | CREAD;
        pts_driver->init_termios.c_ispeed = 38400;
        pts_driver->init_termios.c_ospeed = 38400;
-       pts_driver->flags = TTY_DRIVER_RESET_TERMIOS | TTY_DRIVER_REAL_RAW |
-               TTY_DRIVER_DYNAMIC_DEV | TTY_DRIVER_DEVPTS_MEM;
        pts_driver->other = ptm_driver;
        tty_set_operations(pts_driver, &pty_unix98_ops);
 
index 777d5f9..9700d34 100644 (file)
@@ -704,8 +704,8 @@ static void init_r_port(int board, int aiop, int chan, struct pci_dev *pci_dev)
        spin_lock_init(&info->slock);
        mutex_init(&info->write_mtx);
        rp_table[line] = info;
-       tty_register_device(rocket_driver, line, pci_dev ? &pci_dev->dev :
-                       NULL);
+       tty_port_register_device(&info->port, rocket_driver, line,
+                       pci_dev ? &pci_dev->dev : NULL);
 }
 
 /*
@@ -720,7 +720,7 @@ static void configure_r_port(struct tty_struct *tty, struct r_port *info,
        unsigned rocketMode;
        int bits, baud, divisor;
        CHANNEL_t *cp;
-       struct ktermios *t = tty->termios;
+       struct ktermios *t = &tty->termios;
 
        cp = &info->channel;
        cflag = t->c_cflag;
@@ -978,7 +978,7 @@ static int rp_open(struct tty_struct *tty, struct file *filp)
                        tty->alt_speed = 460800;
 
                configure_r_port(tty, info, NULL);
-               if (tty->termios->c_cflag & CBAUD) {
+               if (tty->termios.c_cflag & CBAUD) {
                        sSetDTR(cp);
                        sSetRTS(cp);
                }
@@ -1089,35 +1089,35 @@ static void rp_set_termios(struct tty_struct *tty,
        if (rocket_paranoia_check(info, "rp_set_termios"))
                return;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        /*
         * This driver doesn't support CS5 or CS6
         */
        if (((cflag & CSIZE) == CS5) || ((cflag & CSIZE) == CS6))
-               tty->termios->c_cflag =
+               tty->termios.c_cflag =
                    ((cflag & ~CSIZE) | (old_termios->c_cflag & CSIZE));
        /* Or CMSPAR */
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        configure_r_port(tty, info, old_termios);
 
        cp = &info->channel;
 
        /* Handle transition to B0 status */
-       if ((old_termios->c_cflag & CBAUD) && !(tty->termios->c_cflag & CBAUD)) {
+       if ((old_termios->c_cflag & CBAUD) && !(tty->termios.c_cflag & CBAUD)) {
                sClrDTR(cp);
                sClrRTS(cp);
        }
 
        /* Handle transition away from B0 status */
-       if (!(old_termios->c_cflag & CBAUD) && (tty->termios->c_cflag & CBAUD)) {
-               if (!tty->hw_stopped || !(tty->termios->c_cflag & CRTSCTS))
+       if (!(old_termios->c_cflag & CBAUD) && (tty->termios.c_cflag & CBAUD)) {
+               if (!tty->hw_stopped || !(tty->termios.c_cflag & CRTSCTS))
                        sSetRTS(cp);
                sSetDTR(cp);
        }
 
-       if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios->c_cflag & CRTSCTS)) {
+       if ((old_termios->c_cflag & CRTSCTS) && !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                rp_start(tty);
        }
index 3ed20e4..66c38a3 100644 (file)
@@ -515,7 +515,7 @@ static void change_speed(struct m68k_serial *info, struct tty_struct *tty)
        unsigned cflag;
        int     i;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
        if (!(port = info->port))
                return;
 
@@ -617,7 +617,7 @@ static void rs_set_ldisc(struct tty_struct *tty)
        if (serial_paranoia_check(info, tty->name, "rs_set_ldisc"))
                return;
 
-       info->is_cons = (tty->termios->c_line == N_TTY);
+       info->is_cons = (tty->termios.c_line == N_TTY);
        
        printk("ttyS%d console mode %s\n", info->line, info->is_cons ? "on" : "off");
 }
@@ -985,7 +985,7 @@ static void rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
        change_speed(info, tty);
 
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                rs_start(tty);
        }
@@ -1070,7 +1070,7 @@ static void rs_close(struct tty_struct *tty, struct file * filp)
                if (tty->ldisc.close)
                        (tty->ldisc.close)(tty);
                tty->ldisc = ldiscs[N_TTY];
-               tty->termios->c_line = N_TTY;
+               tty->termios.c_line = N_TTY;
                if (tty->ldisc.open)
                        (tty->ldisc.open)(tty);
        }
@@ -1189,12 +1189,6 @@ rs68328_init(void)
        serial_driver->flags = TTY_DRIVER_REAL_RAW;
        tty_set_operations(serial_driver, &rs_ops);
 
-       if (tty_register_driver(serial_driver)) {
-               put_tty_driver(serial_driver);
-               printk(KERN_ERR "Couldn't register serial driver\n");
-               return -ENOMEM;
-       }
-
        local_irq_save(flags);
 
        for(i=0;i<NR_PORTS;i++) {
@@ -1224,8 +1218,17 @@ rs68328_init(void)
                            0,
                            "M68328_UART", info))
                 panic("Unable to attach 68328 serial interrupt\n");
+
+           tty_port_link_device(&info->tport, serial_driver, i);
        }
        local_irq_restore(flags);
+
+       if (tty_register_driver(serial_driver)) {
+               put_tty_driver(serial_driver);
+               printk(KERN_ERR "Couldn't register serial driver\n");
+               return -ENOMEM;
+       }
+
        return 0;
 }
 
index 8123f78..d4e0b07 100644 (file)
@@ -2202,6 +2202,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
        unsigned char cval, fcr = 0;
        unsigned long flags;
        unsigned int baud, quot;
+       int fifo_bug = 0;
 
        switch (termios->c_cflag & CSIZE) {
        case CS5:
@@ -2221,8 +2222,11 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
 
        if (termios->c_cflag & CSTOPB)
                cval |= UART_LCR_STOP;
-       if (termios->c_cflag & PARENB)
+       if (termios->c_cflag & PARENB) {
                cval |= UART_LCR_PARITY;
+               if (up->bugs & UART_BUG_PARITY)
+                       fifo_bug = 1;
+       }
        if (!(termios->c_cflag & PARODD))
                cval |= UART_LCR_EPAR;
 #ifdef CMSPAR
@@ -2246,7 +2250,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
 
        if (up->capabilities & UART_CAP_FIFO && port->fifosize > 1) {
                fcr = uart_config[port->type].fcr;
-               if (baud < 2400) {
+               if (baud < 2400 || fifo_bug) {
                        fcr &= ~UART_FCR_TRIGGER_MASK;
                        fcr |= UART_FCR_TRIGGER_1;
                }
@@ -2336,7 +2340,7 @@ serial8250_do_set_termios(struct uart_port *port, struct ktermios *termios,
                        serial_port_out(port, UART_EFR, efr);
        }
 
-#ifdef CONFIG_ARCH_OMAP
+#ifdef CONFIG_ARCH_OMAP1
        /* Workaround to enable 115200 baud on OMAP1510 internal ports */
        if (cpu_is_omap1510() && is_omap_port(up)) {
                if (baud == 115200) {
@@ -2426,7 +2430,7 @@ static unsigned int serial8250_port_size(struct uart_8250_port *pt)
 {
        if (pt->port.iotype == UPIO_AU)
                return 0x1000;
-#ifdef CONFIG_ARCH_OMAP
+#ifdef CONFIG_ARCH_OMAP1
        if (is_omap_port(pt))
                return 0x16 << pt->port.regshift;
 #endif
@@ -2979,36 +2983,36 @@ void serial8250_resume_port(int line)
 static int __devinit serial8250_probe(struct platform_device *dev)
 {
        struct plat_serial8250_port *p = dev->dev.platform_data;
-       struct uart_port port;
+       struct uart_8250_port uart;
        int ret, i, irqflag = 0;
 
-       memset(&port, 0, sizeof(struct uart_port));
+       memset(&uart, 0, sizeof(uart));
 
        if (share_irqs)
                irqflag = IRQF_SHARED;
 
        for (i = 0; p && p->flags != 0; p++, i++) {
-               port.iobase             = p->iobase;
-               port.membase            = p->membase;
-               port.irq                = p->irq;
-               port.irqflags           = p->irqflags;
-               port.uartclk            = p->uartclk;
-               port.regshift           = p->regshift;
-               port.iotype             = p->iotype;
-               port.flags              = p->flags;
-               port.mapbase            = p->mapbase;
-               port.hub6               = p->hub6;
-               port.private_data       = p->private_data;
-               port.type               = p->type;
-               port.serial_in          = p->serial_in;
-               port.serial_out         = p->serial_out;
-               port.handle_irq         = p->handle_irq;
-               port.handle_break       = p->handle_break;
-               port.set_termios        = p->set_termios;
-               port.pm                 = p->pm;
-               port.dev                = &dev->dev;
-               port.irqflags           |= irqflag;
-               ret = serial8250_register_port(&port);
+               uart.port.iobase        = p->iobase;
+               uart.port.membase       = p->membase;
+               uart.port.irq           = p->irq;
+               uart.port.irqflags      = p->irqflags;
+               uart.port.uartclk       = p->uartclk;
+               uart.port.regshift      = p->regshift;
+               uart.port.iotype        = p->iotype;
+               uart.port.flags         = p->flags;
+               uart.port.mapbase       = p->mapbase;
+               uart.port.hub6          = p->hub6;
+               uart.port.private_data  = p->private_data;
+               uart.port.type          = p->type;
+               uart.port.serial_in     = p->serial_in;
+               uart.port.serial_out    = p->serial_out;
+               uart.port.handle_irq    = p->handle_irq;
+               uart.port.handle_break  = p->handle_break;
+               uart.port.set_termios   = p->set_termios;
+               uart.port.pm            = p->pm;
+               uart.port.dev           = &dev->dev;
+               uart.port.irqflags      |= irqflag;
+               ret = serial8250_register_8250_port(&uart);
                if (ret < 0) {
                        dev_err(&dev->dev, "unable to register port at index %d "
                                "(IO%lx MEM%llx IRQ%d): %d\n", i,
@@ -3081,7 +3085,7 @@ static struct platform_driver serial8250_isa_driver = {
 static struct platform_device *serial8250_isa_devs;
 
 /*
- * serial8250_register_port and serial8250_unregister_port allows for
+ * serial8250_register_8250_port and serial8250_unregister_port allows for
  * 16x50 serial ports to be configured at run-time, to support PCMCIA
  * modems and PCI multiport cards.
  */
@@ -3155,6 +3159,7 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
                uart->port.regshift     = up->port.regshift;
                uart->port.iotype       = up->port.iotype;
                uart->port.flags        = up->port.flags | UPF_BOOT_AUTOCONF;
+               uart->bugs              = up->bugs;
                uart->port.mapbase      = up->port.mapbase;
                uart->port.private_data = up->port.private_data;
                if (up->port.dev)
@@ -3198,29 +3203,6 @@ int serial8250_register_8250_port(struct uart_8250_port *up)
 EXPORT_SYMBOL(serial8250_register_8250_port);
 
 /**
- *     serial8250_register_port - register a serial port
- *     @port: serial port template
- *
- *     Configure the serial port specified by the request. If the
- *     port exists and is in use, it is hung up and unregistered
- *     first.
- *
- *     The port is then probed and if necessary the IRQ is autodetected
- *     If this fails an error is returned.
- *
- *     On success the port is ready to use and the line number is returned.
- */
-int serial8250_register_port(struct uart_port *port)
-{
-       struct uart_8250_port up;
-
-       memset(&up, 0, sizeof(up));
-       memcpy(&up.port, port, sizeof(*port));
-       return serial8250_register_8250_port(&up);
-}
-EXPORT_SYMBOL(serial8250_register_port);
-
-/**
  *     serial8250_unregister_port - remove a 16x50 serial port at runtime
  *     @line: serial line number
  *
index f9719d1..0c5e908 100644 (file)
 
 #include <linux/serial_8250.h>
 
-struct uart_8250_port {
-       struct uart_port        port;
-       struct timer_list       timer;          /* "no irq" timer */
-       struct list_head        list;           /* ports on this IRQ */
-       unsigned short          capabilities;   /* port capabilities */
-       unsigned short          bugs;           /* port bugs */
-       unsigned int            tx_loadsz;      /* transmit fifo load size */
-       unsigned char           acr;
-       unsigned char           ier;
-       unsigned char           lcr;
-       unsigned char           mcr;
-       unsigned char           mcr_mask;       /* mask of user bits */
-       unsigned char           mcr_force;      /* mask of forced bits */
-       unsigned char           cur_iotype;     /* Running I/O type */
-
-       /*
-        * Some bits in registers are cleared on a read, so they must
-        * be saved whenever the register is read but the bits will not
-        * be immediately processed.
-        */
-#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
-       unsigned char           lsr_saved_flags;
-#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
-       unsigned char           msr_saved_flags;
-
-       /* 8250 specific callbacks */
-       int                     (*dl_read)(struct uart_8250_port *);
-       void                    (*dl_write)(struct uart_8250_port *, int);
-};
-
 struct old_serial_port {
        unsigned int uart;
        unsigned int baud_base;
@@ -56,9 +26,6 @@ struct old_serial_port {
        unsigned long irqflags;
 };
 
-/*
- * This replaces serial_uart_config in include/linux/serial.h
- */
 struct serial8250_config {
        const char      *name;
        unsigned short  fifo_size;
@@ -78,6 +45,7 @@ struct serial8250_config {
 #define UART_BUG_TXEN  (1 << 1)        /* UART has buggy TX IIR status */
 #define UART_BUG_NOMSR (1 << 2)        /* UART has buggy MSR status bits (Au1x00) */
 #define UART_BUG_THRE  (1 << 3)        /* UART has buggy THRE reassertion */
+#define UART_BUG_PARITY        (1 << 4)        /* UART mishandles parity if FIFO enabled */
 
 #define PROBE_RSA      (1 << 0)
 #define PROBE_ANY      (~0)
index b0ce8c5..8574983 100644 (file)
@@ -43,7 +43,7 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id)
 {
        struct serial_card_info *info;
        struct serial_card_type *type = id->data;
-       struct uart_port port;
+       struct uart_8250_port uart;
        unsigned long bus_addr;
        unsigned int i;
 
@@ -62,19 +62,19 @@ serial_card_probe(struct expansion_card *ec, const struct ecard_id *id)
 
        ecard_set_drvdata(ec, info);
 
-       memset(&port, 0, sizeof(struct uart_port));
-       port.irq        = ec->irq;
-       port.flags      = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
-       port.uartclk    = type->uartclk;
-       port.iotype     = UPIO_MEM;
-       port.regshift   = 2;
-       port.dev        = &ec->dev;
+       memset(&uart, 0, sizeof(struct uart_8250_port));
+       uart.port.irq   = ec->irq;
+       uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
+       uart.port.uartclk       = type->uartclk;
+       uart.port.iotype        = UPIO_MEM;
+       uart.port.regshift      = 2;
+       uart.port.dev   = &ec->dev;
 
        for (i = 0; i < info->num_ports; i ++) {
-               port.membase = info->vaddr + type->offset[i];
-               port.mapbase = bus_addr + type->offset[i];
+               uart.port.membase = info->vaddr + type->offset[i];
+               uart.port.mapbase = bus_addr + type->offset[i];
 
-               info->ports[i] = serial8250_register_port(&port);
+               info->ports[i] = serial8250_register_8250_port(&uart);
        }
 
        return 0;
index f574eef..c3b2ec0 100644 (file)
@@ -89,7 +89,7 @@ static int dw8250_handle_irq(struct uart_port *p)
 
 static int __devinit dw8250_probe(struct platform_device *pdev)
 {
-       struct uart_port port = {};
+       struct uart_8250_port uart = {};
        struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        struct resource *irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
        struct device_node *np = pdev->dev.of_node;
@@ -104,28 +104,28 @@ static int __devinit dw8250_probe(struct platform_device *pdev)
        data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
        if (!data)
                return -ENOMEM;
-       port.private_data = data;
-
-       spin_lock_init(&port.lock);
-       port.mapbase = regs->start;
-       port.irq = irq->start;
-       port.handle_irq = dw8250_handle_irq;
-       port.type = PORT_8250;
-       port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP |
+       uart.port.private_data = data;
+
+       spin_lock_init(&uart.port.lock);
+       uart.port.mapbase = regs->start;
+       uart.port.irq = irq->start;
+       uart.port.handle_irq = dw8250_handle_irq;
+       uart.port.type = PORT_8250;
+       uart.port.flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP |
                UPF_FIXED_PORT | UPF_FIXED_TYPE;
-       port.dev = &pdev->dev;
+       uart.port.dev = &pdev->dev;
 
-       port.iotype = UPIO_MEM;
-       port.serial_in = dw8250_serial_in;
-       port.serial_out = dw8250_serial_out;
+       uart.port.iotype = UPIO_MEM;
+       uart.port.serial_in = dw8250_serial_in;
+       uart.port.serial_out = dw8250_serial_out;
        if (!of_property_read_u32(np, "reg-io-width", &val)) {
                switch (val) {
                case 1:
                        break;
                case 4:
-                       port.iotype = UPIO_MEM32;
-                       port.serial_in = dw8250_serial_in32;
-                       port.serial_out = dw8250_serial_out32;
+                       uart.port.iotype = UPIO_MEM32;
+                       uart.port.serial_in = dw8250_serial_in32;
+                       uart.port.serial_out = dw8250_serial_out32;
                        break;
                default:
                        dev_err(&pdev->dev, "unsupported reg-io-width (%u)\n",
@@ -135,15 +135,15 @@ static int __devinit dw8250_probe(struct platform_device *pdev)
        }
 
        if (!of_property_read_u32(np, "reg-shift", &val))
-               port.regshift = val;
+               uart.port.regshift = val;
 
        if (of_property_read_u32(np, "clock-frequency", &val)) {
                dev_err(&pdev->dev, "no clock-frequency property set\n");
                return -EINVAL;
        }
-       port.uartclk = val;
+       uart.port.uartclk = val;
 
-       data->line = serial8250_register_port(&port);
+       data->line = serial8250_register_8250_port(&uart);
        if (data->line < 0)
                return data->line;
 
index d8c0ffb..097dff9 100644 (file)
@@ -26,7 +26,7 @@
 
 static int __init serial_init_chip(struct parisc_device *dev)
 {
-       struct uart_port port;
+       struct uart_8250_port uart;
        unsigned long address;
        int err;
 
@@ -48,21 +48,21 @@ static int __init serial_init_chip(struct parisc_device *dev)
        if (dev->id.sversion != 0x8d)
                address += 0x800;
 
-       memset(&port, 0, sizeof(port));
-       port.iotype     = UPIO_MEM;
+       memset(&uart, 0, sizeof(uart));
+       uart.port.iotype        = UPIO_MEM;
        /* 7.272727MHz on Lasi.  Assumed the same for Dino, Wax and Timi. */
-       port.uartclk    = 7272727;
-       port.mapbase    = address;
-       port.membase    = ioremap_nocache(address, 16);
-       port.irq        = dev->irq;
-       port.flags      = UPF_BOOT_AUTOCONF;
-       port.dev        = &dev->dev;
-
-       err = serial8250_register_port(&port);
+       uart.port.uartclk       = 7272727;
+       uart.port.mapbase       = address;
+       uart.port.membase       = ioremap_nocache(address, 16);
+       uart.port.irq   = dev->irq;
+       uart.port.flags = UPF_BOOT_AUTOCONF;
+       uart.port.dev   = &dev->dev;
+
+       err = serial8250_register_8250_port(&uart);
        if (err < 0) {
                printk(KERN_WARNING
-                       "serial8250_register_port returned error %d\n", err);
-               iounmap(port.membase);
+                       "serial8250_register_8250_port returned error %d\n", err);
+               iounmap(uart.port.membase);
                return err;
        }
 
index c13438c..8f1dd2c 100644 (file)
@@ -171,7 +171,7 @@ static int __devinit hpdca_init_one(struct dio_dev *d,
                return 0;
        }
 #endif
-       memset(&port, 0, sizeof(struct uart_port));
+       memset(&uart, 0, sizeof(uart));
 
        /* Memory mapped I/O */
        port.iotype = UPIO_MEM;
@@ -182,7 +182,7 @@ static int __devinit hpdca_init_one(struct dio_dev *d,
        port.membase = (char *)(port.mapbase + DIO_VIRADDRBASE);
        port.regshift = 1;
        port.dev = &d->dev;
-       line = serial8250_register_port(&port);
+       line = serial8250_register_8250_port(&uart);
 
        if (line < 0) {
                printk(KERN_NOTICE "8250_hp300: register_serial() DCA scode %d"
@@ -210,7 +210,7 @@ static int __init hp300_8250_init(void)
 #ifdef CONFIG_HPAPCI
        int line;
        unsigned long base;
-       struct uart_port uport;
+       struct uart_8250_port uart;
        struct hp300_port *port;
        int i;
 #endif
@@ -248,26 +248,26 @@ static int __init hp300_8250_init(void)
                if (!port)
                        return -ENOMEM;
 
-               memset(&uport, 0, sizeof(struct uart_port));
+               memset(&uart, 0, sizeof(uart));
 
                base = (FRODO_BASE + FRODO_APCI_OFFSET(i));
 
                /* Memory mapped I/O */
-               uport.iotype = UPIO_MEM;
-               uport.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ \
+               uart.port.iotype = UPIO_MEM;
+               uart.port.flags = UPF_SKIP_TEST | UPF_SHARE_IRQ \
                              | UPF_BOOT_AUTOCONF;
                /* XXX - no interrupt support yet */
-               uport.irq = 0;
-               uport.uartclk = HPAPCI_BAUD_BASE * 16;
-               uport.mapbase = base;
-               uport.membase = (char *)(base + DIO_VIRADDRBASE);
-               uport.regshift = 2;
+               uart.port.irq = 0;
+               uart.port.uartclk = HPAPCI_BAUD_BASE * 16;
+               uart.port.mapbase = base;
+               uart.port.membase = (char *)(base + DIO_VIRADDRBASE);
+               uart.port.regshift = 2;
 
-               line = serial8250_register_port(&uport);
+               line = serial8250_register_8250_port(&uart);
 
                if (line < 0) {
                        printk(KERN_NOTICE "8250_hp300: register_serial() APCI"
-                              " %d irq %d failed\n", i, uport.irq);
+                              " %d irq %d failed\n", i, uart.port.irq);
                        kfree(port);
                        continue;
                }
index 28e7c7c..fdab80a 100644 (file)
@@ -44,7 +44,7 @@ struct pci_serial_quirk {
        int     (*init)(struct pci_dev *dev);
        int     (*setup)(struct serial_private *,
                         const struct pciserial_board *,
-                        struct uart_port *, int);
+                        struct uart_8250_port *, int);
        void    (*exit)(struct pci_dev *dev);
 };
 
@@ -59,7 +59,7 @@ struct serial_private {
 };
 
 static int pci_default_setup(struct serial_private*,
-         const struct pciserial_board*, struct uart_port*, int);
+         const struct pciserial_board*, struct uart_8250_port *, int);
 
 static void moan_device(const char *str, struct pci_dev *dev)
 {
@@ -74,7 +74,7 @@ static void moan_device(const char *str, struct pci_dev *dev)
 }
 
 static int
-setup_port(struct serial_private *priv, struct uart_port *port,
+setup_port(struct serial_private *priv, struct uart_8250_port *port,
           int bar, int offset, int regshift)
 {
        struct pci_dev *dev = priv->dev;
@@ -93,17 +93,17 @@ setup_port(struct serial_private *priv, struct uart_port *port,
                if (!priv->remapped_bar[bar])
                        return -ENOMEM;
 
-               port->iotype = UPIO_MEM;
-               port->iobase = 0;
-               port->mapbase = base + offset;
-               port->membase = priv->remapped_bar[bar] + offset;
-               port->regshift = regshift;
+               port->port.iotype = UPIO_MEM;
+               port->port.iobase = 0;
+               port->port.mapbase = base + offset;
+               port->port.membase = priv->remapped_bar[bar] + offset;
+               port->port.regshift = regshift;
        } else {
-               port->iotype = UPIO_PORT;
-               port->iobase = base + offset;
-               port->mapbase = 0;
-               port->membase = NULL;
-               port->regshift = 0;
+               port->port.iotype = UPIO_PORT;
+               port->port.iobase = base + offset;
+               port->port.mapbase = 0;
+               port->port.membase = NULL;
+               port->port.regshift = 0;
        }
        return 0;
 }
@@ -113,7 +113,7 @@ setup_port(struct serial_private *priv, struct uart_port *port,
  */
 static int addidata_apci7800_setup(struct serial_private *priv,
                                const struct pciserial_board *board,
-                               struct uart_port *port, int idx)
+                               struct uart_8250_port *port, int idx)
 {
        unsigned int bar = 0, offset = board->first_offset;
        bar = FL_GET_BASE(board->flags);
@@ -140,7 +140,7 @@ static int addidata_apci7800_setup(struct serial_private *priv,
  */
 static int
 afavlab_setup(struct serial_private *priv, const struct pciserial_board *board,
-             struct uart_port *port, int idx)
+             struct uart_8250_port *port, int idx)
 {
        unsigned int bar, offset = board->first_offset;
 
@@ -195,7 +195,7 @@ static int pci_hp_diva_init(struct pci_dev *dev)
 static int
 pci_hp_diva_setup(struct serial_private *priv,
                const struct pciserial_board *board,
-               struct uart_port *port, int idx)
+               struct uart_8250_port *port, int idx)
 {
        unsigned int offset = board->first_offset;
        unsigned int bar = FL_GET_BASE(board->flags);
@@ -370,7 +370,7 @@ static void __devexit pci_ni8430_exit(struct pci_dev *dev)
 /* SBS Technologies Inc. PMC-OCTPRO and P-OCTAL cards */
 static int
 sbs_setup(struct serial_private *priv, const struct pciserial_board *board,
-               struct uart_port *port, int idx)
+               struct uart_8250_port *port, int idx)
 {
        unsigned int bar, offset = board->first_offset;
 
@@ -525,7 +525,7 @@ static int pci_siig_init(struct pci_dev *dev)
 
 static int pci_siig_setup(struct serial_private *priv,
                          const struct pciserial_board *board,
-                         struct uart_port *port, int idx)
+                         struct uart_8250_port *port, int idx)
 {
        unsigned int bar = FL_GET_BASE(board->flags) + idx, offset = 0;
 
@@ -619,7 +619,7 @@ static int pci_timedia_init(struct pci_dev *dev)
 static int
 pci_timedia_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
-                 struct uart_port *port, int idx)
+                 struct uart_8250_port *port, int idx)
 {
        unsigned int bar = 0, offset = board->first_offset;
 
@@ -653,7 +653,7 @@ pci_timedia_setup(struct serial_private *priv,
 static int
 titan_400l_800l_setup(struct serial_private *priv,
                      const struct pciserial_board *board,
-                     struct uart_port *port, int idx)
+                     struct uart_8250_port *port, int idx)
 {
        unsigned int bar, offset = board->first_offset;
 
@@ -754,7 +754,7 @@ static int pci_ni8430_init(struct pci_dev *dev)
 static int
 pci_ni8430_setup(struct serial_private *priv,
                 const struct pciserial_board *board,
-                struct uart_port *port, int idx)
+                struct uart_8250_port *port, int idx)
 {
        void __iomem *p;
        unsigned long base, len;
@@ -781,7 +781,7 @@ pci_ni8430_setup(struct serial_private *priv,
 
 static int pci_netmos_9900_setup(struct serial_private *priv,
                                const struct pciserial_board *board,
-                               struct uart_port *port, int idx)
+                               struct uart_8250_port *port, int idx)
 {
        unsigned int bar;
 
@@ -1032,10 +1032,17 @@ static int pci_oxsemi_tornado_init(struct pci_dev *dev)
        return number_uarts;
 }
 
-static int
-pci_default_setup(struct serial_private *priv,
+static int pci_asix_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
-                 struct uart_port *port, int idx)
+                 struct uart_8250_port *port, int idx)
+{
+       port->bugs |= UART_BUG_PARITY;
+       return pci_default_setup(priv, board, port, idx);
+}
+
+static int pci_default_setup(struct serial_private *priv,
+                 const struct pciserial_board *board,
+                 struct uart_8250_port *port, int idx)
 {
        unsigned int bar, offset = board->first_offset, maxnr;
 
@@ -1057,15 +1064,15 @@ pci_default_setup(struct serial_private *priv,
 static int
 ce4100_serial_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
-                 struct uart_port *port, int idx)
+                 struct uart_8250_port *port, int idx)
 {
        int ret;
 
        ret = setup_port(priv, port, 0, 0, board->reg_shift);
-       port->iotype = UPIO_MEM32;
-       port->type = PORT_XSCALE;
-       port->flags = (port->flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
-       port->regshift = 2;
+       port->port.iotype = UPIO_MEM32;
+       port->port.type = PORT_XSCALE;
+       port->port.flags = (port->port.flags | UPF_FIXED_PORT | UPF_FIXED_TYPE);
+       port->port.regshift = 2;
 
        return ret;
 }
@@ -1073,16 +1080,16 @@ ce4100_serial_setup(struct serial_private *priv,
 static int
 pci_omegapci_setup(struct serial_private *priv,
                      const struct pciserial_board *board,
-                     struct uart_port *port, int idx)
+                     struct uart_8250_port *port, int idx)
 {
        return setup_port(priv, port, 2, idx * 8, 0);
 }
 
 static int skip_tx_en_setup(struct serial_private *priv,
                        const struct pciserial_board *board,
-                       struct uart_port *port, int idx)
+                       struct uart_8250_port *port, int idx)
 {
-       port->flags |= UPF_NO_TXEN_TEST;
+       port->port.flags |= UPF_NO_TXEN_TEST;
        printk(KERN_DEBUG "serial8250: skipping TxEn test for device "
                          "[%04x:%04x] subsystem [%04x:%04x]\n",
                          priv->dev->vendor,
@@ -1131,11 +1138,11 @@ static unsigned int kt_serial_in(struct uart_port *p, int offset)
 
 static int kt_serial_setup(struct serial_private *priv,
                           const struct pciserial_board *board,
-                          struct uart_port *port, int idx)
+                          struct uart_8250_port *port, int idx)
 {
-       port->flags |= UPF_BUG_THRE;
-       port->serial_in = kt_serial_in;
-       port->handle_break = kt_handle_break;
+       port->port.flags |= UPF_BUG_THRE;
+       port->port.serial_in = kt_serial_in;
+       port->port.handle_break = kt_handle_break;
        return skip_tx_en_setup(priv, board, port, idx);
 }
 
@@ -1151,9 +1158,19 @@ static int pci_eg20t_init(struct pci_dev *dev)
 static int
 pci_xr17c154_setup(struct serial_private *priv,
                  const struct pciserial_board *board,
-                 struct uart_port *port, int idx)
+                 struct uart_8250_port *port, int idx)
+{
+       port->port.flags |= UPF_EXAR_EFR;
+       return pci_default_setup(priv, board, port, idx);
+}
+
+static int
+pci_wch_ch353_setup(struct serial_private *priv,
+                    const struct pciserial_board *board,
+                    struct uart_8250_port *port, int idx)
 {
-       port->flags |= UPF_EXAR_EFR;
+       port->port.flags |= UPF_FIXED_TYPE;
+       port->port.type = PORT_16550A;
        return pci_default_setup(priv, board, port, idx);
 }
 
@@ -1187,6 +1204,13 @@ pci_xr17c154_setup(struct serial_private *priv,
 #define PCIE_DEVICE_ID_NEO_2_OX_IBM    0x00F6
 #define PCI_DEVICE_ID_PLX_CRONYX_OMEGA 0xc001
 #define PCI_DEVICE_ID_INTEL_PATSBURG_KT 0x1d3d
+#define PCI_VENDOR_ID_WCH              0x4348
+#define PCI_DEVICE_ID_WCH_CH353_4S     0x3453
+#define PCI_DEVICE_ID_WCH_CH353_2S1PF  0x5046
+#define PCI_DEVICE_ID_WCH_CH353_2S1P   0x7053
+#define PCI_VENDOR_ID_AGESTAR          0x5372
+#define PCI_DEVICE_ID_AGESTAR_9375     0x6872
+#define PCI_VENDOR_ID_ASIX             0x9710
 
 /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
 #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584        0x1584
@@ -1726,7 +1750,41 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
                .subvendor      = PCI_ANY_ID,
                .subdevice      = PCI_ANY_ID,
                .setup          = pci_omegapci_setup,
-        },
+       },
+       /* WCH CH353 2S1P card (16550 clone) */
+       {
+               .vendor         = PCI_VENDOR_ID_WCH,
+               .device         = PCI_DEVICE_ID_WCH_CH353_2S1P,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_wch_ch353_setup,
+       },
+       /* WCH CH353 4S card (16550 clone) */
+       {
+               .vendor         = PCI_VENDOR_ID_WCH,
+               .device         = PCI_DEVICE_ID_WCH_CH353_4S,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_wch_ch353_setup,
+       },
+       /* WCH CH353 2S1PF card (16550 clone) */
+       {
+               .vendor         = PCI_VENDOR_ID_WCH,
+               .device         = PCI_DEVICE_ID_WCH_CH353_2S1PF,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_wch_ch353_setup,
+       },
+       /*
+        * ASIX devices with FIFO bug
+        */
+       {
+               .vendor         = PCI_VENDOR_ID_ASIX,
+               .device         = PCI_ANY_ID,
+               .subvendor      = PCI_ANY_ID,
+               .subdevice      = PCI_ANY_ID,
+               .setup          = pci_asix_setup,
+       },
        /*
         * Default "match everything" terminator entry
         */
@@ -1887,7 +1945,6 @@ enum pci_board_num_t {
        pbn_panacom,
        pbn_panacom2,
        pbn_panacom4,
-       pbn_exsys_4055,
        pbn_plx_romulus,
        pbn_oxsemi,
        pbn_oxsemi_1_4000000,
@@ -2393,13 +2450,6 @@ static struct pciserial_board pci_boards[] __devinitdata = {
                .reg_shift      = 7,
        },
 
-       [pbn_exsys_4055] = {
-               .flags          = FL_BASE2,
-               .num_ports      = 4,
-               .base_baud      = 115200,
-               .uart_offset    = 8,
-       },
-
        /* I think this entry is broken - the first_offset looks wrong --rmk */
        [pbn_plx_romulus] = {
                .flags          = FL_BASE2,
@@ -2624,10 +2674,14 @@ static struct pciserial_board pci_boards[] __devinitdata = {
        },
 };
 
-static const struct pci_device_id softmodem_blacklist[] = {
+static const struct pci_device_id blacklist[] = {
+       /* softmodems */
        { PCI_VDEVICE(AL, 0x5457), }, /* ALi Corporation M5457 AC'97 Modem */
        { PCI_VDEVICE(MOTOROLA, 0x3052), }, /* Motorola Si3052-based modem */
        { PCI_DEVICE(0x1543, 0x3052), }, /* Si3052-based modem, default IDs */
+
+       /* multi-io cards handled by parport_serial */
+       { PCI_DEVICE(0x4348, 0x7053), }, /* WCH CH353 2S1P */
 };
 
 /*
@@ -2638,7 +2692,7 @@ static const struct pci_device_id softmodem_blacklist[] = {
 static int __devinit
 serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
 {
-       const struct pci_device_id *blacklist;
+       const struct pci_device_id *bldev;
        int num_iomem, num_port, first_port = -1, i;
 
        /*
@@ -2655,13 +2709,13 @@ serial_pci_guess_board(struct pci_dev *dev, struct pciserial_board *board)
 
        /*
         * Do not access blacklisted devices that are known not to
-        * feature serial ports.
+        * feature serial ports or are handled by other modules.
         */
-       for (blacklist = softmodem_blacklist;
-            blacklist < softmodem_blacklist + ARRAY_SIZE(softmodem_blacklist);
-            blacklist++) {
-               if (dev->vendor == blacklist->vendor &&
-                   dev->device == blacklist->device)
+       for (bldev = blacklist;
+            bldev < blacklist + ARRAY_SIZE(blacklist);
+            bldev++) {
+               if (dev->vendor == bldev->vendor &&
+                   dev->device == bldev->device)
                        return -ENODEV;
        }
 
@@ -2728,7 +2782,7 @@ serial_pci_matches(const struct pciserial_board *board,
 struct serial_private *
 pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
 {
-       struct uart_port serial_port;
+       struct uart_8250_port uart;
        struct serial_private *priv;
        struct pci_serial_quirk *quirk;
        int rc, nr_ports, i;
@@ -2768,22 +2822,22 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board)
        priv->dev = dev;
        priv->quirk = quirk;
 
-       memset(&serial_port, 0, sizeof(struct uart_port));
-       serial_port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
-       serial_port.uartclk = board->base_baud * 16;
-       serial_port.irq = get_pci_irq(dev, board);
-       serial_port.dev = &dev->dev;
+       memset(&uart, 0, sizeof(uart));
+       uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ;
+       uart.port.uartclk = board->base_baud * 16;
+       uart.port.irq = get_pci_irq(dev, board);
+       uart.port.dev = &dev->dev;
 
        for (i = 0; i < nr_ports; i++) {
-               if (quirk->setup(priv, board, &serial_port, i))
+               if (quirk->setup(priv, board, &uart, i))
                        break;
 
 #ifdef SERIAL_DEBUG_PCI
                printk(KERN_DEBUG "Setup PCI port: port %lx, irq %d, type %d\n",
-                      serial_port.iobase, serial_port.irq, serial_port.iotype);
+                      uart.port.iobase, uart.port.irq, uart.port.iotype);
 #endif
 
-               priv->line[i] = serial8250_register_port(&serial_port);
+               priv->line[i] = serial8250_register_8250_port(&uart);
                if (priv->line[i] < 0) {
                        printk(KERN_WARNING "Couldn't register serial port %s: %d\n", pci_name(dev), priv->line[i]);
                        break;
@@ -3193,7 +3247,7 @@ static struct pci_device_id serial_pci_tbl[] = {
        {       PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
                PCI_SUBVENDOR_ID_EXSYS,
                PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0,
-               pbn_exsys_4055 },
+               pbn_b2_4_115200 },
        /*
         * Megawolf Romulus PCI Serial Card, from Mike Hudson
         * (Exoray@isys.ca)
@@ -4179,6 +4233,25 @@ static struct pci_device_id serial_pci_tbl[] = {
                pbn_omegapci },
 
        /*
+        * AgeStar as-prs2-009
+        */
+       {       PCI_VENDOR_ID_AGESTAR, PCI_DEVICE_ID_AGESTAR_9375,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0, pbn_b0_bt_2_115200 },
+
+       /*
+        * WCH CH353 series devices: The 2S1P is handled by parport_serial
+        * so not listed here.
+        */
+       {       PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_4S,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0, pbn_b0_bt_4_115200 },
+
+       {       PCI_VENDOR_ID_WCH, PCI_DEVICE_ID_WCH_CH353_2S1PF,
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0, pbn_b0_bt_2_115200 },
+
+       /*
         * These entries match devices with class COMMUNICATION_SERIAL,
         * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
         */
index a2f2365..fde5aa6 100644 (file)
@@ -424,7 +424,7 @@ static int __devinit serial_pnp_guess_board(struct pnp_dev *dev, int *flags)
 static int __devinit
 serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
 {
-       struct uart_port port;
+       struct uart_8250_port uart;
        int ret, line, flags = dev_id->driver_data;
 
        if (flags & UNKNOWN_DEV) {
@@ -433,32 +433,32 @@ serial_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
                        return ret;
        }
 
-       memset(&port, 0, sizeof(struct uart_port));
+       memset(&uart, 0, sizeof(uart));
        if (pnp_irq_valid(dev, 0))
-               port.irq = pnp_irq(dev, 0);
+               uart.port.irq = pnp_irq(dev, 0);
        if (pnp_port_valid(dev, 0)) {
-               port.iobase = pnp_port_start(dev, 0);
-               port.iotype = UPIO_PORT;
+               uart.port.iobase = pnp_port_start(dev, 0);
+               uart.port.iotype = UPIO_PORT;
        } else if (pnp_mem_valid(dev, 0)) {
-               port.mapbase = pnp_mem_start(dev, 0);
-               port.iotype = UPIO_MEM;
-               port.flags = UPF_IOREMAP;
+               uart.port.mapbase = pnp_mem_start(dev, 0);
+               uart.port.iotype = UPIO_MEM;
+               uart.port.flags = UPF_IOREMAP;
        } else
                return -ENODEV;
 
 #ifdef SERIAL_DEBUG_PNP
        printk(KERN_DEBUG
                "Setup PNP port: port %x, mem 0x%lx, irq %d, type %d\n",
-                      port.iobase, port.mapbase, port.irq, port.iotype);
+                      uart.port.iobase, uart.port.mapbase, uart.port.irq, uart.port.iotype);
 #endif
 
-       port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
+       uart.port.flags |= UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
        if (pnp_irq_flags(dev, 0) & IORESOURCE_IRQ_SHAREABLE)
-               port.flags |= UPF_SHARE_IRQ;
-       port.uartclk = 1843200;
-       port.dev = &dev->dev;
+               uart.port.flags |= UPF_SHARE_IRQ;
+       uart.port.uartclk = 1843200;
+       uart.port.dev = &dev->dev;
 
-       line = serial8250_register_port(&port);
+       line = serial8250_register_8250_port(&uart);
        if (line < 0)
                return -ENODEV;
 
index 29b695d..b7d48b3 100644 (file)
@@ -73,7 +73,7 @@ struct serial_quirk {
        unsigned int prodid;
        int multi;              /* 1 = multifunction, > 1 = # ports */
        void (*config)(struct pcmcia_device *);
-       void (*setup)(struct pcmcia_device *, struct uart_port *);
+       void (*setup)(struct pcmcia_device *, struct uart_8250_port *);
        void (*wakeup)(struct pcmcia_device *);
        int (*post)(struct pcmcia_device *);
 };
@@ -105,9 +105,9 @@ struct serial_cfg_mem {
  * Elan VPU16551 UART with 14.7456MHz oscillator
  * manfid 0x015D, 0x4C45
  */
-static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port)
+static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_8250_port *uart)
 {
-       port->uartclk = 14745600;
+       uart->port.uartclk = 14745600;
 }
 
 static int quirk_post_ibm(struct pcmcia_device *link)
@@ -343,25 +343,25 @@ static void serial_detach(struct pcmcia_device *link)
 static int setup_serial(struct pcmcia_device *handle, struct serial_info * info,
                        unsigned int iobase, int irq)
 {
-       struct uart_port port;
+       struct uart_8250_port uart;
        int line;
 
-       memset(&port, 0, sizeof (struct uart_port));
-       port.iobase = iobase;
-       port.irq = irq;
-       port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
-       port.uartclk = 1843200;
-       port.dev = &handle->dev;
+       memset(&uart, 0, sizeof(uart));
+       uart.port.iobase = iobase;
+       uart.port.irq = irq;
+       uart.port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ;
+       uart.port.uartclk = 1843200;
+       uart.port.dev = &handle->dev;
        if (buggy_uart)
-               port.flags |= UPF_BUGGY_UART;
+               uart.port.flags |= UPF_BUGGY_UART;
 
        if (info->quirk && info->quirk->setup)
-               info->quirk->setup(handle, &port);
+               info->quirk->setup(handle, &uart);
 
-       line = serial8250_register_port(&port);
+       line = serial8250_register_8250_port(&uart);
        if (line < 0) {
-               printk(KERN_NOTICE "serial_cs: serial8250_register_port() at "
-                      "0x%04lx, irq %d failed\n", (u_long)iobase, irq);
+               pr_err("serial_cs: serial8250_register_8250_port() at 0x%04lx, irq %d failed\n",
+                                                       (unsigned long)iobase, irq);
                return -EINVAL;
        }
 
index 4720b4b..26907cf 100644 (file)
@@ -257,12 +257,19 @@ config SERIAL_MAX3100
        help
          MAX3100 chip support
 
-config SERIAL_MAX3107
-       tristate "MAX3107 support"
+config SERIAL_MAX310X
+       bool "MAX310X support"
        depends on SPI
        select SERIAL_CORE
+       select REGMAP_SPI if SPI
+       default n
        help
-         MAX3107 chip support
+         This selects support for an advanced UART from Maxim (Dallas).
+         Supported ICs are MAX3107, MAX3108.
+         Each IC contains 128 words each of receive and transmit FIFO
+         that can be controlled through I2C or high-speed SPI.
+
+         Say Y here if you want to support this ICs.
 
 config SERIAL_DZ
        bool "DECstation DZ serial driver"
@@ -704,6 +711,25 @@ config SERIAL_PNX8XXX_CONSOLE
          If you have a MIPS-based Philips SoC such as PNX8550 or PNX8330
          and you want to use serial console, say Y. Otherwise, say N.
 
+config SERIAL_HS_LPC32XX
+       tristate "LPC32XX high speed serial port support"
+       depends on ARCH_LPC32XX && OF
+       select SERIAL_CORE
+       help
+         Support for the LPC32XX high speed serial ports (up to 900kbps).
+         Those are UARTs completely different from the Standard UARTs on the
+         LPC32XX SoC.
+         Choose M or Y here to build this driver.
+
+config SERIAL_HS_LPC32XX_CONSOLE
+       bool "Enable LPC32XX high speed UART serial console"
+       depends on SERIAL_HS_LPC32XX
+       select SERIAL_CORE_CONSOLE
+       help
+         If you would like to be able to use one of the high speed serial
+         ports on the LPC32XX as the console, you can do so by answering
+         Y to this option.
+
 config SERIAL_CORE
        tristate
 
@@ -1104,6 +1130,24 @@ config SERIAL_SC26XX_CONSOLE
        help
          Support for Console on SC2681/SC2692 serial ports.
 
+config SERIAL_SCCNXP
+       bool "SCCNXP serial port support"
+       depends on !SERIAL_SC26XX
+       select SERIAL_CORE
+       default n
+       help
+         This selects support for an advanced UART from NXP (Philips).
+         Supported ICs are SCC2681, SCC2691, SCC2692, SC28L91, SC28L92,
+         SC28L202, SCC68681 and SCC68692.
+         Positioned as a replacement for the driver SC26XX.
+
+config SERIAL_SCCNXP_CONSOLE
+       bool "Console on SCCNXP serial port"
+       depends on SERIAL_SCCNXP
+       select SERIAL_CORE_CONSOLE
+       help
+         Support for console on SCCNXP serial ports.
+
 config SERIAL_BFIN_SPORT
        tristate "Blackfin SPORT emulate UART"
        depends on BLACKFIN
index 7257c5d..ce88667 100644 (file)
@@ -28,12 +28,13 @@ obj-$(CONFIG_SERIAL_BFIN) += bfin_uart.o
 obj-$(CONFIG_SERIAL_BFIN_SPORT) += bfin_sport_uart.o
 obj-$(CONFIG_SERIAL_SAMSUNG) += samsung.o
 obj-$(CONFIG_SERIAL_MAX3100) += max3100.o
-obj-$(CONFIG_SERIAL_MAX3107) += max3107.o
+obj-$(CONFIG_SERIAL_MAX310X) += max310x.o
 obj-$(CONFIG_SERIAL_IP22_ZILOG) += ip22zilog.o
 obj-$(CONFIG_SERIAL_MUX) += mux.o
 obj-$(CONFIG_SERIAL_68328) += 68328serial.o
 obj-$(CONFIG_SERIAL_MCF) += mcf.o
 obj-$(CONFIG_SERIAL_PMACZILOG) += pmac_zilog.o
+obj-$(CONFIG_SERIAL_HS_LPC32XX) += lpc32xx_hs.o
 obj-$(CONFIG_SERIAL_DZ) += dz.o
 obj-$(CONFIG_SERIAL_ZS) += zs.o
 obj-$(CONFIG_SERIAL_SH_SCI) += sh-sci.o
@@ -47,6 +48,7 @@ obj-$(CONFIG_SERIAL_MPSC) += mpsc.o
 obj-$(CONFIG_SERIAL_SB1250_DUART) += sb1250-duart.o
 obj-$(CONFIG_ETRAX_SERIAL) += crisv10.o
 obj-$(CONFIG_SERIAL_SC26XX) += sc26xx.o
+obj-$(CONFIG_SERIAL_SCCNXP) += sccnxp.o
 obj-$(CONFIG_SERIAL_JSM) += jsm/
 obj-$(CONFIG_SERIAL_TXX9) += serial_txx9.o
 obj-$(CONFIG_SERIAL_VR41XX) += vr41xx_siu.o
index 1f03309..15d80b9 100644 (file)
@@ -591,7 +591,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
        port->ops = &altera_uart_ops;
        port->flags = UPF_BOOT_AUTOCONF;
 
-       dev_set_drvdata(&pdev->dev, port);
+       platform_set_drvdata(pdev, port);
 
        uart_add_one_port(&altera_uart_driver, port);
 
@@ -600,11 +600,11 @@ static int __devinit altera_uart_probe(struct platform_device *pdev)
 
 static int __devexit altera_uart_remove(struct platform_device *pdev)
 {
-       struct uart_port *port = dev_get_drvdata(&pdev->dev);
+       struct uart_port *port = platform_get_drvdata(pdev);
 
        if (port) {
                uart_remove_one_port(&altera_uart_driver, port);
-               dev_set_drvdata(&pdev->dev, NULL);
+               platform_set_drvdata(pdev, NULL);
                port->mapbase = 0;
        }
 
index 0d91a54..22317dd 100644 (file)
@@ -312,16 +312,12 @@ static int pl010_startup(struct uart_port *port)
        struct uart_amba_port *uap = (struct uart_amba_port *)port;
        int retval;
 
-       retval = clk_prepare(uap->clk);
-       if (retval)
-               goto out;
-
        /*
         * Try to enable the clock producer.
         */
-       retval = clk_enable(uap->clk);
+       retval = clk_prepare_enable(uap->clk);
        if (retval)
-               goto clk_unprep;
+               goto out;
 
        uap->port.uartclk = clk_get_rate(uap->clk);
 
@@ -346,9 +342,7 @@ static int pl010_startup(struct uart_port *port)
        return 0;
 
  clk_dis:
-       clk_disable(uap->clk);
- clk_unprep:
-       clk_unprepare(uap->clk);
+       clk_disable_unprepare(uap->clk);
  out:
        return retval;
 }
@@ -375,8 +369,7 @@ static void pl010_shutdown(struct uart_port *port)
        /*
         * Shut down the clock producer
         */
-       clk_disable(uap->clk);
-       clk_unprepare(uap->clk);
+       clk_disable_unprepare(uap->clk);
 }
 
 static void
index d3553b5..cede938 100644 (file)
@@ -52,6 +52,8 @@
 #include <linux/scatterlist.h>
 #include <linux/delay.h>
 #include <linux/types.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/sizes.h>
 
@@ -75,7 +77,6 @@ struct vendor_data {
        unsigned int            lcrh_tx;
        unsigned int            lcrh_rx;
        bool                    oversampling;
-       bool                    interrupt_may_hang;   /* vendor-specific */
        bool                    dma_threshold;
        bool                    cts_event_workaround;
 };
@@ -96,7 +97,6 @@ static struct vendor_data vendor_st = {
        .lcrh_tx                = ST_UART011_LCRH_TX,
        .lcrh_rx                = ST_UART011_LCRH_RX,
        .oversampling           = true,
-       .interrupt_may_hang     = true,
        .dma_threshold          = true,
        .cts_event_workaround   = true,
 };
@@ -147,7 +147,6 @@ struct uart_amba_port {
        unsigned int            old_cr;         /* state during shutdown */
        bool                    autorts;
        char                    type[12];
-       bool                    interrupt_may_hang; /* vendor-specific */
 #ifdef CONFIG_DMA_ENGINE
        /* DMA stuff */
        bool                    using_tx_dma;
@@ -1215,14 +1214,14 @@ static irqreturn_t pl011_int(int irq, void *dev_id)
        return IRQ_RETVAL(handled);
 }
 
-static unsigned int pl01x_tx_empty(struct uart_port *port)
+static unsigned int pl011_tx_empty(struct uart_port *port)
 {
        struct uart_amba_port *uap = (struct uart_amba_port *)port;
        unsigned int status = readw(uap->port.membase + UART01x_FR);
        return status & (UART01x_FR_BUSY|UART01x_FR_TXFF) ? 0 : TIOCSER_TEMT;
 }
 
-static unsigned int pl01x_get_mctrl(struct uart_port *port)
+static unsigned int pl011_get_mctrl(struct uart_port *port)
 {
        struct uart_amba_port *uap = (struct uart_amba_port *)port;
        unsigned int result = 0;
@@ -1285,7 +1284,7 @@ static void pl011_break_ctl(struct uart_port *port, int break_state)
 }
 
 #ifdef CONFIG_CONSOLE_POLL
-static int pl010_get_poll_char(struct uart_port *port)
+static int pl011_get_poll_char(struct uart_port *port)
 {
        struct uart_amba_port *uap = (struct uart_amba_port *)port;
        unsigned int status;
@@ -1297,7 +1296,7 @@ static int pl010_get_poll_char(struct uart_port *port)
        return readw(uap->port.membase + UART01x_DR);
 }
 
-static void pl010_put_poll_char(struct uart_port *port,
+static void pl011_put_poll_char(struct uart_port *port,
                         unsigned char ch)
 {
        struct uart_amba_port *uap = (struct uart_amba_port *)port;
@@ -1324,16 +1323,12 @@ static int pl011_startup(struct uart_port *port)
                                "could not set default pins\n");
        }
 
-       retval = clk_prepare(uap->clk);
-       if (retval)
-               goto out;
-
        /*
         * Try to enable the clock producer.
         */
-       retval = clk_enable(uap->clk);
+       retval = clk_prepare_enable(uap->clk);
        if (retval)
-               goto clk_unprep;
+               goto out;
 
        uap->port.uartclk = clk_get_rate(uap->clk);
 
@@ -1411,9 +1406,7 @@ static int pl011_startup(struct uart_port *port)
        return 0;
 
  clk_dis:
-       clk_disable(uap->clk);
- clk_unprep:
-       clk_unprepare(uap->clk);
+       clk_disable_unprepare(uap->clk);
  out:
        return retval;
 }
@@ -1473,8 +1466,7 @@ static void pl011_shutdown(struct uart_port *port)
        /*
         * Shut down the clock producer
         */
-       clk_disable(uap->clk);
-       clk_unprepare(uap->clk);
+       clk_disable_unprepare(uap->clk);
        /* Optionally let pins go into sleep states */
        if (!IS_ERR(uap->pins_sleep)) {
                retval = pinctrl_select_state(uap->pinctrl, uap->pins_sleep);
@@ -1637,7 +1629,7 @@ static const char *pl011_type(struct uart_port *port)
 /*
  * Release the memory region(s) being used by 'port'
  */
-static void pl010_release_port(struct uart_port *port)
+static void pl011_release_port(struct uart_port *port)
 {
        release_mem_region(port->mapbase, SZ_4K);
 }
@@ -1645,7 +1637,7 @@ static void pl010_release_port(struct uart_port *port)
 /*
  * Request the memory region(s) being used by 'port'
  */
-static int pl010_request_port(struct uart_port *port)
+static int pl011_request_port(struct uart_port *port)
 {
        return request_mem_region(port->mapbase, SZ_4K, "uart-pl011")
                        != NULL ? 0 : -EBUSY;
@@ -1654,18 +1646,18 @@ static int pl010_request_port(struct uart_port *port)
 /*
  * Configure/autoconfigure the port.
  */
-static void pl010_config_port(struct uart_port *port, int flags)
+static void pl011_config_port(struct uart_port *port, int flags)
 {
        if (flags & UART_CONFIG_TYPE) {
                port->type = PORT_AMBA;
-               pl010_request_port(port);
+               pl011_request_port(port);
        }
 }
 
 /*
  * verify the new serial_struct (for TIOCSSERIAL).
  */
-static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser)
+static int pl011_verify_port(struct uart_port *port, struct serial_struct *ser)
 {
        int ret = 0;
        if (ser->type != PORT_UNKNOWN && ser->type != PORT_AMBA)
@@ -1678,9 +1670,9 @@ static int pl010_verify_port(struct uart_port *port, struct serial_struct *ser)
 }
 
 static struct uart_ops amba_pl011_pops = {
-       .tx_empty       = pl01x_tx_empty,
+       .tx_empty       = pl011_tx_empty,
        .set_mctrl      = pl011_set_mctrl,
-       .get_mctrl      = pl01x_get_mctrl,
+       .get_mctrl      = pl011_get_mctrl,
        .stop_tx        = pl011_stop_tx,
        .start_tx       = pl011_start_tx,
        .stop_rx        = pl011_stop_rx,
@@ -1691,13 +1683,13 @@ static struct uart_ops amba_pl011_pops = {
        .flush_buffer   = pl011_dma_flush_buffer,
        .set_termios    = pl011_set_termios,
        .type           = pl011_type,
-       .release_port   = pl010_release_port,
-       .request_port   = pl010_request_port,
-       .config_port    = pl010_config_port,
-       .verify_port    = pl010_verify_port,
+       .release_port   = pl011_release_port,
+       .request_port   = pl011_request_port,
+       .config_port    = pl011_config_port,
+       .verify_port    = pl011_verify_port,
 #ifdef CONFIG_CONSOLE_POLL
-       .poll_get_char = pl010_get_poll_char,
-       .poll_put_char = pl010_put_poll_char,
+       .poll_get_char = pl011_get_poll_char,
+       .poll_put_char = pl011_put_poll_char,
 #endif
 };
 
@@ -1869,6 +1861,38 @@ static struct uart_driver amba_reg = {
        .cons                   = AMBA_CONSOLE,
 };
 
+static int pl011_probe_dt_alias(int index, struct device *dev)
+{
+       struct device_node *np;
+       static bool seen_dev_with_alias = false;
+       static bool seen_dev_without_alias = false;
+       int ret = index;
+
+       if (!IS_ENABLED(CONFIG_OF))
+               return ret;
+
+       np = dev->of_node;
+       if (!np)
+               return ret;
+
+       ret = of_alias_get_id(np, "serial");
+       if (IS_ERR_VALUE(ret)) {
+               seen_dev_without_alias = true;
+               ret = index;
+       } else {
+               seen_dev_with_alias = true;
+               if (ret >= ARRAY_SIZE(amba_ports) || amba_ports[ret] != NULL) {
+                       dev_warn(dev, "requested serial port %d  not available.\n", ret);
+                       ret = index;
+               }
+       }
+
+       if (seen_dev_with_alias && seen_dev_without_alias)
+               dev_warn(dev, "aliased and non-aliased serial devices found in device tree. Serial port enumeration may be unpredictable.\n");
+
+       return ret;
+}
+
 static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
 {
        struct uart_amba_port *uap;
@@ -1891,6 +1915,8 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
                goto out;
        }
 
+       i = pl011_probe_dt_alias(i, &dev->dev);
+
        base = ioremap(dev->res.start, resource_size(&dev->res));
        if (!base) {
                ret = -ENOMEM;
@@ -1923,7 +1949,6 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id)
        uap->lcrh_tx = vendor->lcrh_tx;
        uap->old_cr = 0;
        uap->fifosize = vendor->fifosize;
-       uap->interrupt_may_hang = vendor->interrupt_may_hang;
        uap->port.dev = &dev->dev;
        uap->port.mapbase = dev->res.start;
        uap->port.membase = base;
index bd97db2..9242d56 100644 (file)
@@ -182,7 +182,7 @@ static void bfin_serial_start_tx(struct uart_port *port)
         * To avoid losting RX interrupt, we reset IR function
         * before sending data.
         */
-       if (tty->termios->c_line == N_IRDA)
+       if (tty->termios.c_line == N_IRDA)
                bfin_serial_reset_irda(port);
 
 #ifdef CONFIG_SERIAL_BFIN_DMA
index 80b6b1b..35ee6a2 100644 (file)
@@ -955,7 +955,7 @@ static const struct control_pins e100_modem_pins[NR_PORTS] =
 /* Calculate the chartime depending on baudrate, numbor of bits etc. */
 static void update_char_time(struct e100_serial * info)
 {
-       tcflag_t cflags = info->port.tty->termios->c_cflag;
+       tcflag_t cflags = info->port.tty->termios.c_cflag;
        int bits;
 
        /* calc. number of bits / data byte */
@@ -1473,7 +1473,7 @@ rs_stop(struct tty_struct *tty)
                xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char,
                                STOP_CHAR(info->port.tty));
                xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, stop);
-               if (tty->termios->c_iflag & IXON ) {
+               if (tty->termios.c_iflag & IXON ) {
                        xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
                }
 
@@ -1496,7 +1496,7 @@ rs_start(struct tty_struct *tty)
                                         info->xmit.tail,SERIAL_XMIT_SIZE)));
                xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(tty));
                xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
-               if (tty->termios->c_iflag & IXON ) {
+               if (tty->termios.c_iflag & IXON ) {
                        xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
                }
 
@@ -2929,7 +2929,7 @@ shutdown(struct e100_serial * info)
                        descr[i].buf = 0;
                }
 
-       if (!info->port.tty || (info->port.tty->termios->c_cflag & HUPCL)) {
+       if (!info->port.tty || (info->port.tty->termios.c_cflag & HUPCL)) {
                /* hang up DTR and RTS if HUPCL is enabled */
                e100_dtr(info, 0);
                e100_rts(info, 0); /* could check CRTSCTS before doing this */
@@ -2953,12 +2953,12 @@ change_speed(struct e100_serial *info)
        unsigned long flags;
        /* first some safety checks */
 
-       if (!info->port.tty || !info->port.tty->termios)
+       if (!info->port.tty)
                return;
        if (!info->ioport)
                return;
 
-       cflag = info->port.tty->termios->c_cflag;
+       cflag = info->port.tty->termios.c_cflag;
 
        /* possibly, the tx/rx should be disabled first to do this safely */
 
@@ -3088,7 +3088,7 @@ change_speed(struct e100_serial *info)
        info->ioport[REG_REC_CTRL] = info->rx_ctrl;
        xoff = IO_FIELD(R_SERIAL0_XOFF, xoff_char, STOP_CHAR(info->port.tty));
        xoff |= IO_STATE(R_SERIAL0_XOFF, tx_stop, enable);
-       if (info->port.tty->termios->c_iflag & IXON ) {
+       if (info->port.tty->termios.c_iflag & IXON ) {
                DFLOW(DEBUG_LOG(info->line, "FLOW XOFF enabled 0x%02X\n",
                                STOP_CHAR(info->port.tty)));
                xoff |= IO_STATE(R_SERIAL0_XOFF, auto_xoff, enable);
@@ -3355,7 +3355,7 @@ rs_throttle(struct tty_struct * tty)
        DFLOW(DEBUG_LOG(info->line,"rs_throttle %lu\n", tty->ldisc.chars_in_buffer(tty)));
 
        /* Do RTS before XOFF since XOFF might take some time */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                /* Turn off RTS line */
                e100_rts(info, 0);
        }
@@ -3377,7 +3377,7 @@ rs_unthrottle(struct tty_struct * tty)
        DFLOW(DEBUG_LOG(info->line,"rs_unthrottle ldisc %d\n", tty->ldisc.chars_in_buffer(tty)));
        DFLOW(DEBUG_LOG(info->line,"rs_unthrottle flip.count: %i\n", tty->flip.count));
        /* Do RTS before XOFF since XOFF might take some time */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                /* Assert RTS line  */
                e100_rts(info, 1);
        }
@@ -3748,7 +3748,7 @@ rs_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
        /* Handle turning off CRTSCTS */
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                rs_start(tty);
        }
@@ -3815,7 +3815,7 @@ rs_close(struct tty_struct *tty, struct file * filp)
         * separate termios for callout and dialin.
         */
        if (info->flags & ASYNC_NORMAL_ACTIVE)
-               info->normal_termios = *tty->termios;
+               info->normal_termios = tty->termios;
        /*
         * Now we wait for the transmit buffer to clear; and we notify
         * the line discipline to only process XON/XOFF characters.
@@ -3976,7 +3976,7 @@ block_til_ready(struct tty_struct *tty, struct file * filp,
         */
        if (tty_hung_up_p(filp) ||
            (info->flags & ASYNC_CLOSING)) {
-               wait_event_interruptible_tty(info->close_wait,
+               wait_event_interruptible_tty(tty, info->close_wait,
                        !(info->flags & ASYNC_CLOSING));
 #ifdef SERIAL_DO_RESTART
                if (info->flags & ASYNC_HUP_NOTIFY)
@@ -3998,7 +3998,7 @@ block_til_ready(struct tty_struct *tty, struct file * filp,
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL) {
+       if (tty->termios.c_cflag & CLOCAL) {
                        do_clocal = 1;
        }
 
@@ -4052,9 +4052,9 @@ block_til_ready(struct tty_struct *tty, struct file * filp,
                printk("block_til_ready blocking: ttyS%d, count = %d\n",
                       info->line, info->count);
 #endif
-               tty_unlock();
+               tty_unlock(tty);
                schedule();
-               tty_lock();
+               tty_lock(tty);
        }
        set_current_state(TASK_RUNNING);
        remove_wait_queue(&info->open_wait, &wait);
@@ -4115,7 +4115,7 @@ rs_open(struct tty_struct *tty, struct file * filp)
         */
        if (tty_hung_up_p(filp) ||
            (info->flags & ASYNC_CLOSING)) {
-               wait_event_interruptible_tty(info->close_wait,
+               wait_event_interruptible_tty(tty, info->close_wait,
                        !(info->flags & ASYNC_CLOSING));
 #ifdef SERIAL_DO_RESTART
                return ((info->flags & ASYNC_HUP_NOTIFY) ?
@@ -4219,7 +4219,7 @@ rs_open(struct tty_struct *tty, struct file * filp)
        }
 
        if ((info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS)) {
-               *tty->termios = info->normal_termios;
+               tty->termios = info->normal_termios;
                change_speed(info);
        }
 
@@ -4443,14 +4443,12 @@ static int __init rs_init(void)
                B115200 | CS8 | CREAD | HUPCL | CLOCAL; /* is normally B9600 default... */
        driver->init_termios.c_ispeed = 115200;
        driver->init_termios.c_ospeed = 115200;
-       driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV;
+       driver->flags = TTY_DRIVER_REAL_RAW;
 
        tty_set_operations(driver, &rs_ops);
         serial_driver = driver;
-       if (tty_register_driver(driver))
-               panic("Couldn't register serial driver\n");
-       /* do some initializing for the separate ports */
 
+       /* do some initializing for the separate ports */
        for (i = 0, info = rs_table; i < NR_PORTS; i++,info++) {
                if (info->enabled) {
                        if (cris_request_io_interface(info->io_if,
@@ -4502,7 +4500,12 @@ static int __init rs_init(void)
                        printk(KERN_INFO "%s%d at %p is a builtin UART with DMA\n",
                               serial_driver->name, info->line, info->ioport);
                }
+               tty_port_link_device(&info->port, driver, i);
        }
+
+       if (tty_register_driver(driver))
+               panic("Couldn't register serial driver\n");
+
 #ifdef CONFIG_ETRAX_FAST_TIMER
 #ifdef CONFIG_ETRAX_SERIAL_FAST_TIMER
        memset(fast_timers, 0, sizeof(fast_timers));
index 3ad079f..5b9bc19 100644 (file)
@@ -800,8 +800,8 @@ static int ifx_spi_create_port(struct ifx_spi_device *ifx_dev)
        tty_port_init(pport);
        pport->ops = &ifx_tty_port_ops;
        ifx_dev->minor = IFX_SPI_TTY_ID;
-       ifx_dev->tty_dev = tty_register_device(tty_drv, ifx_dev->minor,
-                                              &ifx_dev->spi_dev->dev);
+       ifx_dev->tty_dev = tty_port_register_device(pport, tty_drv,
+                       ifx_dev->minor, &ifx_dev->spi_dev->dev);
        if (IS_ERR(ifx_dev->tty_dev)) {
                dev_dbg(&ifx_dev->spi_dev->dev,
                        "%s: registering tty device failed", __func__);
index d5c689d..5952b25 100644 (file)
 #define  UCR4_OREN      (1<<1)  /* Receiver overrun interrupt enable */
 #define  UCR4_DREN      (1<<0)  /* Recv data ready interrupt enable */
 #define  UFCR_RXTL_SHF   0       /* Receiver trigger level shift */
+#define  UFCR_DCEDTE    (1<<6)  /* DCE/DTE mode select */
 #define  UFCR_RFDIV      (7<<7)  /* Reference freq divider mask */
 #define  UFCR_RFDIV_REG(x)     (((x) < 7 ? 6 - (x) : 6) << 7)
 #define  UFCR_TXTL_SHF   10      /* Transmitter trigger level shift */
@@ -206,7 +207,7 @@ struct imx_port {
        unsigned short          trcv_delay; /* transceiver delay */
        struct clk              *clk_ipg;
        struct clk              *clk_per;
-       struct imx_uart_data    *devdata;
+       const struct imx_uart_data *devdata;
 };
 
 struct imx_port_ucrs {
@@ -667,22 +668,11 @@ static void imx_break_ctl(struct uart_port *port, int break_state)
 static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode)
 {
        unsigned int val;
-       unsigned int ufcr_rfdiv;
-
-       /* set receiver / transmitter trigger level.
-        * RFDIV is set such way to satisfy requested uartclk value
-        */
-       val = TXTL << 10 | RXTL;
-       ufcr_rfdiv = (clk_get_rate(sport->clk_per) + sport->port.uartclk / 2)
-                       / sport->port.uartclk;
-
-       if(!ufcr_rfdiv)
-               ufcr_rfdiv = 1;
-
-       val |= UFCR_RFDIV_REG(ufcr_rfdiv);
 
+       /* set receiver / transmitter trigger level */
+       val = readl(sport->port.membase + UFCR) & (UFCR_RFDIV | UFCR_DCEDTE);
+       val |= TXTL << UFCR_TXTL_SHF | RXTL;
        writel(val, sport->port.membase + UFCR);
-
        return 0;
 }
 
@@ -754,6 +744,7 @@ static int imx_startup(struct uart_port *port)
                }
        }
 
+       spin_lock_irqsave(&sport->port.lock, flags);
        /*
         * Finally, clear and enable interrupts
         */
@@ -807,7 +798,6 @@ static int imx_startup(struct uart_port *port)
        /*
         * Enable modem status interrupts
         */
-       spin_lock_irqsave(&sport->port.lock,flags);
        imx_enable_ms(&sport->port);
        spin_unlock_irqrestore(&sport->port.lock,flags);
 
@@ -837,10 +827,13 @@ static void imx_shutdown(struct uart_port *port)
 {
        struct imx_port *sport = (struct imx_port *)port;
        unsigned long temp;
+       unsigned long flags;
 
+       spin_lock_irqsave(&sport->port.lock, flags);
        temp = readl(sport->port.membase + UCR2);
        temp &= ~(UCR2_TXEN);
        writel(temp, sport->port.membase + UCR2);
+       spin_unlock_irqrestore(&sport->port.lock, flags);
 
        if (USE_IRDA(sport)) {
                struct imxuart_platform_data *pdata;
@@ -869,12 +862,14 @@ static void imx_shutdown(struct uart_port *port)
         * Disable all interrupts, port and break condition.
         */
 
+       spin_lock_irqsave(&sport->port.lock, flags);
        temp = readl(sport->port.membase + UCR1);
        temp &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN);
        if (USE_IRDA(sport))
                temp &= ~(UCR1_IREN);
 
        writel(temp, sport->port.membase + UCR1);
+       spin_unlock_irqrestore(&sport->port.lock, flags);
 }
 
 static void
@@ -1217,6 +1212,9 @@ imx_console_write(struct console *co, const char *s, unsigned int count)
        struct imx_port *sport = imx_ports[co->index];
        struct imx_port_ucrs old_ucr;
        unsigned int ucr1;
+       unsigned long flags;
+
+       spin_lock_irqsave(&sport->port.lock, flags);
 
        /*
         *      First, save UCR1/2/3 and then disable interrupts
@@ -1242,6 +1240,8 @@ imx_console_write(struct console *co, const char *s, unsigned int count)
        while (!(readl(sport->port.membase + USR2) & USR2_TXDC));
 
        imx_port_ucrs_restore(&sport->port, &old_ucr);
+
+       spin_unlock_irqrestore(&sport->port.lock, flags);
 }
 
 /*
@@ -1505,18 +1505,21 @@ static int serial_imx_probe(struct platform_device *pdev)
        pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
        if (IS_ERR(pinctrl)) {
                ret = PTR_ERR(pinctrl);
+               dev_err(&pdev->dev, "failed to get default pinctrl: %d\n", ret);
                goto unmap;
        }
 
        sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
        if (IS_ERR(sport->clk_ipg)) {
                ret = PTR_ERR(sport->clk_ipg);
+               dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret);
                goto unmap;
        }
 
        sport->clk_per = devm_clk_get(&pdev->dev, "per");
        if (IS_ERR(sport->clk_per)) {
                ret = PTR_ERR(sport->clk_per);
+               dev_err(&pdev->dev, "failed to get per clk: %d\n", ret);
                goto unmap;
        }
 
index 758ff31..5ac5289 100644 (file)
@@ -1120,13 +1120,14 @@ static inline int do_read(struct uart_port *the_port, char *buf, int len)
        struct ioc3_port *port = get_ioc3_port(the_port);
        struct ring *inring;
        struct ring_entry *entry;
-       struct port_hooks *hooks = port->ip_hooks;
+       struct port_hooks *hooks;
        int byte_num;
        char *sc;
        int loop_counter;
 
        BUG_ON(!(len >= 0));
        BUG_ON(!port);
+       hooks = port->ip_hooks;
 
        /* There is a nasty timing issue in the IOC3. When the rx_timer
         * expires or the rx_high condition arises, we take an interrupt.
index e16894f..3e7da10 100644 (file)
@@ -1803,7 +1803,7 @@ static inline int ic4_startup_local(struct uart_port *the_port)
        ioc4_set_proto(port, the_port->mapbase);
 
        /* set the speed of the serial port */
-       ioc4_change_speed(the_port, state->port.tty->termios,
+       ioc4_change_speed(the_port, &state->port.tty->termios,
                          (struct ktermios *)0);
 
        return 0;
@@ -2069,13 +2069,14 @@ static inline int do_read(struct uart_port *the_port, unsigned char *buf,
        struct ioc4_port *port = get_ioc4_port(the_port, 0);
        struct ring *inring;
        struct ring_entry *entry;
-       struct hooks *hooks = port->ip_hooks;
+       struct hooks *hooks;
        int byte_num;
        char *sc;
        int loop_counter;
 
        BUG_ON(!(len >= 0));
        BUG_ON(!port);
+       hooks = port->ip_hooks;
 
        /* There is a nasty timing issue in the IOC4. When the rx_timer
         * expires or the rx_high condition arises, we take an interrupt.
index 434bd88..7139796 100644 (file)
@@ -161,7 +161,7 @@ static void jsm_tty_send_xchar(struct uart_port *port, char ch)
        struct ktermios *termios;
 
        spin_lock_irqsave(&port->lock, lock_flags);
-       termios = port->state->port.tty->termios;
+       termios = &port->state->port.tty->termios;
        if (ch == termios->c_cc[VSTART])
                channel->ch_bd->bd_ops->send_start_character(channel);
 
@@ -250,7 +250,7 @@ static int jsm_tty_open(struct uart_port *port)
        channel->ch_cached_lsr = 0;
        channel->ch_stops_sent = 0;
 
-       termios = port->state->port.tty->termios;
+       termios = &port->state->port.tty->termios;
        channel->ch_c_cflag     = termios->c_cflag;
        channel->ch_c_iflag     = termios->c_iflag;
        channel->ch_c_oflag     = termios->c_oflag;
@@ -283,7 +283,7 @@ static void jsm_tty_close(struct uart_port *port)
        jsm_printk(CLOSE, INFO, &channel->ch_bd->pci_dev, "start\n");
 
        bd = channel->ch_bd;
-       ts = port->state->port.tty->termios;
+       ts = &port->state->port.tty->termios;
 
        channel->ch_flags &= ~(CH_STOPI);
 
@@ -567,7 +567,7 @@ void jsm_input(struct jsm_channel *ch)
         *input data and return immediately.
         */
        if (!tp ||
-               !(tp->termios->c_cflag & CREAD) ) {
+               !(tp->termios.c_cflag & CREAD) ) {
 
                jsm_printk(READ, INFO, &ch->ch_bd->pci_dev,
                        "input. dropping %d bytes on port %d...\n", data_len, ch->ch_portnum);
diff --git a/drivers/tty/serial/lpc32xx_hs.c b/drivers/tty/serial/lpc32xx_hs.c
new file mode 100644 (file)
index 0000000..ba3af3b
--- /dev/null
@@ -0,0 +1,823 @@
+/*
+ * High Speed Serial Ports on NXP LPC32xx SoC
+ *
+ * Authors: Kevin Wells <kevin.wells@nxp.com>
+ *          Roland Stigge <stigge@antcom.de>
+ *
+ * Copyright (C) 2010 NXP Semiconductors
+ * Copyright (C) 2012 Roland Stigge
+ *
+ * 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/module.h>
+#include <linux/ioport.h>
+#include <linux/init.h>
+#include <linux/console.h>
+#include <linux/sysrq.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/serial_core.h>
+#include <linux/serial.h>
+#include <linux/platform_device.h>
+#include <linux/delay.h>
+#include <linux/nmi.h>
+#include <linux/io.h>
+#include <linux/irq.h>
+#include <linux/gpio.h>
+#include <linux/of.h>
+#include <mach/platform.h>
+#include <mach/hardware.h>
+
+/*
+ * High Speed UART register offsets
+ */
+#define LPC32XX_HSUART_FIFO(x)                 ((x) + 0x00)
+#define LPC32XX_HSUART_LEVEL(x)                        ((x) + 0x04)
+#define LPC32XX_HSUART_IIR(x)                  ((x) + 0x08)
+#define LPC32XX_HSUART_CTRL(x)                 ((x) + 0x0C)
+#define LPC32XX_HSUART_RATE(x)                 ((x) + 0x10)
+
+#define LPC32XX_HSU_BREAK_DATA                 (1 << 10)
+#define LPC32XX_HSU_ERROR_DATA                 (1 << 9)
+#define LPC32XX_HSU_RX_EMPTY                   (1 << 8)
+
+#define LPC32XX_HSU_TX_LEV(n)                  (((n) >> 8) & 0xFF)
+#define LPC32XX_HSU_RX_LEV(n)                  ((n) & 0xFF)
+
+#define LPC32XX_HSU_TX_INT_SET                 (1 << 6)
+#define LPC32XX_HSU_RX_OE_INT                  (1 << 5)
+#define LPC32XX_HSU_BRK_INT                    (1 << 4)
+#define LPC32XX_HSU_FE_INT                     (1 << 3)
+#define LPC32XX_HSU_RX_TIMEOUT_INT             (1 << 2)
+#define LPC32XX_HSU_RX_TRIG_INT                        (1 << 1)
+#define LPC32XX_HSU_TX_INT                     (1 << 0)
+
+#define LPC32XX_HSU_HRTS_INV                   (1 << 21)
+#define LPC32XX_HSU_HRTS_TRIG_8B               (0x0 << 19)
+#define LPC32XX_HSU_HRTS_TRIG_16B              (0x1 << 19)
+#define LPC32XX_HSU_HRTS_TRIG_32B              (0x2 << 19)
+#define LPC32XX_HSU_HRTS_TRIG_48B              (0x3 << 19)
+#define LPC32XX_HSU_HRTS_EN                    (1 << 18)
+#define LPC32XX_HSU_TMO_DISABLED               (0x0 << 16)
+#define LPC32XX_HSU_TMO_INACT_4B               (0x1 << 16)
+#define LPC32XX_HSU_TMO_INACT_8B               (0x2 << 16)
+#define LPC32XX_HSU_TMO_INACT_16B              (0x3 << 16)
+#define LPC32XX_HSU_HCTS_INV                   (1 << 15)
+#define LPC32XX_HSU_HCTS_EN                    (1 << 14)
+#define LPC32XX_HSU_OFFSET(n)                  ((n) << 9)
+#define LPC32XX_HSU_BREAK                      (1 << 8)
+#define LPC32XX_HSU_ERR_INT_EN                 (1 << 7)
+#define LPC32XX_HSU_RX_INT_EN                  (1 << 6)
+#define LPC32XX_HSU_TX_INT_EN                  (1 << 5)
+#define LPC32XX_HSU_RX_TL1B                    (0x0 << 2)
+#define LPC32XX_HSU_RX_TL4B                    (0x1 << 2)
+#define LPC32XX_HSU_RX_TL8B                    (0x2 << 2)
+#define LPC32XX_HSU_RX_TL16B                   (0x3 << 2)
+#define LPC32XX_HSU_RX_TL32B                   (0x4 << 2)
+#define LPC32XX_HSU_RX_TL48B                   (0x5 << 2)
+#define LPC32XX_HSU_TX_TLEMPTY                 (0x0 << 0)
+#define LPC32XX_HSU_TX_TL0B                    (0x0 << 0)
+#define LPC32XX_HSU_TX_TL4B                    (0x1 << 0)
+#define LPC32XX_HSU_TX_TL8B                    (0x2 << 0)
+#define LPC32XX_HSU_TX_TL16B                   (0x3 << 0)
+
+#define MODNAME "lpc32xx_hsuart"
+
+struct lpc32xx_hsuart_port {
+       struct uart_port port;
+};
+
+#define FIFO_READ_LIMIT 128
+#define MAX_PORTS 3
+#define LPC32XX_TTY_NAME "ttyTX"
+static struct lpc32xx_hsuart_port lpc32xx_hs_ports[MAX_PORTS];
+
+#ifdef CONFIG_SERIAL_HS_LPC32XX_CONSOLE
+static void wait_for_xmit_empty(struct uart_port *port)
+{
+       unsigned int timeout = 10000;
+
+       do {
+               if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL(
+                                                       port->membase))) == 0)
+                       break;
+               if (--timeout == 0)
+                       break;
+               udelay(1);
+       } while (1);
+}
+
+static void wait_for_xmit_ready(struct uart_port *port)
+{
+       unsigned int timeout = 10000;
+
+       while (1) {
+               if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL(
+                                                       port->membase))) < 32)
+                       break;
+               if (--timeout == 0)
+                       break;
+               udelay(1);
+       }
+}
+
+static void lpc32xx_hsuart_console_putchar(struct uart_port *port, int ch)
+{
+       wait_for_xmit_ready(port);
+       writel((u32)ch, LPC32XX_HSUART_FIFO(port->membase));
+}
+
+static void lpc32xx_hsuart_console_write(struct console *co, const char *s,
+                                        unsigned int count)
+{
+       struct lpc32xx_hsuart_port *up = &lpc32xx_hs_ports[co->index];
+       unsigned long flags;
+       int locked = 1;
+
+       touch_nmi_watchdog();
+       local_irq_save(flags);
+       if (up->port.sysrq)
+               locked = 0;
+       else if (oops_in_progress)
+               locked = spin_trylock(&up->port.lock);
+       else
+               spin_lock(&up->port.lock);
+
+       uart_console_write(&up->port, s, count, lpc32xx_hsuart_console_putchar);
+       wait_for_xmit_empty(&up->port);
+
+       if (locked)
+               spin_unlock(&up->port.lock);
+       local_irq_restore(flags);
+}
+
+static int __init lpc32xx_hsuart_console_setup(struct console *co,
+                                              char *options)
+{
+       struct uart_port *port;
+       int baud = 115200;
+       int bits = 8;
+       int parity = 'n';
+       int flow = 'n';
+
+       if (co->index >= MAX_PORTS)
+               co->index = 0;
+
+       port = &lpc32xx_hs_ports[co->index].port;
+       if (!port->membase)
+               return -ENODEV;
+
+       if (options)
+               uart_parse_options(options, &baud, &parity, &bits, &flow);
+
+       return uart_set_options(port, co, baud, parity, bits, flow);
+}
+
+static struct uart_driver lpc32xx_hsuart_reg;
+static struct console lpc32xx_hsuart_console = {
+       .name           = LPC32XX_TTY_NAME,
+       .write          = lpc32xx_hsuart_console_write,
+       .device         = uart_console_device,
+       .setup          = lpc32xx_hsuart_console_setup,
+       .flags          = CON_PRINTBUFFER,
+       .index          = -1,
+       .data           = &lpc32xx_hsuart_reg,
+};
+
+static int __init lpc32xx_hsuart_console_init(void)
+{
+       register_console(&lpc32xx_hsuart_console);
+       return 0;
+}
+console_initcall(lpc32xx_hsuart_console_init);
+
+#define LPC32XX_HSUART_CONSOLE (&lpc32xx_hsuart_console)
+#else
+#define LPC32XX_HSUART_CONSOLE NULL
+#endif
+
+static struct uart_driver lpc32xx_hs_reg = {
+       .owner          = THIS_MODULE,
+       .driver_name    = MODNAME,
+       .dev_name       = LPC32XX_TTY_NAME,
+       .nr             = MAX_PORTS,
+       .cons           = LPC32XX_HSUART_CONSOLE,
+};
+static int uarts_registered;
+
+static unsigned int __serial_get_clock_div(unsigned long uartclk,
+                                          unsigned long rate)
+{
+       u32 div, goodrate, hsu_rate, l_hsu_rate, comprate;
+       u32 rate_diff;
+
+       /* Find the closest divider to get the desired clock rate */
+       div = uartclk / rate;
+       goodrate = hsu_rate = (div / 14) - 1;
+       if (hsu_rate != 0)
+               hsu_rate--;
+
+       /* Tweak divider */
+       l_hsu_rate = hsu_rate + 3;
+       rate_diff = 0xFFFFFFFF;
+
+       while (hsu_rate < l_hsu_rate) {
+               comprate = uartclk / ((hsu_rate + 1) * 14);
+               if (abs(comprate - rate) < rate_diff) {
+                       goodrate = hsu_rate;
+                       rate_diff = abs(comprate - rate);
+               }
+
+               hsu_rate++;
+       }
+       if (hsu_rate > 0xFF)
+               hsu_rate = 0xFF;
+
+       return goodrate;
+}
+
+static void __serial_uart_flush(struct uart_port *port)
+{
+       u32 tmp;
+       int cnt = 0;
+
+       while ((readl(LPC32XX_HSUART_LEVEL(port->membase)) > 0) &&
+              (cnt++ < FIFO_READ_LIMIT))
+               tmp = readl(LPC32XX_HSUART_FIFO(port->membase));
+}
+
+static void __serial_lpc32xx_rx(struct uart_port *port)
+{
+       unsigned int tmp, flag;
+       struct tty_struct *tty = tty_port_tty_get(&port->state->port);
+
+       if (!tty) {
+               /* Discard data: no tty available */
+               while (!(readl(LPC32XX_HSUART_FIFO(port->membase)) &
+                        LPC32XX_HSU_RX_EMPTY))
+                       ;
+
+               return;
+       }
+
+       /* Read data from FIFO and push into terminal */
+       tmp = readl(LPC32XX_HSUART_FIFO(port->membase));
+       while (!(tmp & LPC32XX_HSU_RX_EMPTY)) {
+               flag = TTY_NORMAL;
+               port->icount.rx++;
+
+               if (tmp & LPC32XX_HSU_ERROR_DATA) {
+                       /* Framing error */
+                       writel(LPC32XX_HSU_FE_INT,
+                              LPC32XX_HSUART_IIR(port->membase));
+                       port->icount.frame++;
+                       flag = TTY_FRAME;
+                       tty_insert_flip_char(tty, 0, TTY_FRAME);
+               }
+
+               tty_insert_flip_char(tty, (tmp & 0xFF), flag);
+
+               tmp = readl(LPC32XX_HSUART_FIFO(port->membase));
+       }
+       tty_flip_buffer_push(tty);
+       tty_kref_put(tty);
+}
+
+static void __serial_lpc32xx_tx(struct uart_port *port)
+{
+       struct circ_buf *xmit = &port->state->xmit;
+       unsigned int tmp;
+
+       if (port->x_char) {
+               writel((u32)port->x_char, LPC32XX_HSUART_FIFO(port->membase));
+               port->icount.tx++;
+               port->x_char = 0;
+               return;
+       }
+
+       if (uart_circ_empty(xmit) || uart_tx_stopped(port))
+               goto exit_tx;
+
+       /* Transfer data */
+       while (LPC32XX_HSU_TX_LEV(readl(
+               LPC32XX_HSUART_LEVEL(port->membase))) < 64) {
+               writel((u32) xmit->buf[xmit->tail],
+                      LPC32XX_HSUART_FIFO(port->membase));
+               xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+               port->icount.tx++;
+               if (uart_circ_empty(xmit))
+                       break;
+       }
+
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+               uart_write_wakeup(port);
+
+exit_tx:
+       if (uart_circ_empty(xmit)) {
+               tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
+               tmp &= ~LPC32XX_HSU_TX_INT_EN;
+               writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
+       }
+}
+
+static irqreturn_t serial_lpc32xx_interrupt(int irq, void *dev_id)
+{
+       struct uart_port *port = dev_id;
+       struct tty_struct *tty = tty_port_tty_get(&port->state->port);
+       u32 status;
+
+       spin_lock(&port->lock);
+
+       /* Read UART status and clear latched interrupts */
+       status = readl(LPC32XX_HSUART_IIR(port->membase));
+
+       if (status & LPC32XX_HSU_BRK_INT) {
+               /* Break received */
+               writel(LPC32XX_HSU_BRK_INT, LPC32XX_HSUART_IIR(port->membase));
+               port->icount.brk++;
+               uart_handle_break(port);
+       }
+
+       /* Framing error */
+       if (status & LPC32XX_HSU_FE_INT)
+               writel(LPC32XX_HSU_FE_INT, LPC32XX_HSUART_IIR(port->membase));
+
+       if (status & LPC32XX_HSU_RX_OE_INT) {
+               /* Receive FIFO overrun */
+               writel(LPC32XX_HSU_RX_OE_INT,
+                      LPC32XX_HSUART_IIR(port->membase));
+               port->icount.overrun++;
+               if (tty) {
+                       tty_insert_flip_char(tty, 0, TTY_OVERRUN);
+                       tty_schedule_flip(tty);
+               }
+       }
+
+       /* Data received? */
+       if (status & (LPC32XX_HSU_RX_TIMEOUT_INT | LPC32XX_HSU_RX_TRIG_INT)) {
+               __serial_lpc32xx_rx(port);
+               if (tty)
+                       tty_flip_buffer_push(tty);
+       }
+
+       /* Transmit data request? */
+       if ((status & LPC32XX_HSU_TX_INT) && (!uart_tx_stopped(port))) {
+               writel(LPC32XX_HSU_TX_INT, LPC32XX_HSUART_IIR(port->membase));
+               __serial_lpc32xx_tx(port);
+       }
+
+       spin_unlock(&port->lock);
+       tty_kref_put(tty);
+
+       return IRQ_HANDLED;
+}
+
+/* port->lock is not held.  */
+static unsigned int serial_lpc32xx_tx_empty(struct uart_port *port)
+{
+       unsigned int ret = 0;
+
+       if (LPC32XX_HSU_TX_LEV(readl(LPC32XX_HSUART_LEVEL(port->membase))) == 0)
+               ret = TIOCSER_TEMT;
+
+       return ret;
+}
+
+/* port->lock held by caller.  */
+static void serial_lpc32xx_set_mctrl(struct uart_port *port,
+                                    unsigned int mctrl)
+{
+       /* No signals are supported on HS UARTs */
+}
+
+/* port->lock is held by caller and interrupts are disabled.  */
+static unsigned int serial_lpc32xx_get_mctrl(struct uart_port *port)
+{
+       /* No signals are supported on HS UARTs */
+       return TIOCM_CAR | TIOCM_DSR | TIOCM_CTS;
+}
+
+/* port->lock held by caller.  */
+static void serial_lpc32xx_stop_tx(struct uart_port *port)
+{
+       u32 tmp;
+
+       tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
+       tmp &= ~LPC32XX_HSU_TX_INT_EN;
+       writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
+}
+
+/* port->lock held by caller.  */
+static void serial_lpc32xx_start_tx(struct uart_port *port)
+{
+       u32 tmp;
+
+       __serial_lpc32xx_tx(port);
+       tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
+       tmp |= LPC32XX_HSU_TX_INT_EN;
+       writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
+}
+
+/* port->lock held by caller.  */
+static void serial_lpc32xx_stop_rx(struct uart_port *port)
+{
+       u32 tmp;
+
+       tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
+       tmp &= ~(LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN);
+       writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
+
+       writel((LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT |
+               LPC32XX_HSU_FE_INT), LPC32XX_HSUART_IIR(port->membase));
+}
+
+/* port->lock held by caller.  */
+static void serial_lpc32xx_enable_ms(struct uart_port *port)
+{
+       /* Modem status is not supported */
+}
+
+/* port->lock is not held.  */
+static void serial_lpc32xx_break_ctl(struct uart_port *port,
+                                    int break_state)
+{
+       unsigned long flags;
+       u32 tmp;
+
+       spin_lock_irqsave(&port->lock, flags);
+       tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
+       if (break_state != 0)
+               tmp |= LPC32XX_HSU_BREAK;
+       else
+               tmp &= ~LPC32XX_HSU_BREAK;
+       writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
+       spin_unlock_irqrestore(&port->lock, flags);
+}
+
+/* LPC3250 Errata HSUART.1: Hang workaround via loopback mode on inactivity */
+static void lpc32xx_loopback_set(resource_size_t mapbase, int state)
+{
+       int bit;
+       u32 tmp;
+
+       switch (mapbase) {
+       case LPC32XX_HS_UART1_BASE:
+               bit = 0;
+               break;
+       case LPC32XX_HS_UART2_BASE:
+               bit = 1;
+               break;
+       case LPC32XX_HS_UART7_BASE:
+               bit = 6;
+               break;
+       default:
+               WARN(1, "lpc32xx_hs: Warning: Unknown port at %08x\n", mapbase);
+               return;
+       }
+
+       tmp = readl(LPC32XX_UARTCTL_CLOOP);
+       if (state)
+               tmp |= (1 << bit);
+       else
+               tmp &= ~(1 << bit);
+       writel(tmp, LPC32XX_UARTCTL_CLOOP);
+}
+
+/* port->lock is not held.  */
+static int serial_lpc32xx_startup(struct uart_port *port)
+{
+       int retval;
+       unsigned long flags;
+       u32 tmp;
+
+       spin_lock_irqsave(&port->lock, flags);
+
+       __serial_uart_flush(port);
+
+       writel((LPC32XX_HSU_TX_INT | LPC32XX_HSU_FE_INT |
+               LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT),
+              LPC32XX_HSUART_IIR(port->membase));
+
+       writel(0xFF, LPC32XX_HSUART_RATE(port->membase));
+
+       /*
+        * Set receiver timeout, HSU offset of 20, no break, no interrupts,
+        * and default FIFO trigger levels
+        */
+       tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B |
+               LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B;
+       writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
+
+       lpc32xx_loopback_set(port->mapbase, 0); /* get out of loopback mode */
+
+       spin_unlock_irqrestore(&port->lock, flags);
+
+       retval = request_irq(port->irq, serial_lpc32xx_interrupt,
+                            0, MODNAME, port);
+       if (!retval)
+               writel((tmp | LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN),
+                      LPC32XX_HSUART_CTRL(port->membase));
+
+       return retval;
+}
+
+/* port->lock is not held.  */
+static void serial_lpc32xx_shutdown(struct uart_port *port)
+{
+       u32 tmp;
+       unsigned long flags;
+
+       spin_lock_irqsave(&port->lock, flags);
+
+       tmp = LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B |
+               LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B;
+       writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
+
+       lpc32xx_loopback_set(port->mapbase, 1); /* go to loopback mode */
+
+       spin_unlock_irqrestore(&port->lock, flags);
+
+       free_irq(port->irq, port);
+}
+
+/* port->lock is not held.  */
+static void serial_lpc32xx_set_termios(struct uart_port *port,
+                                      struct ktermios *termios,
+                                      struct ktermios *old)
+{
+       unsigned long flags;
+       unsigned int baud, quot;
+       u32 tmp;
+
+       /* Always 8-bit, no parity, 1 stop bit */
+       termios->c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD);
+       termios->c_cflag |= CS8;
+
+       termios->c_cflag &= ~(HUPCL | CMSPAR | CLOCAL | CRTSCTS);
+
+       baud = uart_get_baud_rate(port, termios, old, 0,
+                                 port->uartclk / 14);
+
+       quot = __serial_get_clock_div(port->uartclk, baud);
+
+       spin_lock_irqsave(&port->lock, flags);
+
+       /* Ignore characters? */
+       tmp = readl(LPC32XX_HSUART_CTRL(port->membase));
+       if ((termios->c_cflag & CREAD) == 0)
+               tmp &= ~(LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN);
+       else
+               tmp |= LPC32XX_HSU_RX_INT_EN | LPC32XX_HSU_ERR_INT_EN;
+       writel(tmp, LPC32XX_HSUART_CTRL(port->membase));
+
+       writel(quot, LPC32XX_HSUART_RATE(port->membase));
+
+       uart_update_timeout(port, termios->c_cflag, baud);
+
+       spin_unlock_irqrestore(&port->lock, flags);
+
+       /* Don't rewrite B0 */
+       if (tty_termios_baud_rate(termios))
+               tty_termios_encode_baud_rate(termios, baud, baud);
+}
+
+static const char *serial_lpc32xx_type(struct uart_port *port)
+{
+       return MODNAME;
+}
+
+static void serial_lpc32xx_release_port(struct uart_port *port)
+{
+       if ((port->iotype == UPIO_MEM32) && (port->mapbase)) {
+               if (port->flags & UPF_IOREMAP) {
+                       iounmap(port->membase);
+                       port->membase = NULL;
+               }
+
+               release_mem_region(port->mapbase, SZ_4K);
+       }
+}
+
+static int serial_lpc32xx_request_port(struct uart_port *port)
+{
+       int ret = -ENODEV;
+
+       if ((port->iotype == UPIO_MEM32) && (port->mapbase)) {
+               ret = 0;
+
+               if (!request_mem_region(port->mapbase, SZ_4K, MODNAME))
+                       ret = -EBUSY;
+               else if (port->flags & UPF_IOREMAP) {
+                       port->membase = ioremap(port->mapbase, SZ_4K);
+                       if (!port->membase) {
+                               release_mem_region(port->mapbase, SZ_4K);
+                               ret = -ENOMEM;
+                       }
+               }
+       }
+
+       return ret;
+}
+
+static void serial_lpc32xx_config_port(struct uart_port *port, int uflags)
+{
+       int ret;
+
+       ret = serial_lpc32xx_request_port(port);
+       if (ret < 0)
+               return;
+       port->type = PORT_UART00;
+       port->fifosize = 64;
+
+       __serial_uart_flush(port);
+
+       writel((LPC32XX_HSU_TX_INT | LPC32XX_HSU_FE_INT |
+               LPC32XX_HSU_BRK_INT | LPC32XX_HSU_RX_OE_INT),
+              LPC32XX_HSUART_IIR(port->membase));
+
+       writel(0xFF, LPC32XX_HSUART_RATE(port->membase));
+
+       /* Set receiver timeout, HSU offset of 20, no break, no interrupts,
+          and default FIFO trigger levels */
+       writel(LPC32XX_HSU_TX_TL8B | LPC32XX_HSU_RX_TL32B |
+              LPC32XX_HSU_OFFSET(20) | LPC32XX_HSU_TMO_INACT_4B,
+              LPC32XX_HSUART_CTRL(port->membase));
+}
+
+static int serial_lpc32xx_verify_port(struct uart_port *port,
+                                     struct serial_struct *ser)
+{
+       int ret = 0;
+
+       if (ser->type != PORT_UART00)
+               ret = -EINVAL;
+
+       return ret;
+}
+
+static struct uart_ops serial_lpc32xx_pops = {
+       .tx_empty       = serial_lpc32xx_tx_empty,
+       .set_mctrl      = serial_lpc32xx_set_mctrl,
+       .get_mctrl      = serial_lpc32xx_get_mctrl,
+       .stop_tx        = serial_lpc32xx_stop_tx,
+       .start_tx       = serial_lpc32xx_start_tx,
+       .stop_rx        = serial_lpc32xx_stop_rx,
+       .enable_ms      = serial_lpc32xx_enable_ms,
+       .break_ctl      = serial_lpc32xx_break_ctl,
+       .startup        = serial_lpc32xx_startup,
+       .shutdown       = serial_lpc32xx_shutdown,
+       .set_termios    = serial_lpc32xx_set_termios,
+       .type           = serial_lpc32xx_type,
+       .release_port   = serial_lpc32xx_release_port,
+       .request_port   = serial_lpc32xx_request_port,
+       .config_port    = serial_lpc32xx_config_port,
+       .verify_port    = serial_lpc32xx_verify_port,
+};
+
+/*
+ * Register a set of serial devices attached to a platform device
+ */
+static int __devinit serial_hs_lpc32xx_probe(struct platform_device *pdev)
+{
+       struct lpc32xx_hsuart_port *p = &lpc32xx_hs_ports[uarts_registered];
+       int ret = 0;
+       struct resource *res;
+
+       if (uarts_registered >= MAX_PORTS) {
+               dev_err(&pdev->dev,
+                       "Error: Number of possible ports exceeded (%d)!\n",
+                       uarts_registered + 1);
+               return -ENXIO;
+       }
+
+       memset(p, 0, sizeof(*p));
+
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (!res) {
+               dev_err(&pdev->dev,
+                       "Error getting mem resource for HS UART port %d\n",
+                       uarts_registered);
+               return -ENXIO;
+       }
+       p->port.mapbase = res->start;
+       p->port.membase = NULL;
+
+       p->port.irq = platform_get_irq(pdev, 0);
+       if (p->port.irq < 0) {
+               dev_err(&pdev->dev, "Error getting irq for HS UART port %d\n",
+                       uarts_registered);
+               return p->port.irq;
+       }
+
+       p->port.iotype = UPIO_MEM32;
+       p->port.uartclk = LPC32XX_MAIN_OSC_FREQ;
+       p->port.regshift = 2;
+       p->port.flags = UPF_BOOT_AUTOCONF | UPF_FIXED_PORT | UPF_IOREMAP;
+       p->port.dev = &pdev->dev;
+       p->port.ops = &serial_lpc32xx_pops;
+       p->port.line = uarts_registered++;
+       spin_lock_init(&p->port.lock);
+
+       /* send port to loopback mode by default */
+       lpc32xx_loopback_set(p->port.mapbase, 1);
+
+       ret = uart_add_one_port(&lpc32xx_hs_reg, &p->port);
+
+       platform_set_drvdata(pdev, p);
+
+       return ret;
+}
+
+/*
+ * Remove serial ports registered against a platform device.
+ */
+static int __devexit serial_hs_lpc32xx_remove(struct platform_device *pdev)
+{
+       struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev);
+
+       uart_remove_one_port(&lpc32xx_hs_reg, &p->port);
+
+       return 0;
+}
+
+
+#ifdef CONFIG_PM
+static int serial_hs_lpc32xx_suspend(struct platform_device *pdev,
+                                    pm_message_t state)
+{
+       struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev);
+
+       uart_suspend_port(&lpc32xx_hs_reg, &p->port);
+
+       return 0;
+}
+
+static int serial_hs_lpc32xx_resume(struct platform_device *pdev)
+{
+       struct lpc32xx_hsuart_port *p = platform_get_drvdata(pdev);
+
+       uart_resume_port(&lpc32xx_hs_reg, &p->port);
+
+       return 0;
+}
+#else
+#define serial_hs_lpc32xx_suspend      NULL
+#define serial_hs_lpc32xx_resume       NULL
+#endif
+
+static const struct of_device_id serial_hs_lpc32xx_dt_ids[] = {
+       { .compatible = "nxp,lpc3220-hsuart" },
+       { /* sentinel */ }
+};
+
+MODULE_DEVICE_TABLE(of, serial_hs_lpc32xx_dt_ids);
+
+static struct platform_driver serial_hs_lpc32xx_driver = {
+       .probe          = serial_hs_lpc32xx_probe,
+       .remove         = __devexit_p(serial_hs_lpc32xx_remove),
+       .suspend        = serial_hs_lpc32xx_suspend,
+       .resume         = serial_hs_lpc32xx_resume,
+       .driver         = {
+               .name   = MODNAME,
+               .owner  = THIS_MODULE,
+               .of_match_table = serial_hs_lpc32xx_dt_ids,
+       },
+};
+
+static int __init lpc32xx_hsuart_init(void)
+{
+       int ret;
+
+       ret = uart_register_driver(&lpc32xx_hs_reg);
+       if (ret)
+               return ret;
+
+       ret = platform_driver_register(&serial_hs_lpc32xx_driver);
+       if (ret)
+               uart_unregister_driver(&lpc32xx_hs_reg);
+
+       return ret;
+}
+
+static void __exit lpc32xx_hsuart_exit(void)
+{
+       platform_driver_unregister(&serial_hs_lpc32xx_driver);
+       uart_unregister_driver(&lpc32xx_hs_reg);
+}
+
+module_init(lpc32xx_hsuart_init);
+module_exit(lpc32xx_hsuart_exit);
+
+MODULE_AUTHOR("Kevin Wells <kevin.wells@nxp.com>");
+MODULE_AUTHOR("Roland Stigge <stigge@antcom.de>");
+MODULE_DESCRIPTION("NXP LPC32XX High Speed UART driver");
+MODULE_LICENSE("GPL");
index a070362..b13949a 100644 (file)
@@ -44,8 +44,6 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 
-#define PORT_M32R_BASE PORT_M32R_SIO
-#define PORT_INDEX(x)  (x - PORT_M32R_BASE + 1)
 #define BAUD_RATE      115200
 
 #include <linux/serial_core.h>
@@ -132,22 +130,6 @@ struct irq_info {
 
 static struct irq_info irq_lists[NR_IRQS];
 
-/*
- * Here we define the default xmit fifo size used for each type of UART.
- */
-static const struct serial_uart_config uart_config[] = {
-       [PORT_UNKNOWN] = {
-               .name                   = "unknown",
-               .dfl_xmit_fifo_size     = 1,
-               .flags                  = 0,
-       },
-       [PORT_INDEX(PORT_M32R_SIO)] = {
-               .name                   = "M32RSIO",
-               .dfl_xmit_fifo_size     = 1,
-               .flags                  = 0,
-       },
-};
-
 #ifdef CONFIG_SERIAL_M32R_PLDSIO
 
 #define __sio_in(x) inw((unsigned long)(x))
@@ -907,8 +889,7 @@ static void m32r_sio_config_port(struct uart_port *port, int unused)
 
        spin_lock_irqsave(&up->port.lock, flags);
 
-       up->port.type = (PORT_M32R_SIO - PORT_M32R_BASE + 1);
-       up->port.fifosize = uart_config[up->port.type].dfl_xmit_fifo_size;
+       up->port.fifosize = 1;
 
        spin_unlock_irqrestore(&up->port.lock, flags);
 }
@@ -916,23 +897,11 @@ static void m32r_sio_config_port(struct uart_port *port, int unused)
 static int
 m32r_sio_verify_port(struct uart_port *port, struct serial_struct *ser)
 {
-       if (ser->irq >= nr_irqs || ser->irq < 0 ||
-           ser->baud_base < 9600 || ser->type < PORT_UNKNOWN ||
-           ser->type >= ARRAY_SIZE(uart_config))
+       if (ser->irq >= nr_irqs || ser->irq < 0 || ser->baud_base < 9600)
                return -EINVAL;
        return 0;
 }
 
-static const char *
-m32r_sio_type(struct uart_port *port)
-{
-       int type = port->type;
-
-       if (type >= ARRAY_SIZE(uart_config))
-               type = 0;
-       return uart_config[type].name;
-}
-
 static struct uart_ops m32r_sio_pops = {
        .tx_empty       = m32r_sio_tx_empty,
        .set_mctrl      = m32r_sio_set_mctrl,
@@ -946,7 +915,6 @@ static struct uart_ops m32r_sio_pops = {
        .shutdown       = m32r_sio_shutdown,
        .set_termios    = m32r_sio_set_termios,
        .pm             = m32r_sio_pm,
-       .type           = m32r_sio_type,
        .release_port   = m32r_sio_release_port,
        .request_port   = m32r_sio_request_port,
        .config_port    = m32r_sio_config_port,
index b4902b9..46043c2 100644 (file)
@@ -910,17 +910,7 @@ static struct spi_driver max3100_driver = {
        .resume         = max3100_resume,
 };
 
-static int __init max3100_init(void)
-{
-       return spi_register_driver(&max3100_driver);
-}
-module_init(max3100_init);
-
-static void __exit max3100_exit(void)
-{
-       spi_unregister_driver(&max3100_driver);
-}
-module_exit(max3100_exit);
+module_spi_driver(max3100_driver);
 
 MODULE_DESCRIPTION("MAX3100 driver");
 MODULE_AUTHOR("Christian Pellegrin <chripell@evolware.org>");
diff --git a/drivers/tty/serial/max3107.c b/drivers/tty/serial/max3107.c
deleted file mode 100644 (file)
index 17c7ba8..0000000
+++ /dev/null
@@ -1,1215 +0,0 @@
-/*
- *  max3107.c - spi uart protocol driver for Maxim 3107
- *  Based on max3100.c
- *     by Christian Pellegrin <chripell@evolware.org>
- *  and        max3110.c
- *     by Feng Tang <feng.tang@intel.com>
- *
- *  Copyright (C) Aavamobile 2009
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- *
- *  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/delay.h>
-#include <linux/device.h>
-#include <linux/serial_core.h>
-#include <linux/serial.h>
-#include <linux/tty.h>
-#include <linux/tty_flip.h>
-#include <linux/gpio.h>
-#include <linux/spi/spi.h>
-#include <linux/freezer.h>
-#include <linux/module.h>
-#include "max3107.h"
-
-static const struct baud_table brg26_ext[] = {
-       { 300,    MAX3107_BRG26_B300 },
-       { 600,    MAX3107_BRG26_B600 },
-       { 1200,   MAX3107_BRG26_B1200 },
-       { 2400,   MAX3107_BRG26_B2400 },
-       { 4800,   MAX3107_BRG26_B4800 },
-       { 9600,   MAX3107_BRG26_B9600 },
-       { 19200,  MAX3107_BRG26_B19200 },
-       { 57600,  MAX3107_BRG26_B57600 },
-       { 115200, MAX3107_BRG26_B115200 },
-       { 230400, MAX3107_BRG26_B230400 },
-       { 460800, MAX3107_BRG26_B460800 },
-       { 921600, MAX3107_BRG26_B921600 },
-       { 0, 0 }
-};
-
-static const struct baud_table brg13_int[] = {
-       { 300,    MAX3107_BRG13_IB300 },
-       { 600,    MAX3107_BRG13_IB600 },
-       { 1200,   MAX3107_BRG13_IB1200 },
-       { 2400,   MAX3107_BRG13_IB2400 },
-       { 4800,   MAX3107_BRG13_IB4800 },
-       { 9600,   MAX3107_BRG13_IB9600 },
-       { 19200,  MAX3107_BRG13_IB19200 },
-       { 57600,  MAX3107_BRG13_IB57600 },
-       { 115200, MAX3107_BRG13_IB115200 },
-       { 230400, MAX3107_BRG13_IB230400 },
-       { 460800, MAX3107_BRG13_IB460800 },
-       { 921600, MAX3107_BRG13_IB921600 },
-       { 0, 0 }
-};
-
-static u32 get_new_brg(int baud, struct max3107_port *s)
-{
-       int i;
-       const struct baud_table *baud_tbl = s->baud_tbl;
-
-       for (i = 0; i < 13; i++) {
-               if (baud == baud_tbl[i].baud)
-                       return baud_tbl[i].new_brg;
-       }
-
-       return 0;
-}
-
-/* Perform SPI transfer for write/read of device register(s) */
-int max3107_rw(struct max3107_port *s, u8 *tx, u8 *rx, int len)
-{
-       struct spi_message spi_msg;
-       struct spi_transfer spi_xfer;
-
-       /* Initialize SPI ,message */
-       spi_message_init(&spi_msg);
-
-       /* Initialize SPI transfer */
-       memset(&spi_xfer, 0, sizeof spi_xfer);
-       spi_xfer.len = len;
-       spi_xfer.tx_buf = tx;
-       spi_xfer.rx_buf = rx;
-       spi_xfer.speed_hz = MAX3107_SPI_SPEED;
-
-       /* Add SPI transfer to SPI message */
-       spi_message_add_tail(&spi_xfer, &spi_msg);
-
-#ifdef DBG_TRACE_SPI_DATA
-       {
-               int i;
-               pr_info("tx len %d:\n", spi_xfer.len);
-               for (i = 0 ; i < spi_xfer.len && i < 32 ; i++)
-                       pr_info(" %x", ((u8 *)spi_xfer.tx_buf)[i]);
-               pr_info("\n");
-       }
-#endif
-
-       /* Perform synchronous SPI transfer */
-       if (spi_sync(s->spi, &spi_msg)) {
-               dev_err(&s->spi->dev, "spi_sync failure\n");
-               return -EIO;
-       }
-
-#ifdef DBG_TRACE_SPI_DATA
-       if (spi_xfer.rx_buf) {
-               int i;
-               pr_info("rx len %d:\n", spi_xfer.len);
-               for (i = 0 ; i < spi_xfer.len && i < 32 ; i++)
-                       pr_info(" %x", ((u8 *)spi_xfer.rx_buf)[i]);
-               pr_info("\n");
-       }
-#endif
-       return 0;
-}
-EXPORT_SYMBOL_GPL(max3107_rw);
-
-/* Puts received data to circular buffer */
-static void put_data_to_circ_buf(struct max3107_port *s, unsigned char *data,
-                                       int len)
-{
-       struct uart_port *port = &s->port;
-       struct tty_struct *tty;
-
-       if (!port->state)
-               return;
-
-       tty = port->state->port.tty;
-       if (!tty)
-               return;
-
-       /* Insert received data */
-       tty_insert_flip_string(tty, data, len);
-       /* Update RX counter */
-       port->icount.rx += len;
-}
-
-/* Handle data receiving */
-static void max3107_handlerx(struct max3107_port *s, u16 rxlvl)
-{
-       int i;
-       int j;
-       int len;                                /* SPI transfer buffer length */
-       u16 *buf;
-       u8 *valid_str;
-
-       if (!s->rx_enabled)
-               /* RX is disabled */
-               return;
-
-       if (rxlvl == 0) {
-               /* RX fifo is empty */
-               return;
-       } else if (rxlvl >= MAX3107_RX_FIFO_SIZE) {
-               dev_warn(&s->spi->dev, "Possible RX FIFO overrun %d\n", rxlvl);
-               /* Ensure sanity of RX level */
-               rxlvl = MAX3107_RX_FIFO_SIZE;
-       }
-       if ((s->rxbuf == 0) || (s->rxstr == 0)) {
-               dev_warn(&s->spi->dev, "Rx buffer/str isn't ready\n");
-               return;
-       }
-       buf = s->rxbuf;
-       valid_str = s->rxstr;
-       while (rxlvl) {
-               pr_debug("rxlvl %d\n", rxlvl);
-               /* Clear buffer */
-               memset(buf, 0, sizeof(u16) * (MAX3107_RX_FIFO_SIZE + 2));
-               len = 0;
-               if (s->irqen_reg & MAX3107_IRQ_RXFIFO_BIT) {
-                       /* First disable RX FIFO interrupt */
-                       pr_debug("Disabling RX INT\n");
-                       buf[0] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG);
-                       s->irqen_reg &= ~MAX3107_IRQ_RXFIFO_BIT;
-                       buf[0] |= s->irqen_reg;
-                       len++;
-               }
-               /* Just increase the length by amount of words in FIFO since
-                * buffer was zeroed and SPI transfer of 0x0000 means reading
-                * from RX FIFO
-                */
-               len += rxlvl;
-               /* Append RX level query */
-               buf[len] = MAX3107_RXFIFOLVL_REG;
-               len++;
-
-               /* Perform the SPI transfer */
-               if (max3107_rw(s, (u8 *)buf, (u8 *)buf, len * 2)) {
-                       dev_err(&s->spi->dev, "SPI transfer for RX h failed\n");
-                       return;
-               }
-
-               /* Skip RX FIFO interrupt disabling word if it was added */
-               j = ((len - 1) - rxlvl);
-               /* Read received words */
-               for (i = 0; i < rxlvl; i++, j++)
-                       valid_str[i] = (u8)buf[j];
-               put_data_to_circ_buf(s, valid_str, rxlvl);
-               /* Get new RX level */
-               rxlvl = (buf[len - 1] & MAX3107_SPI_RX_DATA_MASK);
-       }
-
-       if (s->rx_enabled) {
-               /* RX still enabled, re-enable RX FIFO interrupt */
-               pr_debug("Enabling RX INT\n");
-               buf[0] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG);
-               s->irqen_reg |= MAX3107_IRQ_RXFIFO_BIT;
-               buf[0] |= s->irqen_reg;
-               if (max3107_rw(s, (u8 *)buf, NULL, 2))
-                       dev_err(&s->spi->dev, "RX FIFO INT enabling failed\n");
-       }
-
-       /* Push the received data to receivers */
-       if (s->port.state->port.tty)
-               tty_flip_buffer_push(s->port.state->port.tty);
-}
-
-
-/* Handle data sending */
-static void max3107_handletx(struct max3107_port *s)
-{
-       struct circ_buf *xmit = &s->port.state->xmit;
-       int i;
-       unsigned long flags;
-       int len;                                /* SPI transfer buffer length */
-       u16 *buf;
-
-       if (!s->tx_fifo_empty)
-               /* Don't send more data before previous data is sent */
-               return;
-
-       if (uart_circ_empty(xmit) || uart_tx_stopped(&s->port))
-               /* No data to send or TX is stopped */
-               return;
-
-       if (!s->txbuf) {
-               dev_warn(&s->spi->dev, "Txbuf isn't ready\n");
-               return;
-       }
-       buf = s->txbuf;
-       /* Get length of data pending in circular buffer */
-       len = uart_circ_chars_pending(xmit);
-       if (len) {
-               /* Limit to size of TX FIFO */
-               if (len > MAX3107_TX_FIFO_SIZE)
-                       len = MAX3107_TX_FIFO_SIZE;
-
-               pr_debug("txlen %d\n", len);
-
-               /* Update TX counter */
-               s->port.icount.tx += len;
-
-               /* TX FIFO will no longer be empty */
-               s->tx_fifo_empty = 0;
-
-               i = 0;
-               if (s->irqen_reg & MAX3107_IRQ_TXEMPTY_BIT) {
-                       /* First disable TX empty interrupt */
-                       pr_debug("Disabling TE INT\n");
-                       buf[i] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG);
-                       s->irqen_reg &= ~MAX3107_IRQ_TXEMPTY_BIT;
-                       buf[i] |= s->irqen_reg;
-                       i++;
-                       len++;
-               }
-               /* Add data to send */
-               spin_lock_irqsave(&s->port.lock, flags);
-               for ( ; i < len ; i++) {
-                       buf[i] = (MAX3107_WRITE_BIT | MAX3107_THR_REG);
-                       buf[i] |= ((u16)xmit->buf[xmit->tail] &
-                                               MAX3107_SPI_TX_DATA_MASK);
-                       xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
-               }
-               spin_unlock_irqrestore(&s->port.lock, flags);
-               if (!(s->irqen_reg & MAX3107_IRQ_TXEMPTY_BIT)) {
-                       /* Enable TX empty interrupt */
-                       pr_debug("Enabling TE INT\n");
-                       buf[i] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG);
-                       s->irqen_reg |= MAX3107_IRQ_TXEMPTY_BIT;
-                       buf[i] |= s->irqen_reg;
-                       i++;
-                       len++;
-               }
-               if (!s->tx_enabled) {
-                       /* Enable TX */
-                       pr_debug("Enable TX\n");
-                       buf[i] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG);
-                       spin_lock_irqsave(&s->data_lock, flags);
-                       s->mode1_reg &= ~MAX3107_MODE1_TXDIS_BIT;
-                       buf[i] |= s->mode1_reg;
-                       spin_unlock_irqrestore(&s->data_lock, flags);
-                       s->tx_enabled = 1;
-                       i++;
-                       len++;
-               }
-
-               /* Perform the SPI transfer */
-               if (max3107_rw(s, (u8 *)buf, NULL, len*2)) {
-                       dev_err(&s->spi->dev,
-                               "SPI transfer TX handling failed\n");
-                       return;
-               }
-       }
-
-       /* Indicate wake up if circular buffer is getting low on data */
-       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
-               uart_write_wakeup(&s->port);
-
-}
-
-/* Handle interrupts
- * Also reads and returns current RX FIFO level
- */
-static u16 handle_interrupt(struct max3107_port *s)
-{
-       u16 buf[4];     /* Buffer for SPI transfers */
-       u8 irq_status;
-       u16 rx_level;
-       unsigned long flags;
-
-       /* Read IRQ status register */
-       buf[0] = MAX3107_IRQSTS_REG;
-       /* Read status IRQ status register */
-       buf[1] = MAX3107_STS_IRQSTS_REG;
-       /* Read LSR IRQ status register */
-       buf[2] = MAX3107_LSR_IRQSTS_REG;
-       /* Query RX level */
-       buf[3] = MAX3107_RXFIFOLVL_REG;
-
-       if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 8)) {
-               dev_err(&s->spi->dev,
-                       "SPI transfer for INTR handling failed\n");
-               return 0;
-       }
-
-       irq_status = (u8)buf[0];
-       pr_debug("IRQSTS %x\n", irq_status);
-       rx_level = (buf[3] & MAX3107_SPI_RX_DATA_MASK);
-
-       if (irq_status & MAX3107_IRQ_LSR_BIT) {
-               /* LSR interrupt */
-               if (buf[2] & MAX3107_LSR_RXTO_BIT)
-                       /* RX timeout interrupt,
-                        * handled by normal RX handling
-                        */
-                       pr_debug("RX TO INT\n");
-       }
-
-       if (irq_status & MAX3107_IRQ_TXEMPTY_BIT) {
-               /* Tx empty interrupt,
-                * disable TX and set tx_fifo_empty flag
-                */
-               pr_debug("TE INT, disabling TX\n");
-               buf[0] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG);
-               spin_lock_irqsave(&s->data_lock, flags);
-               s->mode1_reg |= MAX3107_MODE1_TXDIS_BIT;
-               buf[0] |= s->mode1_reg;
-               spin_unlock_irqrestore(&s->data_lock, flags);
-               if (max3107_rw(s, (u8 *)buf, NULL, 2))
-                       dev_err(&s->spi->dev, "SPI transfer TX dis failed\n");
-               s->tx_enabled = 0;
-               s->tx_fifo_empty = 1;
-       }
-
-       if (irq_status & MAX3107_IRQ_RXFIFO_BIT)
-               /* RX FIFO interrupt,
-                * handled by normal RX handling
-                */
-               pr_debug("RFIFO INT\n");
-
-       /* Return RX level */
-       return rx_level;
-}
-
-/* Trigger work thread*/
-static void max3107_dowork(struct max3107_port *s)
-{
-       if (!work_pending(&s->work) && !freezing(current) && !s->suspended)
-               queue_work(s->workqueue, &s->work);
-       else
-               dev_warn(&s->spi->dev, "interrup isn't serviced normally!\n");
-}
-
-/* Work thread */
-static void max3107_work(struct work_struct *w)
-{
-       struct max3107_port *s = container_of(w, struct max3107_port, work);
-       u16 rxlvl = 0;
-       int len;        /* SPI transfer buffer length */
-       u16 buf[5];     /* Buffer for SPI transfers */
-       unsigned long flags;
-
-       /* Start by reading current RX FIFO level */
-       buf[0] = MAX3107_RXFIFOLVL_REG;
-       if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 2)) {
-               dev_err(&s->spi->dev, "SPI transfer RX lev failed\n");
-               rxlvl = 0;
-       } else {
-               rxlvl = (buf[0] & MAX3107_SPI_RX_DATA_MASK);
-       }
-
-       do {
-               pr_debug("rxlvl %d\n", rxlvl);
-
-               /* Handle RX */
-               max3107_handlerx(s, rxlvl);
-               rxlvl = 0;
-
-               if (s->handle_irq) {
-                       /* Handle pending interrupts
-                        * We also get new RX FIFO level since new data may
-                        * have been received while pushing received data to
-                        * receivers
-                        */
-                       s->handle_irq = 0;
-                       rxlvl = handle_interrupt(s);
-               }
-
-               /* Handle TX */
-               max3107_handletx(s);
-
-               /* Handle configuration changes */
-               len = 0;
-               spin_lock_irqsave(&s->data_lock, flags);
-               if (s->mode1_commit) {
-                       pr_debug("mode1_commit\n");
-                       buf[len] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG);
-                       buf[len++] |= s->mode1_reg;
-                       s->mode1_commit = 0;
-               }
-               if (s->lcr_commit) {
-                       pr_debug("lcr_commit\n");
-                       buf[len] = (MAX3107_WRITE_BIT | MAX3107_LCR_REG);
-                       buf[len++] |= s->lcr_reg;
-                       s->lcr_commit = 0;
-               }
-               if (s->brg_commit) {
-                       pr_debug("brg_commit\n");
-                       buf[len] = (MAX3107_WRITE_BIT | MAX3107_BRGDIVMSB_REG);
-                       buf[len++] |= ((s->brg_cfg >> 16) &
-                                               MAX3107_SPI_TX_DATA_MASK);
-                       buf[len] = (MAX3107_WRITE_BIT | MAX3107_BRGDIVLSB_REG);
-                       buf[len++] |= ((s->brg_cfg >> 8) &
-                                               MAX3107_SPI_TX_DATA_MASK);
-                       buf[len] = (MAX3107_WRITE_BIT | MAX3107_BRGCFG_REG);
-                       buf[len++] |= ((s->brg_cfg) & 0xff);
-                       s->brg_commit = 0;
-               }
-               spin_unlock_irqrestore(&s->data_lock, flags);
-
-               if (len > 0) {
-                       if (max3107_rw(s, (u8 *)buf, NULL, len * 2))
-                               dev_err(&s->spi->dev,
-                                       "SPI transfer config failed\n");
-               }
-
-               /* Reloop if interrupt handling indicated data in RX FIFO */
-       } while (rxlvl);
-
-}
-
-/* Set sleep mode */
-static void max3107_set_sleep(struct max3107_port *s, int mode)
-{
-       u16 buf[1];     /* Buffer for SPI transfer */
-       unsigned long flags;
-       pr_debug("enter, mode %d\n", mode);
-
-       buf[0] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG);
-       spin_lock_irqsave(&s->data_lock, flags);
-       switch (mode) {
-       case MAX3107_DISABLE_FORCED_SLEEP:
-                       s->mode1_reg &= ~MAX3107_MODE1_FORCESLEEP_BIT;
-                       break;
-       case MAX3107_ENABLE_FORCED_SLEEP:
-                       s->mode1_reg |= MAX3107_MODE1_FORCESLEEP_BIT;
-                       break;
-       case MAX3107_DISABLE_AUTOSLEEP:
-                       s->mode1_reg &= ~MAX3107_MODE1_AUTOSLEEP_BIT;
-                       break;
-       case MAX3107_ENABLE_AUTOSLEEP:
-                       s->mode1_reg |= MAX3107_MODE1_AUTOSLEEP_BIT;
-                       break;
-       default:
-               spin_unlock_irqrestore(&s->data_lock, flags);
-               dev_warn(&s->spi->dev, "invalid sleep mode\n");
-               return;
-       }
-       buf[0] |= s->mode1_reg;
-       spin_unlock_irqrestore(&s->data_lock, flags);
-
-       if (max3107_rw(s, (u8 *)buf, NULL, 2))
-               dev_err(&s->spi->dev, "SPI transfer sleep mode failed\n");
-
-       if (mode == MAX3107_DISABLE_AUTOSLEEP ||
-                       mode == MAX3107_DISABLE_FORCED_SLEEP)
-               msleep(MAX3107_WAKEUP_DELAY);
-}
-
-/* Perform full register initialization */
-static void max3107_register_init(struct max3107_port *s)
-{
-       u16 buf[11];    /* Buffer for SPI transfers */
-
-       /* 1. Configure baud rate, 9600 as default */
-       s->baud = 9600;
-       /* the below is default*/
-       if (s->ext_clk) {
-               s->brg_cfg = MAX3107_BRG26_B9600;
-               s->baud_tbl = (struct baud_table *)brg26_ext;
-       } else {
-               s->brg_cfg = MAX3107_BRG13_IB9600;
-               s->baud_tbl = (struct baud_table *)brg13_int;
-       }
-
-       if (s->pdata->init)
-               s->pdata->init(s);
-
-       buf[0] = (MAX3107_WRITE_BIT | MAX3107_BRGDIVMSB_REG)
-               | ((s->brg_cfg >> 16) & MAX3107_SPI_TX_DATA_MASK);
-       buf[1] = (MAX3107_WRITE_BIT | MAX3107_BRGDIVLSB_REG)
-               | ((s->brg_cfg >> 8) & MAX3107_SPI_TX_DATA_MASK);
-       buf[2] = (MAX3107_WRITE_BIT | MAX3107_BRGCFG_REG)
-               | ((s->brg_cfg) & 0xff);
-
-       /* 2. Configure LCR register, 8N1 mode by default */
-       s->lcr_reg = MAX3107_LCR_WORD_LEN_8;
-       buf[3] = (MAX3107_WRITE_BIT | MAX3107_LCR_REG)
-               | s->lcr_reg;
-
-       /* 3. Configure MODE 1 register */
-       s->mode1_reg = 0;
-       /* Enable IRQ pin */
-       s->mode1_reg |= MAX3107_MODE1_IRQSEL_BIT;
-       /* Disable TX */
-       s->mode1_reg |= MAX3107_MODE1_TXDIS_BIT;
-       s->tx_enabled = 0;
-       /* RX is enabled */
-       s->rx_enabled = 1;
-       buf[4] = (MAX3107_WRITE_BIT | MAX3107_MODE1_REG)
-               | s->mode1_reg;
-
-       /* 4. Configure MODE 2 register */
-       buf[5] = (MAX3107_WRITE_BIT | MAX3107_MODE2_REG);
-       if (s->loopback) {
-               /* Enable loopback */
-               buf[5] |= MAX3107_MODE2_LOOPBACK_BIT;
-       }
-       /* Reset FIFOs */
-       buf[5] |= MAX3107_MODE2_FIFORST_BIT;
-       s->tx_fifo_empty = 1;
-
-       /* 5. Configure FIFO trigger level register */
-       buf[6] = (MAX3107_WRITE_BIT | MAX3107_FIFOTRIGLVL_REG);
-       /* RX FIFO trigger for 16 words, TX FIFO trigger not used */
-       buf[6] |= (MAX3107_FIFOTRIGLVL_RX(16) | MAX3107_FIFOTRIGLVL_TX(0));
-
-       /* 6. Configure flow control levels */
-       buf[7] = (MAX3107_WRITE_BIT | MAX3107_FLOWLVL_REG);
-       /* Flow control halt level 96, resume level 48 */
-       buf[7] |= (MAX3107_FLOWLVL_RES(48) | MAX3107_FLOWLVL_HALT(96));
-
-       /* 7. Configure flow control */
-       buf[8] = (MAX3107_WRITE_BIT | MAX3107_FLOWCTRL_REG);
-       /* Enable auto CTS and auto RTS flow control */
-       buf[8] |= (MAX3107_FLOWCTRL_AUTOCTS_BIT | MAX3107_FLOWCTRL_AUTORTS_BIT);
-
-       /* 8. Configure RX timeout register */
-       buf[9] = (MAX3107_WRITE_BIT | MAX3107_RXTO_REG);
-       /* Timeout after 48 character intervals */
-       buf[9] |= 0x0030;
-
-       /* 9. Configure LSR interrupt enable register */
-       buf[10] = (MAX3107_WRITE_BIT | MAX3107_LSR_IRQEN_REG);
-       /* Enable RX timeout interrupt */
-       buf[10] |= MAX3107_LSR_RXTO_BIT;
-
-       /* Perform SPI transfer */
-       if (max3107_rw(s, (u8 *)buf, NULL, 22))
-               dev_err(&s->spi->dev, "SPI transfer for init failed\n");
-
-       /* 10. Clear IRQ status register by reading it */
-       buf[0] = MAX3107_IRQSTS_REG;
-
-       /* 11. Configure interrupt enable register */
-       /* Enable LSR interrupt */
-       s->irqen_reg = MAX3107_IRQ_LSR_BIT;
-       /* Enable RX FIFO interrupt */
-       s->irqen_reg |= MAX3107_IRQ_RXFIFO_BIT;
-       buf[1] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG)
-               | s->irqen_reg;
-
-       /* 12. Clear FIFO reset that was set in step 6 */
-       buf[2] = (MAX3107_WRITE_BIT | MAX3107_MODE2_REG);
-       if (s->loopback) {
-               /* Keep loopback enabled */
-               buf[2] |= MAX3107_MODE2_LOOPBACK_BIT;
-       }
-
-       /* Perform SPI transfer */
-       if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 6))
-               dev_err(&s->spi->dev, "SPI transfer for init failed\n");
-
-}
-
-/* IRQ handler */
-static irqreturn_t max3107_irq(int irqno, void *dev_id)
-{
-       struct max3107_port *s = dev_id;
-
-       if (irqno != s->spi->irq) {
-               /* Unexpected IRQ */
-               return IRQ_NONE;
-       }
-
-       /* Indicate irq */
-       s->handle_irq = 1;
-
-       /* Trigger work thread */
-       max3107_dowork(s);
-
-       return IRQ_HANDLED;
-}
-
-/* HW suspension function
- *
- * Currently autosleep is used to decrease current consumption, alternative
- * approach would be to set the chip to reset mode if UART is not being
- * used but that would mess the GPIOs
- *
- */
-void max3107_hw_susp(struct max3107_port *s, int suspend)
-{
-       pr_debug("enter, suspend %d\n", suspend);
-
-       if (suspend) {
-               /* Suspend requested,
-                * enable autosleep to decrease current consumption
-                */
-               s->suspended = 1;
-               max3107_set_sleep(s, MAX3107_ENABLE_AUTOSLEEP);
-       } else {
-               /* Resume requested,
-                * disable autosleep
-                */
-               s->suspended = 0;
-               max3107_set_sleep(s, MAX3107_DISABLE_AUTOSLEEP);
-       }
-}
-EXPORT_SYMBOL_GPL(max3107_hw_susp);
-
-/* Modem status IRQ enabling */
-static void max3107_enable_ms(struct uart_port *port)
-{
-       /* Modem status not supported */
-}
-
-/* Data send function */
-static void max3107_start_tx(struct uart_port *port)
-{
-       struct max3107_port *s = container_of(port, struct max3107_port, port);
-
-       /* Trigger work thread for sending data */
-       max3107_dowork(s);
-}
-
-/* Function for checking that there is no pending transfers */
-static unsigned int max3107_tx_empty(struct uart_port *port)
-{
-       struct max3107_port *s = container_of(port, struct max3107_port, port);
-
-       pr_debug("returning %d\n",
-                 (s->tx_fifo_empty && uart_circ_empty(&s->port.state->xmit)));
-       return s->tx_fifo_empty && uart_circ_empty(&s->port.state->xmit);
-}
-
-/* Function for stopping RX */
-static void max3107_stop_rx(struct uart_port *port)
-{
-       struct max3107_port *s = container_of(port, struct max3107_port, port);
-       unsigned long flags;
-
-       /* Set RX disabled in MODE 1 register */
-       spin_lock_irqsave(&s->data_lock, flags);
-       s->mode1_reg |= MAX3107_MODE1_RXDIS_BIT;
-       s->mode1_commit = 1;
-       spin_unlock_irqrestore(&s->data_lock, flags);
-       /* Set RX disabled */
-       s->rx_enabled = 0;
-       /* Trigger work thread for doing the actual configuration change */
-       max3107_dowork(s);
-}
-
-/* Function for returning control pin states */
-static unsigned int max3107_get_mctrl(struct uart_port *port)
-{
-       /* DCD and DSR are not wired and CTS/RTS is handled automatically
-        * so just indicate DSR and CAR asserted
-        */
-       return TIOCM_DSR | TIOCM_CAR;
-}
-
-/* Function for setting control pin states */
-static void max3107_set_mctrl(struct uart_port *port, unsigned int mctrl)
-{
-       /* DCD and DSR are not wired and CTS/RTS is hadnled automatically
-        * so do nothing
-        */
-}
-
-/* Function for configuring UART parameters */
-static void max3107_set_termios(struct uart_port *port,
-                               struct ktermios *termios,
-                               struct ktermios *old)
-{
-       struct max3107_port *s = container_of(port, struct max3107_port, port);
-       struct tty_struct *tty;
-       int baud;
-       u16 new_lcr = 0;
-       u32 new_brg = 0;
-       unsigned long flags;
-
-       if (!port->state)
-               return;
-
-       tty = port->state->port.tty;
-       if (!tty)
-               return;
-
-       /* Get new LCR register values */
-       /* Word size */
-       if ((termios->c_cflag & CSIZE) == CS7)
-               new_lcr |= MAX3107_LCR_WORD_LEN_7;
-       else
-               new_lcr |= MAX3107_LCR_WORD_LEN_8;
-
-       /* Parity */
-       if (termios->c_cflag & PARENB) {
-               new_lcr |= MAX3107_LCR_PARITY_BIT;
-               if (!(termios->c_cflag & PARODD))
-                       new_lcr |= MAX3107_LCR_EVENPARITY_BIT;
-       }
-
-       /* Stop bits */
-       if (termios->c_cflag & CSTOPB) {
-               /* 2 stop bits */
-               new_lcr |= MAX3107_LCR_STOPLEN_BIT;
-       }
-
-       /* Mask termios capabilities we don't support */
-       termios->c_cflag &= ~CMSPAR;
-
-       /* Set status ignore mask */
-       s->port.ignore_status_mask = 0;
-       if (termios->c_iflag & IGNPAR)
-               s->port.ignore_status_mask |= MAX3107_ALL_ERRORS;
-
-       /* Set low latency to immediately handle pushed data */
-       s->port.state->port.tty->low_latency = 1;
-
-       /* Get new baud rate generator configuration */
-       baud = tty_get_baud_rate(tty);
-
-       spin_lock_irqsave(&s->data_lock, flags);
-       new_brg = get_new_brg(baud, s);
-       /* if can't find the corrent config, use previous */
-       if (!new_brg) {
-               baud = s->baud;
-               new_brg = s->brg_cfg;
-       }
-       spin_unlock_irqrestore(&s->data_lock, flags);
-       tty_termios_encode_baud_rate(termios, baud, baud);
-       s->baud = baud;
-
-       /* Update timeout according to new baud rate */
-       uart_update_timeout(port, termios->c_cflag, baud);
-
-       spin_lock_irqsave(&s->data_lock, flags);
-       if (s->lcr_reg != new_lcr) {
-               s->lcr_reg = new_lcr;
-               s->lcr_commit = 1;
-       }
-       if (s->brg_cfg != new_brg) {
-               s->brg_cfg = new_brg;
-               s->brg_commit = 1;
-       }
-       spin_unlock_irqrestore(&s->data_lock, flags);
-
-       /* Trigger work thread for doing the actual configuration change */
-       max3107_dowork(s);
-}
-
-/* Port shutdown function */
-static void max3107_shutdown(struct uart_port *port)
-{
-       struct max3107_port *s = container_of(port, struct max3107_port, port);
-
-       if (s->suspended && s->pdata->hw_suspend)
-               s->pdata->hw_suspend(s, 0);
-
-       /* Free the interrupt */
-       free_irq(s->spi->irq, s);
-
-       if (s->workqueue) {
-               /* Flush and destroy work queue */
-               flush_workqueue(s->workqueue);
-               destroy_workqueue(s->workqueue);
-               s->workqueue = NULL;
-       }
-
-       /* Suspend HW */
-       if (s->pdata->hw_suspend)
-               s->pdata->hw_suspend(s, 1);
-}
-
-/* Port startup function */
-static int max3107_startup(struct uart_port *port)
-{
-       struct max3107_port *s = container_of(port, struct max3107_port, port);
-
-       /* Initialize work queue */
-       s->workqueue = create_freezable_workqueue("max3107");
-       if (!s->workqueue) {
-               dev_err(&s->spi->dev, "Workqueue creation failed\n");
-               return -EBUSY;
-       }
-       INIT_WORK(&s->work, max3107_work);
-
-       /* Setup IRQ */
-       if (request_irq(s->spi->irq, max3107_irq, IRQF_TRIGGER_FALLING,
-                       "max3107", s)) {
-               dev_err(&s->spi->dev, "IRQ reguest failed\n");
-               destroy_workqueue(s->workqueue);
-               s->workqueue = NULL;
-               return -EBUSY;
-       }
-
-       /* Resume HW */
-       if (s->pdata->hw_suspend)
-               s->pdata->hw_suspend(s, 0);
-
-       /* Init registers */
-       max3107_register_init(s);
-
-       return 0;
-}
-
-/* Port type function */
-static const char *max3107_type(struct uart_port *port)
-{
-       struct max3107_port *s = container_of(port, struct max3107_port, port);
-       return s->spi->modalias;
-}
-
-/* Port release function */
-static void max3107_release_port(struct uart_port *port)
-{
-       /* Do nothing */
-}
-
-/* Port request function */
-static int max3107_request_port(struct uart_port *port)
-{
-       /* Do nothing */
-       return 0;
-}
-
-/* Port config function */
-static void max3107_config_port(struct uart_port *port, int flags)
-{
-       struct max3107_port *s = container_of(port, struct max3107_port, port);
-       s->port.type = PORT_MAX3107;
-}
-
-/* Port verify function */
-static int max3107_verify_port(struct uart_port *port,
-                               struct serial_struct *ser)
-{
-       if (ser->type == PORT_UNKNOWN || ser->type == PORT_MAX3107)
-               return 0;
-
-       return -EINVAL;
-}
-
-/* Port stop TX function */
-static void max3107_stop_tx(struct uart_port *port)
-{
-       /* Do nothing */
-}
-
-/* Port break control function */
-static void max3107_break_ctl(struct uart_port *port, int break_state)
-{
-       /* We don't support break control, do nothing */
-}
-
-
-/* Port functions */
-static struct uart_ops max3107_ops = {
-       .tx_empty       = max3107_tx_empty,
-       .set_mctrl      = max3107_set_mctrl,
-       .get_mctrl      = max3107_get_mctrl,
-       .stop_tx        = max3107_stop_tx,
-       .start_tx       = max3107_start_tx,
-       .stop_rx        = max3107_stop_rx,
-       .enable_ms      = max3107_enable_ms,
-       .break_ctl      = max3107_break_ctl,
-       .startup        = max3107_startup,
-       .shutdown       = max3107_shutdown,
-       .set_termios    = max3107_set_termios,
-       .type           = max3107_type,
-       .release_port   = max3107_release_port,
-       .request_port   = max3107_request_port,
-       .config_port    = max3107_config_port,
-       .verify_port    = max3107_verify_port,
-};
-
-/* UART driver data */
-static struct uart_driver max3107_uart_driver = {
-       .owner          = THIS_MODULE,
-       .driver_name    = "ttyMAX",
-       .dev_name       = "ttyMAX",
-       .nr             = 1,
-};
-
-static int driver_registered = 0;
-
-
-
-/* 'Generic' platform data */
-static struct max3107_plat generic_plat_data = {
-       .loopback               = 0,
-       .ext_clk                = 1,
-       .hw_suspend             = max3107_hw_susp,
-       .polled_mode            = 0,
-       .poll_time              = 0,
-};
-
-
-/*******************************************************************/
-
-/**
- *     max3107_probe           -       SPI bus probe entry point
- *     @spi: the spi device
- *
- *     SPI wants us to probe this device and if appropriate claim it.
- *     Perform any platform specific requirements and then initialise
- *     the device.
- */
-
-int max3107_probe(struct spi_device *spi, struct max3107_plat *pdata)
-{
-       struct max3107_port *s;
-       u16 buf[2];     /* Buffer for SPI transfers */
-       int retval;
-
-       pr_info("enter max3107 probe\n");
-
-       /* Allocate port structure */
-       s = kzalloc(sizeof(*s), GFP_KERNEL);
-       if (!s) {
-               pr_err("Allocating port structure failed\n");
-               return -ENOMEM;
-       }
-
-       s->pdata = pdata;
-
-       /* SPI Rx buffer
-        * +2 for RX FIFO interrupt
-        * disabling and RX level query
-        */
-       s->rxbuf = kzalloc(sizeof(u16) * (MAX3107_RX_FIFO_SIZE+2), GFP_KERNEL);
-       if (!s->rxbuf) {
-               pr_err("Allocating RX buffer failed\n");
-               retval = -ENOMEM;
-               goto err_free4;
-       }
-       s->rxstr = kzalloc(sizeof(u8) * MAX3107_RX_FIFO_SIZE, GFP_KERNEL);
-       if (!s->rxstr) {
-               pr_err("Allocating RX buffer failed\n");
-               retval = -ENOMEM;
-               goto err_free3;
-       }
-       /* SPI Tx buffer
-        * SPI transfer buffer
-        * +3 for TX FIFO empty
-        * interrupt disabling and
-        * enabling and TX enabling
-        */
-       s->txbuf = kzalloc(sizeof(u16) * MAX3107_TX_FIFO_SIZE + 3, GFP_KERNEL);
-       if (!s->txbuf) {
-               pr_err("Allocating TX buffer failed\n");
-               retval = -ENOMEM;
-               goto err_free2;
-       }
-       /* Initialize shared data lock */
-       spin_lock_init(&s->data_lock);
-
-       /* SPI intializations */
-       dev_set_drvdata(&spi->dev, s);
-       spi->mode = SPI_MODE_0;
-       spi->dev.platform_data = pdata;
-       spi->bits_per_word = 16;
-       s->ext_clk = pdata->ext_clk;
-       s->loopback = pdata->loopback;
-       spi_setup(spi);
-       s->spi = spi;
-
-       /* Check REV ID to ensure we are talking to what we expect */
-       buf[0] = MAX3107_REVID_REG;
-       if (max3107_rw(s, (u8 *)buf, (u8 *)buf, 2)) {
-               dev_err(&s->spi->dev, "SPI transfer for REVID read failed\n");
-               retval = -EIO;
-               goto err_free1;
-       }
-       if ((buf[0] & MAX3107_SPI_RX_DATA_MASK) != MAX3107_REVID1 &&
-               (buf[0] & MAX3107_SPI_RX_DATA_MASK) != MAX3107_REVID2) {
-               dev_err(&s->spi->dev, "REVID %x does not match\n",
-                               (buf[0] & MAX3107_SPI_RX_DATA_MASK));
-               retval = -ENODEV;
-               goto err_free1;
-       }
-
-       /* Disable all interrupts */
-       buf[0] = (MAX3107_WRITE_BIT | MAX3107_IRQEN_REG | 0x0000);
-       buf[0] |= 0x0000;
-
-       /* Configure clock source */
-       buf[1] = (MAX3107_WRITE_BIT | MAX3107_CLKSRC_REG);
-       if (s->ext_clk) {
-               /* External clock */
-               buf[1] |= MAX3107_CLKSRC_EXTCLK_BIT;
-       }
-
-       /* PLL bypass ON */
-       buf[1] |= MAX3107_CLKSRC_PLLBYP_BIT;
-
-       /* Perform SPI transfer */
-       if (max3107_rw(s, (u8 *)buf, NULL, 4)) {
-               dev_err(&s->spi->dev, "SPI transfer for init failed\n");
-               retval = -EIO;
-               goto err_free1;
-       }
-
-       /* Register UART driver */
-       if (!driver_registered) {
-               retval = uart_register_driver(&max3107_uart_driver);
-               if (retval) {
-                       dev_err(&s->spi->dev, "Registering UART driver failed\n");
-                       goto err_free1;
-               }
-               driver_registered = 1;
-       }
-
-       /* Initialize UART port data */
-       s->port.fifosize = 128;
-       s->port.ops = &max3107_ops;
-       s->port.line = 0;
-       s->port.dev = &spi->dev;
-       s->port.uartclk = 9600;
-       s->port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF;
-       s->port.irq = s->spi->irq;
-       s->port.type = PORT_MAX3107;
-
-       /* Add UART port */
-       retval = uart_add_one_port(&max3107_uart_driver, &s->port);
-       if (retval < 0) {
-               dev_err(&s->spi->dev, "Adding UART port failed\n");
-               goto err_free1;
-       }
-
-       if (pdata->configure) {
-               retval = pdata->configure(s);
-               if (retval < 0)
-                       goto err_free1;
-       }
-
-       /* Go to suspend mode */
-       if (pdata->hw_suspend)
-               pdata->hw_suspend(s, 1);
-
-       return 0;
-
-err_free1:
-       kfree(s->txbuf);
-err_free2:
-       kfree(s->rxstr);
-err_free3:
-       kfree(s->rxbuf);
-err_free4:
-       kfree(s);
-       return retval;
-}
-EXPORT_SYMBOL_GPL(max3107_probe);
-
-/* Driver remove function */
-int max3107_remove(struct spi_device *spi)
-{
-       struct max3107_port *s = dev_get_drvdata(&spi->dev);
-
-       pr_info("enter max3107 remove\n");
-
-       /* Remove port */
-       if (uart_remove_one_port(&max3107_uart_driver, &s->port))
-               dev_warn(&s->spi->dev, "Removing UART port failed\n");
-
-
-       /* Free TxRx buffer */
-       kfree(s->rxbuf);
-       kfree(s->rxstr);
-       kfree(s->txbuf);
-
-       /* Free port structure */
-       kfree(s);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(max3107_remove);
-
-/* Driver suspend function */
-int max3107_suspend(struct spi_device *spi, pm_message_t state)
-{
-#ifdef CONFIG_PM
-       struct max3107_port *s = dev_get_drvdata(&spi->dev);
-
-       pr_debug("enter suspend\n");
-
-       /* Suspend UART port */
-       uart_suspend_port(&max3107_uart_driver, &s->port);
-
-       /* Go to suspend mode */
-       if (s->pdata->hw_suspend)
-               s->pdata->hw_suspend(s, 1);
-#endif /* CONFIG_PM */
-       return 0;
-}
-EXPORT_SYMBOL_GPL(max3107_suspend);
-
-/* Driver resume function */
-int max3107_resume(struct spi_device *spi)
-{
-#ifdef CONFIG_PM
-       struct max3107_port *s = dev_get_drvdata(&spi->dev);
-
-       pr_debug("enter resume\n");
-
-       /* Resume from suspend */
-       if (s->pdata->hw_suspend)
-               s->pdata->hw_suspend(s, 0);
-
-       /* Resume UART port */
-       uart_resume_port(&max3107_uart_driver, &s->port);
-#endif /* CONFIG_PM */
-       return 0;
-}
-EXPORT_SYMBOL_GPL(max3107_resume);
-
-static int max3107_probe_generic(struct spi_device *spi)
-{
-       return max3107_probe(spi, &generic_plat_data);
-}
-
-/* Spi driver data */
-static struct spi_driver max3107_driver = {
-       .driver = {
-               .name           = "max3107",
-               .owner          = THIS_MODULE,
-       },
-       .probe          = max3107_probe_generic,
-       .remove         = __devexit_p(max3107_remove),
-       .suspend        = max3107_suspend,
-       .resume         = max3107_resume,
-};
-
-/* Driver init function */
-static int __init max3107_init(void)
-{
-       pr_info("enter max3107 init\n");
-       return spi_register_driver(&max3107_driver);
-}
-
-/* Driver exit function */
-static void __exit max3107_exit(void)
-{
-       pr_info("enter max3107 exit\n");
-       /* Unregister UART driver */
-       if (driver_registered)
-               uart_unregister_driver(&max3107_uart_driver);
-       spi_unregister_driver(&max3107_driver);
-}
-
-module_init(max3107_init);
-module_exit(max3107_exit);
-
-MODULE_DESCRIPTION("MAX3107 driver");
-MODULE_AUTHOR("Aavamobile");
-MODULE_ALIAS("spi:max3107");
-MODULE_LICENSE("GPL v2");
diff --git a/drivers/tty/serial/max3107.h b/drivers/tty/serial/max3107.h
deleted file mode 100644 (file)
index 8415fc7..0000000
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- * max3107.h - spi uart protocol driver header for Maxim 3107
- *
- * Copyright (C) Aavamobile 2009
- * Based on serial_max3100.h by Christian Pellegrin
- *
- * 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 _MAX3107_H
-#define _MAX3107_H
-
-/* Serial error status definitions */
-#define MAX3107_PARITY_ERROR   1
-#define MAX3107_FRAME_ERROR    2
-#define MAX3107_OVERRUN_ERROR  4
-#define MAX3107_ALL_ERRORS     (MAX3107_PARITY_ERROR | \
-                                MAX3107_FRAME_ERROR | \
-                                MAX3107_OVERRUN_ERROR)
-
-/* GPIO definitions */
-#define MAX3107_GPIO_BASE      88
-#define MAX3107_GPIO_COUNT     4
-
-
-/* GPIO connected to chip's reset pin */
-#define MAX3107_RESET_GPIO     87
-
-
-/* Chip reset delay */
-#define MAX3107_RESET_DELAY    10
-
-/* Chip wakeup delay */
-#define MAX3107_WAKEUP_DELAY   50
-
-
-/* Sleep mode definitions */
-#define MAX3107_DISABLE_FORCED_SLEEP   0
-#define MAX3107_ENABLE_FORCED_SLEEP    1
-#define MAX3107_DISABLE_AUTOSLEEP      2
-#define MAX3107_ENABLE_AUTOSLEEP       3
-
-
-/* Definitions for register access with SPI transfers
- *
- * SPI transfer format:
- *
- * Master to slave bits xzzzzzzzyyyyyyyy
- * Slave to master bits aaaaaaaabbbbbbbb
- *
- * where:
- * x = 0 for reads, 1 for writes
- * z = register address
- * y = new register value if write, 0 if read
- * a = unspecified
- * b = register value if read, unspecified if write
- */
-
-/* SPI speed */
-#define MAX3107_SPI_SPEED      (3125000 * 2)
-
-/* Write bit */
-#define MAX3107_WRITE_BIT      (1 << 15)
-
-/* SPI TX data mask */
-#define MAX3107_SPI_RX_DATA_MASK       (0x00ff)
-
-/* SPI RX data mask */
-#define MAX3107_SPI_TX_DATA_MASK       (0x00ff)
-
-/* Register access masks */
-#define MAX3107_RHR_REG                        (0x0000) /* RX FIFO */
-#define MAX3107_THR_REG                        (0x0000) /* TX FIFO */
-#define MAX3107_IRQEN_REG              (0x0100) /* IRQ enable */
-#define MAX3107_IRQSTS_REG             (0x0200) /* IRQ status */
-#define MAX3107_LSR_IRQEN_REG          (0x0300) /* LSR IRQ enable */
-#define MAX3107_LSR_IRQSTS_REG         (0x0400) /* LSR IRQ status */
-#define MAX3107_SPCHR_IRQEN_REG                (0x0500) /* Special char IRQ enable */
-#define MAX3107_SPCHR_IRQSTS_REG       (0x0600) /* Special char IRQ status */
-#define MAX3107_STS_IRQEN_REG          (0x0700) /* Status IRQ enable */
-#define MAX3107_STS_IRQSTS_REG         (0x0800) /* Status IRQ status */
-#define MAX3107_MODE1_REG              (0x0900) /* MODE1 */
-#define MAX3107_MODE2_REG              (0x0a00) /* MODE2 */
-#define MAX3107_LCR_REG                        (0x0b00) /* LCR */
-#define MAX3107_RXTO_REG               (0x0c00) /* RX timeout */
-#define MAX3107_HDPIXDELAY_REG         (0x0d00) /* Auto transceiver delays */
-#define MAX3107_IRDA_REG               (0x0e00) /* IRDA settings */
-#define MAX3107_FLOWLVL_REG            (0x0f00) /* Flow control levels */
-#define MAX3107_FIFOTRIGLVL_REG                (0x1000) /* FIFO IRQ trigger levels */
-#define MAX3107_TXFIFOLVL_REG          (0x1100) /* TX FIFO level */
-#define MAX3107_RXFIFOLVL_REG          (0x1200) /* RX FIFO level */
-#define MAX3107_FLOWCTRL_REG           (0x1300) /* Flow control */
-#define MAX3107_XON1_REG               (0x1400) /* XON1 character */
-#define MAX3107_XON2_REG               (0x1500) /* XON2 character */
-#define MAX3107_XOFF1_REG              (0x1600) /* XOFF1 character */
-#define MAX3107_XOFF2_REG              (0x1700) /* XOFF2 character */
-#define MAX3107_GPIOCFG_REG            (0x1800) /* GPIO config */
-#define MAX3107_GPIODATA_REG           (0x1900) /* GPIO data */
-#define MAX3107_PLLCFG_REG             (0x1a00) /* PLL config */
-#define MAX3107_BRGCFG_REG             (0x1b00) /* Baud rate generator conf */
-#define MAX3107_BRGDIVLSB_REG          (0x1c00) /* Baud rate divisor LSB */
-#define MAX3107_BRGDIVMSB_REG          (0x1d00) /* Baud rate divisor MSB */
-#define MAX3107_CLKSRC_REG             (0x1e00) /* Clock source */
-#define MAX3107_REVID_REG              (0x1f00) /* Revision identification */
-
-/* IRQ register bits */
-#define MAX3107_IRQ_LSR_BIT    (1 << 0) /* LSR interrupt */
-#define MAX3107_IRQ_SPCHR_BIT  (1 << 1) /* Special char interrupt */
-#define MAX3107_IRQ_STS_BIT    (1 << 2) /* Status interrupt */
-#define MAX3107_IRQ_RXFIFO_BIT (1 << 3) /* RX FIFO interrupt */
-#define MAX3107_IRQ_TXFIFO_BIT (1 << 4) /* TX FIFO interrupt */
-#define MAX3107_IRQ_TXEMPTY_BIT        (1 << 5) /* TX FIFO empty interrupt */
-#define MAX3107_IRQ_RXEMPTY_BIT        (1 << 6) /* RX FIFO empty interrupt */
-#define MAX3107_IRQ_CTS_BIT    (1 << 7) /* CTS interrupt */
-
-/* LSR register bits */
-#define MAX3107_LSR_RXTO_BIT   (1 << 0) /* RX timeout */
-#define MAX3107_LSR_RXOVR_BIT  (1 << 1) /* RX overrun */
-#define MAX3107_LSR_RXPAR_BIT  (1 << 2) /* RX parity error */
-#define MAX3107_LSR_FRERR_BIT  (1 << 3) /* Frame error */
-#define MAX3107_LSR_RXBRK_BIT  (1 << 4) /* RX break */
-#define MAX3107_LSR_RXNOISE_BIT        (1 << 5) /* RX noise */
-#define MAX3107_LSR_UNDEF6_BIT (1 << 6) /* Undefined/not used */
-#define MAX3107_LSR_CTS_BIT    (1 << 7) /* CTS pin state */
-
-/* Special character register bits */
-#define MAX3107_SPCHR_XON1_BIT         (1 << 0) /* XON1 character */
-#define MAX3107_SPCHR_XON2_BIT         (1 << 1) /* XON2 character */
-#define MAX3107_SPCHR_XOFF1_BIT                (1 << 2) /* XOFF1 character */
-#define MAX3107_SPCHR_XOFF2_BIT                (1 << 3) /* XOFF2 character */
-#define MAX3107_SPCHR_BREAK_BIT                (1 << 4) /* RX break */
-#define MAX3107_SPCHR_MULTIDROP_BIT    (1 << 5) /* 9-bit multidrop addr char */
-#define MAX3107_SPCHR_UNDEF6_BIT       (1 << 6) /* Undefined/not used */
-#define MAX3107_SPCHR_UNDEF7_BIT       (1 << 7) /* Undefined/not used */
-
-/* Status register bits */
-#define MAX3107_STS_GPIO0_BIT          (1 << 0) /* GPIO 0 interrupt */
-#define MAX3107_STS_GPIO1_BIT          (1 << 1) /* GPIO 1 interrupt */
-#define MAX3107_STS_GPIO2_BIT          (1 << 2) /* GPIO 2 interrupt */
-#define MAX3107_STS_GPIO3_BIT          (1 << 3) /* GPIO 3 interrupt */
-#define MAX3107_STS_UNDEF4_BIT         (1 << 4) /* Undefined/not used */
-#define MAX3107_STS_CLKREADY_BIT       (1 << 5) /* Clock ready */
-#define MAX3107_STS_SLEEP_BIT          (1 << 6) /* Sleep interrupt */
-#define MAX3107_STS_UNDEF7_BIT         (1 << 7) /* Undefined/not used */
-
-/* MODE1 register bits */
-#define MAX3107_MODE1_RXDIS_BIT                (1 << 0) /* RX disable */
-#define MAX3107_MODE1_TXDIS_BIT                (1 << 1) /* TX disable */
-#define MAX3107_MODE1_TXHIZ_BIT                (1 << 2) /* TX pin three-state */
-#define MAX3107_MODE1_RTSHIZ_BIT       (1 << 3) /* RTS pin three-state */
-#define MAX3107_MODE1_TRNSCVCTRL_BIT   (1 << 4) /* Transceiver ctrl enable */
-#define MAX3107_MODE1_FORCESLEEP_BIT   (1 << 5) /* Force sleep mode */
-#define MAX3107_MODE1_AUTOSLEEP_BIT    (1 << 6) /* Auto sleep enable */
-#define MAX3107_MODE1_IRQSEL_BIT       (1 << 7) /* IRQ pin enable */
-
-/* MODE2 register bits */
-#define MAX3107_MODE2_RST_BIT          (1 << 0) /* Chip reset */
-#define MAX3107_MODE2_FIFORST_BIT      (1 << 1) /* FIFO reset */
-#define MAX3107_MODE2_RXTRIGINV_BIT    (1 << 2) /* RX FIFO INT invert */
-#define MAX3107_MODE2_RXEMPTINV_BIT    (1 << 3) /* RX FIFO empty INT invert */
-#define MAX3107_MODE2_SPCHR_BIT                (1 << 4) /* Special chr detect enable */
-#define MAX3107_MODE2_LOOPBACK_BIT     (1 << 5) /* Internal loopback enable */
-#define MAX3107_MODE2_MULTIDROP_BIT    (1 << 6) /* 9-bit multidrop enable */
-#define MAX3107_MODE2_ECHOSUPR_BIT     (1 << 7) /* ECHO suppression enable */
-
-/* LCR register bits */
-#define MAX3107_LCR_LENGTH0_BIT                (1 << 0) /* Word length bit 0 */
-#define MAX3107_LCR_LENGTH1_BIT                (1 << 1) /* Word length bit 1
-                                                 *
-                                                 * Word length bits table:
-                                                 * 00 -> 5 bit words
-                                                 * 01 -> 6 bit words
-                                                 * 10 -> 7 bit words
-                                                 * 11 -> 8 bit words
-                                                 */
-#define MAX3107_LCR_STOPLEN_BIT                (1 << 2) /* STOP length bit
-                                                 *
-                                                 * STOP length bit table:
-                                                 * 0 -> 1 stop bit
-                                                 * 1 -> 1-1.5 stop bits if
-                                                 *      word length is 5,
-                                                 *      2 stop bits otherwise
-                                                 */
-#define MAX3107_LCR_PARITY_BIT         (1 << 3) /* Parity bit enable */
-#define MAX3107_LCR_EVENPARITY_BIT     (1 << 4) /* Even parity bit enable */
-#define MAX3107_LCR_FORCEPARITY_BIT    (1 << 5) /* 9-bit multidrop parity */
-#define MAX3107_LCR_TXBREAK_BIT                (1 << 6) /* TX break enable */
-#define MAX3107_LCR_RTS_BIT            (1 << 7) /* RTS pin control */
-#define MAX3107_LCR_WORD_LEN_5         (0x0000)
-#define MAX3107_LCR_WORD_LEN_6         (0x0001)
-#define MAX3107_LCR_WORD_LEN_7         (0x0002)
-#define MAX3107_LCR_WORD_LEN_8         (0x0003)
-
-
-/* IRDA register bits */
-#define MAX3107_IRDA_IRDAEN_BIT                (1 << 0) /* IRDA mode enable */
-#define MAX3107_IRDA_SIR_BIT           (1 << 1) /* SIR mode enable */
-#define MAX3107_IRDA_SHORTIR_BIT       (1 << 2) /* Short SIR mode enable */
-#define MAX3107_IRDA_MIR_BIT           (1 << 3) /* MIR mode enable */
-#define MAX3107_IRDA_RXINV_BIT         (1 << 4) /* RX logic inversion enable */
-#define MAX3107_IRDA_TXINV_BIT         (1 << 5) /* TX logic inversion enable */
-#define MAX3107_IRDA_UNDEF6_BIT                (1 << 6) /* Undefined/not used */
-#define MAX3107_IRDA_UNDEF7_BIT                (1 << 7) /* Undefined/not used */
-
-/* Flow control trigger level register masks */
-#define MAX3107_FLOWLVL_HALT_MASK      (0x000f) /* Flow control halt level */
-#define MAX3107_FLOWLVL_RES_MASK       (0x00f0) /* Flow control resume level */
-#define MAX3107_FLOWLVL_HALT(words)    ((words/8) & 0x000f)
-#define MAX3107_FLOWLVL_RES(words)     (((words/8) & 0x000f) << 4)
-
-/* FIFO interrupt trigger level register masks */
-#define MAX3107_FIFOTRIGLVL_TX_MASK    (0x000f) /* TX FIFO trigger level */
-#define MAX3107_FIFOTRIGLVL_RX_MASK    (0x00f0) /* RX FIFO trigger level */
-#define MAX3107_FIFOTRIGLVL_TX(words)  ((words/8) & 0x000f)
-#define MAX3107_FIFOTRIGLVL_RX(words)  (((words/8) & 0x000f) << 4)
-
-/* Flow control register bits */
-#define MAX3107_FLOWCTRL_AUTORTS_BIT   (1 << 0) /* Auto RTS flow ctrl enable */
-#define MAX3107_FLOWCTRL_AUTOCTS_BIT   (1 << 1) /* Auto CTS flow ctrl enable */
-#define MAX3107_FLOWCTRL_GPIADDR_BIT   (1 << 2) /* Enables that GPIO inputs
-                                                 * are used in conjunction with
-                                                 * XOFF2 for definition of
-                                                 * special character */
-#define MAX3107_FLOWCTRL_SWFLOWEN_BIT  (1 << 3) /* Auto SW flow ctrl enable */
-#define MAX3107_FLOWCTRL_SWFLOW0_BIT   (1 << 4) /* SWFLOW bit 0 */
-#define MAX3107_FLOWCTRL_SWFLOW1_BIT   (1 << 5) /* SWFLOW bit 1
-                                                 *
-                                                 * SWFLOW bits 1 & 0 table:
-                                                 * 00 -> no transmitter flow
-                                                 *       control
-                                                 * 01 -> receiver compares
-                                                 *       XON2 and XOFF2
-                                                 *       and controls
-                                                 *       transmitter
-                                                 * 10 -> receiver compares
-                                                 *       XON1 and XOFF1
-                                                 *       and controls
-                                                 *       transmitter
-                                                 * 11 -> receiver compares
-                                                 *       XON1, XON2, XOFF1 and
-                                                 *       XOFF2 and controls
-                                                 *       transmitter
-                                                 */
-#define MAX3107_FLOWCTRL_SWFLOW2_BIT   (1 << 6) /* SWFLOW bit 2 */
-#define MAX3107_FLOWCTRL_SWFLOW3_BIT   (1 << 7) /* SWFLOW bit 3
-                                                 *
-                                                 * SWFLOW bits 3 & 2 table:
-                                                 * 00 -> no received flow
-                                                 *       control
-                                                 * 01 -> transmitter generates
-                                                 *       XON2 and XOFF2
-                                                 * 10 -> transmitter generates
-                                                 *       XON1 and XOFF1
-                                                 * 11 -> transmitter generates
-                                                 *       XON1, XON2, XOFF1 and
-                                                 *       XOFF2
-                                                 */
-
-/* GPIO configuration register bits */
-#define MAX3107_GPIOCFG_GP0OUT_BIT     (1 << 0) /* GPIO 0 output enable */
-#define MAX3107_GPIOCFG_GP1OUT_BIT     (1 << 1) /* GPIO 1 output enable */
-#define MAX3107_GPIOCFG_GP2OUT_BIT     (1 << 2) /* GPIO 2 output enable */
-#define MAX3107_GPIOCFG_GP3OUT_BIT     (1 << 3) /* GPIO 3 output enable */
-#define MAX3107_GPIOCFG_GP0OD_BIT      (1 << 4) /* GPIO 0 open-drain enable */
-#define MAX3107_GPIOCFG_GP1OD_BIT      (1 << 5) /* GPIO 1 open-drain enable */
-#define MAX3107_GPIOCFG_GP2OD_BIT      (1 << 6) /* GPIO 2 open-drain enable */
-#define MAX3107_GPIOCFG_GP3OD_BIT      (1 << 7) /* GPIO 3 open-drain enable */
-
-/* GPIO DATA register bits */
-#define MAX3107_GPIODATA_GP0OUT_BIT    (1 << 0) /* GPIO 0 output value */
-#define MAX3107_GPIODATA_GP1OUT_BIT    (1 << 1) /* GPIO 1 output value */
-#define MAX3107_GPIODATA_GP2OUT_BIT    (1 << 2) /* GPIO 2 output value */
-#define MAX3107_GPIODATA_GP3OUT_BIT    (1 << 3) /* GPIO 3 output value */
-#define MAX3107_GPIODATA_GP0IN_BIT     (1 << 4) /* GPIO 0 input value */
-#define MAX3107_GPIODATA_GP1IN_BIT     (1 << 5) /* GPIO 1 input value */
-#define MAX3107_GPIODATA_GP2IN_BIT     (1 << 6) /* GPIO 2 input value */
-#define MAX3107_GPIODATA_GP3IN_BIT     (1 << 7) /* GPIO 3 input value */
-
-/* PLL configuration register masks */
-#define MAX3107_PLLCFG_PREDIV_MASK     (0x003f) /* PLL predivision value */
-#define MAX3107_PLLCFG_PLLFACTOR_MASK  (0x00c0) /* PLL multiplication factor */
-
-/* Baud rate generator configuration register masks and bits */
-#define MAX3107_BRGCFG_FRACT_MASK      (0x000f) /* Fractional portion of
-                                                 * Baud rate generator divisor
-                                                 */
-#define MAX3107_BRGCFG_2XMODE_BIT      (1 << 4) /* Double baud rate */
-#define MAX3107_BRGCFG_4XMODE_BIT      (1 << 5) /* Quadruple baud rate */
-#define MAX3107_BRGCFG_UNDEF6_BIT      (1 << 6) /* Undefined/not used */
-#define MAX3107_BRGCFG_UNDEF7_BIT      (1 << 7) /* Undefined/not used */
-
-/* Clock source register bits */
-#define MAX3107_CLKSRC_INTOSC_BIT      (1 << 0) /* Internal osc enable */
-#define MAX3107_CLKSRC_CRYST_BIT       (1 << 1) /* Crystal osc enable */
-#define MAX3107_CLKSRC_PLL_BIT         (1 << 2) /* PLL enable */
-#define MAX3107_CLKSRC_PLLBYP_BIT      (1 << 3) /* PLL bypass */
-#define MAX3107_CLKSRC_EXTCLK_BIT      (1 << 4) /* External clock enable */
-#define MAX3107_CLKSRC_UNDEF5_BIT      (1 << 5) /* Undefined/not used */
-#define MAX3107_CLKSRC_UNDEF6_BIT      (1 << 6) /* Undefined/not used */
-#define MAX3107_CLKSRC_CLK2RTS_BIT     (1 << 7) /* Baud clk to RTS pin */
-
-
-/* HW definitions */
-#define MAX3107_RX_FIFO_SIZE   128
-#define MAX3107_TX_FIFO_SIZE   128
-#define MAX3107_REVID1         0x00a0
-#define MAX3107_REVID2         0x00a1
-
-
-/* Baud rate generator configuration values for external clock 13MHz */
-#define MAX3107_BRG13_B300     (0x0A9400 | 0x05)
-#define MAX3107_BRG13_B600     (0x054A00 | 0x03)
-#define MAX3107_BRG13_B1200    (0x02A500 | 0x01)
-#define MAX3107_BRG13_B2400    (0x015200 | 0x09)
-#define MAX3107_BRG13_B4800    (0x00A900 | 0x04)
-#define MAX3107_BRG13_B9600    (0x005400 | 0x0A)
-#define MAX3107_BRG13_B19200   (0x002A00 | 0x05)
-#define MAX3107_BRG13_B38400   (0x001500 | 0x03)
-#define MAX3107_BRG13_B57600   (0x000E00 | 0x02)
-#define MAX3107_BRG13_B115200  (0x000700 | 0x01)
-#define MAX3107_BRG13_B230400  (0x000300 | 0x08)
-#define MAX3107_BRG13_B460800  (0x000100 | 0x0c)
-#define MAX3107_BRG13_B921600  (0x000100 | 0x1c)
-
-/* Baud rate generator configuration values for external clock 26MHz */
-#define MAX3107_BRG26_B300     (0x152800 | 0x0A)
-#define MAX3107_BRG26_B600     (0x0A9400 | 0x05)
-#define MAX3107_BRG26_B1200    (0x054A00 | 0x03)
-#define MAX3107_BRG26_B2400    (0x02A500 | 0x01)
-#define MAX3107_BRG26_B4800    (0x015200 | 0x09)
-#define MAX3107_BRG26_B9600    (0x00A900 | 0x04)
-#define MAX3107_BRG26_B19200   (0x005400 | 0x0A)
-#define MAX3107_BRG26_B38400   (0x002A00 | 0x05)
-#define MAX3107_BRG26_B57600   (0x001C00 | 0x03)
-#define MAX3107_BRG26_B115200  (0x000E00 | 0x02)
-#define MAX3107_BRG26_B230400  (0x000700 | 0x01)
-#define MAX3107_BRG26_B460800  (0x000300 | 0x08)
-#define MAX3107_BRG26_B921600  (0x000100 | 0x0C)
-
-/* Baud rate generator configuration values for internal clock */
-#define MAX3107_BRG13_IB300    (0x008000 | 0x00)
-#define MAX3107_BRG13_IB600    (0x004000 | 0x00)
-#define MAX3107_BRG13_IB1200   (0x002000 | 0x00)
-#define MAX3107_BRG13_IB2400   (0x001000 | 0x00)
-#define MAX3107_BRG13_IB4800   (0x000800 | 0x00)
-#define MAX3107_BRG13_IB9600   (0x000400 | 0x00)
-#define MAX3107_BRG13_IB19200  (0x000200 | 0x00)
-#define MAX3107_BRG13_IB38400  (0x000100 | 0x00)
-#define MAX3107_BRG13_IB57600  (0x000000 | 0x0B)
-#define MAX3107_BRG13_IB115200 (0x000000 | 0x05)
-#define MAX3107_BRG13_IB230400 (0x000000 | 0x03)
-#define MAX3107_BRG13_IB460800 (0x000000 | 0x00)
-#define MAX3107_BRG13_IB921600 (0x000000 | 0x00)
-
-
-struct baud_table {
-       int baud;
-       u32 new_brg;
-};
-
-struct max3107_port {
-       /* UART port structure */
-       struct uart_port port;
-
-       /* SPI device structure */
-       struct spi_device *spi;
-
-#if defined(CONFIG_GPIOLIB)
-       /* GPIO chip structure */
-       struct gpio_chip chip;
-#endif
-
-       /* Workqueue that does all the magic */
-       struct workqueue_struct *workqueue;
-       struct work_struct work;
-
-       /* Lock for shared data */
-       spinlock_t data_lock;
-
-       /* Device configuration */
-       int ext_clk;            /* 1 if external clock used */
-       int loopback;           /* Current loopback mode state */
-       int baud;                       /* Current baud rate */
-
-       /* State flags */
-       int suspended;          /* Indicates suspend mode */
-       int tx_fifo_empty;      /* Flag for TX FIFO state */
-       int rx_enabled;         /* Flag for receiver state */
-       int tx_enabled;         /* Flag for transmitter state */
-
-       u16 irqen_reg;          /* Current IRQ enable register value */
-       /* Shared data */
-       u16 mode1_reg;          /* Current mode1 register value*/
-       int mode1_commit;       /* Flag for setting new mode1 register value */
-       u16 lcr_reg;            /* Current LCR register value */
-       int lcr_commit;         /* Flag for setting new LCR register value */
-       u32 brg_cfg;            /* Current Baud rate generator config  */
-       int brg_commit;         /* Flag for setting new baud rate generator
-                                * config
-                                */
-       struct baud_table *baud_tbl;
-       int handle_irq;         /* Indicates that IRQ should be handled */
-
-       /* Rx buffer and str*/
-       u16 *rxbuf;
-       u8  *rxstr;
-       /* Tx buffer*/
-       u16 *txbuf;
-
-       struct max3107_plat *pdata;     /* Platform data */
-};
-
-/* Platform data structure */
-struct max3107_plat {
-       /* Loopback mode enable */
-       int loopback;
-       /* External clock enable */
-       int ext_clk;
-       /* Called during the register initialisation */
-       void (*init)(struct max3107_port *s);
-       /* Called when the port is found and configured */
-       int (*configure)(struct max3107_port *s);
-       /* HW suspend function */
-       void (*hw_suspend) (struct max3107_port *s, int suspend);
-       /* Polling mode enable */
-       int polled_mode;
-       /* Polling period if polling mode enabled */
-       int poll_time;
-};
-
-extern int max3107_rw(struct max3107_port *s, u8 *tx, u8 *rx, int len);
-extern void max3107_hw_susp(struct max3107_port *s, int suspend);
-extern int max3107_probe(struct spi_device *spi, struct max3107_plat *pdata);
-extern int max3107_remove(struct spi_device *spi);
-extern int max3107_suspend(struct spi_device *spi, pm_message_t state);
-extern int max3107_resume(struct spi_device *spi);
-
-#endif /* _LINUX_SERIAL_MAX3107_H */
diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c
new file mode 100644 (file)
index 0000000..2bc28a5
--- /dev/null
@@ -0,0 +1,1260 @@
+/*
+ *  Maxim (Dallas) MAX3107/8 serial driver
+ *
+ *  Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru>
+ *
+ *  Based on max3100.c, by Christian Pellegrin <chripell@evolware.org>
+ *  Based on max3110.c, by Feng Tang <feng.tang@intel.com>
+ *  Based on max3107.c, by Aavamobile
+ *
+ *  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.
+ */
+
+/* TODO: MAX3109 support (Dual) */
+/* TODO: MAX14830 support (Quad) */
+
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/serial_core.h>
+#include <linux/serial.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/regmap.h>
+#include <linux/gpio.h>
+#include <linux/spi/spi.h>
+#include <linux/platform_data/max310x.h>
+
+#define MAX310X_MAJOR                  204
+#define MAX310X_MINOR                  209
+
+/* MAX310X register definitions */
+#define MAX310X_RHR_REG                        (0x00) /* RX FIFO */
+#define MAX310X_THR_REG                        (0x00) /* TX FIFO */
+#define MAX310X_IRQEN_REG              (0x01) /* IRQ enable */
+#define MAX310X_IRQSTS_REG             (0x02) /* IRQ status */
+#define MAX310X_LSR_IRQEN_REG          (0x03) /* LSR IRQ enable */
+#define MAX310X_LSR_IRQSTS_REG         (0x04) /* LSR IRQ status */
+#define MAX310X_SPCHR_IRQEN_REG                (0x05) /* Special char IRQ enable */
+#define MAX310X_SPCHR_IRQSTS_REG       (0x06) /* Special char IRQ status */
+#define MAX310X_STS_IRQEN_REG          (0x07) /* Status IRQ enable */
+#define MAX310X_STS_IRQSTS_REG         (0x08) /* Status IRQ status */
+#define MAX310X_MODE1_REG              (0x09) /* MODE1 */
+#define MAX310X_MODE2_REG              (0x0a) /* MODE2 */
+#define MAX310X_LCR_REG                        (0x0b) /* LCR */
+#define MAX310X_RXTO_REG               (0x0c) /* RX timeout */
+#define MAX310X_HDPIXDELAY_REG         (0x0d) /* Auto transceiver delays */
+#define MAX310X_IRDA_REG               (0x0e) /* IRDA settings */
+#define MAX310X_FLOWLVL_REG            (0x0f) /* Flow control levels */
+#define MAX310X_FIFOTRIGLVL_REG                (0x10) /* FIFO IRQ trigger levels */
+#define MAX310X_TXFIFOLVL_REG          (0x11) /* TX FIFO level */
+#define MAX310X_RXFIFOLVL_REG          (0x12) /* RX FIFO level */
+#define MAX310X_FLOWCTRL_REG           (0x13) /* Flow control */
+#define MAX310X_XON1_REG               (0x14) /* XON1 character */
+#define MAX310X_XON2_REG               (0x15) /* XON2 character */
+#define MAX310X_XOFF1_REG              (0x16) /* XOFF1 character */
+#define MAX310X_XOFF2_REG              (0x17) /* XOFF2 character */
+#define MAX310X_GPIOCFG_REG            (0x18) /* GPIO config */
+#define MAX310X_GPIODATA_REG           (0x19) /* GPIO data */
+#define MAX310X_PLLCFG_REG             (0x1a) /* PLL config */
+#define MAX310X_BRGCFG_REG             (0x1b) /* Baud rate generator conf */
+#define MAX310X_BRGDIVLSB_REG          (0x1c) /* Baud rate divisor LSB */
+#define MAX310X_BRGDIVMSB_REG          (0x1d) /* Baud rate divisor MSB */
+#define MAX310X_CLKSRC_REG             (0x1e) /* Clock source */
+/* Only present in MAX3107 */
+#define MAX3107_REVID_REG              (0x1f) /* Revision identification */
+
+/* IRQ register bits */
+#define MAX310X_IRQ_LSR_BIT            (1 << 0) /* LSR interrupt */
+#define MAX310X_IRQ_SPCHR_BIT          (1 << 1) /* Special char interrupt */
+#define MAX310X_IRQ_STS_BIT            (1 << 2) /* Status interrupt */
+#define MAX310X_IRQ_RXFIFO_BIT         (1 << 3) /* RX FIFO interrupt */
+#define MAX310X_IRQ_TXFIFO_BIT         (1 << 4) /* TX FIFO interrupt */
+#define MAX310X_IRQ_TXEMPTY_BIT                (1 << 5) /* TX FIFO empty interrupt */
+#define MAX310X_IRQ_RXEMPTY_BIT                (1 << 6) /* RX FIFO empty interrupt */
+#define MAX310X_IRQ_CTS_BIT            (1 << 7) /* CTS interrupt */
+
+/* LSR register bits */
+#define MAX310X_LSR_RXTO_BIT           (1 << 0) /* RX timeout */
+#define MAX310X_LSR_RXOVR_BIT          (1 << 1) /* RX overrun */
+#define MAX310X_LSR_RXPAR_BIT          (1 << 2) /* RX parity error */
+#define MAX310X_LSR_FRERR_BIT          (1 << 3) /* Frame error */
+#define MAX310X_LSR_RXBRK_BIT          (1 << 4) /* RX break */
+#define MAX310X_LSR_RXNOISE_BIT                (1 << 5) /* RX noise */
+#define MAX310X_LSR_CTS_BIT            (1 << 7) /* CTS pin state */
+
+/* Special character register bits */
+#define MAX310X_SPCHR_XON1_BIT         (1 << 0) /* XON1 character */
+#define MAX310X_SPCHR_XON2_BIT         (1 << 1) /* XON2 character */
+#define MAX310X_SPCHR_XOFF1_BIT                (1 << 2) /* XOFF1 character */
+#define MAX310X_SPCHR_XOFF2_BIT                (1 << 3) /* XOFF2 character */
+#define MAX310X_SPCHR_BREAK_BIT                (1 << 4) /* RX break */
+#define MAX310X_SPCHR_MULTIDROP_BIT    (1 << 5) /* 9-bit multidrop addr char */
+
+/* Status register bits */
+#define MAX310X_STS_GPIO0_BIT          (1 << 0) /* GPIO 0 interrupt */
+#define MAX310X_STS_GPIO1_BIT          (1 << 1) /* GPIO 1 interrupt */
+#define MAX310X_STS_GPIO2_BIT          (1 << 2) /* GPIO 2 interrupt */
+#define MAX310X_STS_GPIO3_BIT          (1 << 3) /* GPIO 3 interrupt */
+#define MAX310X_STS_CLKREADY_BIT       (1 << 5) /* Clock ready */
+#define MAX310X_STS_SLEEP_BIT          (1 << 6) /* Sleep interrupt */
+
+/* MODE1 register bits */
+#define MAX310X_MODE1_RXDIS_BIT                (1 << 0) /* RX disable */
+#define MAX310X_MODE1_TXDIS_BIT                (1 << 1) /* TX disable */
+#define MAX310X_MODE1_TXHIZ_BIT                (1 << 2) /* TX pin three-state */
+#define MAX310X_MODE1_RTSHIZ_BIT       (1 << 3) /* RTS pin three-state */
+#define MAX310X_MODE1_TRNSCVCTRL_BIT   (1 << 4) /* Transceiver ctrl enable */
+#define MAX310X_MODE1_FORCESLEEP_BIT   (1 << 5) /* Force sleep mode */
+#define MAX310X_MODE1_AUTOSLEEP_BIT    (1 << 6) /* Auto sleep enable */
+#define MAX310X_MODE1_IRQSEL_BIT       (1 << 7) /* IRQ pin enable */
+
+/* MODE2 register bits */
+#define MAX310X_MODE2_RST_BIT          (1 << 0) /* Chip reset */
+#define MAX310X_MODE2_FIFORST_BIT      (1 << 1) /* FIFO reset */
+#define MAX310X_MODE2_RXTRIGINV_BIT    (1 << 2) /* RX FIFO INT invert */
+#define MAX310X_MODE2_RXEMPTINV_BIT    (1 << 3) /* RX FIFO empty INT invert */
+#define MAX310X_MODE2_SPCHR_BIT                (1 << 4) /* Special chr detect enable */
+#define MAX310X_MODE2_LOOPBACK_BIT     (1 << 5) /* Internal loopback enable */
+#define MAX310X_MODE2_MULTIDROP_BIT    (1 << 6) /* 9-bit multidrop enable */
+#define MAX310X_MODE2_ECHOSUPR_BIT     (1 << 7) /* ECHO suppression enable */
+
+/* LCR register bits */
+#define MAX310X_LCR_LENGTH0_BIT                (1 << 0) /* Word length bit 0 */
+#define MAX310X_LCR_LENGTH1_BIT                (1 << 1) /* Word length bit 1
+                                                 *
+                                                 * Word length bits table:
+                                                 * 00 -> 5 bit words
+                                                 * 01 -> 6 bit words
+                                                 * 10 -> 7 bit words
+                                                 * 11 -> 8 bit words
+                                                 */
+#define MAX310X_LCR_STOPLEN_BIT                (1 << 2) /* STOP length bit
+                                                 *
+                                                 * STOP length bit table:
+                                                 * 0 -> 1 stop bit
+                                                 * 1 -> 1-1.5 stop bits if
+                                                 *      word length is 5,
+                                                 *      2 stop bits otherwise
+                                                 */
+#define MAX310X_LCR_PARITY_BIT         (1 << 3) /* Parity bit enable */
+#define MAX310X_LCR_EVENPARITY_BIT     (1 << 4) /* Even parity bit enable */
+#define MAX310X_LCR_FORCEPARITY_BIT    (1 << 5) /* 9-bit multidrop parity */
+#define MAX310X_LCR_TXBREAK_BIT                (1 << 6) /* TX break enable */
+#define MAX310X_LCR_RTS_BIT            (1 << 7) /* RTS pin control */
+#define MAX310X_LCR_WORD_LEN_5         (0x00)
+#define MAX310X_LCR_WORD_LEN_6         (0x01)
+#define MAX310X_LCR_WORD_LEN_7         (0x02)
+#define MAX310X_LCR_WORD_LEN_8         (0x03)
+
+/* IRDA register bits */
+#define MAX310X_IRDA_IRDAEN_BIT                (1 << 0) /* IRDA mode enable */
+#define MAX310X_IRDA_SIR_BIT           (1 << 1) /* SIR mode enable */
+#define MAX310X_IRDA_SHORTIR_BIT       (1 << 2) /* Short SIR mode enable */
+#define MAX310X_IRDA_MIR_BIT           (1 << 3) /* MIR mode enable */
+#define MAX310X_IRDA_RXINV_BIT         (1 << 4) /* RX logic inversion enable */
+#define MAX310X_IRDA_TXINV_BIT         (1 << 5) /* TX logic inversion enable */
+
+/* Flow control trigger level register masks */
+#define MAX310X_FLOWLVL_HALT_MASK      (0x000f) /* Flow control halt level */
+#define MAX310X_FLOWLVL_RES_MASK       (0x00f0) /* Flow control resume level */
+#define MAX310X_FLOWLVL_HALT(words)    ((words / 8) & 0x0f)
+#define MAX310X_FLOWLVL_RES(words)     (((words / 8) & 0x0f) << 4)
+
+/* FIFO interrupt trigger level register masks */
+#define MAX310X_FIFOTRIGLVL_TX_MASK    (0x0f) /* TX FIFO trigger level */
+#define MAX310X_FIFOTRIGLVL_RX_MASK    (0xf0) /* RX FIFO trigger level */
+#define MAX310X_FIFOTRIGLVL_TX(words)  ((words / 8) & 0x0f)
+#define MAX310X_FIFOTRIGLVL_RX(words)  (((words / 8) & 0x0f) << 4)
+
+/* Flow control register bits */
+#define MAX310X_FLOWCTRL_AUTORTS_BIT   (1 << 0) /* Auto RTS flow ctrl enable */
+#define MAX310X_FLOWCTRL_AUTOCTS_BIT   (1 << 1) /* Auto CTS flow ctrl enable */
+#define MAX310X_FLOWCTRL_GPIADDR_BIT   (1 << 2) /* Enables that GPIO inputs
+                                                 * are used in conjunction with
+                                                 * XOFF2 for definition of
+                                                 * special character */
+#define MAX310X_FLOWCTRL_SWFLOWEN_BIT  (1 << 3) /* Auto SW flow ctrl enable */
+#define MAX310X_FLOWCTRL_SWFLOW0_BIT   (1 << 4) /* SWFLOW bit 0 */
+#define MAX310X_FLOWCTRL_SWFLOW1_BIT   (1 << 5) /* SWFLOW bit 1
+                                                 *
+                                                 * SWFLOW bits 1 & 0 table:
+                                                 * 00 -> no transmitter flow
+                                                 *       control
+                                                 * 01 -> receiver compares
+                                                 *       XON2 and XOFF2
+                                                 *       and controls
+                                                 *       transmitter
+                                                 * 10 -> receiver compares
+                                                 *       XON1 and XOFF1
+                                                 *       and controls
+                                                 *       transmitter
+                                                 * 11 -> receiver compares
+                                                 *       XON1, XON2, XOFF1 and
+                                                 *       XOFF2 and controls
+                                                 *       transmitter
+                                                 */
+#define MAX310X_FLOWCTRL_SWFLOW2_BIT   (1 << 6) /* SWFLOW bit 2 */
+#define MAX310X_FLOWCTRL_SWFLOW3_BIT   (1 << 7) /* SWFLOW bit 3
+                                                 *
+                                                 * SWFLOW bits 3 & 2 table:
+                                                 * 00 -> no received flow
+                                                 *       control
+                                                 * 01 -> transmitter generates
+                                                 *       XON2 and XOFF2
+                                                 * 10 -> transmitter generates
+                                                 *       XON1 and XOFF1
+                                                 * 11 -> transmitter generates
+                                                 *       XON1, XON2, XOFF1 and
+                                                 *       XOFF2
+                                                 */
+
+/* GPIO configuration register bits */
+#define MAX310X_GPIOCFG_GP0OUT_BIT     (1 << 0) /* GPIO 0 output enable */
+#define MAX310X_GPIOCFG_GP1OUT_BIT     (1 << 1) /* GPIO 1 output enable */
+#define MAX310X_GPIOCFG_GP2OUT_BIT     (1 << 2) /* GPIO 2 output enable */
+#define MAX310X_GPIOCFG_GP3OUT_BIT     (1 << 3) /* GPIO 3 output enable */
+#define MAX310X_GPIOCFG_GP0OD_BIT      (1 << 4) /* GPIO 0 open-drain enable */
+#define MAX310X_GPIOCFG_GP1OD_BIT      (1 << 5) /* GPIO 1 open-drain enable */
+#define MAX310X_GPIOCFG_GP2OD_BIT      (1 << 6) /* GPIO 2 open-drain enable */
+#define MAX310X_GPIOCFG_GP3OD_BIT      (1 << 7) /* GPIO 3 open-drain enable */
+
+/* GPIO DATA register bits */
+#define MAX310X_GPIODATA_GP0OUT_BIT    (1 << 0) /* GPIO 0 output value */
+#define MAX310X_GPIODATA_GP1OUT_BIT    (1 << 1) /* GPIO 1 output value */
+#define MAX310X_GPIODATA_GP2OUT_BIT    (1 << 2) /* GPIO 2 output value */
+#define MAX310X_GPIODATA_GP3OUT_BIT    (1 << 3) /* GPIO 3 output value */
+#define MAX310X_GPIODATA_GP0IN_BIT     (1 << 4) /* GPIO 0 input value */
+#define MAX310X_GPIODATA_GP1IN_BIT     (1 << 5) /* GPIO 1 input value */
+#define MAX310X_GPIODATA_GP2IN_BIT     (1 << 6) /* GPIO 2 input value */
+#define MAX310X_GPIODATA_GP3IN_BIT     (1 << 7) /* GPIO 3 input value */
+
+/* PLL configuration register masks */
+#define MAX310X_PLLCFG_PREDIV_MASK     (0x3f) /* PLL predivision value */
+#define MAX310X_PLLCFG_PLLFACTOR_MASK  (0xc0) /* PLL multiplication factor */
+
+/* Baud rate generator configuration register bits */
+#define MAX310X_BRGCFG_2XMODE_BIT      (1 << 4) /* Double baud rate */
+#define MAX310X_BRGCFG_4XMODE_BIT      (1 << 5) /* Quadruple baud rate */
+
+/* Clock source register bits */
+#define MAX310X_CLKSRC_CRYST_BIT       (1 << 1) /* Crystal osc enable */
+#define MAX310X_CLKSRC_PLL_BIT         (1 << 2) /* PLL enable */
+#define MAX310X_CLKSRC_PLLBYP_BIT      (1 << 3) /* PLL bypass */
+#define MAX310X_CLKSRC_EXTCLK_BIT      (1 << 4) /* External clock enable */
+#define MAX310X_CLKSRC_CLK2RTS_BIT     (1 << 7) /* Baud clk to RTS pin */
+
+/* Misc definitions */
+#define MAX310X_FIFO_SIZE              (128)
+
+/* MAX3107 specific */
+#define MAX3107_REV_ID                 (0xa0)
+#define MAX3107_REV_MASK               (0xfe)
+
+/* IRQ status bits definitions */
+#define MAX310X_IRQ_TX                 (MAX310X_IRQ_TXFIFO_BIT | \
+                                        MAX310X_IRQ_TXEMPTY_BIT)
+#define MAX310X_IRQ_RX                 (MAX310X_IRQ_RXFIFO_BIT | \
+                                        MAX310X_IRQ_RXEMPTY_BIT)
+
+/* Supported chip types */
+enum {
+       MAX310X_TYPE_MAX3107    = 3107,
+       MAX310X_TYPE_MAX3108    = 3108,
+};
+
+struct max310x_port {
+       struct uart_driver      uart;
+       struct uart_port        port;
+
+       const char              *name;
+       int                     uartclk;
+
+       unsigned int            nr_gpio;
+#ifdef CONFIG_GPIOLIB
+       struct gpio_chip        gpio;
+#endif
+
+       struct regmap           *regmap;
+       struct regmap_config    regcfg;
+
+       struct workqueue_struct *wq;
+       struct work_struct      tx_work;
+
+       struct mutex            max310x_mutex;
+
+       struct max310x_pdata    *pdata;
+};
+
+static bool max3107_8_reg_writeable(struct device *dev, unsigned int reg)
+{
+       switch (reg) {
+       case MAX310X_IRQSTS_REG:
+       case MAX310X_LSR_IRQSTS_REG:
+       case MAX310X_SPCHR_IRQSTS_REG:
+       case MAX310X_STS_IRQSTS_REG:
+       case MAX310X_TXFIFOLVL_REG:
+       case MAX310X_RXFIFOLVL_REG:
+       case MAX3107_REVID_REG: /* Only available on MAX3107 */
+               return false;
+       default:
+               break;
+       }
+
+       return true;
+}
+
+static bool max310x_reg_volatile(struct device *dev, unsigned int reg)
+{
+       switch (reg) {
+       case MAX310X_RHR_REG:
+       case MAX310X_IRQSTS_REG:
+       case MAX310X_LSR_IRQSTS_REG:
+       case MAX310X_SPCHR_IRQSTS_REG:
+       case MAX310X_STS_IRQSTS_REG:
+       case MAX310X_TXFIFOLVL_REG:
+       case MAX310X_RXFIFOLVL_REG:
+       case MAX310X_GPIODATA_REG:
+               return true;
+       default:
+               break;
+       }
+
+       return false;
+}
+
+static bool max310x_reg_precious(struct device *dev, unsigned int reg)
+{
+       switch (reg) {
+       case MAX310X_RHR_REG:
+       case MAX310X_IRQSTS_REG:
+       case MAX310X_SPCHR_IRQSTS_REG:
+       case MAX310X_STS_IRQSTS_REG:
+               return true;
+       default:
+               break;
+       }
+
+       return false;
+}
+
+static void max310x_set_baud(struct max310x_port *s, int baud)
+{
+       unsigned int mode = 0, div = s->uartclk / baud;
+
+       if (!(div / 16)) {
+               /* Mode x2 */
+               mode = MAX310X_BRGCFG_2XMODE_BIT;
+               div = (s->uartclk * 2) / baud;
+       }
+
+       if (!(div / 16)) {
+               /* Mode x4 */
+               mode = MAX310X_BRGCFG_4XMODE_BIT;
+               div = (s->uartclk * 4) / baud;
+       }
+
+       regmap_write(s->regmap, MAX310X_BRGDIVMSB_REG,
+                    ((div / 16) >> 8) & 0xff);
+       regmap_write(s->regmap, MAX310X_BRGDIVLSB_REG, (div / 16) & 0xff);
+       regmap_write(s->regmap, MAX310X_BRGCFG_REG, (div % 16) | mode);
+}
+
+static void max310x_wait_pll(struct max310x_port *s)
+{
+       int tryes = 1000;
+
+       /* Wait for PLL only if crystal is used */
+       if (!(s->pdata->driver_flags & MAX310X_EXT_CLK)) {
+               unsigned int sts = 0;
+
+               while (tryes--) {
+                       regmap_read(s->regmap, MAX310X_STS_IRQSTS_REG, &sts);
+                       if (sts & MAX310X_STS_CLKREADY_BIT)
+                               break;
+               }
+       }
+}
+
+static int __devinit max310x_update_best_err(unsigned long f, long *besterr)
+{
+       /* Use baudrate 115200 for calculate error */
+       long err = f % (115200 * 16);
+
+       if ((*besterr < 0) || (*besterr > err)) {
+               *besterr = err;
+               return 0;
+       }
+
+       return 1;
+}
+
+static int __devinit max310x_set_ref_clk(struct max310x_port *s)
+{
+       unsigned int div, clksrc, pllcfg = 0;
+       long besterr = -1;
+       unsigned long fdiv, fmul, bestfreq = s->pdata->frequency;
+
+       /* First, update error without PLL */
+       max310x_update_best_err(s->pdata->frequency, &besterr);
+
+       /* Try all possible PLL dividers */
+       for (div = 1; (div <= 63) && besterr; div++) {
+               fdiv = DIV_ROUND_CLOSEST(s->pdata->frequency, div);
+
+               /* Try multiplier 6 */
+               fmul = fdiv * 6;
+               if ((fdiv >= 500000) && (fdiv <= 800000))
+                       if (!max310x_update_best_err(fmul, &besterr)) {
+                               pllcfg = (0 << 6) | div;
+                               bestfreq = fmul;
+                       }
+               /* Try multiplier 48 */
+               fmul = fdiv * 48;
+               if ((fdiv >= 850000) && (fdiv <= 1200000))
+                       if (!max310x_update_best_err(fmul, &besterr)) {
+                               pllcfg = (1 << 6) | div;
+                               bestfreq = fmul;
+                       }
+               /* Try multiplier 96 */
+               fmul = fdiv * 96;
+               if ((fdiv >= 425000) && (fdiv <= 1000000))
+                       if (!max310x_update_best_err(fmul, &besterr)) {
+                               pllcfg = (2 << 6) | div;
+                               bestfreq = fmul;
+                       }
+               /* Try multiplier 144 */
+               fmul = fdiv * 144;
+               if ((fdiv >= 390000) && (fdiv <= 667000))
+                       if (!max310x_update_best_err(fmul, &besterr)) {
+                               pllcfg = (3 << 6) | div;
+                               bestfreq = fmul;
+                       }
+       }
+
+       /* Configure clock source */
+       if (s->pdata->driver_flags & MAX310X_EXT_CLK)
+               clksrc = MAX310X_CLKSRC_EXTCLK_BIT;
+       else
+               clksrc = MAX310X_CLKSRC_CRYST_BIT;
+
+       /* Configure PLL */
+       if (pllcfg) {
+               clksrc |= MAX310X_CLKSRC_PLL_BIT;
+               regmap_write(s->regmap, MAX310X_PLLCFG_REG, pllcfg);
+       } else
+               clksrc |= MAX310X_CLKSRC_PLLBYP_BIT;
+
+       regmap_write(s->regmap, MAX310X_CLKSRC_REG, clksrc);
+
+       if (pllcfg)
+               max310x_wait_pll(s);
+
+       dev_dbg(s->port.dev, "Reference clock set to %lu Hz\n", bestfreq);
+
+       return (int)bestfreq;
+}
+
+static void max310x_handle_rx(struct max310x_port *s, unsigned int rxlen)
+{
+       unsigned int sts = 0, ch = 0, flag;
+       struct tty_struct *tty = tty_port_tty_get(&s->port.state->port);
+
+       if (!tty)
+               return;
+
+       if (unlikely(rxlen >= MAX310X_FIFO_SIZE)) {
+               dev_warn(s->port.dev, "Possible RX FIFO overrun %d\n", rxlen);
+               /* Ensure sanity of RX level */
+               rxlen = MAX310X_FIFO_SIZE;
+       }
+
+       dev_dbg(s->port.dev, "RX Len = %u\n", rxlen);
+
+       while (rxlen--) {
+               regmap_read(s->regmap, MAX310X_RHR_REG, &ch);
+               regmap_read(s->regmap, MAX310X_LSR_IRQSTS_REG, &sts);
+
+               sts &= MAX310X_LSR_RXPAR_BIT | MAX310X_LSR_FRERR_BIT |
+                      MAX310X_LSR_RXOVR_BIT | MAX310X_LSR_RXBRK_BIT;
+
+               s->port.icount.rx++;
+               flag = TTY_NORMAL;
+
+               if (unlikely(sts)) {
+                       if (sts & MAX310X_LSR_RXBRK_BIT) {
+                               s->port.icount.brk++;
+                               if (uart_handle_break(&s->port))
+                                       continue;
+                       } else if (sts & MAX310X_LSR_RXPAR_BIT)
+                               s->port.icount.parity++;
+                       else if (sts & MAX310X_LSR_FRERR_BIT)
+                               s->port.icount.frame++;
+                       else if (sts & MAX310X_LSR_RXOVR_BIT)
+                               s->port.icount.overrun++;
+
+                       sts &= s->port.read_status_mask;
+                       if (sts & MAX310X_LSR_RXBRK_BIT)
+                               flag = TTY_BREAK;
+                       else if (sts & MAX310X_LSR_RXPAR_BIT)
+                               flag = TTY_PARITY;
+                       else if (sts & MAX310X_LSR_FRERR_BIT)
+                               flag = TTY_FRAME;
+                       else if (sts & MAX310X_LSR_RXOVR_BIT)
+                               flag = TTY_OVERRUN;
+               }
+
+               if (uart_handle_sysrq_char(s->port, ch))
+                       continue;
+
+               if (sts & s->port.ignore_status_mask)
+                       continue;
+
+               uart_insert_char(&s->port, sts, MAX310X_LSR_RXOVR_BIT,
+                                ch, flag);
+       }
+
+       tty_flip_buffer_push(tty);
+
+       tty_kref_put(tty);
+}
+
+static void max310x_handle_tx(struct max310x_port *s)
+{
+       struct circ_buf *xmit = &s->port.state->xmit;
+       unsigned int txlen = 0, to_send;
+
+       if (unlikely(s->port.x_char)) {
+               regmap_write(s->regmap, MAX310X_THR_REG, s->port.x_char);
+               s->port.icount.tx++;
+               s->port.x_char = 0;
+               return;
+       }
+
+       if (uart_circ_empty(xmit) || uart_tx_stopped(&s->port))
+               return;
+
+       /* Get length of data pending in circular buffer */
+       to_send = uart_circ_chars_pending(xmit);
+       if (likely(to_send)) {
+               /* Limit to size of TX FIFO */
+               regmap_read(s->regmap, MAX310X_TXFIFOLVL_REG, &txlen);
+               txlen = MAX310X_FIFO_SIZE - txlen;
+               to_send = (to_send > txlen) ? txlen : to_send;
+
+               dev_dbg(s->port.dev, "TX Len = %u\n", to_send);
+
+               /* Add data to send */
+               s->port.icount.tx += to_send;
+               while (to_send--) {
+                       regmap_write(s->regmap, MAX310X_THR_REG,
+                                    xmit->buf[xmit->tail]);
+                       xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+               };
+       }
+
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+               uart_write_wakeup(&s->port);
+}
+
+static irqreturn_t max310x_ist(int irq, void *dev_id)
+{
+       struct max310x_port *s = (struct max310x_port *)dev_id;
+       unsigned int ists = 0, lsr = 0, rxlen = 0;
+
+       mutex_lock(&s->max310x_mutex);
+
+       for (;;) {
+               /* Read IRQ status & RX FIFO level */
+               regmap_read(s->regmap, MAX310X_IRQSTS_REG, &ists);
+               regmap_read(s->regmap, MAX310X_LSR_IRQSTS_REG, &lsr);
+               regmap_read(s->regmap, MAX310X_RXFIFOLVL_REG, &rxlen);
+               if (!ists && !(lsr & MAX310X_LSR_RXTO_BIT) && !rxlen)
+                       break;
+
+               dev_dbg(s->port.dev, "IRQ status: 0x%02x\n", ists);
+
+               if (rxlen)
+                       max310x_handle_rx(s, rxlen);
+               if (ists & MAX310X_IRQ_TX)
+                       max310x_handle_tx(s);
+               if (ists & MAX310X_IRQ_CTS_BIT)
+                       uart_handle_cts_change(&s->port,
+                                              !!(lsr & MAX310X_LSR_CTS_BIT));
+       }
+
+       mutex_unlock(&s->max310x_mutex);
+
+       return IRQ_HANDLED;
+}
+
+static void max310x_wq_proc(struct work_struct *ws)
+{
+       struct max310x_port *s = container_of(ws, struct max310x_port, tx_work);
+
+       mutex_lock(&s->max310x_mutex);
+       max310x_handle_tx(s);
+       mutex_unlock(&s->max310x_mutex);
+}
+
+static void max310x_start_tx(struct uart_port *port)
+{
+       struct max310x_port *s = container_of(port, struct max310x_port, port);
+
+       queue_work(s->wq, &s->tx_work);
+}
+
+static void max310x_stop_tx(struct uart_port *port)
+{
+       /* Do nothing */
+}
+
+static void max310x_stop_rx(struct uart_port *port)
+{
+       /* Do nothing */
+}
+
+static unsigned int max310x_tx_empty(struct uart_port *port)
+{
+       unsigned int val = 0;
+       struct max310x_port *s = container_of(port, struct max310x_port, port);
+
+       mutex_lock(&s->max310x_mutex);
+       regmap_read(s->regmap, MAX310X_TXFIFOLVL_REG, &val);
+       mutex_unlock(&s->max310x_mutex);
+
+       return val ? 0 : TIOCSER_TEMT;
+}
+
+static void max310x_enable_ms(struct uart_port *port)
+{
+       /* Modem status not supported */
+}
+
+static unsigned int max310x_get_mctrl(struct uart_port *port)
+{
+       /* DCD and DSR are not wired and CTS/RTS is handled automatically
+        * so just indicate DSR and CAR asserted
+        */
+       return TIOCM_DSR | TIOCM_CAR;
+}
+
+static void max310x_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+       /* DCD and DSR are not wired and CTS/RTS is hadnled automatically
+        * so do nothing
+        */
+}
+
+static void max310x_break_ctl(struct uart_port *port, int break_state)
+{
+       struct max310x_port *s = container_of(port, struct max310x_port, port);
+
+       mutex_lock(&s->max310x_mutex);
+       regmap_update_bits(s->regmap, MAX310X_LCR_REG,
+                          MAX310X_LCR_TXBREAK_BIT,
+                          break_state ? MAX310X_LCR_TXBREAK_BIT : 0);
+       mutex_unlock(&s->max310x_mutex);
+}
+
+static void max310x_set_termios(struct uart_port *port,
+                               struct ktermios *termios,
+                               struct ktermios *old)
+{
+       struct max310x_port *s = container_of(port, struct max310x_port, port);
+       unsigned int lcr, flow = 0;
+       int baud;
+
+       mutex_lock(&s->max310x_mutex);
+
+       /* Mask termios capabilities we don't support */
+       termios->c_cflag &= ~CMSPAR;
+       termios->c_iflag &= ~IXANY;
+
+       /* Word size */
+       switch (termios->c_cflag & CSIZE) {
+       case CS5:
+               lcr = MAX310X_LCR_WORD_LEN_5;
+               break;
+       case CS6:
+               lcr = MAX310X_LCR_WORD_LEN_6;
+               break;
+       case CS7:
+               lcr = MAX310X_LCR_WORD_LEN_7;
+               break;
+       case CS8:
+       default:
+               lcr = MAX310X_LCR_WORD_LEN_8;
+               break;
+       }
+
+       /* Parity */
+       if (termios->c_cflag & PARENB) {
+               lcr |= MAX310X_LCR_PARITY_BIT;
+               if (!(termios->c_cflag & PARODD))
+                       lcr |= MAX310X_LCR_EVENPARITY_BIT;
+       }
+
+       /* Stop bits */
+       if (termios->c_cflag & CSTOPB)
+               lcr |= MAX310X_LCR_STOPLEN_BIT; /* 2 stops */
+
+       /* Update LCR register */
+       regmap_write(s->regmap, MAX310X_LCR_REG, lcr);
+
+       /* Set read status mask */
+       port->read_status_mask = MAX310X_LSR_RXOVR_BIT;
+       if (termios->c_iflag & INPCK)
+               port->read_status_mask |= MAX310X_LSR_RXPAR_BIT |
+                                         MAX310X_LSR_FRERR_BIT;
+       if (termios->c_iflag & (BRKINT | PARMRK))
+               port->read_status_mask |= MAX310X_LSR_RXBRK_BIT;
+
+       /* Set status ignore mask */
+       port->ignore_status_mask = 0;
+       if (termios->c_iflag & IGNBRK)
+               port->ignore_status_mask |= MAX310X_LSR_RXBRK_BIT;
+       if (!(termios->c_cflag & CREAD))
+               port->ignore_status_mask |= MAX310X_LSR_RXPAR_BIT |
+                                           MAX310X_LSR_RXOVR_BIT |
+                                           MAX310X_LSR_FRERR_BIT |
+                                           MAX310X_LSR_RXBRK_BIT;
+
+       /* Configure flow control */
+       regmap_write(s->regmap, MAX310X_XON1_REG, termios->c_cc[VSTART]);
+       regmap_write(s->regmap, MAX310X_XOFF1_REG, termios->c_cc[VSTOP]);
+       if (termios->c_cflag & CRTSCTS)
+               flow |= MAX310X_FLOWCTRL_AUTOCTS_BIT |
+                       MAX310X_FLOWCTRL_AUTORTS_BIT;
+       if (termios->c_iflag & IXON)
+               flow |= MAX310X_FLOWCTRL_SWFLOW3_BIT |
+                       MAX310X_FLOWCTRL_SWFLOWEN_BIT;
+       if (termios->c_iflag & IXOFF)
+               flow |= MAX310X_FLOWCTRL_SWFLOW1_BIT |
+                       MAX310X_FLOWCTRL_SWFLOWEN_BIT;
+       regmap_write(s->regmap, MAX310X_FLOWCTRL_REG, flow);
+
+       /* Get baud rate generator configuration */
+       baud = uart_get_baud_rate(port, termios, old,
+                                 port->uartclk / 16 / 0xffff,
+                                 port->uartclk / 4);
+
+       /* Setup baudrate generator */
+       max310x_set_baud(s, baud);
+
+       /* Update timeout according to new baud rate */
+       uart_update_timeout(port, termios->c_cflag, baud);
+
+       mutex_unlock(&s->max310x_mutex);
+}
+
+static int max310x_startup(struct uart_port *port)
+{
+       unsigned int val, line = port->line;
+       struct max310x_port *s = container_of(port, struct max310x_port, port);
+
+       if (s->pdata->suspend)
+               s->pdata->suspend(0);
+
+       mutex_lock(&s->max310x_mutex);
+
+       /* Configure baud rate, 9600 as default */
+       max310x_set_baud(s, 9600);
+
+       /* Configure LCR register, 8N1 mode by default */
+       val = MAX310X_LCR_WORD_LEN_8;
+       regmap_write(s->regmap, MAX310X_LCR_REG, val);
+
+       /* Configure MODE1 register */
+       regmap_update_bits(s->regmap, MAX310X_MODE1_REG,
+                          MAX310X_MODE1_TRNSCVCTRL_BIT,
+                          (s->pdata->uart_flags[line] & MAX310X_AUTO_DIR_CTRL)
+                          ? MAX310X_MODE1_TRNSCVCTRL_BIT : 0);
+
+       /* Configure MODE2 register */
+       val = MAX310X_MODE2_RXEMPTINV_BIT;
+       if (s->pdata->uart_flags[line] & MAX310X_LOOPBACK)
+               val |= MAX310X_MODE2_LOOPBACK_BIT;
+       if (s->pdata->uart_flags[line] & MAX310X_ECHO_SUPRESS)
+               val |= MAX310X_MODE2_ECHOSUPR_BIT;
+
+       /* Reset FIFOs */
+       val |= MAX310X_MODE2_FIFORST_BIT;
+       regmap_write(s->regmap, MAX310X_MODE2_REG, val);
+
+       /* Configure FIFO trigger level register */
+       /* RX FIFO trigger for 16 words, TX FIFO trigger for 64 words */
+       val = MAX310X_FIFOTRIGLVL_RX(16) | MAX310X_FIFOTRIGLVL_TX(64);
+       regmap_write(s->regmap, MAX310X_FIFOTRIGLVL_REG, val);
+
+       /* Configure flow control levels */
+       /* Flow control halt level 96, resume level 48 */
+       val = MAX310X_FLOWLVL_RES(48) | MAX310X_FLOWLVL_HALT(96);
+       regmap_write(s->regmap, MAX310X_FLOWLVL_REG, val);
+
+       /* Clear timeout register */
+       regmap_write(s->regmap, MAX310X_RXTO_REG, 0);
+
+       /* Configure LSR interrupt enable register */
+       /* Enable RX timeout interrupt */
+       val = MAX310X_LSR_RXTO_BIT;
+       regmap_write(s->regmap, MAX310X_LSR_IRQEN_REG, val);
+
+       /* Clear FIFO reset */
+       regmap_update_bits(s->regmap, MAX310X_MODE2_REG,
+                          MAX310X_MODE2_FIFORST_BIT, 0);
+
+       /* Clear IRQ status register by reading it */
+       regmap_read(s->regmap, MAX310X_IRQSTS_REG, &val);
+
+       /* Configure interrupt enable register */
+       /* Enable CTS change interrupt */
+       val = MAX310X_IRQ_CTS_BIT;
+       /* Enable RX, TX interrupts */
+       val |= MAX310X_IRQ_RX | MAX310X_IRQ_TX;
+       regmap_write(s->regmap, MAX310X_IRQEN_REG, val);
+
+       mutex_unlock(&s->max310x_mutex);
+
+       return 0;
+}
+
+static void max310x_shutdown(struct uart_port *port)
+{
+       struct max310x_port *s = container_of(port, struct max310x_port, port);
+
+       /* Disable all interrupts */
+       mutex_lock(&s->max310x_mutex);
+       regmap_write(s->regmap, MAX310X_IRQEN_REG, 0);
+       mutex_unlock(&s->max310x_mutex);
+
+       if (s->pdata->suspend)
+               s->pdata->suspend(1);
+}
+
+static const char *max310x_type(struct uart_port *port)
+{
+       struct max310x_port *s = container_of(port, struct max310x_port, port);
+
+       return (port->type == PORT_MAX310X) ? s->name : NULL;
+}
+
+static int max310x_request_port(struct uart_port *port)
+{
+       /* Do nothing */
+       return 0;
+}
+
+static void max310x_release_port(struct uart_port *port)
+{
+       /* Do nothing */
+}
+
+static void max310x_config_port(struct uart_port *port, int flags)
+{
+       if (flags & UART_CONFIG_TYPE)
+               port->type = PORT_MAX310X;
+}
+
+static int max310x_verify_port(struct uart_port *port, struct serial_struct *ser)
+{
+       if ((ser->type == PORT_UNKNOWN) || (ser->type == PORT_MAX310X))
+               return 0;
+       if (ser->irq == port->irq)
+               return 0;
+
+       return -EINVAL;
+}
+
+static struct uart_ops max310x_ops = {
+       .tx_empty       = max310x_tx_empty,
+       .set_mctrl      = max310x_set_mctrl,
+       .get_mctrl      = max310x_get_mctrl,
+       .stop_tx        = max310x_stop_tx,
+       .start_tx       = max310x_start_tx,
+       .stop_rx        = max310x_stop_rx,
+       .enable_ms      = max310x_enable_ms,
+       .break_ctl      = max310x_break_ctl,
+       .startup        = max310x_startup,
+       .shutdown       = max310x_shutdown,
+       .set_termios    = max310x_set_termios,
+       .type           = max310x_type,
+       .request_port   = max310x_request_port,
+       .release_port   = max310x_release_port,
+       .config_port    = max310x_config_port,
+       .verify_port    = max310x_verify_port,
+};
+
+static int max310x_suspend(struct spi_device *spi, pm_message_t state)
+{
+       int ret;
+       struct max310x_port *s = dev_get_drvdata(&spi->dev);
+
+       dev_dbg(&spi->dev, "Suspend\n");
+
+       ret = uart_suspend_port(&s->uart, &s->port);
+
+       mutex_lock(&s->max310x_mutex);
+
+       /* Enable sleep mode */
+       regmap_update_bits(s->regmap, MAX310X_MODE1_REG,
+                          MAX310X_MODE1_FORCESLEEP_BIT,
+                          MAX310X_MODE1_FORCESLEEP_BIT);
+
+       mutex_unlock(&s->max310x_mutex);
+
+       if (s->pdata->suspend)
+               s->pdata->suspend(1);
+
+       return ret;
+}
+
+static int max310x_resume(struct spi_device *spi)
+{
+       struct max310x_port *s = dev_get_drvdata(&spi->dev);
+
+       dev_dbg(&spi->dev, "Resume\n");
+
+       if (s->pdata->suspend)
+               s->pdata->suspend(0);
+
+       mutex_lock(&s->max310x_mutex);
+
+       /* Disable sleep mode */
+       regmap_update_bits(s->regmap, MAX310X_MODE1_REG,
+                          MAX310X_MODE1_FORCESLEEP_BIT,
+                          0);
+
+       max310x_wait_pll(s);
+
+       mutex_unlock(&s->max310x_mutex);
+
+       return uart_resume_port(&s->uart, &s->port);
+}
+
+#ifdef CONFIG_GPIOLIB
+static int max310x_gpio_get(struct gpio_chip *chip, unsigned offset)
+{
+       unsigned int val = 0;
+       struct max310x_port *s = container_of(chip, struct max310x_port, gpio);
+
+       mutex_lock(&s->max310x_mutex);
+       regmap_read(s->regmap, MAX310X_GPIODATA_REG, &val);
+       mutex_unlock(&s->max310x_mutex);
+
+       return !!((val >> 4) & (1 << offset));
+}
+
+static void max310x_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
+{
+       struct max310x_port *s = container_of(chip, struct max310x_port, gpio);
+
+       mutex_lock(&s->max310x_mutex);
+       regmap_update_bits(s->regmap, MAX310X_GPIODATA_REG, 1 << offset, value ?
+                                                           1 << offset : 0);
+       mutex_unlock(&s->max310x_mutex);
+}
+
+static int max310x_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
+{
+       struct max310x_port *s = container_of(chip, struct max310x_port, gpio);
+
+       mutex_lock(&s->max310x_mutex);
+
+       regmap_update_bits(s->regmap, MAX310X_GPIOCFG_REG, 1 << offset, 0);
+
+       mutex_unlock(&s->max310x_mutex);
+
+       return 0;
+}
+
+static int max310x_gpio_direction_output(struct gpio_chip *chip,
+                                        unsigned offset, int value)
+{
+       struct max310x_port *s = container_of(chip, struct max310x_port, gpio);
+
+       mutex_lock(&s->max310x_mutex);
+
+       regmap_update_bits(s->regmap, MAX310X_GPIOCFG_REG, 1 << offset,
+                                                          1 << offset);
+       regmap_update_bits(s->regmap, MAX310X_GPIODATA_REG, 1 << offset, value ?
+                                                           1 << offset : 0);
+
+       mutex_unlock(&s->max310x_mutex);
+
+       return 0;
+}
+#endif
+
+/* Generic platform data */
+static struct max310x_pdata generic_plat_data = {
+       .driver_flags   = MAX310X_EXT_CLK,
+       .uart_flags[0]  = MAX310X_ECHO_SUPRESS,
+       .frequency      = 26000000,
+};
+
+static int __devinit max310x_probe(struct spi_device *spi)
+{
+       struct max310x_port *s;
+       struct device *dev = &spi->dev;
+       int chiptype = spi_get_device_id(spi)->driver_data;
+       struct max310x_pdata *pdata = dev->platform_data;
+       unsigned int val = 0;
+       int ret;
+
+       /* Check for IRQ */
+       if (spi->irq <= 0) {
+               dev_err(dev, "No IRQ specified\n");
+               return -ENOTSUPP;
+       }
+
+       /* Alloc port structure */
+       s = devm_kzalloc(dev, sizeof(struct max310x_port), GFP_KERNEL);
+       if (!s) {
+               dev_err(dev, "Error allocating port structure\n");
+               return -ENOMEM;
+       }
+       dev_set_drvdata(dev, s);
+
+       if (!pdata) {
+               dev_warn(dev, "No platform data supplied, using defaults\n");
+               pdata = &generic_plat_data;
+       }
+       s->pdata = pdata;
+
+       /* Individual chip settings */
+       switch (chiptype) {
+       case MAX310X_TYPE_MAX3107:
+               s->name = "MAX3107";
+               s->nr_gpio = 4;
+               s->uart.nr = 1;
+               s->regcfg.max_register = 0x1f;
+               break;
+       case MAX310X_TYPE_MAX3108:
+               s->name = "MAX3108";
+               s->nr_gpio = 4;
+               s->uart.nr = 1;
+               s->regcfg.max_register = 0x1e;
+               break;
+       default:
+               dev_err(dev, "Unsupported chip type %i\n", chiptype);
+               return -ENOTSUPP;
+       }
+
+       /* Check input frequency */
+       if ((pdata->driver_flags & MAX310X_EXT_CLK) &&
+          ((pdata->frequency < 500000) || (pdata->frequency > 35000000)))
+               goto err_freq;
+       /* Check frequency for quartz */
+       if (!(pdata->driver_flags & MAX310X_EXT_CLK) &&
+          ((pdata->frequency < 1000000) || (pdata->frequency > 4000000)))
+               goto err_freq;
+
+       mutex_init(&s->max310x_mutex);
+
+       /* Setup SPI bus */
+       spi->mode               = SPI_MODE_0;
+       spi->bits_per_word      = 8;
+       spi->max_speed_hz       = 26000000;
+       spi_setup(spi);
+
+       /* Setup regmap */
+       s->regcfg.reg_bits              = 8;
+       s->regcfg.val_bits              = 8;
+       s->regcfg.read_flag_mask        = 0x00;
+       s->regcfg.write_flag_mask       = 0x80;
+       s->regcfg.cache_type            = REGCACHE_RBTREE;
+       s->regcfg.writeable_reg         = max3107_8_reg_writeable;
+       s->regcfg.volatile_reg          = max310x_reg_volatile;
+       s->regcfg.precious_reg          = max310x_reg_precious;
+       s->regmap = devm_regmap_init_spi(spi, &s->regcfg);
+       if (IS_ERR(s->regmap)) {
+               ret = PTR_ERR(s->regmap);
+               dev_err(dev, "Failed to initialize register map\n");
+               goto err_out;
+       }
+
+       /* Reset chip & check SPI function */
+       ret = regmap_write(s->regmap, MAX310X_MODE2_REG, MAX310X_MODE2_RST_BIT);
+       if (ret) {
+               dev_err(dev, "SPI transfer failed\n");
+               goto err_out;
+       }
+       /* Clear chip reset */
+       regmap_write(s->regmap, MAX310X_MODE2_REG, 0);
+
+       switch (chiptype) {
+       case MAX310X_TYPE_MAX3107:
+               /* Check REV ID to ensure we are talking to what we expect */
+               regmap_read(s->regmap, MAX3107_REVID_REG, &val);
+               if (((val & MAX3107_REV_MASK) != MAX3107_REV_ID)) {
+                       dev_err(dev, "%s ID 0x%02x does not match\n",
+                               s->name, val);
+                       ret = -ENODEV;
+                       goto err_out;
+               }
+               break;
+       case MAX310X_TYPE_MAX3108:
+               /* MAX3108 have not REV ID register, we just check default value
+                * from clocksource register to make sure everything works.
+                */
+               regmap_read(s->regmap, MAX310X_CLKSRC_REG, &val);
+               if (val != (MAX310X_CLKSRC_EXTCLK_BIT |
+                           MAX310X_CLKSRC_PLLBYP_BIT)) {
+                       dev_err(dev, "%s not present\n", s->name);
+                       ret = -ENODEV;
+                       goto err_out;
+               }
+               break;
+       }
+
+       /* Board specific configure */
+       if (pdata->init)
+               pdata->init();
+       if (pdata->suspend)
+               pdata->suspend(0);
+
+       /* Calculate referecne clock */
+       s->uartclk = max310x_set_ref_clk(s);
+
+       /* Disable all interrupts */
+       regmap_write(s->regmap, MAX310X_IRQEN_REG, 0);
+
+       /* Setup MODE1 register */
+       val = MAX310X_MODE1_IRQSEL_BIT; /* Enable IRQ pin */
+       if (pdata->driver_flags & MAX310X_AUTOSLEEP)
+               val = MAX310X_MODE1_AUTOSLEEP_BIT;
+       regmap_write(s->regmap, MAX310X_MODE1_REG, val);
+
+       /* Setup interrupt */
+       ret = devm_request_threaded_irq(dev, spi->irq, NULL, max310x_ist,
+                                       IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+                                       dev_name(dev), s);
+       if (ret) {
+               dev_err(dev, "Unable to reguest IRQ %i\n", spi->irq);
+               goto err_out;
+       }
+
+       /* Register UART driver */
+       s->uart.owner           = THIS_MODULE;
+       s->uart.driver_name     = dev_name(dev);
+       s->uart.dev_name        = "ttyMAX";
+       s->uart.major           = MAX310X_MAJOR;
+       s->uart.minor           = MAX310X_MINOR;
+       ret = uart_register_driver(&s->uart);
+       if (ret) {
+               dev_err(dev, "Registering UART driver failed\n");
+               goto err_out;
+       }
+
+       /* Initialize workqueue for start TX */
+       s->wq = create_freezable_workqueue(dev_name(dev));
+       INIT_WORK(&s->tx_work, max310x_wq_proc);
+
+       /* Initialize UART port data */
+       s->port.line            = 0;
+       s->port.dev             = dev;
+       s->port.irq             = spi->irq;
+       s->port.type            = PORT_MAX310X;
+       s->port.fifosize        = MAX310X_FIFO_SIZE;
+       s->port.flags           = UPF_SKIP_TEST | UPF_FIXED_TYPE;
+       s->port.iotype          = UPIO_PORT;
+       s->port.membase         = (void __iomem *)0xffffffff; /* Bogus value */
+       s->port.uartclk         = s->uartclk;
+       s->port.ops             = &max310x_ops;
+       uart_add_one_port(&s->uart, &s->port);
+
+#ifdef CONFIG_GPIOLIB
+       /* Setup GPIO cotroller */
+       if (pdata->gpio_base) {
+               s->gpio.owner           = THIS_MODULE;
+               s->gpio.dev             = dev;
+               s->gpio.label           = dev_name(dev);
+               s->gpio.direction_input = max310x_gpio_direction_input;
+               s->gpio.get             = max310x_gpio_get;
+               s->gpio.direction_output= max310x_gpio_direction_output;
+               s->gpio.set             = max310x_gpio_set;
+               s->gpio.base            = pdata->gpio_base;
+               s->gpio.ngpio           = s->nr_gpio;
+               if (gpiochip_add(&s->gpio)) {
+                       /* Indicate that we should not call gpiochip_remove */
+                       s->gpio.base = 0;
+               }
+       } else
+               dev_info(dev, "GPIO support not enabled\n");
+#endif
+
+       /* Go to suspend mode */
+       if (pdata->suspend)
+               pdata->suspend(1);
+
+       return 0;
+
+err_freq:
+       dev_err(dev, "Frequency parameter incorrect\n");
+       ret = -EINVAL;
+
+err_out:
+       dev_set_drvdata(dev, NULL);
+
+       return ret;
+}
+
+static int __devexit max310x_remove(struct spi_device *spi)
+{
+       struct device *dev = &spi->dev;
+       struct max310x_port *s = dev_get_drvdata(dev);
+       int ret = 0;
+
+       dev_dbg(dev, "Removing port\n");
+
+       devm_free_irq(dev, s->port.irq, s);
+
+       destroy_workqueue(s->wq);
+
+       uart_remove_one_port(&s->uart, &s->port);
+
+       uart_unregister_driver(&s->uart);
+
+#ifdef CONFIG_GPIOLIB
+       if (s->pdata->gpio_base) {
+               ret = gpiochip_remove(&s->gpio);
+               if (ret)
+                       dev_err(dev, "Failed to remove gpio chip: %d\n", ret);
+       }
+#endif
+
+       dev_set_drvdata(dev, NULL);
+
+       if (s->pdata->suspend)
+               s->pdata->suspend(1);
+       if (s->pdata->exit)
+               s->pdata->exit();
+
+       return ret;
+}
+
+static const struct spi_device_id max310x_id_table[] = {
+       { "max3107",    MAX310X_TYPE_MAX3107 },
+       { "max3108",    MAX310X_TYPE_MAX3108 },
+};
+MODULE_DEVICE_TABLE(spi, max310x_id_table);
+
+static struct spi_driver max310x_driver = {
+       .driver = {
+               .name   = "max310x",
+               .owner  = THIS_MODULE,
+       },
+       .probe          = max310x_probe,
+       .remove         = __devexit_p(max310x_remove),
+       .suspend        = max310x_suspend,
+       .resume         = max310x_resume,
+       .id_table       = max310x_id_table,
+};
+module_spi_driver(max310x_driver);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>");
+MODULE_DESCRIPTION("MAX310X serial driver");
index bedac0d..f19d04e 100644 (file)
@@ -775,11 +775,15 @@ mpc52xx_uart_set_termios(struct uart_port *port, struct ktermios *new,
        }
 
        if (new->c_cflag & PARENB) {
+               if (new->c_cflag & CMSPAR)
+                       mr1 |= MPC52xx_PSC_MODE_PARFORCE;
+
+               /* With CMSPAR, PARODD also means high parity (same as termios) */
                mr1 |= (new->c_cflag & PARODD) ?
                        MPC52xx_PSC_MODE_PARODD : MPC52xx_PSC_MODE_PAREVEN;
-       } else
+       } else {
                mr1 |= MPC52xx_PSC_MODE_PARNONE;
-
+       }
 
        mr2 = 0;
 
index 8131e2c..033e0bc 100644 (file)
@@ -896,7 +896,7 @@ static int __init msm_serial_probe(struct platform_device *pdev)
                        return PTR_ERR(msm_port->clk);
 
        if (msm_port->is_uartdm)
-               clk_set_rate(msm_port->clk, 7372800);
+               clk_set_rate(msm_port->clk, 1843200);
 
        port->uartclk = clk_get_rate(msm_port->clk);
        printk(KERN_INFO "uartclk = %d\n", port->uartclk);
index b25e6ee..925d1fa 100644 (file)
@@ -223,9 +223,11 @@ static int __init smd_tty_init(void)
                return ret;
 
        for (i = 0; i < smd_tty_channels_len; i++) {
-               tty_port_init(&smd_tty[smd_tty_channels[i].id].port);
-               smd_tty[smd_tty_channels[i].id].port.ops = &smd_tty_port_ops;
-               tty_register_device(smd_tty_driver, smd_tty_channels[i].id, 0);
+               struct tty_port *port = &smd_tty[smd_tty_channels[i].id].port;
+               tty_port_init(port);
+               port->ops = &smd_tty_port_ops;
+               tty_port_register_device(port, smd_tty_driver,
+                               smd_tty_channels[i].id, NULL);
        }
 
        return 0;
index 3a667ee..6898413 100644 (file)
@@ -262,7 +262,7 @@ static void mxs_auart_set_mctrl(struct uart_port *u, unsigned mctrl)
 
        ctrl &= ~AUART_CTRL2_RTSEN;
        if (mctrl & TIOCM_RTS) {
-               if (u->state->port.flags & ASYNC_CTS_FLOW)
+               if (tty_port_cts_enabled(&u->state->port))
                        ctrl |= AUART_CTRL2_RTSEN;
        }
 
@@ -457,11 +457,11 @@ static void mxs_auart_shutdown(struct uart_port *u)
 
        writel(AUART_CTRL2_UARTEN, u->membase + AUART_CTRL2_CLR);
 
-       writel(AUART_CTRL0_CLKGATE, u->membase + AUART_CTRL0_SET);
-
        writel(AUART_INTR_RXIEN | AUART_INTR_RTIEN | AUART_INTR_CTSMIEN,
                        u->membase + AUART_INTR_CLR);
 
+       writel(AUART_CTRL0_CLKGATE, u->membase + AUART_CTRL0_SET);
+
        clk_disable_unprepare(s->clk);
 }
 
@@ -796,6 +796,7 @@ static int __devexit mxs_auart_remove(struct platform_device *pdev)
 
        auart_port[pdev->id] = NULL;
 
+       put_device(s->dev);
        clk_put(s->clk);
        free_irq(s->irq, s);
        kfree(s);
index 34e7187..df443b9 100644 (file)
@@ -105,6 +105,10 @@ static int __devinit of_platform_serial_setup(struct platform_device *ofdev,
        port->uartclk = clk;
        port->flags = UPF_SHARE_IRQ | UPF_BOOT_AUTOCONF | UPF_IOREMAP
                | UPF_FIXED_PORT | UPF_FIXED_TYPE;
+
+       if (of_find_property(np, "no-loopback-test", NULL))
+               port->flags |= UPF_SKIP_TEST;
+
        port->dev = &ofdev->dev;
 
        if (type == PORT_TEGRA)
@@ -144,8 +148,15 @@ static int __devinit of_platform_serial_probe(struct platform_device *ofdev)
        switch (port_type) {
 #ifdef CONFIG_SERIAL_8250
        case PORT_8250 ... PORT_MAX_8250:
-               ret = serial8250_register_port(&port);
+       {
+               /* For now the of bindings don't support the extra
+                  8250 specific bits */
+               struct uart_8250_port port8250;
+               memset(&port8250, 0, sizeof(port8250));
+               port8250.port = port;
+               ret = serial8250_register_8250_port(&port8250);
                break;
+       }
 #endif
 #ifdef CONFIG_SERIAL_OF_PLATFORM_NWPSERIAL
        case PORT_NWPSERIAL:
index d3cda0c..f175385 100644 (file)
 #include <linux/slab.h>
 #include <linux/tty.h>
 #include <linux/tty_flip.h>
+#include <linux/platform_device.h>
 #include <linux/io.h>
-#include <linux/dma-mapping.h>
 #include <linux/clk.h>
 #include <linux/serial_core.h>
 #include <linux/irq.h>
 #include <linux/pm_runtime.h>
 #include <linux/of.h>
+#include <linux/gpio.h>
+#include <linux/pinctrl/consumer.h>
 
-#include <plat/dma.h>
-#include <plat/dmtimer.h>
 #include <plat/omap-serial.h>
 
 #define UART_BUILD_REVISION(x, y)      (((x) << 8) | (y))
@@ -57,8 +57,8 @@
 #define OMAP_UART_SCR_RX_TRIG_GRANU1_MASK              (1 << 7)
 
 /* FCR register bitmasks */
-#define OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT               6
 #define OMAP_UART_FCR_RX_FIFO_TRIG_MASK                        (0x3 << 6)
+#define OMAP_UART_FCR_TX_FIFO_TRIG_MASK                        (0x3 << 4)
 
 /* MVR register bitmasks */
 #define OMAP_UART_MVR_SCHEME_SHIFT     30
 #define OMAP_UART_MVR_MAJ_SHIFT                8
 #define OMAP_UART_MVR_MIN_MASK         0x3f
 
+struct uart_omap_port {
+       struct uart_port        port;
+       struct uart_omap_dma    uart_dma;
+       struct device           *dev;
+
+       unsigned char           ier;
+       unsigned char           lcr;
+       unsigned char           mcr;
+       unsigned char           fcr;
+       unsigned char           efr;
+       unsigned char           dll;
+       unsigned char           dlh;
+       unsigned char           mdr1;
+       unsigned char           scr;
+
+       int                     use_dma;
+       /*
+        * Some bits in registers are cleared on a read, so they must
+        * be saved whenever the register is read but the bits will not
+        * be immediately processed.
+        */
+       unsigned int            lsr_break_flag;
+       unsigned char           msr_saved_flags;
+       char                    name[20];
+       unsigned long           port_activity;
+       u32                     context_loss_cnt;
+       u32                     errata;
+       u8                      wakeups_enabled;
+       unsigned int            irq_pending:1;
+
+       int                     DTR_gpio;
+       int                     DTR_inverted;
+       int                     DTR_active;
+
+       struct pm_qos_request   pm_qos_request;
+       u32                     latency;
+       u32                     calc_latency;
+       struct work_struct      qos_work;
+       struct pinctrl          *pins;
+};
+
+#define to_uart_omap_port(p)   ((container_of((p), struct uart_omap_port, port)))
+
 static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];
 
 /* Forward declaration of functions */
-static void uart_tx_dma_callback(int lch, u16 ch_status, void *data);
-static void serial_omap_rxdma_poll(unsigned long uart_no);
-static int serial_omap_start_rxdma(struct uart_omap_port *up);
 static void serial_omap_mdr1_errataset(struct uart_omap_port *up, u8 mdr1);
 
 static struct workqueue_struct *serial_omap_uart_wq;
@@ -101,6 +141,46 @@ static inline void serial_omap_clear_fifos(struct uart_omap_port *up)
        serial_out(up, UART_FCR, 0);
 }
 
+static int serial_omap_get_context_loss_count(struct uart_omap_port *up)
+{
+       struct omap_uart_port_info *pdata = up->dev->platform_data;
+
+       if (!pdata || !pdata->get_context_loss_count)
+               return 0;
+
+       return pdata->get_context_loss_count(up->dev);
+}
+
+static void serial_omap_set_forceidle(struct uart_omap_port *up)
+{
+       struct omap_uart_port_info *pdata = up->dev->platform_data;
+
+       if (!pdata || !pdata->set_forceidle)
+               return;
+
+       pdata->set_forceidle(up->dev);
+}
+
+static void serial_omap_set_noidle(struct uart_omap_port *up)
+{
+       struct omap_uart_port_info *pdata = up->dev->platform_data;
+
+       if (!pdata || !pdata->set_noidle)
+               return;
+
+       pdata->set_noidle(up->dev);
+}
+
+static void serial_omap_enable_wakeup(struct uart_omap_port *up, bool enable)
+{
+       struct omap_uart_port_info *pdata = up->dev->platform_data;
+
+       if (!pdata || !pdata->enable_wakeup)
+               return;
+
+       pdata->enable_wakeup(up->dev, enable);
+}
+
 /*
  * serial_omap_get_divisor - calculate divisor value
  * @port: uart port info
@@ -126,151 +206,55 @@ serial_omap_get_divisor(struct uart_port *port, unsigned int baud)
        return port->uartclk/(baud * divisor);
 }
 
-static void serial_omap_stop_rxdma(struct uart_omap_port *up)
-{
-       if (up->uart_dma.rx_dma_used) {
-               del_timer(&up->uart_dma.rx_timer);
-               omap_stop_dma(up->uart_dma.rx_dma_channel);
-               omap_free_dma(up->uart_dma.rx_dma_channel);
-               up->uart_dma.rx_dma_channel = OMAP_UART_DMA_CH_FREE;
-               up->uart_dma.rx_dma_used = false;
-               pm_runtime_mark_last_busy(&up->pdev->dev);
-               pm_runtime_put_autosuspend(&up->pdev->dev);
-       }
-}
-
 static void serial_omap_enable_ms(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
 
        dev_dbg(up->port.dev, "serial_omap_enable_ms+%d\n", up->port.line);
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        up->ier |= UART_IER_MSI;
        serial_out(up, UART_IER, up->ier);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
 }
 
 static void serial_omap_stop_tx(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
-       struct omap_uart_port_info *pdata = up->pdev->dev.platform_data;
+       struct uart_omap_port *up = to_uart_omap_port(port);
 
-       if (up->use_dma &&
-               up->uart_dma.tx_dma_channel != OMAP_UART_DMA_CH_FREE) {
-               /*
-                * Check if dma is still active. If yes do nothing,
-                * return. Else stop dma
-                */
-               if (omap_get_dma_active_status(up->uart_dma.tx_dma_channel))
-                       return;
-               omap_stop_dma(up->uart_dma.tx_dma_channel);
-               omap_free_dma(up->uart_dma.tx_dma_channel);
-               up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE;
-               pm_runtime_mark_last_busy(&up->pdev->dev);
-               pm_runtime_put_autosuspend(&up->pdev->dev);
-       }
-
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        if (up->ier & UART_IER_THRI) {
                up->ier &= ~UART_IER_THRI;
                serial_out(up, UART_IER, up->ier);
        }
 
-       if (!up->use_dma && pdata && pdata->set_forceidle)
-               pdata->set_forceidle(up->pdev);
+       serial_omap_set_forceidle(up);
 
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
 }
 
 static void serial_omap_stop_rx(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
 
-       pm_runtime_get_sync(&up->pdev->dev);
-       if (up->use_dma)
-               serial_omap_stop_rxdma(up);
+       pm_runtime_get_sync(up->dev);
        up->ier &= ~UART_IER_RLSI;
        up->port.read_status_mask &= ~UART_LSR_DR;
        serial_out(up, UART_IER, up->ier);
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
-}
-
-static inline void receive_chars(struct uart_omap_port *up,
-               unsigned int *status)
-{
-       struct tty_struct *tty = up->port.state->port.tty;
-       unsigned int flag, lsr = *status;
-       unsigned char ch = 0;
-       int max_count = 256;
-
-       do {
-               if (likely(lsr & UART_LSR_DR))
-                       ch = serial_in(up, UART_RX);
-               flag = TTY_NORMAL;
-               up->port.icount.rx++;
-
-               if (unlikely(lsr & UART_LSR_BRK_ERROR_BITS)) {
-                       /*
-                        * For statistics only
-                        */
-                       if (lsr & UART_LSR_BI) {
-                               lsr &= ~(UART_LSR_FE | UART_LSR_PE);
-                               up->port.icount.brk++;
-                               /*
-                                * We do the SysRQ and SAK checking
-                                * here because otherwise the break
-                                * may get masked by ignore_status_mask
-                                * or read_status_mask.
-                                */
-                               if (uart_handle_break(&up->port))
-                                       goto ignore_char;
-                       } else if (lsr & UART_LSR_PE) {
-                               up->port.icount.parity++;
-                       } else if (lsr & UART_LSR_FE) {
-                               up->port.icount.frame++;
-                       }
-
-                       if (lsr & UART_LSR_OE)
-                               up->port.icount.overrun++;
-
-                       /*
-                        * Mask off conditions which should be ignored.
-                        */
-                       lsr &= up->port.read_status_mask;
-
-#ifdef CONFIG_SERIAL_OMAP_CONSOLE
-                       if (up->port.line == up->port.cons->index) {
-                               /* Recover the break flag from console xmit */
-                               lsr |= up->lsr_break_flag;
-                       }
-#endif
-                       if (lsr & UART_LSR_BI)
-                               flag = TTY_BREAK;
-                       else if (lsr & UART_LSR_PE)
-                               flag = TTY_PARITY;
-                       else if (lsr & UART_LSR_FE)
-                               flag = TTY_FRAME;
-               }
-
-               if (uart_handle_sysrq_char(&up->port, ch))
-                       goto ignore_char;
-               uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
-ignore_char:
-               lsr = serial_in(up, UART_LSR);
-       } while ((lsr & (UART_LSR_DR | UART_LSR_BI)) && (max_count-- > 0));
-       spin_unlock(&up->port.lock);
-       tty_flip_buffer_push(tty);
-       spin_lock(&up->port.lock);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
 }
 
-static void transmit_chars(struct uart_omap_port *up)
+static void transmit_chars(struct uart_omap_port *up, unsigned int lsr)
 {
        struct circ_buf *xmit = &up->port.state->xmit;
        int count;
 
+       if (!(lsr & UART_LSR_THRE))
+               return;
+
        if (up->port.x_char) {
                serial_out(up, UART_TX, up->port.x_char);
                up->port.icount.tx++;
@@ -290,8 +274,11 @@ static void transmit_chars(struct uart_omap_port *up)
                        break;
        } while (--count > 0);
 
-       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS) {
+               spin_unlock(&up->port.lock);
                uart_write_wakeup(&up->port);
+               spin_lock(&up->port.lock);
+       }
 
        if (uart_circ_empty(xmit))
                serial_omap_stop_tx(&up->port);
@@ -307,70 +294,13 @@ static inline void serial_omap_enable_ier_thri(struct uart_omap_port *up)
 
 static void serial_omap_start_tx(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
-       struct omap_uart_port_info *pdata = up->pdev->dev.platform_data;
-       struct circ_buf *xmit;
-       unsigned int start;
-       int ret = 0;
-
-       if (!up->use_dma) {
-               pm_runtime_get_sync(&up->pdev->dev);
-               serial_omap_enable_ier_thri(up);
-               if (pdata && pdata->set_noidle)
-                       pdata->set_noidle(up->pdev);
-               pm_runtime_mark_last_busy(&up->pdev->dev);
-               pm_runtime_put_autosuspend(&up->pdev->dev);
-               return;
-       }
-
-       if (up->uart_dma.tx_dma_used)
-               return;
-
-       xmit = &up->port.state->xmit;
-
-       if (up->uart_dma.tx_dma_channel == OMAP_UART_DMA_CH_FREE) {
-               pm_runtime_get_sync(&up->pdev->dev);
-               ret = omap_request_dma(up->uart_dma.uart_dma_tx,
-                               "UART Tx DMA",
-                               (void *)uart_tx_dma_callback, up,
-                               &(up->uart_dma.tx_dma_channel));
+       struct uart_omap_port *up = to_uart_omap_port(port);
 
-               if (ret < 0) {
-                       serial_omap_enable_ier_thri(up);
-                       return;
-               }
-       }
-       spin_lock(&(up->uart_dma.tx_lock));
-       up->uart_dma.tx_dma_used = true;
-       spin_unlock(&(up->uart_dma.tx_lock));
-
-       start = up->uart_dma.tx_buf_dma_phys +
-                               (xmit->tail & (UART_XMIT_SIZE - 1));
-
-       up->uart_dma.tx_buf_size = uart_circ_chars_pending(xmit);
-       /*
-        * It is a circular buffer. See if the buffer has wounded back.
-        * If yes it will have to be transferred in two separate dma
-        * transfers
-        */
-       if (start + up->uart_dma.tx_buf_size >=
-                       up->uart_dma.tx_buf_dma_phys + UART_XMIT_SIZE)
-               up->uart_dma.tx_buf_size =
-                       (up->uart_dma.tx_buf_dma_phys +
-                       UART_XMIT_SIZE) - start;
-
-       omap_set_dma_dest_params(up->uart_dma.tx_dma_channel, 0,
-                               OMAP_DMA_AMODE_CONSTANT,
-                               up->uart_dma.uart_base, 0, 0);
-       omap_set_dma_src_params(up->uart_dma.tx_dma_channel, 0,
-                               OMAP_DMA_AMODE_POST_INC, start, 0, 0);
-       omap_set_dma_transfer_params(up->uart_dma.tx_dma_channel,
-                               OMAP_DMA_DATA_TYPE_S8,
-                               up->uart_dma.tx_buf_size, 1,
-                               OMAP_DMA_SYNC_ELEMENT,
-                               up->uart_dma.uart_dma_tx, 0);
-       /* FIXME: Cache maintenance needed here? */
-       omap_start_dma(up->uart_dma.tx_dma_channel);
+       pm_runtime_get_sync(up->dev);
+       serial_omap_enable_ier_thri(up);
+       serial_omap_set_noidle(up);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
 }
 
 static unsigned int check_modem_status(struct uart_omap_port *up)
@@ -401,76 +331,158 @@ static unsigned int check_modem_status(struct uart_omap_port *up)
        return status;
 }
 
+static void serial_omap_rlsi(struct uart_omap_port *up, unsigned int lsr)
+{
+       unsigned int flag;
+
+       up->port.icount.rx++;
+       flag = TTY_NORMAL;
+
+       if (lsr & UART_LSR_BI) {
+               flag = TTY_BREAK;
+               lsr &= ~(UART_LSR_FE | UART_LSR_PE);
+               up->port.icount.brk++;
+               /*
+                * We do the SysRQ and SAK checking
+                * here because otherwise the break
+                * may get masked by ignore_status_mask
+                * or read_status_mask.
+                */
+               if (uart_handle_break(&up->port))
+                       return;
+
+       }
+
+       if (lsr & UART_LSR_PE) {
+               flag = TTY_PARITY;
+               up->port.icount.parity++;
+       }
+
+       if (lsr & UART_LSR_FE) {
+               flag = TTY_FRAME;
+               up->port.icount.frame++;
+       }
+
+       if (lsr & UART_LSR_OE)
+               up->port.icount.overrun++;
+
+#ifdef CONFIG_SERIAL_OMAP_CONSOLE
+       if (up->port.line == up->port.cons->index) {
+               /* Recover the break flag from console xmit */
+               lsr |= up->lsr_break_flag;
+       }
+#endif
+       uart_insert_char(&up->port, lsr, UART_LSR_OE, 0, flag);
+}
+
+static void serial_omap_rdi(struct uart_omap_port *up, unsigned int lsr)
+{
+       unsigned char ch = 0;
+       unsigned int flag;
+
+       if (!(lsr & UART_LSR_DR))
+               return;
+
+       ch = serial_in(up, UART_RX);
+       flag = TTY_NORMAL;
+       up->port.icount.rx++;
+
+       if (uart_handle_sysrq_char(&up->port, ch))
+               return;
+
+       uart_insert_char(&up->port, lsr, UART_LSR_OE, ch, flag);
+}
+
 /**
  * serial_omap_irq() - This handles the interrupt from one port
  * @irq: uart port irq number
  * @dev_id: uart port info
  */
-static inline irqreturn_t serial_omap_irq(int irq, void *dev_id)
+static irqreturn_t serial_omap_irq(int irq, void *dev_id)
 {
        struct uart_omap_port *up = dev_id;
+       struct tty_struct *tty = up->port.state->port.tty;
        unsigned int iir, lsr;
-       unsigned long flags;
+       unsigned int type;
+       irqreturn_t ret = IRQ_NONE;
+       int max_count = 256;
 
-       pm_runtime_get_sync(&up->pdev->dev);
-       iir = serial_in(up, UART_IIR);
-       if (iir & UART_IIR_NO_INT) {
-               pm_runtime_mark_last_busy(&up->pdev->dev);
-               pm_runtime_put_autosuspend(&up->pdev->dev);
-               return IRQ_NONE;
-       }
+       spin_lock(&up->port.lock);
+       pm_runtime_get_sync(up->dev);
 
-       spin_lock_irqsave(&up->port.lock, flags);
-       lsr = serial_in(up, UART_LSR);
-       if (iir & UART_IIR_RLSI) {
-               if (!up->use_dma) {
-                       if (lsr & UART_LSR_DR)
-                               receive_chars(up, &lsr);
-               } else {
-                       up->ier &= ~(UART_IER_RDI | UART_IER_RLSI);
-                       serial_out(up, UART_IER, up->ier);
-                       if ((serial_omap_start_rxdma(up) != 0) &&
-                                       (lsr & UART_LSR_DR))
-                               receive_chars(up, &lsr);
+       do {
+               iir = serial_in(up, UART_IIR);
+               if (iir & UART_IIR_NO_INT)
+                       break;
+
+               ret = IRQ_HANDLED;
+               lsr = serial_in(up, UART_LSR);
+
+               /* extract IRQ type from IIR register */
+               type = iir & 0x3e;
+
+               switch (type) {
+               case UART_IIR_MSI:
+                       check_modem_status(up);
+                       break;
+               case UART_IIR_THRI:
+                       transmit_chars(up, lsr);
+                       break;
+               case UART_IIR_RX_TIMEOUT:
+                       /* FALLTHROUGH */
+               case UART_IIR_RDI:
+                       serial_omap_rdi(up, lsr);
+                       break;
+               case UART_IIR_RLSI:
+                       serial_omap_rlsi(up, lsr);
+                       break;
+               case UART_IIR_CTS_RTS_DSR:
+                       /* simply try again */
+                       break;
+               case UART_IIR_XOFF:
+                       /* FALLTHROUGH */
+               default:
+                       break;
                }
-       }
+       } while (!(iir & UART_IIR_NO_INT) && max_count--);
 
-       check_modem_status(up);
-       if ((lsr & UART_LSR_THRE) && (iir & UART_IIR_THRI))
-               transmit_chars(up);
+       spin_unlock(&up->port.lock);
 
-       spin_unlock_irqrestore(&up->port.lock, flags);
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
+       tty_flip_buffer_push(tty);
 
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        up->port_activity = jiffies;
-       return IRQ_HANDLED;
+
+       return ret;
 }
 
 static unsigned int serial_omap_tx_empty(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned long flags = 0;
        unsigned int ret = 0;
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        dev_dbg(up->port.dev, "serial_omap_tx_empty+%d\n", up->port.line);
        spin_lock_irqsave(&up->port.lock, flags);
        ret = serial_in(up, UART_LSR) & UART_LSR_TEMT ? TIOCSER_TEMT : 0;
        spin_unlock_irqrestore(&up->port.lock, flags);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        return ret;
 }
 
 static unsigned int serial_omap_get_mctrl(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned int status;
        unsigned int ret = 0;
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        status = check_modem_status(up);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
 
        dev_dbg(up->port.dev, "serial_omap_get_mctrl+%d\n", up->port.line);
 
@@ -487,7 +499,7 @@ static unsigned int serial_omap_get_mctrl(struct uart_port *port)
 
 static void serial_omap_set_mctrl(struct uart_port *port, unsigned int mctrl)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned char mcr = 0;
 
        dev_dbg(up->port.dev, "serial_omap_set_mctrl+%d\n", up->port.line);
@@ -502,20 +514,31 @@ static void serial_omap_set_mctrl(struct uart_port *port, unsigned int mctrl)
        if (mctrl & TIOCM_LOOP)
                mcr |= UART_MCR_LOOP;
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        up->mcr = serial_in(up, UART_MCR);
        up->mcr |= mcr;
        serial_out(up, UART_MCR, up->mcr);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
+
+       if (gpio_is_valid(up->DTR_gpio) &&
+           !!(mctrl & TIOCM_DTR) != up->DTR_active) {
+               up->DTR_active = !up->DTR_active;
+               if (gpio_cansleep(up->DTR_gpio))
+                       schedule_work(&up->qos_work);
+               else
+                       gpio_set_value(up->DTR_gpio,
+                                      up->DTR_active != up->DTR_inverted);
+       }
 }
 
 static void serial_omap_break_ctl(struct uart_port *port, int break_state)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned long flags = 0;
 
        dev_dbg(up->port.dev, "serial_omap_break_ctl+%d\n", up->port.line);
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        spin_lock_irqsave(&up->port.lock, flags);
        if (break_state == -1)
                up->lcr |= UART_LCR_SBC;
@@ -523,12 +546,13 @@ static void serial_omap_break_ctl(struct uart_port *port, int break_state)
                up->lcr &= ~UART_LCR_SBC;
        serial_out(up, UART_LCR, up->lcr);
        spin_unlock_irqrestore(&up->port.lock, flags);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
 }
 
 static int serial_omap_startup(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned long flags = 0;
        int retval;
 
@@ -542,7 +566,7 @@ static int serial_omap_startup(struct uart_port *port)
 
        dev_dbg(up->port.dev, "serial_omap_startup+%d\n", up->port.line);
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        /*
         * Clear the FIFO buffers and disable them.
         * (they will be reenabled in set_termios())
@@ -573,20 +597,6 @@ static int serial_omap_startup(struct uart_port *port)
        spin_unlock_irqrestore(&up->port.lock, flags);
 
        up->msr_saved_flags = 0;
-       if (up->use_dma) {
-               free_page((unsigned long)up->port.state->xmit.buf);
-               up->port.state->xmit.buf = dma_alloc_coherent(NULL,
-                       UART_XMIT_SIZE,
-                       (dma_addr_t *)&(up->uart_dma.tx_buf_dma_phys),
-                       0);
-               init_timer(&(up->uart_dma.rx_timer));
-               up->uart_dma.rx_timer.function = serial_omap_rxdma_poll;
-               up->uart_dma.rx_timer.data = up->port.line;
-               /* Currently the buffer size is 4KB. Can increase it */
-               up->uart_dma.rx_buf = dma_alloc_coherent(NULL,
-                       up->uart_dma.rx_buf_size,
-                       (dma_addr_t *)&(up->uart_dma.rx_buf_dma_phys), 0);
-       }
        /*
         * Finally, enable interrupts. Note: Modem status interrupts
         * are set via set_termios(), which will be occurring imminently
@@ -598,20 +608,20 @@ static int serial_omap_startup(struct uart_port *port)
        /* Enable module level wake up */
        serial_out(up, UART_OMAP_WER, OMAP_UART_WER_MOD_WKUP);
 
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        up->port_activity = jiffies;
        return 0;
 }
 
 static void serial_omap_shutdown(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned long flags = 0;
 
        dev_dbg(up->port.dev, "serial_omap_shutdown+%d\n", up->port.line);
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        /*
         * Disable interrupts from this port
         */
@@ -634,19 +644,9 @@ static void serial_omap_shutdown(struct uart_port *port)
         */
        if (serial_in(up, UART_LSR) & UART_LSR_DR)
                (void) serial_in(up, UART_RX);
-       if (up->use_dma) {
-               dma_free_coherent(up->port.dev,
-                       UART_XMIT_SIZE, up->port.state->xmit.buf,
-                       up->uart_dma.tx_buf_dma_phys);
-               up->port.state->xmit.buf = NULL;
-               serial_omap_stop_rx(port);
-               dma_free_coherent(up->port.dev,
-                       up->uart_dma.rx_buf_size, up->uart_dma.rx_buf,
-                       up->uart_dma.rx_buf_dma_phys);
-               up->uart_dma.rx_buf = NULL;
-       }
 
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        free_irq(up->port.irq, up);
 }
 
@@ -667,19 +667,19 @@ serial_omap_configure_xonxoff
 
        /*
         * IXON Flag:
-        * Enable XON/XOFF flow control on output.
-        * Transmit XON1, XOFF1
+        * Flow control for OMAP.TX
+        * OMAP.RX should listen for XON/XOFF
         */
        if (termios->c_iflag & IXON)
-               up->efr |= OMAP_UART_SW_TX;
+               up->efr |= OMAP_UART_SW_RX;
 
        /*
         * IXOFF Flag:
-        * Enable XON/XOFF flow control on input.
-        * Receiver compares XON1, XOFF1.
+        * Flow control for OMAP.RX
+        * OMAP.TX should send XON/XOFF
         */
        if (termios->c_iflag & IXOFF)
-               up->efr |= OMAP_UART_SW_RX;
+               up->efr |= OMAP_UART_SW_TX;
 
        serial_out(up, UART_EFR, up->efr | UART_EFR_ECB);
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
@@ -715,13 +715,16 @@ static void serial_omap_uart_qos_work(struct work_struct *work)
                                                qos_work);
 
        pm_qos_update_request(&up->pm_qos_request, up->latency);
+       if (gpio_is_valid(up->DTR_gpio))
+               gpio_set_value_cansleep(up->DTR_gpio,
+                                       up->DTR_active != up->DTR_inverted);
 }
 
 static void
 serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
                        struct ktermios *old)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned char cval = 0;
        unsigned char efr = 0;
        unsigned long flags = 0;
@@ -768,14 +771,12 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
 
        up->fcr = UART_FCR_R_TRIG_01 | UART_FCR_T_TRIG_01 |
                        UART_FCR_ENABLE_FIFO;
-       if (up->use_dma)
-               up->fcr |= UART_FCR_DMA_SELECT;
 
        /*
         * Ok, we're now changing the port state. Do it with
         * interrupts disabled.
         */
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        spin_lock_irqsave(&up->port.lock, flags);
 
        /*
@@ -845,14 +846,13 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
 
        up->scr |= OMAP_UART_SCR_RX_TRIG_GRANU1_MASK;
 
-       if (up->use_dma) {
-               serial_out(up, UART_TI752_TLR, 0);
-               up->scr |= UART_FCR_TRIGGER_4;
-       } else {
-               /* Set receive FIFO threshold to 1 byte */
-               up->fcr &= ~OMAP_UART_FCR_RX_FIFO_TRIG_MASK;
-               up->fcr |= (0x1 << OMAP_UART_FCR_RX_FIFO_TRIG_SHIFT);
-       }
+       /* Set receive FIFO threshold to 16 characters and
+        * transmit FIFO threshold to 16 spaces
+        */
+       up->fcr &= ~OMAP_UART_FCR_RX_FIFO_TRIG_MASK;
+       up->fcr &= ~OMAP_UART_FCR_TX_FIFO_TRIG_MASK;
+       up->fcr |= UART_FCR6_R_TRIGGER_16 | UART_FCR6_T_TRIGGER_24 |
+               UART_FCR_ENABLE_FIFO;
 
        serial_out(up, UART_FCR, up->fcr);
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
@@ -924,20 +924,30 @@ serial_omap_set_termios(struct uart_port *port, struct ktermios *termios,
        serial_omap_configure_xonxoff(up, termios);
 
        spin_unlock_irqrestore(&up->port.lock, flags);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        dev_dbg(up->port.dev, "serial_omap_set_termios+%d\n", up->port.line);
 }
 
+static int serial_omap_set_wake(struct uart_port *port, unsigned int state)
+{
+       struct uart_omap_port *up = to_uart_omap_port(port);
+
+       serial_omap_enable_wakeup(up, state);
+
+       return 0;
+}
+
 static void
 serial_omap_pm(struct uart_port *port, unsigned int state,
               unsigned int oldstate)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned char efr;
 
        dev_dbg(up->port.dev, "serial_omap_pm+%d\n", up->port.line);
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
        efr = serial_in(up, UART_EFR);
        serial_out(up, UART_EFR, efr | UART_EFR_ECB);
@@ -948,14 +958,15 @@ serial_omap_pm(struct uart_port *port, unsigned int state,
        serial_out(up, UART_EFR, efr);
        serial_out(up, UART_LCR, 0);
 
-       if (!device_may_wakeup(&up->pdev->dev)) {
+       if (!device_may_wakeup(up->dev)) {
                if (!state)
-                       pm_runtime_forbid(&up->pdev->dev);
+                       pm_runtime_forbid(up->dev);
                else
-                       pm_runtime_allow(&up->pdev->dev);
+                       pm_runtime_allow(up->dev);
        }
 
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
 }
 
 static void serial_omap_release_port(struct uart_port *port)
@@ -971,7 +982,7 @@ static int serial_omap_request_port(struct uart_port *port)
 
 static void serial_omap_config_port(struct uart_port *port, int flags)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
 
        dev_dbg(up->port.dev, "serial_omap_config_port+%d\n",
                                                        up->port.line);
@@ -989,7 +1000,7 @@ serial_omap_verify_port(struct uart_port *port, struct serial_struct *ser)
 static const char *
 serial_omap_type(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
 
        dev_dbg(up->port.dev, "serial_omap_type+%d\n", up->port.line);
        return up->name;
@@ -1032,26 +1043,33 @@ static inline void wait_for_xmitr(struct uart_omap_port *up)
 
 static void serial_omap_poll_put_char(struct uart_port *port, unsigned char ch)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        wait_for_xmitr(up);
        serial_out(up, UART_TX, ch);
-       pm_runtime_put(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
 }
 
 static int serial_omap_poll_get_char(struct uart_port *port)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
        unsigned int status;
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
        status = serial_in(up, UART_LSR);
-       if (!(status & UART_LSR_DR))
-               return NO_POLL_CHAR;
+       if (!(status & UART_LSR_DR)) {
+               status = NO_POLL_CHAR;
+               goto out;
+       }
 
        status = serial_in(up, UART_RX);
-       pm_runtime_put(&up->pdev->dev);
+
+out:
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
+
        return status;
 }
 
@@ -1065,7 +1083,7 @@ static struct uart_driver serial_omap_reg;
 
 static void serial_omap_console_putchar(struct uart_port *port, int ch)
 {
-       struct uart_omap_port *up = (struct uart_omap_port *)port;
+       struct uart_omap_port *up = to_uart_omap_port(port);
 
        wait_for_xmitr(up);
        serial_out(up, UART_TX, ch);
@@ -1080,7 +1098,7 @@ serial_omap_console_write(struct console *co, const char *s,
        unsigned int ier;
        int locked = 1;
 
-       pm_runtime_get_sync(&up->pdev->dev);
+       pm_runtime_get_sync(up->dev);
 
        local_irq_save(flags);
        if (up->port.sysrq)
@@ -1114,8 +1132,8 @@ serial_omap_console_write(struct console *co, const char *s,
        if (up->msr_saved_flags)
                check_modem_status(up);
 
-       pm_runtime_mark_last_busy(&up->pdev->dev);
-       pm_runtime_put_autosuspend(&up->pdev->dev);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        if (locked)
                spin_unlock(&up->port.lock);
        local_irq_restore(flags);
@@ -1179,6 +1197,7 @@ static struct uart_ops serial_omap_pops = {
        .shutdown       = serial_omap_shutdown,
        .set_termios    = serial_omap_set_termios,
        .pm             = serial_omap_pm,
+       .set_wake       = serial_omap_set_wake,
        .type           = serial_omap_type,
        .release_port   = serial_omap_release_port,
        .request_port   = serial_omap_request_port,
@@ -1221,150 +1240,7 @@ static int serial_omap_resume(struct device *dev)
 }
 #endif
 
-static void serial_omap_rxdma_poll(unsigned long uart_no)
-{
-       struct uart_omap_port *up = ui[uart_no];
-       unsigned int curr_dma_pos, curr_transmitted_size;
-       int ret = 0;
-
-       curr_dma_pos = omap_get_dma_dst_pos(up->uart_dma.rx_dma_channel);
-       if ((curr_dma_pos == up->uart_dma.prev_rx_dma_pos) ||
-                            (curr_dma_pos == 0)) {
-               if (jiffies_to_msecs(jiffies - up->port_activity) <
-                                               up->uart_dma.rx_timeout) {
-                       mod_timer(&up->uart_dma.rx_timer, jiffies +
-                               usecs_to_jiffies(up->uart_dma.rx_poll_rate));
-               } else {
-                       serial_omap_stop_rxdma(up);
-                       up->ier |= (UART_IER_RDI | UART_IER_RLSI);
-                       serial_out(up, UART_IER, up->ier);
-               }
-               return;
-       }
-
-       curr_transmitted_size = curr_dma_pos -
-                                       up->uart_dma.prev_rx_dma_pos;
-       up->port.icount.rx += curr_transmitted_size;
-       tty_insert_flip_string(up->port.state->port.tty,
-                       up->uart_dma.rx_buf +
-                       (up->uart_dma.prev_rx_dma_pos -
-                       up->uart_dma.rx_buf_dma_phys),
-                       curr_transmitted_size);
-       tty_flip_buffer_push(up->port.state->port.tty);
-       up->uart_dma.prev_rx_dma_pos = curr_dma_pos;
-       if (up->uart_dma.rx_buf_size +
-                       up->uart_dma.rx_buf_dma_phys == curr_dma_pos) {
-               ret = serial_omap_start_rxdma(up);
-               if (ret < 0) {
-                       serial_omap_stop_rxdma(up);
-                       up->ier |= (UART_IER_RDI | UART_IER_RLSI);
-                       serial_out(up, UART_IER, up->ier);
-               }
-       } else  {
-               mod_timer(&up->uart_dma.rx_timer, jiffies +
-                       usecs_to_jiffies(up->uart_dma.rx_poll_rate));
-       }
-       up->port_activity = jiffies;
-}
-
-static void uart_rx_dma_callback(int lch, u16 ch_status, void *data)
-{
-       return;
-}
-
-static int serial_omap_start_rxdma(struct uart_omap_port *up)
-{
-       int ret = 0;
-
-       if (up->uart_dma.rx_dma_channel == -1) {
-               pm_runtime_get_sync(&up->pdev->dev);
-               ret = omap_request_dma(up->uart_dma.uart_dma_rx,
-                               "UART Rx DMA",
-                               (void *)uart_rx_dma_callback, up,
-                               &(up->uart_dma.rx_dma_channel));
-               if (ret < 0)
-                       return ret;
-
-               omap_set_dma_src_params(up->uart_dma.rx_dma_channel, 0,
-                               OMAP_DMA_AMODE_CONSTANT,
-                               up->uart_dma.uart_base, 0, 0);
-               omap_set_dma_dest_params(up->uart_dma.rx_dma_channel, 0,
-                               OMAP_DMA_AMODE_POST_INC,
-                               up->uart_dma.rx_buf_dma_phys, 0, 0);
-               omap_set_dma_transfer_params(up->uart_dma.rx_dma_channel,
-                               OMAP_DMA_DATA_TYPE_S8,
-                               up->uart_dma.rx_buf_size, 1,
-                               OMAP_DMA_SYNC_ELEMENT,
-                               up->uart_dma.uart_dma_rx, 0);
-       }
-       up->uart_dma.prev_rx_dma_pos = up->uart_dma.rx_buf_dma_phys;
-       /* FIXME: Cache maintenance needed here? */
-       omap_start_dma(up->uart_dma.rx_dma_channel);
-       mod_timer(&up->uart_dma.rx_timer, jiffies +
-                               usecs_to_jiffies(up->uart_dma.rx_poll_rate));
-       up->uart_dma.rx_dma_used = true;
-       return ret;
-}
-
-static void serial_omap_continue_tx(struct uart_omap_port *up)
-{
-       struct circ_buf *xmit = &up->port.state->xmit;
-       unsigned int start = up->uart_dma.tx_buf_dma_phys
-                       + (xmit->tail & (UART_XMIT_SIZE - 1));
-
-       if (uart_circ_empty(xmit))
-               return;
-
-       up->uart_dma.tx_buf_size = uart_circ_chars_pending(xmit);
-       /*
-        * It is a circular buffer. See if the buffer has wounded back.
-        * If yes it will have to be transferred in two separate dma
-        * transfers
-        */
-       if (start + up->uart_dma.tx_buf_size >=
-                       up->uart_dma.tx_buf_dma_phys + UART_XMIT_SIZE)
-               up->uart_dma.tx_buf_size =
-                       (up->uart_dma.tx_buf_dma_phys + UART_XMIT_SIZE) - start;
-       omap_set_dma_dest_params(up->uart_dma.tx_dma_channel, 0,
-                               OMAP_DMA_AMODE_CONSTANT,
-                               up->uart_dma.uart_base, 0, 0);
-       omap_set_dma_src_params(up->uart_dma.tx_dma_channel, 0,
-                               OMAP_DMA_AMODE_POST_INC, start, 0, 0);
-       omap_set_dma_transfer_params(up->uart_dma.tx_dma_channel,
-                               OMAP_DMA_DATA_TYPE_S8,
-                               up->uart_dma.tx_buf_size, 1,
-                               OMAP_DMA_SYNC_ELEMENT,
-                               up->uart_dma.uart_dma_tx, 0);
-       /* FIXME: Cache maintenance needed here? */
-       omap_start_dma(up->uart_dma.tx_dma_channel);
-}
-
-static void uart_tx_dma_callback(int lch, u16 ch_status, void *data)
-{
-       struct uart_omap_port *up = (struct uart_omap_port *)data;
-       struct circ_buf *xmit = &up->port.state->xmit;
-
-       xmit->tail = (xmit->tail + up->uart_dma.tx_buf_size) & \
-                       (UART_XMIT_SIZE - 1);
-       up->port.icount.tx += up->uart_dma.tx_buf_size;
-
-       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
-               uart_write_wakeup(&up->port);
-
-       if (uart_circ_empty(xmit)) {
-               spin_lock(&(up->uart_dma.tx_lock));
-               serial_omap_stop_tx(&up->port);
-               up->uart_dma.tx_dma_used = false;
-               spin_unlock(&(up->uart_dma.tx_lock));
-       } else {
-               omap_stop_dma(up->uart_dma.tx_dma_channel);
-               serial_omap_continue_tx(up);
-       }
-       up->port_activity = jiffies;
-       return;
-}
-
-static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
+static void __devinit omap_serial_fill_features_erratas(struct uart_omap_port *up)
 {
        u32 mvr, scheme;
        u16 revision, major, minor;
@@ -1389,7 +1265,7 @@ static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
                minor = (mvr & OMAP_UART_MVR_MIN_MASK);
                break;
        default:
-               dev_warn(&up->pdev->dev,
+               dev_warn(up->dev,
                        "Unknown %s revision, defaulting to highest\n",
                        up->name);
                /* highest possible revision */
@@ -1417,7 +1293,7 @@ static void omap_serial_fill_features_erratas(struct uart_omap_port *up)
        }
 }
 
-static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
+static __devinit struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
 {
        struct omap_uart_port_info *omap_up_info;
 
@@ -1430,12 +1306,12 @@ static struct omap_uart_port_info *of_get_uart_port_info(struct device *dev)
        return omap_up_info;
 }
 
-static int serial_omap_probe(struct platform_device *pdev)
+static int __devinit serial_omap_probe(struct platform_device *pdev)
 {
        struct uart_omap_port   *up;
-       struct resource         *mem, *irq, *dma_tx, *dma_rx;
+       struct resource         *mem, *irq;
        struct omap_uart_port_info *omap_up_info = pdev->dev.platform_data;
-       int ret = -ENOSPC;
+       int ret;
 
        if (pdev->dev.of_node)
                omap_up_info = of_get_uart_port_info(&pdev->dev);
@@ -1458,19 +1334,30 @@ static int serial_omap_probe(struct platform_device *pdev)
                return -EBUSY;
        }
 
-       dma_rx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx");
-       if (!dma_rx)
-               return -ENXIO;
-
-       dma_tx = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx");
-       if (!dma_tx)
-               return -ENXIO;
+       if (gpio_is_valid(omap_up_info->DTR_gpio) &&
+           omap_up_info->DTR_present) {
+               ret = gpio_request(omap_up_info->DTR_gpio, "omap-serial");
+               if (ret < 0)
+                       return ret;
+               ret = gpio_direction_output(omap_up_info->DTR_gpio,
+                                           omap_up_info->DTR_inverted);
+               if (ret < 0)
+                       return ret;
+       }
 
        up = devm_kzalloc(&pdev->dev, sizeof(*up), GFP_KERNEL);
        if (!up)
                return -ENOMEM;
 
-       up->pdev = pdev;
+       if (gpio_is_valid(omap_up_info->DTR_gpio) &&
+           omap_up_info->DTR_present) {
+               up->DTR_gpio = omap_up_info->DTR_gpio;
+               up->DTR_inverted = omap_up_info->DTR_inverted;
+       } else
+               up->DTR_gpio = -EINVAL;
+       up->DTR_active = 0;
+
+       up->dev = &pdev->dev;
        up->port.dev = &pdev->dev;
        up->port.type = PORT_OMAP;
        up->port.iotype = UPIO_MEM;
@@ -1492,6 +1379,13 @@ static int serial_omap_probe(struct platform_device *pdev)
                goto err_port_line;
        }
 
+       up->pins = devm_pinctrl_get_select_default(&pdev->dev);
+       if (IS_ERR(up->pins)) {
+               dev_warn(&pdev->dev, "did not get pins for uart%i error: %li\n",
+                        up->port.line, PTR_ERR(up->pins));
+               up->pins = NULL;
+       }
+
        sprintf(up->name, "OMAP UART%d", up->port.line);
        up->port.mapbase = mem->start;
        up->port.membase = devm_ioremap(&pdev->dev, mem->start,
@@ -1509,20 +1403,6 @@ static int serial_omap_probe(struct platform_device *pdev)
                dev_warn(&pdev->dev, "No clock speed specified: using default:"
                                                "%d\n", DEFAULT_CLK_SPEED);
        }
-       up->uart_dma.uart_base = mem->start;
-
-       if (omap_up_info->dma_enabled) {
-               up->uart_dma.uart_dma_tx = dma_tx->start;
-               up->uart_dma.uart_dma_rx = dma_rx->start;
-               up->use_dma = 1;
-               up->uart_dma.rx_buf_size = omap_up_info->dma_rx_buf_size;
-               up->uart_dma.rx_timeout = omap_up_info->dma_rx_timeout;
-               up->uart_dma.rx_poll_rate = omap_up_info->dma_rx_poll_rate;
-               spin_lock_init(&(up->uart_dma.tx_lock));
-               spin_lock_init(&(up->uart_dma.rx_lock));
-               up->uart_dma.tx_dma_channel = OMAP_UART_DMA_CH_FREE;
-               up->uart_dma.rx_dma_channel = OMAP_UART_DMA_CH_FREE;
-       }
 
        up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
        up->calc_latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
@@ -1531,12 +1411,13 @@ static int serial_omap_probe(struct platform_device *pdev)
        serial_omap_uart_wq = create_singlethread_workqueue(up->name);
        INIT_WORK(&up->qos_work, serial_omap_uart_qos_work);
 
+       platform_set_drvdata(pdev, up);
+       pm_runtime_enable(&pdev->dev);
        pm_runtime_use_autosuspend(&pdev->dev);
        pm_runtime_set_autosuspend_delay(&pdev->dev,
                        omap_up_info->autosuspend_timeout);
 
        pm_runtime_irq_safe(&pdev->dev);
-       pm_runtime_enable(&pdev->dev);
        pm_runtime_get_sync(&pdev->dev);
 
        omap_serial_fill_features_erratas(up);
@@ -1548,8 +1429,8 @@ static int serial_omap_probe(struct platform_device *pdev)
        if (ret != 0)
                goto err_add_port;
 
-       pm_runtime_put(&pdev->dev);
-       platform_set_drvdata(pdev, up);
+       pm_runtime_mark_last_busy(up->dev);
+       pm_runtime_put_autosuspend(up->dev);
        return 0;
 
 err_add_port:
@@ -1562,17 +1443,15 @@ err_port_line:
        return ret;
 }
 
-static int serial_omap_remove(struct platform_device *dev)
+static int __devexit serial_omap_remove(struct platform_device *dev)
 {
        struct uart_omap_port *up = platform_get_drvdata(dev);
 
-       if (up) {
-               pm_runtime_disable(&up->pdev->dev);
-               uart_remove_one_port(&serial_omap_reg, &up->port);
-               pm_qos_remove_request(&up->pm_qos_request);
-       }
+       pm_runtime_put_sync(up->dev);
+       pm_runtime_disable(up->dev);
+       uart_remove_one_port(&serial_omap_reg, &up->port);
+       pm_qos_remove_request(&up->pm_qos_request);
 
-       platform_set_drvdata(dev, NULL);
        return 0;
 }
 
@@ -1602,7 +1481,7 @@ static void serial_omap_mdr1_errataset(struct uart_omap_port *up, u8 mdr1)
                timeout--;
                if (!timeout) {
                        /* Should *never* happen. we warn and carry on */
-                       dev_crit(&up->pdev->dev, "Errata i202: timedout %x\n",
+                       dev_crit(up->dev, "Errata i202: timedout %x\n",
                                                serial_in(up, UART_LSR));
                        break;
                }
@@ -1648,29 +1527,23 @@ static int serial_omap_runtime_suspend(struct device *dev)
        if (!up)
                return -EINVAL;
 
-       if (!pdata || !pdata->enable_wakeup)
+       if (!pdata)
                return 0;
 
-       if (pdata->get_context_loss_count)
-               up->context_loss_cnt = pdata->get_context_loss_count(dev);
+       up->context_loss_cnt = serial_omap_get_context_loss_count(up);
 
        if (device_may_wakeup(dev)) {
                if (!up->wakeups_enabled) {
-                       pdata->enable_wakeup(up->pdev, true);
+                       serial_omap_enable_wakeup(up, true);
                        up->wakeups_enabled = true;
                }
        } else {
                if (up->wakeups_enabled) {
-                       pdata->enable_wakeup(up->pdev, false);
+                       serial_omap_enable_wakeup(up, false);
                        up->wakeups_enabled = false;
                }
        }
 
-       /* Errata i291 */
-       if (up->use_dma && pdata->set_forceidle &&
-                       (up->errata & UART_ERRATA_i291_DMA_FORCEIDLE))
-               pdata->set_forceidle(up->pdev);
-
        up->latency = PM_QOS_CPU_DMA_LAT_DEFAULT_VALUE;
        schedule_work(&up->qos_work);
 
@@ -1683,17 +1556,10 @@ static int serial_omap_runtime_resume(struct device *dev)
        struct omap_uart_port_info *pdata = dev->platform_data;
 
        if (up && pdata) {
-               if (pdata->get_context_loss_count) {
-                       u32 loss_cnt = pdata->get_context_loss_count(dev);
+                       u32 loss_cnt = serial_omap_get_context_loss_count(up);
 
                        if (up->context_loss_cnt != loss_cnt)
                                serial_omap_restore_context(up);
-               }
-
-               /* Errata i291 */
-               if (up->use_dma && pdata->set_noidle &&
-                               (up->errata & UART_ERRATA_i291_DMA_FORCEIDLE))
-                       pdata->set_noidle(up->pdev);
 
                up->latency = up->calc_latency;
                schedule_work(&up->qos_work);
@@ -1721,7 +1587,7 @@ MODULE_DEVICE_TABLE(of, omap_serial_of_match);
 
 static struct platform_driver serial_omap_driver = {
        .probe          = serial_omap_probe,
-       .remove         = serial_omap_remove,
+       .remove         = __devexit_p(serial_omap_remove),
        .driver         = {
                .name   = DRIVER_NAME,
                .pm     = &serial_omap_dev_pm_ops,
index 558ce85..4cd6c23 100644 (file)
@@ -979,6 +979,10 @@ static unsigned int dma_handle_tx(struct eg20t_port *priv)
        priv->tx_dma_use = 1;
 
        priv->sg_tx_p = kzalloc(sizeof(struct scatterlist)*num, GFP_ATOMIC);
+       if (!priv->sg_tx_p) {
+               dev_err(priv->port.dev, "%s:kzalloc Failed\n", __func__);
+               return 0;
+       }
 
        sg_init_table(priv->sg_tx_p, num); /* Initialize SG table */
        sg = priv->sg_tx_p;
index 5847a4b..9033fc6 100644 (file)
@@ -670,9 +670,19 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
 {
        struct uart_pxa_port *up = serial_pxa_ports[co->index];
        unsigned int ier;
+       unsigned long flags;
+       int locked = 1;
 
        clk_prepare_enable(up->clk);
 
+       local_irq_save(flags);
+       if (up->port.sysrq)
+               locked = 0;
+       else if (oops_in_progress)
+               locked = spin_trylock(&up->port.lock);
+       else
+               spin_lock(&up->port.lock);
+
        /*
         *      First save the IER then disable the interrupts
         */
@@ -688,6 +698,10 @@ serial_pxa_console_write(struct console *co, const char *s, unsigned int count)
        wait_for_xmitr(up);
        serial_out(up, UART_IER, ier);
 
+       if (locked)
+               spin_unlock(&up->port.lock);
+       local_irq_restore(flags);
+
        clk_disable_unprepare(up->clk);
 }
 
index 02d07bf..bdaa06f 100644 (file)
@@ -82,7 +82,7 @@ static inline const char *s3c24xx_serial_portname(struct uart_port *port)
 
 static int s3c24xx_serial_txempty_nofifo(struct uart_port *port)
 {
-       return (rd_regl(port, S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE);
+       return rd_regl(port, S3C2410_UTRSTAT) & S3C2410_UTRSTAT_TXE;
 }
 
 /*
@@ -268,7 +268,7 @@ s3c24xx_serial_rx_chars(int irq, void *dev_id)
                                dbg("break!\n");
                                port->icount.brk++;
                                if (uart_handle_break(port))
-                                   goto ignore_char;
+                                       goto ignore_char;
                        }
 
                        if (uerstat & S3C2410_UERSTAT_FRAME)
@@ -459,7 +459,7 @@ static int s3c24xx_serial_startup(struct uart_port *port)
                          s3c24xx_serial_portname(port), ourport);
 
        if (ret != 0) {
-               printk(KERN_ERR "cannot get irq %d\n", ourport->rx_irq);
+               dev_err(port->dev, "cannot get irq %d\n", ourport->rx_irq);
                return ret;
        }
 
@@ -473,7 +473,7 @@ static int s3c24xx_serial_startup(struct uart_port *port)
                          s3c24xx_serial_portname(port), ourport);
 
        if (ret) {
-               printk(KERN_ERR "cannot get irq %d\n", ourport->tx_irq);
+               dev_err(port->dev, "cannot get irq %d\n", ourport->tx_irq);
                goto err;
        }
 
@@ -502,7 +502,7 @@ static int s3c64xx_serial_startup(struct uart_port *port)
        ret = request_irq(port->irq, s3c64xx_serial_handle_irq, IRQF_SHARED,
                          s3c24xx_serial_portname(port), ourport);
        if (ret) {
-               printk(KERN_ERR "cannot get irq %d\n", port->irq);
+               dev_err(port->dev, "cannot get irq %d\n", port->irq);
                return ret;
        }
 
@@ -529,7 +529,7 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level,
 
        switch (level) {
        case 3:
-               if (!IS_ERR(ourport->baudclk) && ourport->baudclk != NULL)
+               if (!IS_ERR(ourport->baudclk))
                        clk_disable(ourport->baudclk);
 
                clk_disable(ourport->clk);
@@ -538,12 +538,12 @@ static void s3c24xx_serial_pm(struct uart_port *port, unsigned int level,
        case 0:
                clk_enable(ourport->clk);
 
-               if (!IS_ERR(ourport->baudclk) && ourport->baudclk != NULL)
+               if (!IS_ERR(ourport->baudclk))
                        clk_enable(ourport->baudclk);
 
                break;
        default:
-               printk(KERN_ERR "s3c24xx_serial: unknown pm %d\n", level);
+               dev_err(port->dev, "s3c24xx_serial: unknown pm %d\n", level);
        }
 }
 
@@ -604,7 +604,6 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
        char clkname[MAX_CLK_NAME_LENGTH];
        int calc_deviation, deviation = (1 << 30) - 1;
 
-       *best_clk = NULL;
        clk_sel = (ourport->cfg->clk_sel) ? ourport->cfg->clk_sel :
                        ourport->info->def_clk_sel;
        for (cnt = 0; cnt < info->num_clks; cnt++) {
@@ -613,7 +612,7 @@ static unsigned int s3c24xx_serial_getclk(struct s3c24xx_uart_port *ourport,
 
                sprintf(clkname, "clk_uart_baud%d", cnt);
                clk = clk_get(ourport->port.dev, clkname);
-               if (IS_ERR_OR_NULL(clk))
+               if (IS_ERR(clk))
                        continue;
 
                rate = clk_get_rate(clk);
@@ -684,7 +683,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
 {
        struct s3c2410_uartcfg *cfg = s3c24xx_port_to_cfg(port);
        struct s3c24xx_uart_port *ourport = to_ourport(port);
-       struct clk *clk = NULL;
+       struct clk *clk = ERR_PTR(-EINVAL);
        unsigned long flags;
        unsigned int baud, quot, clk_sel = 0;
        unsigned int ulcon;
@@ -705,7 +704,7 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
        quot = s3c24xx_serial_getclk(ourport, baud, &clk, &clk_sel);
        if (baud == 38400 && (port->flags & UPF_SPD_MASK) == UPF_SPD_CUST)
                quot = port->custom_divisor;
-       if (!clk)
+       if (IS_ERR(clk))
                return;
 
        /* check to see if we need  to change clock source */
@@ -713,9 +712,9 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
        if (ourport->baudclk != clk) {
                s3c24xx_serial_setsource(port, clk_sel);
 
-               if (ourport->baudclk != NULL && !IS_ERR(ourport->baudclk)) {
+               if (!IS_ERR(ourport->baudclk)) {
                        clk_disable(ourport->baudclk);
-                       ourport->baudclk  = NULL;
+                       ourport->baudclk = ERR_PTR(-EINVAL);
                }
 
                clk_enable(clk);
@@ -1036,10 +1035,10 @@ static int s3c24xx_serial_cpufreq_transition(struct notifier_block *nb,
                if (tty == NULL)
                        goto exit;
 
-               termios = tty->termios;
+               termios = &tty->termios;
 
                if (termios == NULL) {
-                       printk(KERN_WARNING "%s: no termios?\n", __func__);
+                       dev_warn(uport->dev, "%s: no termios?\n", __func__);
                        goto exit;
                }
 
@@ -1114,7 +1113,7 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport,
 
        res = platform_get_resource(platdev, IORESOURCE_MEM, 0);
        if (res == NULL) {
-               printk(KERN_ERR "failed to find memory resource for uart\n");
+               dev_err(port->dev, "failed to find memory resource for uart\n");
                return -EINVAL;
        }
 
@@ -1130,7 +1129,7 @@ static int s3c24xx_serial_init_port(struct s3c24xx_uart_port *ourport,
                ourport->rx_irq = ret;
                ourport->tx_irq = ret + 1;
        }
-       
+
        ret = platform_get_irq(platdev, 1);
        if (ret > 0)
                ourport->tx_irq = ret;
@@ -1160,7 +1159,11 @@ static ssize_t s3c24xx_serial_show_clksrc(struct device *dev,
        struct uart_port *port = s3c24xx_dev_to_port(dev);
        struct s3c24xx_uart_port *ourport = to_ourport(port);
 
-       return snprintf(buf, PAGE_SIZE, "* %s\n", ourport->baudclk->name);
+       if (IS_ERR(ourport->baudclk))
+               return -EINVAL;
+
+       return snprintf(buf, PAGE_SIZE, "* %s\n",
+                       ourport->baudclk->name ?: "(null)");
 }
 
 static DEVICE_ATTR(clock_source, S_IRUGO, s3c24xx_serial_show_clksrc, NULL);
@@ -1200,6 +1203,7 @@ static int s3c24xx_serial_probe(struct platform_device *pdev)
                return -ENODEV;
        }
 
+       ourport->baudclk = ERR_PTR(-EINVAL);
        ourport->info = ourport->drv_data->info;
        ourport->cfg = (pdev->dev.platform_data) ?
                        (struct s3c2410_uartcfg *)pdev->dev.platform_data :
@@ -1387,7 +1391,7 @@ s3c24xx_serial_get_options(struct uart_port *port, int *baud,
                sprintf(clk_name, "clk_uart_baud%d", clk_sel);
 
                clk = clk_get(port->dev, clk_name);
-               if (!IS_ERR(clk) && clk != NULL)
+               if (!IS_ERR(clk))
                        rate = clk_get_rate(clk);
                else
                        rate = 1;
@@ -1679,7 +1683,7 @@ static int __init s3c24xx_serial_modinit(void)
 
        ret = uart_register_driver(&s3c24xx_uart_drv);
        if (ret < 0) {
-               printk(KERN_ERR "failed to register UART driver\n");
+               pr_err("Failed to register Samsung UART driver\n");
                return -1;
        }
 
index e0b4b0a..9d66424 100644 (file)
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/irq.h>
+#include <linux/io.h>
+
+#warning "Please try migrate to use new driver SCCNXP and report the status" \
+        "in the linux-serial mailing list."
 
 #if defined(CONFIG_MAGIC_SYSRQ)
 #define SUPPORT_SYSRQ
diff --git a/drivers/tty/serial/sccnxp.c b/drivers/tty/serial/sccnxp.c
new file mode 100644 (file)
index 0000000..05d767c
--- /dev/null
@@ -0,0 +1,985 @@
+/*
+ *  NXP (Philips) SCC+++(SCN+++) serial driver
+ *
+ *  Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru>
+ *
+ *  Based on sc26xx.c, by Thomas Bogendörfer (tsbogend@alpha.franken.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.
+ */
+
+#if defined(CONFIG_SERIAL_SCCNXP_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ)
+#define SUPPORT_SYSRQ
+#endif
+
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/console.h>
+#include <linux/serial_core.h>
+#include <linux/serial.h>
+#include <linux/io.h>
+#include <linux/tty.h>
+#include <linux/tty_flip.h>
+#include <linux/platform_device.h>
+#include <linux/platform_data/sccnxp.h>
+
+#define SCCNXP_NAME                    "uart-sccnxp"
+#define SCCNXP_MAJOR                   204
+#define SCCNXP_MINOR                   205
+
+#define SCCNXP_MR_REG                  (0x00)
+#      define MR0_BAUD_NORMAL          (0 << 0)
+#      define MR0_BAUD_EXT1            (1 << 0)
+#      define MR0_BAUD_EXT2            (5 << 0)
+#      define MR0_FIFO                 (1 << 3)
+#      define MR0_TXLVL                (1 << 4)
+#      define MR1_BITS_5               (0 << 0)
+#      define MR1_BITS_6               (1 << 0)
+#      define MR1_BITS_7               (2 << 0)
+#      define MR1_BITS_8               (3 << 0)
+#      define MR1_PAR_EVN              (0 << 2)
+#      define MR1_PAR_ODD              (1 << 2)
+#      define MR1_PAR_NO               (4 << 2)
+#      define MR2_STOP1                (7 << 0)
+#      define MR2_STOP2                (0xf << 0)
+#define SCCNXP_SR_REG                  (0x01)
+#define SCCNXP_CSR_REG                 SCCNXP_SR_REG
+#      define SR_RXRDY                 (1 << 0)
+#      define SR_FULL                  (1 << 1)
+#      define SR_TXRDY                 (1 << 2)
+#      define SR_TXEMT                 (1 << 3)
+#      define SR_OVR                   (1 << 4)
+#      define SR_PE                    (1 << 5)
+#      define SR_FE                    (1 << 6)
+#      define SR_BRK                   (1 << 7)
+#define SCCNXP_CR_REG                  (0x02)
+#      define CR_RX_ENABLE             (1 << 0)
+#      define CR_RX_DISABLE            (1 << 1)
+#      define CR_TX_ENABLE             (1 << 2)
+#      define CR_TX_DISABLE            (1 << 3)
+#      define CR_CMD_MRPTR1            (0x01 << 4)
+#      define CR_CMD_RX_RESET          (0x02 << 4)
+#      define CR_CMD_TX_RESET          (0x03 << 4)
+#      define CR_CMD_STATUS_RESET      (0x04 << 4)
+#      define CR_CMD_BREAK_RESET       (0x05 << 4)
+#      define CR_CMD_START_BREAK       (0x06 << 4)
+#      define CR_CMD_STOP_BREAK        (0x07 << 4)
+#      define CR_CMD_MRPTR0            (0x0b << 4)
+#define SCCNXP_RHR_REG                 (0x03)
+#define SCCNXP_THR_REG                 SCCNXP_RHR_REG
+#define SCCNXP_IPCR_REG                        (0x04)
+#define SCCNXP_ACR_REG                 SCCNXP_IPCR_REG
+#      define ACR_BAUD0                (0 << 7)
+#      define ACR_BAUD1                (1 << 7)
+#      define ACR_TIMER_MODE           (6 << 4)
+#define SCCNXP_ISR_REG                 (0x05)
+#define SCCNXP_IMR_REG                 SCCNXP_ISR_REG
+#      define IMR_TXRDY                (1 << 0)
+#      define IMR_RXRDY                (1 << 1)
+#      define ISR_TXRDY(x)             (1 << ((x * 4) + 0))
+#      define ISR_RXRDY(x)             (1 << ((x * 4) + 1))
+#define SCCNXP_IPR_REG                 (0x0d)
+#define SCCNXP_OPCR_REG                        SCCNXP_IPR_REG
+#define SCCNXP_SOP_REG                 (0x0e)
+#define SCCNXP_ROP_REG                 (0x0f)
+
+/* Route helpers */
+#define MCTRL_MASK(sig)                        (0xf << (sig))
+#define MCTRL_IBIT(cfg, sig)           ((((cfg) >> (sig)) & 0xf) - LINE_IP0)
+#define MCTRL_OBIT(cfg, sig)           ((((cfg) >> (sig)) & 0xf) - LINE_OP0)
+
+/* Supported chip types */
+enum {
+       SCCNXP_TYPE_SC2681      = 2681,
+       SCCNXP_TYPE_SC2691      = 2691,
+       SCCNXP_TYPE_SC2692      = 2692,
+       SCCNXP_TYPE_SC2891      = 2891,
+       SCCNXP_TYPE_SC2892      = 2892,
+       SCCNXP_TYPE_SC28202     = 28202,
+       SCCNXP_TYPE_SC68681     = 68681,
+       SCCNXP_TYPE_SC68692     = 68692,
+};
+
+struct sccnxp_port {
+       struct uart_driver      uart;
+       struct uart_port        port[SCCNXP_MAX_UARTS];
+
+       const char              *name;
+       int                     irq;
+
+       u8                      imr;
+       u8                      addr_mask;
+       int                     freq_std;
+
+       int                     flags;
+#define SCCNXP_HAVE_IO         0x00000001
+#define SCCNXP_HAVE_MR0                0x00000002
+
+#ifdef CONFIG_SERIAL_SCCNXP_CONSOLE
+       struct console          console;
+#endif
+
+       struct mutex            sccnxp_mutex;
+
+       struct sccnxp_pdata     pdata;
+};
+
+static inline u8 sccnxp_raw_read(void __iomem *base, u8 reg, u8 shift)
+{
+       return readb(base + (reg << shift));
+}
+
+static inline void sccnxp_raw_write(void __iomem *base, u8 reg, u8 shift, u8 v)
+{
+       writeb(v, base + (reg << shift));
+}
+
+static inline u8 sccnxp_read(struct uart_port *port, u8 reg)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       return sccnxp_raw_read(port->membase, reg & s->addr_mask,
+                              port->regshift);
+}
+
+static inline void sccnxp_write(struct uart_port *port, u8 reg, u8 v)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       sccnxp_raw_write(port->membase, reg & s->addr_mask, port->regshift, v);
+}
+
+static inline u8 sccnxp_port_read(struct uart_port *port, u8 reg)
+{
+       return sccnxp_read(port, (port->line << 3) + reg);
+}
+
+static inline void sccnxp_port_write(struct uart_port *port, u8 reg, u8 v)
+{
+       sccnxp_write(port, (port->line << 3) + reg, v);
+}
+
+static int sccnxp_update_best_err(int a, int b, int *besterr)
+{
+       int err = abs(a - b);
+
+       if ((*besterr < 0) || (*besterr > err)) {
+               *besterr = err;
+               return 0;
+       }
+
+       return 1;
+}
+
+struct baud_table {
+       u8      csr;
+       u8      acr;
+       u8      mr0;
+       int     baud;
+};
+
+const struct baud_table baud_std[] = {
+       { 0,    ACR_BAUD0,      MR0_BAUD_NORMAL,        50, },
+       { 0,    ACR_BAUD1,      MR0_BAUD_NORMAL,        75, },
+       { 1,    ACR_BAUD0,      MR0_BAUD_NORMAL,        110, },
+       { 2,    ACR_BAUD0,      MR0_BAUD_NORMAL,        134, },
+       { 3,    ACR_BAUD1,      MR0_BAUD_NORMAL,        150, },
+       { 3,    ACR_BAUD0,      MR0_BAUD_NORMAL,        200, },
+       { 4,    ACR_BAUD0,      MR0_BAUD_NORMAL,        300, },
+       { 0,    ACR_BAUD1,      MR0_BAUD_EXT1,          450, },
+       { 1,    ACR_BAUD0,      MR0_BAUD_EXT2,          880, },
+       { 3,    ACR_BAUD1,      MR0_BAUD_EXT1,          900, },
+       { 5,    ACR_BAUD0,      MR0_BAUD_NORMAL,        600, },
+       { 7,    ACR_BAUD0,      MR0_BAUD_NORMAL,        1050, },
+       { 2,    ACR_BAUD0,      MR0_BAUD_EXT2,          1076, },
+       { 6,    ACR_BAUD0,      MR0_BAUD_NORMAL,        1200, },
+       { 10,   ACR_BAUD1,      MR0_BAUD_NORMAL,        1800, },
+       { 7,    ACR_BAUD1,      MR0_BAUD_NORMAL,        2000, },
+       { 8,    ACR_BAUD0,      MR0_BAUD_NORMAL,        2400, },
+       { 5,    ACR_BAUD1,      MR0_BAUD_EXT1,          3600, },
+       { 9,    ACR_BAUD0,      MR0_BAUD_NORMAL,        4800, },
+       { 10,   ACR_BAUD0,      MR0_BAUD_NORMAL,        7200, },
+       { 11,   ACR_BAUD0,      MR0_BAUD_NORMAL,        9600, },
+       { 8,    ACR_BAUD0,      MR0_BAUD_EXT1,          14400, },
+       { 12,   ACR_BAUD1,      MR0_BAUD_NORMAL,        19200, },
+       { 9,    ACR_BAUD0,      MR0_BAUD_EXT1,          28800, },
+       { 12,   ACR_BAUD0,      MR0_BAUD_NORMAL,        38400, },
+       { 11,   ACR_BAUD0,      MR0_BAUD_EXT1,          57600, },
+       { 12,   ACR_BAUD1,      MR0_BAUD_EXT1,          115200, },
+       { 12,   ACR_BAUD0,      MR0_BAUD_EXT1,          230400, },
+       { 0, 0, 0, 0 }
+};
+
+static void sccnxp_set_baud(struct uart_port *port, int baud)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+       int div_std, tmp_baud, bestbaud = baud, besterr = -1;
+       u8 i, acr = 0, csr = 0, mr0 = 0;
+
+       /* Find best baud from table */
+       for (i = 0; baud_std[i].baud && besterr; i++) {
+               if (baud_std[i].mr0 && !(s->flags & SCCNXP_HAVE_MR0))
+                       continue;
+               div_std = DIV_ROUND_CLOSEST(s->freq_std, baud_std[i].baud);
+               tmp_baud = DIV_ROUND_CLOSEST(port->uartclk, div_std);
+               if (!sccnxp_update_best_err(baud, tmp_baud, &besterr)) {
+                       acr = baud_std[i].acr;
+                       csr = baud_std[i].csr;
+                       mr0 = baud_std[i].mr0;
+                       bestbaud = tmp_baud;
+               }
+       }
+
+       if (s->flags & SCCNXP_HAVE_MR0) {
+               /* Enable FIFO, set half level for TX */
+               mr0 |= MR0_FIFO | MR0_TXLVL;
+               /* Update MR0 */
+               sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_MRPTR0);
+               sccnxp_port_write(port, SCCNXP_MR_REG, mr0);
+       }
+
+       sccnxp_port_write(port, SCCNXP_ACR_REG, acr | ACR_TIMER_MODE);
+       sccnxp_port_write(port, SCCNXP_CSR_REG, (csr << 4) | csr);
+
+       dev_dbg(port->dev, "Baudrate desired: %i, calculated: %i\n",
+               baud, bestbaud);
+}
+
+static void sccnxp_enable_irq(struct uart_port *port, int mask)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       s->imr |= mask << (port->line * 4);
+       sccnxp_write(port, SCCNXP_IMR_REG, s->imr);
+}
+
+static void sccnxp_disable_irq(struct uart_port *port, int mask)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       s->imr &= ~(mask << (port->line * 4));
+       sccnxp_write(port, SCCNXP_IMR_REG, s->imr);
+}
+
+static void sccnxp_set_bit(struct uart_port *port, int sig, int state)
+{
+       u8 bitmask;
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(sig)) {
+               bitmask = 1 << MCTRL_OBIT(s->pdata.mctrl_cfg[port->line], sig);
+               if (state)
+                       sccnxp_write(port, SCCNXP_SOP_REG, bitmask);
+               else
+                       sccnxp_write(port, SCCNXP_ROP_REG, bitmask);
+       }
+}
+
+static void sccnxp_handle_rx(struct uart_port *port)
+{
+       u8 sr;
+       unsigned int ch, flag;
+       struct tty_struct *tty = tty_port_tty_get(&port->state->port);
+
+       if (!tty)
+               return;
+
+       for (;;) {
+               sr = sccnxp_port_read(port, SCCNXP_SR_REG);
+               if (!(sr & SR_RXRDY))
+                       break;
+               sr &= SR_PE | SR_FE | SR_OVR | SR_BRK;
+
+               ch = sccnxp_port_read(port, SCCNXP_RHR_REG);
+
+               port->icount.rx++;
+               flag = TTY_NORMAL;
+
+               if (unlikely(sr)) {
+                       if (sr & SR_BRK) {
+                               port->icount.brk++;
+                               if (uart_handle_break(port))
+                                       continue;
+                       } else if (sr & SR_PE)
+                               port->icount.parity++;
+                       else if (sr & SR_FE)
+                               port->icount.frame++;
+                       else if (sr & SR_OVR)
+                               port->icount.overrun++;
+
+                       sr &= port->read_status_mask;
+                       if (sr & SR_BRK)
+                               flag = TTY_BREAK;
+                       else if (sr & SR_PE)
+                               flag = TTY_PARITY;
+                       else if (sr & SR_FE)
+                               flag = TTY_FRAME;
+                       else if (sr & SR_OVR)
+                               flag = TTY_OVERRUN;
+               }
+
+               if (uart_handle_sysrq_char(port, ch))
+                       continue;
+
+               if (sr & port->ignore_status_mask)
+                       continue;
+
+               uart_insert_char(port, sr, SR_OVR, ch, flag);
+       }
+
+       tty_flip_buffer_push(tty);
+
+       tty_kref_put(tty);
+}
+
+static void sccnxp_handle_tx(struct uart_port *port)
+{
+       u8 sr;
+       struct circ_buf *xmit = &port->state->xmit;
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       if (unlikely(port->x_char)) {
+               sccnxp_port_write(port, SCCNXP_THR_REG, port->x_char);
+               port->icount.tx++;
+               port->x_char = 0;
+               return;
+       }
+
+       if (uart_circ_empty(xmit) || uart_tx_stopped(port)) {
+               /* Disable TX if FIFO is empty */
+               if (sccnxp_port_read(port, SCCNXP_SR_REG) & SR_TXEMT) {
+                       sccnxp_disable_irq(port, IMR_TXRDY);
+
+                       /* Set direction to input */
+                       if (s->flags & SCCNXP_HAVE_IO)
+                               sccnxp_set_bit(port, DIR_OP, 0);
+               }
+               return;
+       }
+
+       while (!uart_circ_empty(xmit)) {
+               sr = sccnxp_port_read(port, SCCNXP_SR_REG);
+               if (!(sr & SR_TXRDY))
+                       break;
+
+               sccnxp_port_write(port, SCCNXP_THR_REG, xmit->buf[xmit->tail]);
+               xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
+               port->icount.tx++;
+       }
+
+       if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
+               uart_write_wakeup(port);
+}
+
+static irqreturn_t sccnxp_ist(int irq, void *dev_id)
+{
+       int i;
+       u8 isr;
+       struct sccnxp_port *s = (struct sccnxp_port *)dev_id;
+
+       mutex_lock(&s->sccnxp_mutex);
+
+       for (;;) {
+               isr = sccnxp_read(&s->port[0], SCCNXP_ISR_REG);
+               isr &= s->imr;
+               if (!isr)
+                       break;
+
+               dev_dbg(s->port[0].dev, "IRQ status: 0x%02x\n", isr);
+
+               for (i = 0; i < s->uart.nr; i++) {
+                       if (isr & ISR_RXRDY(i))
+                               sccnxp_handle_rx(&s->port[i]);
+                       if (isr & ISR_TXRDY(i))
+                               sccnxp_handle_tx(&s->port[i]);
+               }
+       }
+
+       mutex_unlock(&s->sccnxp_mutex);
+
+       return IRQ_HANDLED;
+}
+
+static void sccnxp_start_tx(struct uart_port *port)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       mutex_lock(&s->sccnxp_mutex);
+
+       /* Set direction to output */
+       if (s->flags & SCCNXP_HAVE_IO)
+               sccnxp_set_bit(port, DIR_OP, 1);
+
+       sccnxp_enable_irq(port, IMR_TXRDY);
+
+       mutex_unlock(&s->sccnxp_mutex);
+}
+
+static void sccnxp_stop_tx(struct uart_port *port)
+{
+       /* Do nothing */
+}
+
+static void sccnxp_stop_rx(struct uart_port *port)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       mutex_lock(&s->sccnxp_mutex);
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_DISABLE);
+       mutex_unlock(&s->sccnxp_mutex);
+}
+
+static unsigned int sccnxp_tx_empty(struct uart_port *port)
+{
+       u8 val;
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       mutex_lock(&s->sccnxp_mutex);
+       val = sccnxp_port_read(port, SCCNXP_SR_REG);
+       mutex_unlock(&s->sccnxp_mutex);
+
+       return (val & SR_TXEMT) ? TIOCSER_TEMT : 0;
+}
+
+static void sccnxp_enable_ms(struct uart_port *port)
+{
+       /* Do nothing */
+}
+
+static void sccnxp_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       if (!(s->flags & SCCNXP_HAVE_IO))
+               return;
+
+       mutex_lock(&s->sccnxp_mutex);
+
+       sccnxp_set_bit(port, DTR_OP, mctrl & TIOCM_DTR);
+       sccnxp_set_bit(port, RTS_OP, mctrl & TIOCM_RTS);
+
+       mutex_unlock(&s->sccnxp_mutex);
+}
+
+static unsigned int sccnxp_get_mctrl(struct uart_port *port)
+{
+       u8 bitmask, ipr;
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+       unsigned int mctrl = TIOCM_DSR | TIOCM_CTS | TIOCM_CAR;
+
+       if (!(s->flags & SCCNXP_HAVE_IO))
+               return mctrl;
+
+       mutex_lock(&s->sccnxp_mutex);
+
+       ipr = ~sccnxp_read(port, SCCNXP_IPCR_REG);
+
+       if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(DSR_IP)) {
+               bitmask = 1 << MCTRL_IBIT(s->pdata.mctrl_cfg[port->line],
+                                         DSR_IP);
+               mctrl &= ~TIOCM_DSR;
+               mctrl |= (ipr & bitmask) ? TIOCM_DSR : 0;
+       }
+       if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(CTS_IP)) {
+               bitmask = 1 << MCTRL_IBIT(s->pdata.mctrl_cfg[port->line],
+                                         CTS_IP);
+               mctrl &= ~TIOCM_CTS;
+               mctrl |= (ipr & bitmask) ? TIOCM_CTS : 0;
+       }
+       if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(DCD_IP)) {
+               bitmask = 1 << MCTRL_IBIT(s->pdata.mctrl_cfg[port->line],
+                                         DCD_IP);
+               mctrl &= ~TIOCM_CAR;
+               mctrl |= (ipr & bitmask) ? TIOCM_CAR : 0;
+       }
+       if (s->pdata.mctrl_cfg[port->line] & MCTRL_MASK(RNG_IP)) {
+               bitmask = 1 << MCTRL_IBIT(s->pdata.mctrl_cfg[port->line],
+                                         RNG_IP);
+               mctrl &= ~TIOCM_RNG;
+               mctrl |= (ipr & bitmask) ? TIOCM_RNG : 0;
+       }
+
+       mutex_unlock(&s->sccnxp_mutex);
+
+       return mctrl;
+}
+
+static void sccnxp_break_ctl(struct uart_port *port, int break_state)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       mutex_lock(&s->sccnxp_mutex);
+       sccnxp_port_write(port, SCCNXP_CR_REG, break_state ?
+                         CR_CMD_START_BREAK : CR_CMD_STOP_BREAK);
+       mutex_unlock(&s->sccnxp_mutex);
+}
+
+static void sccnxp_set_termios(struct uart_port *port,
+                              struct ktermios *termios, struct ktermios *old)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+       u8 mr1, mr2;
+       int baud;
+
+       mutex_lock(&s->sccnxp_mutex);
+
+       /* Mask termios capabilities we don't support */
+       termios->c_cflag &= ~CMSPAR;
+       termios->c_iflag &= ~(IXON | IXOFF | IXANY);
+
+       /* Disable RX & TX, reset break condition, status and FIFOs */
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_RX_RESET |
+                                              CR_RX_DISABLE | CR_TX_DISABLE);
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_TX_RESET);
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_STATUS_RESET);
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_BREAK_RESET);
+
+       /* Word size */
+       switch (termios->c_cflag & CSIZE) {
+       case CS5:
+               mr1 = MR1_BITS_5;
+               break;
+       case CS6:
+               mr1 = MR1_BITS_6;
+               break;
+       case CS7:
+               mr1 = MR1_BITS_7;
+               break;
+       default:
+       case CS8:
+               mr1 = MR1_BITS_8;
+               break;
+       }
+
+       /* Parity */
+       if (termios->c_cflag & PARENB) {
+               if (termios->c_cflag & PARODD)
+                       mr1 |= MR1_PAR_ODD;
+       } else
+               mr1 |= MR1_PAR_NO;
+
+       /* Stop bits */
+       mr2 = (termios->c_cflag & CSTOPB) ? MR2_STOP2 : MR2_STOP1;
+
+       /* Update desired format */
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_MRPTR1);
+       sccnxp_port_write(port, SCCNXP_MR_REG, mr1);
+       sccnxp_port_write(port, SCCNXP_MR_REG, mr2);
+
+       /* Set read status mask */
+       port->read_status_mask = SR_OVR;
+       if (termios->c_iflag & INPCK)
+               port->read_status_mask |= SR_PE | SR_FE;
+       if (termios->c_iflag & (BRKINT | PARMRK))
+               port->read_status_mask |= SR_BRK;
+
+       /* Set status ignore mask */
+       port->ignore_status_mask = 0;
+       if (termios->c_iflag & IGNBRK)
+               port->ignore_status_mask |= SR_BRK;
+       if (!(termios->c_cflag & CREAD))
+               port->ignore_status_mask |= SR_PE | SR_OVR | SR_FE | SR_BRK;
+
+       /* Setup baudrate */
+       baud = uart_get_baud_rate(port, termios, old, 50,
+                                 (s->flags & SCCNXP_HAVE_MR0) ?
+                                 230400 : 38400);
+       sccnxp_set_baud(port, baud);
+
+       /* Update timeout according to new baud rate */
+       uart_update_timeout(port, termios->c_cflag, baud);
+
+       /* Enable RX & TX */
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_ENABLE | CR_TX_ENABLE);
+
+       mutex_unlock(&s->sccnxp_mutex);
+}
+
+static int sccnxp_startup(struct uart_port *port)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       mutex_lock(&s->sccnxp_mutex);
+
+       if (s->flags & SCCNXP_HAVE_IO) {
+               /* Outputs are controlled manually */
+               sccnxp_write(port, SCCNXP_OPCR_REG, 0);
+       }
+
+       /* Reset break condition, status and FIFOs */
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_RX_RESET);
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_TX_RESET);
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_STATUS_RESET);
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_CMD_BREAK_RESET);
+
+       /* Enable RX & TX */
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_ENABLE | CR_TX_ENABLE);
+
+       /* Enable RX interrupt */
+       sccnxp_enable_irq(port, IMR_RXRDY);
+
+       mutex_unlock(&s->sccnxp_mutex);
+
+       return 0;
+}
+
+static void sccnxp_shutdown(struct uart_port *port)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       mutex_lock(&s->sccnxp_mutex);
+
+       /* Disable interrupts */
+       sccnxp_disable_irq(port, IMR_TXRDY | IMR_RXRDY);
+
+       /* Disable TX & RX */
+       sccnxp_port_write(port, SCCNXP_CR_REG, CR_RX_DISABLE | CR_TX_DISABLE);
+
+       /* Leave direction to input */
+       if (s->flags & SCCNXP_HAVE_IO)
+               sccnxp_set_bit(port, DIR_OP, 0);
+
+       mutex_unlock(&s->sccnxp_mutex);
+}
+
+static const char *sccnxp_type(struct uart_port *port)
+{
+       struct sccnxp_port *s = dev_get_drvdata(port->dev);
+
+       return (port->type == PORT_SC26XX) ? s->name : NULL;
+}
+
+static void sccnxp_release_port(struct uart_port *port)
+{
+       /* Do nothing */
+}
+
+static int sccnxp_request_port(struct uart_port *port)
+{
+       /* Do nothing */
+       return 0;
+}
+
+static void sccnxp_config_port(struct uart_port *port, int flags)
+{
+       if (flags & UART_CONFIG_TYPE)
+               port->type = PORT_SC26XX;
+}
+
+static int sccnxp_verify_port(struct uart_port *port, struct serial_struct *s)
+{
+       if ((s->type == PORT_UNKNOWN) || (s->type == PORT_SC26XX))
+               return 0;
+       if (s->irq == port->irq)
+               return 0;
+
+       return -EINVAL;
+}
+
+static const struct uart_ops sccnxp_ops = {
+       .tx_empty       = sccnxp_tx_empty,
+       .set_mctrl      = sccnxp_set_mctrl,
+       .get_mctrl      = sccnxp_get_mctrl,
+       .stop_tx        = sccnxp_stop_tx,
+       .start_tx       = sccnxp_start_tx,
+       .stop_rx        = sccnxp_stop_rx,
+       .enable_ms      = sccnxp_enable_ms,
+       .break_ctl      = sccnxp_break_ctl,
+       .startup        = sccnxp_startup,
+       .shutdown       = sccnxp_shutdown,
+       .set_termios    = sccnxp_set_termios,
+       .type           = sccnxp_type,
+       .release_port   = sccnxp_release_port,
+       .request_port   = sccnxp_request_port,
+       .config_port    = sccnxp_config_port,
+       .verify_port    = sccnxp_verify_port,
+};
+
+#ifdef CONFIG_SERIAL_SCCNXP_CONSOLE
+static void sccnxp_console_putchar(struct uart_port *port, int c)
+{
+       int tryes = 100000;
+
+       while (tryes--) {
+               if (sccnxp_port_read(port, SCCNXP_SR_REG) & SR_TXRDY) {
+                       sccnxp_port_write(port, SCCNXP_THR_REG, c);
+                       break;
+               }
+               barrier();
+       }
+}
+
+static void sccnxp_console_write(struct console *co, const char *c, unsigned n)
+{
+       struct sccnxp_port *s = (struct sccnxp_port *)co->data;
+       struct uart_port *port = &s->port[co->index];
+
+       mutex_lock(&s->sccnxp_mutex);
+       uart_console_write(port, c, n, sccnxp_console_putchar);
+       mutex_unlock(&s->sccnxp_mutex);
+}
+
+static int sccnxp_console_setup(struct console *co, char *options)
+{
+       struct sccnxp_port *s = (struct sccnxp_port *)co->data;
+       struct uart_port *port = &s->port[(co->index > 0) ? co->index : 0];
+       int baud = 9600, bits = 8, parity = 'n', flow = 'n';
+
+       if (options)
+               uart_parse_options(options, &baud, &parity, &bits, &flow);
+
+       return uart_set_options(port, co, baud, parity, bits, flow);
+}
+#endif
+
+static int __devinit sccnxp_probe(struct platform_device *pdev)
+{
+       struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       int chiptype = pdev->id_entry->driver_data;
+       struct sccnxp_pdata *pdata = dev_get_platdata(&pdev->dev);
+       int i, ret, fifosize, freq_min, freq_max;
+       struct sccnxp_port *s;
+       void __iomem *membase;
+
+       if (!res) {
+               dev_err(&pdev->dev, "Missing memory resource data\n");
+               return -EADDRNOTAVAIL;
+       }
+
+       dev_set_name(&pdev->dev, SCCNXP_NAME);
+
+       s = devm_kzalloc(&pdev->dev, sizeof(struct sccnxp_port), GFP_KERNEL);
+       if (!s) {
+               dev_err(&pdev->dev, "Error allocating port structure\n");
+               return -ENOMEM;
+       }
+       platform_set_drvdata(pdev, s);
+
+       mutex_init(&s->sccnxp_mutex);
+
+       /* Individual chip settings */
+       switch (chiptype) {
+       case SCCNXP_TYPE_SC2681:
+               s->name         = "SC2681";
+               s->uart.nr      = 2;
+               s->freq_std     = 3686400;
+               s->addr_mask    = 0x0f;
+               s->flags        = SCCNXP_HAVE_IO;
+               fifosize        = 3;
+               freq_min        = 1000000;
+               freq_max        = 4000000;
+               break;
+       case SCCNXP_TYPE_SC2691:
+               s->name         = "SC2691";
+               s->uart.nr      = 1;
+               s->freq_std     = 3686400;
+               s->addr_mask    = 0x07;
+               s->flags        = 0;
+               fifosize        = 3;
+               freq_min        = 1000000;
+               freq_max        = 4000000;
+               break;
+       case SCCNXP_TYPE_SC2692:
+               s->name         = "SC2692";
+               s->uart.nr      = 2;
+               s->freq_std     = 3686400;
+               s->addr_mask    = 0x0f;
+               s->flags        = SCCNXP_HAVE_IO;
+               fifosize        = 3;
+               freq_min        = 1000000;
+               freq_max        = 4000000;
+               break;
+       case SCCNXP_TYPE_SC2891:
+               s->name         = "SC2891";
+               s->uart.nr      = 1;
+               s->freq_std     = 3686400;
+               s->addr_mask    = 0x0f;
+               s->flags        = SCCNXP_HAVE_IO | SCCNXP_HAVE_MR0;
+               fifosize        = 16;
+               freq_min        = 100000;
+               freq_max        = 8000000;
+               break;
+       case SCCNXP_TYPE_SC2892:
+               s->name         = "SC2892";
+               s->uart.nr      = 2;
+               s->freq_std     = 3686400;
+               s->addr_mask    = 0x0f;
+               s->flags        = SCCNXP_HAVE_IO | SCCNXP_HAVE_MR0;
+               fifosize        = 16;
+               freq_min        = 100000;
+               freq_max        = 8000000;
+               break;
+       case SCCNXP_TYPE_SC28202:
+               s->name         = "SC28202";
+               s->uart.nr      = 2;
+               s->freq_std     = 14745600;
+               s->addr_mask    = 0x7f;
+               s->flags        = SCCNXP_HAVE_IO | SCCNXP_HAVE_MR0;
+               fifosize        = 256;
+               freq_min        = 1000000;
+               freq_max        = 50000000;
+               break;
+       case SCCNXP_TYPE_SC68681:
+               s->name         = "SC68681";
+               s->uart.nr      = 2;
+               s->freq_std     = 3686400;
+               s->addr_mask    = 0x0f;
+               s->flags        = SCCNXP_HAVE_IO;
+               fifosize        = 3;
+               freq_min        = 1000000;
+               freq_max        = 4000000;
+               break;
+       case SCCNXP_TYPE_SC68692:
+               s->name         = "SC68692";
+               s->uart.nr      = 2;
+               s->freq_std     = 3686400;
+               s->addr_mask    = 0x0f;
+               s->flags        = SCCNXP_HAVE_IO;
+               fifosize        = 3;
+               freq_min        = 1000000;
+               freq_max        = 4000000;
+               break;
+       default:
+               dev_err(&pdev->dev, "Unsupported chip type %i\n", chiptype);
+               ret = -ENOTSUPP;
+               goto err_out;
+       }
+
+       if (!pdata) {
+               dev_warn(&pdev->dev,
+                        "No platform data supplied, using defaults\n");
+               s->pdata.frequency = s->freq_std;
+       } else
+               memcpy(&s->pdata, pdata, sizeof(struct sccnxp_pdata));
+
+       s->irq = platform_get_irq(pdev, 0);
+       if (s->irq <= 0) {
+               dev_err(&pdev->dev, "Missing irq resource data\n");
+               ret = -ENXIO;
+               goto err_out;
+       }
+
+       /* Check input frequency */
+       if ((s->pdata.frequency < freq_min) ||
+           (s->pdata.frequency > freq_max)) {
+               dev_err(&pdev->dev, "Frequency out of bounds\n");
+               ret = -EINVAL;
+               goto err_out;
+       }
+
+       membase = devm_request_and_ioremap(&pdev->dev, res);
+       if (!membase) {
+               dev_err(&pdev->dev, "Failed to ioremap\n");
+               ret = -EIO;
+               goto err_out;
+       }
+
+       s->uart.owner           = THIS_MODULE;
+       s->uart.dev_name        = "ttySC";
+       s->uart.major           = SCCNXP_MAJOR;
+       s->uart.minor           = SCCNXP_MINOR;
+#ifdef CONFIG_SERIAL_SCCNXP_CONSOLE
+       s->uart.cons            = &s->console;
+       s->uart.cons->device    = uart_console_device;
+       s->uart.cons->write     = sccnxp_console_write;
+       s->uart.cons->setup     = sccnxp_console_setup;
+       s->uart.cons->flags     = CON_PRINTBUFFER;
+       s->uart.cons->index     = -1;
+       s->uart.cons->data      = s;
+       strcpy(s->uart.cons->name, "ttySC");
+#endif
+       ret = uart_register_driver(&s->uart);
+       if (ret) {
+               dev_err(&pdev->dev, "Registering UART driver failed\n");
+               goto err_out;
+       }
+
+       for (i = 0; i < s->uart.nr; i++) {
+               s->port[i].line         = i;
+               s->port[i].dev          = &pdev->dev;
+               s->port[i].irq          = s->irq;
+               s->port[i].type         = PORT_SC26XX;
+               s->port[i].fifosize     = fifosize;
+               s->port[i].flags        = UPF_SKIP_TEST | UPF_FIXED_TYPE;
+               s->port[i].iotype       = UPIO_MEM;
+               s->port[i].mapbase      = res->start;
+               s->port[i].membase      = membase;
+               s->port[i].regshift     = s->pdata.reg_shift;
+               s->port[i].uartclk      = s->pdata.frequency;
+               s->port[i].ops          = &sccnxp_ops;
+               uart_add_one_port(&s->uart, &s->port[i]);
+               /* Set direction to input */
+               if (s->flags & SCCNXP_HAVE_IO)
+                       sccnxp_set_bit(&s->port[i], DIR_OP, 0);
+       }
+
+       /* Disable interrupts */
+       s->imr = 0;
+       sccnxp_write(&s->port[0], SCCNXP_IMR_REG, 0);
+
+       /* Board specific configure */
+       if (s->pdata.init)
+               s->pdata.init();
+
+       ret = devm_request_threaded_irq(&pdev->dev, s->irq, NULL, sccnxp_ist,
+                                       IRQF_TRIGGER_FALLING | IRQF_ONESHOT,
+                                       dev_name(&pdev->dev), s);
+       if (!ret)
+               return 0;
+
+       dev_err(&pdev->dev, "Unable to reguest IRQ %i\n", s->irq);
+
+err_out:
+       platform_set_drvdata(pdev, NULL);
+
+       return ret;
+}
+
+static int __devexit sccnxp_remove(struct platform_device *pdev)
+{
+       int i;
+       struct sccnxp_port *s = platform_get_drvdata(pdev);
+
+       devm_free_irq(&pdev->dev, s->irq, s);
+
+       for (i = 0; i < s->uart.nr; i++)
+               uart_remove_one_port(&s->uart, &s->port[i]);
+
+       uart_unregister_driver(&s->uart);
+       platform_set_drvdata(pdev, NULL);
+
+       if (s->pdata.exit)
+               s->pdata.exit();
+
+       return 0;
+}
+
+static const struct platform_device_id sccnxp_id_table[] = {
+       { "sc2681",     SCCNXP_TYPE_SC2681 },
+       { "sc2691",     SCCNXP_TYPE_SC2691 },
+       { "sc2692",     SCCNXP_TYPE_SC2692 },
+       { "sc2891",     SCCNXP_TYPE_SC2891 },
+       { "sc2892",     SCCNXP_TYPE_SC2892 },
+       { "sc28202",    SCCNXP_TYPE_SC28202 },
+       { "sc68681",    SCCNXP_TYPE_SC68681 },
+       { "sc68692",    SCCNXP_TYPE_SC68692 },
+};
+MODULE_DEVICE_TABLE(platform, sccnxp_id_table);
+
+static struct platform_driver sccnxp_uart_driver = {
+       .driver = {
+               .name   = SCCNXP_NAME,
+               .owner  = THIS_MODULE,
+       },
+       .probe          = sccnxp_probe,
+       .remove         = __devexit_p(sccnxp_remove),
+       .id_table       = sccnxp_id_table,
+};
+module_platform_driver(sccnxp_uart_driver);
+
+MODULE_LICENSE("GPL v2");
+MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>");
+MODULE_DESCRIPTION("SCCNXP serial driver");
index a21dc8e..046279c 100644 (file)
@@ -159,7 +159,7 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
        retval = uport->ops->startup(uport);
        if (retval == 0) {
                if (uart_console(uport) && uport->cons->cflag) {
-                       tty->termios->c_cflag = uport->cons->cflag;
+                       tty->termios.c_cflag = uport->cons->cflag;
                        uport->cons->cflag = 0;
                }
                /*
@@ -172,11 +172,11 @@ static int uart_port_startup(struct tty_struct *tty, struct uart_state *state,
                         * Setup the RTS and DTR signals once the
                         * port is open and ready to respond.
                         */
-                       if (tty->termios->c_cflag & CBAUD)
+                       if (tty->termios.c_cflag & CBAUD)
                                uart_set_mctrl(uport, TIOCM_RTS | TIOCM_DTR);
                }
 
-               if (port->flags & ASYNC_CTS_FLOW) {
+               if (tty_port_cts_enabled(port)) {
                        spin_lock_irq(&uport->lock);
                        if (!(uport->ops->get_mctrl(uport) & TIOCM_CTS))
                                tty->hw_stopped = 1;
@@ -240,7 +240,7 @@ static void uart_shutdown(struct tty_struct *tty, struct uart_state *state)
                /*
                 * Turn off DTR and RTS early.
                 */
-               if (!tty || (tty->termios->c_cflag & HUPCL))
+               if (!tty || (tty->termios.c_cflag & HUPCL))
                        uart_clear_mctrl(uport, TIOCM_DTR | TIOCM_RTS);
 
                uart_port_shutdown(port);
@@ -440,10 +440,10 @@ static void uart_change_speed(struct tty_struct *tty, struct uart_state *state,
         * If we have no tty, termios, or the port does not exist,
         * then we can't set the parameters for this port.
         */
-       if (!tty || !tty->termios || uport->type == PORT_UNKNOWN)
+       if (!tty || uport->type == PORT_UNKNOWN)
                return;
 
-       termios = tty->termios;
+       termios = &tty->termios;
 
        /*
         * Set flags based on termios cflag
@@ -614,7 +614,7 @@ static void uart_throttle(struct tty_struct *tty)
        if (I_IXOFF(tty))
                uart_send_xchar(tty, STOP_CHAR(tty));
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                uart_clear_mctrl(state->uart_port, TIOCM_RTS);
 }
 
@@ -630,42 +630,48 @@ static void uart_unthrottle(struct tty_struct *tty)
                        uart_send_xchar(tty, START_CHAR(tty));
        }
 
-       if (tty->termios->c_cflag & CRTSCTS)
+       if (tty->termios.c_cflag & CRTSCTS)
                uart_set_mctrl(port, TIOCM_RTS);
 }
 
-static int uart_get_info(struct uart_state *state,
-                        struct serial_struct __user *retinfo)
+static void uart_get_info(struct tty_port *port,
+                        struct uart_state *state,
+                       struct serial_struct *retinfo)
 {
        struct uart_port *uport = state->uart_port;
-       struct tty_port *port = &state->port;
-       struct serial_struct tmp;
-
-       memset(&tmp, 0, sizeof(tmp));
 
-       /* Ensure the state we copy is consistent and no hardware changes
-          occur as we go */
-       mutex_lock(&port->mutex);
+       memset(retinfo, 0, sizeof(*retinfo));
 
-       tmp.type            = uport->type;
-       tmp.line            = uport->line;
-       tmp.port            = uport->iobase;
+       retinfo->type       = uport->type;
+       retinfo->line       = uport->line;
+       retinfo->port       = uport->iobase;
        if (HIGH_BITS_OFFSET)
-               tmp.port_high = (long) uport->iobase >> HIGH_BITS_OFFSET;
-       tmp.irq             = uport->irq;
-       tmp.flags           = uport->flags;
-       tmp.xmit_fifo_size  = uport->fifosize;
-       tmp.baud_base       = uport->uartclk / 16;
-       tmp.close_delay     = jiffies_to_msecs(port->close_delay) / 10;
-       tmp.closing_wait    = port->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
+               retinfo->port_high = (long) uport->iobase >> HIGH_BITS_OFFSET;
+       retinfo->irq                = uport->irq;
+       retinfo->flags      = uport->flags;
+       retinfo->xmit_fifo_size  = uport->fifosize;
+       retinfo->baud_base          = uport->uartclk / 16;
+       retinfo->close_delay        = jiffies_to_msecs(port->close_delay) / 10;
+       retinfo->closing_wait    = port->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
                                ASYNC_CLOSING_WAIT_NONE :
                                jiffies_to_msecs(port->closing_wait) / 10;
-       tmp.custom_divisor  = uport->custom_divisor;
-       tmp.hub6            = uport->hub6;
-       tmp.io_type         = uport->iotype;
-       tmp.iomem_reg_shift = uport->regshift;
-       tmp.iomem_base      = (void *)(unsigned long)uport->mapbase;
+       retinfo->custom_divisor  = uport->custom_divisor;
+       retinfo->hub6       = uport->hub6;
+       retinfo->io_type         = uport->iotype;
+       retinfo->iomem_reg_shift = uport->regshift;
+       retinfo->iomem_base      = (void *)(unsigned long)uport->mapbase;
+}
 
+static int uart_get_info_user(struct uart_state *state,
+                        struct serial_struct __user *retinfo)
+{
+       struct tty_port *port = &state->port;
+       struct serial_struct tmp;
+
+       /* Ensure the state we copy is consistent and no hardware changes
+          occur as we go */
+       mutex_lock(&port->mutex);
+       uart_get_info(port, state, &tmp);
        mutex_unlock(&port->mutex);
 
        if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
@@ -673,42 +679,30 @@ static int uart_get_info(struct uart_state *state,
        return 0;
 }
 
-static int uart_set_info(struct tty_struct *tty, struct uart_state *state,
-                        struct serial_struct __user *newinfo)
+static int uart_set_info(struct tty_struct *tty, struct tty_port *port,
+                        struct uart_state *state,
+                        struct serial_struct *new_info)
 {
-       struct serial_struct new_serial;
        struct uart_port *uport = state->uart_port;
-       struct tty_port *port = &state->port;
        unsigned long new_port;
        unsigned int change_irq, change_port, closing_wait;
        unsigned int old_custom_divisor, close_delay;
        upf_t old_flags, new_flags;
        int retval = 0;
 
-       if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
-               return -EFAULT;
-
-       new_port = new_serial.port;
+       new_port = new_info->port;
        if (HIGH_BITS_OFFSET)
-               new_port += (unsigned long) new_serial.port_high << HIGH_BITS_OFFSET;
+               new_port += (unsigned long) new_info->port_high << HIGH_BITS_OFFSET;
 
-       new_serial.irq = irq_canonicalize(new_serial.irq);
-       close_delay = msecs_to_jiffies(new_serial.close_delay * 10);
-       closing_wait = new_serial.closing_wait == ASYNC_CLOSING_WAIT_NONE ?
+       new_info->irq = irq_canonicalize(new_info->irq);
+       close_delay = msecs_to_jiffies(new_info->close_delay * 10);
+       closing_wait = new_info->closing_wait == ASYNC_CLOSING_WAIT_NONE ?
                        ASYNC_CLOSING_WAIT_NONE :
-                       msecs_to_jiffies(new_serial.closing_wait * 10);
+                       msecs_to_jiffies(new_info->closing_wait * 10);
 
-       /*
-        * This semaphore protects port->count.  It is also
-        * very useful to prevent opens.  Also, take the
-        * port configuration semaphore to make sure that a
-        * module insertion/removal doesn't change anything
-        * under us.
-        */
-       mutex_lock(&port->mutex);
 
        change_irq  = !(uport->flags & UPF_FIXED_PORT)
-               && new_serial.irq != uport->irq;
+               && new_info->irq != uport->irq;
 
        /*
         * Since changing the 'type' of the port changes its resource
@@ -717,29 +711,29 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state,
         */
        change_port = !(uport->flags & UPF_FIXED_PORT)
                && (new_port != uport->iobase ||
-                   (unsigned long)new_serial.iomem_base != uport->mapbase ||
-                   new_serial.hub6 != uport->hub6 ||
-                   new_serial.io_type != uport->iotype ||
-                   new_serial.iomem_reg_shift != uport->regshift ||
-                   new_serial.type != uport->type);
+                   (unsigned long)new_info->iomem_base != uport->mapbase ||
+                   new_info->hub6 != uport->hub6 ||
+                   new_info->io_type != uport->iotype ||
+                   new_info->iomem_reg_shift != uport->regshift ||
+                   new_info->type != uport->type);
 
        old_flags = uport->flags;
-       new_flags = new_serial.flags;
+       new_flags = new_info->flags;
        old_custom_divisor = uport->custom_divisor;
 
        if (!capable(CAP_SYS_ADMIN)) {
                retval = -EPERM;
                if (change_irq || change_port ||
-                   (new_serial.baud_base != uport->uartclk / 16) ||
+                   (new_info->baud_base != uport->uartclk / 16) ||
                    (close_delay != port->close_delay) ||
                    (closing_wait != port->closing_wait) ||
-                   (new_serial.xmit_fifo_size &&
-                    new_serial.xmit_fifo_size != uport->fifosize) ||
+                   (new_info->xmit_fifo_size &&
+                    new_info->xmit_fifo_size != uport->fifosize) ||
                    (((new_flags ^ old_flags) & ~UPF_USR_MASK) != 0))
                        goto exit;
                uport->flags = ((uport->flags & ~UPF_USR_MASK) |
                               (new_flags & UPF_USR_MASK));
-               uport->custom_divisor = new_serial.custom_divisor;
+               uport->custom_divisor = new_info->custom_divisor;
                goto check_and_exit;
        }
 
@@ -747,10 +741,10 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state,
         * Ask the low level driver to verify the settings.
         */
        if (uport->ops->verify_port)
-               retval = uport->ops->verify_port(uport, &new_serial);
+               retval = uport->ops->verify_port(uport, new_info);
 
-       if ((new_serial.irq >= nr_irqs) || (new_serial.irq < 0) ||
-           (new_serial.baud_base < 9600))
+       if ((new_info->irq >= nr_irqs) || (new_info->irq < 0) ||
+           (new_info->baud_base < 9600))
                retval = -EINVAL;
 
        if (retval)
@@ -790,11 +784,11 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state,
                        uport->ops->release_port(uport);
 
                uport->iobase = new_port;
-               uport->type = new_serial.type;
-               uport->hub6 = new_serial.hub6;
-               uport->iotype = new_serial.io_type;
-               uport->regshift = new_serial.iomem_reg_shift;
-               uport->mapbase = (unsigned long)new_serial.iomem_base;
+               uport->type = new_info->type;
+               uport->hub6 = new_info->hub6;
+               uport->iotype = new_info->io_type;
+               uport->regshift = new_info->iomem_reg_shift;
+               uport->mapbase = (unsigned long)new_info->iomem_base;
 
                /*
                 * Claim and map the new regions
@@ -835,16 +829,16 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state,
        }
 
        if (change_irq)
-               uport->irq      = new_serial.irq;
+               uport->irq      = new_info->irq;
        if (!(uport->flags & UPF_FIXED_PORT))
-               uport->uartclk  = new_serial.baud_base * 16;
+               uport->uartclk  = new_info->baud_base * 16;
        uport->flags            = (uport->flags & ~UPF_CHANGE_MASK) |
                                 (new_flags & UPF_CHANGE_MASK);
-       uport->custom_divisor   = new_serial.custom_divisor;
+       uport->custom_divisor   = new_info->custom_divisor;
        port->close_delay     = close_delay;
        port->closing_wait    = closing_wait;
-       if (new_serial.xmit_fifo_size)
-               uport->fifosize = new_serial.xmit_fifo_size;
+       if (new_info->xmit_fifo_size)
+               uport->fifosize = new_info->xmit_fifo_size;
        if (port->tty)
                port->tty->low_latency =
                        (uport->flags & UPF_LOW_LATENCY) ? 1 : 0;
@@ -873,6 +867,28 @@ static int uart_set_info(struct tty_struct *tty, struct uart_state *state,
        } else
                retval = uart_startup(tty, state, 1);
  exit:
+       return retval;
+}
+
+static int uart_set_info_user(struct tty_struct *tty, struct uart_state *state,
+                        struct serial_struct __user *newinfo)
+{
+       struct serial_struct new_serial;
+       struct tty_port *port = &state->port;
+       int retval;
+
+       if (copy_from_user(&new_serial, newinfo, sizeof(new_serial)))
+               return -EFAULT;
+
+       /*
+        * This semaphore protects port->count.  It is also
+        * very useful to prevent opens.  Also, take the
+        * port configuration semaphore to make sure that a
+        * module insertion/removal doesn't change anything
+        * under us.
+        */
+       mutex_lock(&port->mutex);
+       retval = uart_set_info(tty, port, state, &new_serial);
        mutex_unlock(&port->mutex);
        return retval;
 }
@@ -1115,11 +1131,11 @@ uart_ioctl(struct tty_struct *tty, unsigned int cmd,
         */
        switch (cmd) {
        case TIOCGSERIAL:
-               ret = uart_get_info(state, uarg);
+               ret = uart_get_info_user(state, uarg);
                break;
 
        case TIOCSSERIAL:
-               ret = uart_set_info(tty, state, uarg);
+               ret = uart_set_info_user(tty, state, uarg);
                break;
 
        case TIOCSERCONFIG:
@@ -1187,7 +1203,7 @@ static void uart_set_ldisc(struct tty_struct *tty)
        struct uart_port *uport = state->uart_port;
 
        if (uport->ops->set_ldisc)
-               uport->ops->set_ldisc(uport, tty->termios->c_line);
+               uport->ops->set_ldisc(uport, tty->termios.c_line);
 }
 
 static void uart_set_termios(struct tty_struct *tty,
@@ -1195,7 +1211,7 @@ static void uart_set_termios(struct tty_struct *tty,
 {
        struct uart_state *state = tty->driver_data;
        unsigned long flags;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
 
        /*
@@ -1206,9 +1222,9 @@ static void uart_set_termios(struct tty_struct *tty,
         */
 #define RELEVANT_IFLAG(iflag)  ((iflag) & (IGNBRK|BRKINT|IGNPAR|PARMRK|INPCK))
        if ((cflag ^ old_termios->c_cflag) == 0 &&
-           tty->termios->c_ospeed == old_termios->c_ospeed &&
-           tty->termios->c_ispeed == old_termios->c_ispeed &&
-           RELEVANT_IFLAG(tty->termios->c_iflag ^ old_termios->c_iflag) == 0) {
+           tty->termios.c_ospeed == old_termios->c_ospeed &&
+           tty->termios.c_ispeed == old_termios->c_ispeed &&
+           RELEVANT_IFLAG(tty->termios.c_iflag ^ old_termios->c_iflag) == 0) {
                return;
        }
 
@@ -1960,8 +1976,8 @@ int uart_resume_port(struct uart_driver *drv, struct uart_port *uport)
                /*
                 * If that's unset, use the tty termios setting.
                 */
-               if (port->tty && port->tty->termios && termios.c_cflag == 0)
-                       termios = *(port->tty->termios);
+               if (port->tty && termios.c_cflag == 0)
+                       termios = port->tty->termios;
 
                if (console_suspend_enabled)
                        uart_change_pm(state, 0);
@@ -2293,6 +2309,36 @@ struct tty_driver *uart_console_device(struct console *co, int *index)
        return p->tty_driver;
 }
 
+static ssize_t uart_get_attr_uartclk(struct device *dev,
+       struct device_attribute *attr, char *buf)
+{
+       int ret;
+       struct tty_port *port = dev_get_drvdata(dev);
+       struct uart_state *state = container_of(port, struct uart_state, port);
+
+       mutex_lock(&state->port.mutex);
+       ret = snprintf(buf, PAGE_SIZE, "%d\n", state->uart_port->uartclk);
+       mutex_unlock(&state->port.mutex);
+
+       return ret;
+}
+
+static DEVICE_ATTR(uartclk, S_IRUSR | S_IRGRP, uart_get_attr_uartclk, NULL);
+
+static struct attribute *tty_dev_attrs[] = {
+       &dev_attr_uartclk.attr,
+       NULL,
+       };
+
+static const struct attribute_group tty_dev_attr_group = {
+       .attrs = tty_dev_attrs,
+       };
+
+static const struct attribute_group *tty_dev_attr_groups[] = {
+       &tty_dev_attr_group,
+       NULL
+       };
+
 /**
  *     uart_add_one_port - attach a driver-defined port structure
  *     @drv: pointer to the uart low level driver structure for this port
@@ -2346,7 +2392,8 @@ int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport)
         * Register the port whether it's detected or not.  This allows
         * setserial to be used to alter this ports parameters.
         */
-       tty_dev = tty_register_device(drv->tty_driver, uport->line, uport->dev);
+       tty_dev = tty_port_register_device_attr(port, drv->tty_driver,
+                       uport->line, uport->dev, port, tty_dev_attr_groups);
        if (likely(!IS_ERR(tty_dev))) {
                device_set_wakeup_capable(tty_dev, 1);
        } else {
@@ -2492,7 +2539,7 @@ void uart_handle_cts_change(struct uart_port *uport, unsigned int status)
 
        uport->icount.cts++;
 
-       if (port->flags & ASYNC_CTS_FLOW) {
+       if (tty_port_cts_enabled(port)) {
                if (tty->hw_stopped) {
                        if (status) {
                                tty->hw_stopped = 0;
index 5b3eda2..a9e2bd1 100644 (file)
@@ -668,7 +668,7 @@ int sirfsoc_uart_probe(struct platform_device *pdev)
        if (res == NULL) {
                dev_err(&pdev->dev, "Insufficient resources.\n");
                ret = -EFAULT;
-               goto irq_err;
+               goto err;
        }
        port->irq = res->start;
 
@@ -676,7 +676,7 @@ int sirfsoc_uart_probe(struct platform_device *pdev)
                sirfport->p = pinctrl_get_select_default(&pdev->dev);
                ret = IS_ERR(sirfport->p);
                if (ret)
-                       goto pin_err;
+                       goto err;
        }
 
        port->ops = &sirfsoc_uart_ops;
@@ -695,9 +695,6 @@ port_err:
        platform_set_drvdata(pdev, NULL);
        if (sirfport->hw_flow_ctrl)
                pinctrl_put(sirfport->p);
-pin_err:
-irq_err:
-       devm_iounmap(&pdev->dev, port->membase);
 err:
        return ret;
 }
@@ -709,7 +706,6 @@ static int sirfsoc_uart_remove(struct platform_device *pdev)
        platform_set_drvdata(pdev, NULL);
        if (sirfport->hw_flow_ctrl)
                pinctrl_put(sirfport->p);
-       devm_iounmap(&pdev->dev, port->membase);
        uart_remove_one_port(&sirfsoc_uart_drv, port);
        return 0;
 }
index 675303b..b97913d 100644 (file)
 enum su_type { SU_PORT_NONE, SU_PORT_MS, SU_PORT_KBD, SU_PORT_PORT };
 static char *su_typev[] = { "su(???)", "su(mouse)", "su(kbd)", "su(serial)" };
 
+struct serial_uart_config {
+       char    *name;
+       int     dfl_xmit_fifo_size;
+       int     flags;
+};
+
 /*
  * Here we define the default xmit fifo size used for each type of UART.
  */
-static const struct serial_uart_config uart_config[PORT_MAX_8250+1] = {
+static const struct serial_uart_config uart_config[] = {
        { "unknown",    1,      0 },
        { "8250",       1,      0 },
        { "16450",      1,      0 },
index 593d40a..70e3a52 100644 (file)
@@ -1359,7 +1359,7 @@ static void mgsl_isr_io_pin( struct mgsl_struct *info )
                        }
                }
        
-               if ( (info->port.flags & ASYNC_CTS_FLOW) && 
+               if (tty_port_cts_enabled(&info->port) &&
                     (status & MISCSTATUS_CTS_LATCHED) ) {
                        if (info->port.tty->hw_stopped) {
                                if (status & MISCSTATUS_CTS) {
@@ -1840,22 +1840,22 @@ static void shutdown(struct mgsl_struct * info)
        usc_DisableInterrupts(info,RECEIVE_DATA + RECEIVE_STATUS +
                TRANSMIT_DATA + TRANSMIT_STATUS + IO_PIN + MISC );
        usc_DisableDmaInterrupts(info,DICR_MASTER + DICR_TRANSMIT + DICR_RECEIVE);
-       
+
        /* Disable DMAEN (Port 7, Bit 14) */
        /* This disconnects the DMA request signal from the ISA bus */
        /* on the ISA adapter. This has no effect for the PCI adapter */
        usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT15) | BIT14));
-       
+
        /* Disable INTEN (Port 6, Bit12) */
        /* This disconnects the IRQ request signal to the ISA bus */
        /* on the ISA adapter. This has no effect for the PCI adapter */
        usc_OutReg(info, PCR, (u16)((usc_InReg(info, PCR) | BIT13) | BIT12));
-       
-       if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) {
+
+       if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
                info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
                usc_set_serial_signals(info);
        }
-       
+
        spin_unlock_irqrestore(&info->irq_spinlock,flags);
 
        mgsl_release_resources(info);   
@@ -1895,7 +1895,7 @@ static void mgsl_program_hw(struct mgsl_struct *info)
        usc_EnableInterrupts(info, IO_PIN);
        usc_get_serial_signals(info);
                
-       if (info->netcount || info->port.tty->termios->c_cflag & CREAD)
+       if (info->netcount || info->port.tty->termios.c_cflag & CREAD)
                usc_start_receiver(info);
                
        spin_unlock_irqrestore(&info->irq_spinlock,flags);
@@ -1908,14 +1908,14 @@ static void mgsl_change_params(struct mgsl_struct *info)
        unsigned cflag;
        int bits_per_char;
 
-       if (!info->port.tty || !info->port.tty->termios)
+       if (!info->port.tty)
                return;
                
        if (debug_level >= DEBUG_LEVEL_INFO)
                printk("%s(%d):mgsl_change_params(%s)\n",
                         __FILE__,__LINE__, info->device_name );
                         
-       cflag = info->port.tty->termios->c_cflag;
+       cflag = info->port.tty->termios.c_cflag;
 
        /* if B0 rate (hangup) specified then negate DTR and RTS */
        /* otherwise assert DTR and RTS */
@@ -2367,8 +2367,8 @@ static void mgsl_throttle(struct tty_struct * tty)
        
        if (I_IXOFF(tty))
                mgsl_send_xchar(tty, STOP_CHAR(tty));
-       if (tty->termios->c_cflag & CRTSCTS) {
+
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->irq_spinlock,flags);
                info->serial_signals &= ~SerialSignal_RTS;
                usc_set_serial_signals(info);
@@ -2401,8 +2401,8 @@ static void mgsl_unthrottle(struct tty_struct * tty)
                else
                        mgsl_send_xchar(tty, START_CHAR(tty));
        }
-       
-       if (tty->termios->c_cflag & CRTSCTS) {
+
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->irq_spinlock,flags);
                info->serial_signals |= SerialSignal_RTS;
                usc_set_serial_signals(info);
@@ -3045,7 +3045,7 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio
 
        /* Handle transition to B0 status */
        if (old_termios->c_cflag & CBAUD &&
-           !(tty->termios->c_cflag & CBAUD)) {
+           !(tty->termios.c_cflag & CBAUD)) {
                info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
                spin_lock_irqsave(&info->irq_spinlock,flags);
                usc_set_serial_signals(info);
@@ -3054,9 +3054,9 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio
        
        /* Handle transition away from B0 status */
        if (!(old_termios->c_cflag & CBAUD) &&
-           tty->termios->c_cflag & CBAUD) {
+           tty->termios.c_cflag & CBAUD) {
                info->serial_signals |= SerialSignal_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) || 
+               if (!(tty->termios.c_cflag & CRTSCTS) || 
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        info->serial_signals |= SerialSignal_RTS;
                }
@@ -3067,7 +3067,7 @@ static void mgsl_set_termios(struct tty_struct *tty, struct ktermios *old_termio
        
        /* Handle turning off CRTSCTS */
        if (old_termios->c_cflag & CRTSCTS &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                mgsl_start(tty);
        }
@@ -3287,7 +3287,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL)
+       if (tty->termios.c_cflag & CLOCAL)
                do_clocal = true;
 
        /* Wait for carrier detect and the line to become
@@ -3313,7 +3313,7 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
        port->blocked_open++;
        
        while (1) {
-               if (tty->termios->c_cflag & CBAUD)
+               if (tty->termios.c_cflag & CBAUD)
                        tty_port_raise_dtr_rts(port);
                
                set_current_state(TASK_INTERRUPTIBLE);
@@ -3338,9 +3338,9 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
                        printk("%s(%d):block_til_ready blocking on %s count=%d\n",
                                 __FILE__,__LINE__, tty->driver->name, port->count );
                                 
-               tty_unlock();
+               tty_unlock(tty);
                schedule();
-               tty_lock();
+               tty_lock(tty);
        }
        
        set_current_state(TASK_RUNNING);
@@ -3362,6 +3362,29 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
        
 }      /* end of block_til_ready() */
 
+static int mgsl_install(struct tty_driver *driver, struct tty_struct *tty)
+{
+       struct mgsl_struct *info;
+       int line = tty->index;
+
+       /* verify range of specified line number */
+       if (line >= mgsl_device_count) {
+               printk("%s(%d):mgsl_open with invalid line #%d.\n",
+                       __FILE__, __LINE__, line);
+               return -ENODEV;
+       }
+
+       /* find the info structure for the specified line */
+       info = mgsl_device_list;
+       while (info && info->line != line)
+               info = info->next_device;
+       if (mgsl_paranoia_check(info, tty->name, "mgsl_open"))
+               return -ENODEV;
+       tty->driver_data = info;
+
+       return tty_port_install(&info->port, driver, tty);
+}
+
 /* mgsl_open()
  *
  *     Called when a port is opened.  Init and enable port.
@@ -3374,26 +3397,10 @@ static int block_til_ready(struct tty_struct *tty, struct file * filp,
  */
 static int mgsl_open(struct tty_struct *tty, struct file * filp)
 {
-       struct mgsl_struct      *info;
-       int                     retval, line;
+       struct mgsl_struct *info = tty->driver_data;
        unsigned long flags;
+       int retval;
 
-       /* verify range of specified line number */     
-       line = tty->index;
-       if (line >= mgsl_device_count) {
-               printk("%s(%d):mgsl_open with invalid line #%d.\n",
-                       __FILE__,__LINE__,line);
-               return -ENODEV;
-       }
-
-       /* find the info structure for the specified line */
-       info = mgsl_device_list;
-       while(info && info->line != line)
-               info = info->next_device;
-       if (mgsl_paranoia_check(info, tty->name, "mgsl_open"))
-               return -ENODEV;
-       
-       tty->driver_data = info;
        info->port.tty = tty;
                
        if (debug_level >= DEBUG_LEVEL_INFO)
@@ -4297,6 +4304,7 @@ static struct mgsl_struct* mgsl_allocate_device(void)
 }      /* end of mgsl_allocate_device()*/
 
 static const struct tty_operations mgsl_ops = {
+       .install = mgsl_install,
        .open = mgsl_open,
        .close = mgsl_close,
        .write = mgsl_write,
index aa1debf..b38e954 100644 (file)
@@ -785,7 +785,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
        /* Handle transition to B0 status */
        if (old_termios->c_cflag & CBAUD &&
-           !(tty->termios->c_cflag & CBAUD)) {
+           !(tty->termios.c_cflag & CBAUD)) {
                info->signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
                spin_lock_irqsave(&info->lock,flags);
                set_signals(info);
@@ -794,9 +794,9 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
        /* Handle transition away from B0 status */
        if (!(old_termios->c_cflag & CBAUD) &&
-           tty->termios->c_cflag & CBAUD) {
+           tty->termios.c_cflag & CBAUD) {
                info->signals |= SerialSignal_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) ||
+               if (!(tty->termios.c_cflag & CRTSCTS) ||
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        info->signals |= SerialSignal_RTS;
                }
@@ -807,7 +807,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
        /* Handle turning off CRTSCTS */
        if (old_termios->c_cflag & CRTSCTS &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                tx_release(tty);
        }
@@ -1372,7 +1372,7 @@ static void throttle(struct tty_struct * tty)
        DBGINFO(("%s throttle\n", info->device_name));
        if (I_IXOFF(tty))
                send_xchar(tty, STOP_CHAR(tty));
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->signals &= ~SerialSignal_RTS;
                set_signals(info);
@@ -1397,7 +1397,7 @@ static void unthrottle(struct tty_struct * tty)
                else
                        send_xchar(tty, START_CHAR(tty));
        }
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->signals |= SerialSignal_RTS;
                set_signals(info);
@@ -2053,7 +2053,7 @@ static void cts_change(struct slgt_info *info, unsigned short status)
        wake_up_interruptible(&info->event_wait_q);
        info->pending_bh |= BH_STATUS;
 
-       if (info->port.flags & ASYNC_CTS_FLOW) {
+       if (tty_port_cts_enabled(&info->port)) {
                if (info->port.tty) {
                        if (info->port.tty->hw_stopped) {
                                if (info->signals & SerialSignal_CTS) {
@@ -2493,7 +2493,7 @@ static void shutdown(struct slgt_info *info)
 
        slgt_irq_off(info, IRQ_ALL | IRQ_MASTER);
 
-       if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) {
+       if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
                info->signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
                set_signals(info);
        }
@@ -2534,7 +2534,7 @@ static void program_hw(struct slgt_info *info)
        get_signals(info);
 
        if (info->netcount ||
-           (info->port.tty && info->port.tty->termios->c_cflag & CREAD))
+           (info->port.tty && info->port.tty->termios.c_cflag & CREAD))
                rx_start(info);
 
        spin_unlock_irqrestore(&info->lock,flags);
@@ -2548,11 +2548,11 @@ static void change_params(struct slgt_info *info)
        unsigned cflag;
        int bits_per_char;
 
-       if (!info->port.tty || !info->port.tty->termios)
+       if (!info->port.tty)
                return;
        DBGINFO(("%s change_params\n", info->device_name));
 
-       cflag = info->port.tty->termios->c_cflag;
+       cflag = info->port.tty->termios.c_cflag;
 
        /* if B0 rate (hangup) specified then negate DTR and RTS */
        /* otherwise assert DTR and RTS */
@@ -3292,7 +3292,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL)
+       if (tty->termios.c_cflag & CLOCAL)
                do_clocal = true;
 
        /* Wait for carrier detect and the line to become
@@ -3314,7 +3314,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
        port->blocked_open++;
 
        while (1) {
-               if ((tty->termios->c_cflag & CBAUD))
+               if ((tty->termios.c_cflag & CBAUD))
                        tty_port_raise_dtr_rts(port);
 
                set_current_state(TASK_INTERRUPTIBLE);
@@ -3336,9 +3336,9 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
                }
 
                DBGINFO(("%s block_til_ready wait\n", tty->driver->name));
-               tty_unlock();
+               tty_unlock(tty);
                schedule();
-               tty_lock();
+               tty_lock(tty);
        }
 
        set_current_state(TASK_RUNNING);
@@ -3689,8 +3689,11 @@ static void device_init(int adapter_num, struct pci_dev *pdev)
                }
        }
 
-       for (i=0; i < port_count; ++i)
-               tty_register_device(serial_driver, port_array[i]->line, &(port_array[i]->pdev->dev));
+       for (i = 0; i < port_count; ++i) {
+               struct slgt_info *info = port_array[i];
+               tty_port_register_device(&info->port, serial_driver, info->line,
+                               &info->pdev->dev);
+       }
 }
 
 static int __devinit init_one(struct pci_dev *dev,
index a3dddc1..f17d9f3 100644 (file)
@@ -711,15 +711,11 @@ static void ldisc_receive_buf(struct tty_struct *tty,
 
 /* tty callbacks */
 
-/* Called when a port is opened.  Init and enable port.
- */
-static int open(struct tty_struct *tty, struct file *filp)
+static int install(struct tty_driver *driver, struct tty_struct *tty)
 {
        SLMP_INFO *info;
-       int retval, line;
-       unsigned long flags;
+       int line = tty->index;
 
-       line = tty->index;
        if (line >= synclinkmp_device_count) {
                printk("%s(%d): open with invalid line #%d.\n",
                        __FILE__,__LINE__,line);
@@ -727,17 +723,30 @@ static int open(struct tty_struct *tty, struct file *filp)
        }
 
        info = synclinkmp_device_list;
-       while(info && info->line != line)
+       while (info && info->line != line)
                info = info->next_device;
        if (sanity_check(info, tty->name, "open"))
                return -ENODEV;
-       if ( info->init_error ) {
+       if (info->init_error) {
                printk("%s(%d):%s device is not allocated, init error=%d\n",
-                       __FILE__,__LINE__,info->device_name,info->init_error);
+                       __FILE__, __LINE__, info->device_name,
+                       info->init_error);
                return -ENODEV;
        }
 
        tty->driver_data = info;
+
+       return tty_port_install(&info->port, driver, tty);
+}
+
+/* Called when a port is opened.  Init and enable port.
+ */
+static int open(struct tty_struct *tty, struct file *filp)
+{
+       SLMP_INFO *info = tty->driver_data;
+       unsigned long flags;
+       int retval;
+
        info->port.tty = tty;
 
        if (debug_level >= DEBUG_LEVEL_INFO)
@@ -873,7 +882,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
        /* Handle transition to B0 status */
        if (old_termios->c_cflag & CBAUD &&
-           !(tty->termios->c_cflag & CBAUD)) {
+           !(tty->termios.c_cflag & CBAUD)) {
                info->serial_signals &= ~(SerialSignal_RTS + SerialSignal_DTR);
                spin_lock_irqsave(&info->lock,flags);
                set_signals(info);
@@ -882,9 +891,9 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
        /* Handle transition away from B0 status */
        if (!(old_termios->c_cflag & CBAUD) &&
-           tty->termios->c_cflag & CBAUD) {
+           tty->termios.c_cflag & CBAUD) {
                info->serial_signals |= SerialSignal_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) ||
+               if (!(tty->termios.c_cflag & CRTSCTS) ||
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        info->serial_signals |= SerialSignal_RTS;
                }
@@ -895,7 +904,7 @@ static void set_termios(struct tty_struct *tty, struct ktermios *old_termios)
 
        /* Handle turning off CRTSCTS */
        if (old_termios->c_cflag & CRTSCTS &&
-           !(tty->termios->c_cflag & CRTSCTS)) {
+           !(tty->termios.c_cflag & CRTSCTS)) {
                tty->hw_stopped = 0;
                tx_release(tty);
        }
@@ -1473,7 +1482,7 @@ static void throttle(struct tty_struct * tty)
        if (I_IXOFF(tty))
                send_xchar(tty, STOP_CHAR(tty));
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->serial_signals &= ~SerialSignal_RTS;
                set_signals(info);
@@ -1502,7 +1511,7 @@ static void unthrottle(struct tty_struct * tty)
                        send_xchar(tty, START_CHAR(tty));
        }
 
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                spin_lock_irqsave(&info->lock,flags);
                info->serial_signals |= SerialSignal_RTS;
                set_signals(info);
@@ -2491,7 +2500,7 @@ static void isr_io_pin( SLMP_INFO *info, u16 status )
                        }
                }
 
-               if ( (info->port.flags & ASYNC_CTS_FLOW) &&
+               if (tty_port_cts_enabled(&info->port) &&
                     (status & MISCSTATUS_CTS_LATCHED) ) {
                        if ( info->port.tty ) {
                                if (info->port.tty->hw_stopped) {
@@ -2708,7 +2717,7 @@ static void shutdown(SLMP_INFO * info)
 
        reset_port(info);
 
-       if (!info->port.tty || info->port.tty->termios->c_cflag & HUPCL) {
+       if (!info->port.tty || info->port.tty->termios.c_cflag & HUPCL) {
                info->serial_signals &= ~(SerialSignal_DTR + SerialSignal_RTS);
                set_signals(info);
        }
@@ -2749,7 +2758,7 @@ static void program_hw(SLMP_INFO *info)
 
        get_signals(info);
 
-       if (info->netcount || (info->port.tty && info->port.tty->termios->c_cflag & CREAD) )
+       if (info->netcount || (info->port.tty && info->port.tty->termios.c_cflag & CREAD) )
                rx_start(info);
 
        spin_unlock_irqrestore(&info->lock,flags);
@@ -2762,14 +2771,14 @@ static void change_params(SLMP_INFO *info)
        unsigned cflag;
        int bits_per_char;
 
-       if (!info->port.tty || !info->port.tty->termios)
+       if (!info->port.tty)
                return;
 
        if (debug_level >= DEBUG_LEVEL_INFO)
                printk("%s(%d):%s change_params()\n",
                         __FILE__,__LINE__, info->device_name );
 
-       cflag = info->port.tty->termios->c_cflag;
+       cflag = info->port.tty->termios.c_cflag;
 
        /* if B0 rate (hangup) specified then negate DTR and RTS */
        /* otherwise assert DTR and RTS */
@@ -3306,7 +3315,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL)
+       if (tty->termios.c_cflag & CLOCAL)
                do_clocal = true;
 
        /* Wait for carrier detect and the line to become
@@ -3332,7 +3341,7 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
        port->blocked_open++;
 
        while (1) {
-               if (tty->termios->c_cflag & CBAUD)
+               if (tty->termios.c_cflag & CBAUD)
                        tty_port_raise_dtr_rts(port);
 
                set_current_state(TASK_INTERRUPTIBLE);
@@ -3357,9 +3366,9 @@ static int block_til_ready(struct tty_struct *tty, struct file *filp,
                        printk("%s(%d):%s block_til_ready() count=%d\n",
                                 __FILE__,__LINE__, tty->driver->name, port->count );
 
-               tty_unlock();
+               tty_unlock(tty);
                schedule();
-               tty_lock();
+               tty_lock(tty);
        }
 
        set_current_state(TASK_RUNNING);
@@ -3881,6 +3890,7 @@ static void device_init(int adapter_num, struct pci_dev *pdev)
 }
 
 static const struct tty_operations ops = {
+       .install = install,
        .open = open,
        .close = close,
        .write = write,
index b425c79..8a5a8b0 100644 (file)
@@ -181,10 +181,13 @@ struct tty_struct *alloc_tty_struct(void)
 
 void free_tty_struct(struct tty_struct *tty)
 {
+       if (!tty)
+               return;
        if (tty->dev)
                put_device(tty->dev);
        kfree(tty->write_buf);
        tty_buffer_free_all(tty);
+       tty->magic = 0xDEADDEAD;
        kfree(tty);
 }
 
@@ -573,7 +576,7 @@ void __tty_hangup(struct tty_struct *tty)
        }
        spin_unlock(&redirect_lock);
 
-       tty_lock();
+       tty_lock(tty);
 
        /* some functions below drop BTM, so we need this bit */
        set_bit(TTY_HUPPING, &tty->flags);
@@ -666,7 +669,7 @@ void __tty_hangup(struct tty_struct *tty)
        clear_bit(TTY_HUPPING, &tty->flags);
        tty_ldisc_enable(tty);
 
-       tty_unlock();
+       tty_unlock(tty);
 
        if (f)
                fput(f);
@@ -1103,12 +1106,12 @@ void tty_write_message(struct tty_struct *tty, char *msg)
 {
        if (tty) {
                mutex_lock(&tty->atomic_write_lock);
-               tty_lock();
+               tty_lock(tty);
                if (tty->ops->write && !test_bit(TTY_CLOSING, &tty->flags)) {
-                       tty_unlock();
+                       tty_unlock(tty);
                        tty->ops->write(tty, msg, strlen(msg));
                } else
-                       tty_unlock();
+                       tty_unlock(tty);
                tty_write_unlock(tty);
        }
        return;
@@ -1213,7 +1216,10 @@ static void pty_line_name(struct tty_driver *driver, int index, char *p)
  */
 static void tty_line_name(struct tty_driver *driver, int index, char *p)
 {
-       sprintf(p, "%s%d", driver->name, index + driver->name_base);
+       if (driver->flags & TTY_DRIVER_UNNUMBERED_NODE)
+               strcpy(p, driver->name);
+       else
+               sprintf(p, "%s%d", driver->name, index + driver->name_base);
 }
 
 /**
@@ -1249,21 +1255,19 @@ int tty_init_termios(struct tty_struct *tty)
        struct ktermios *tp;
        int idx = tty->index;
 
-       tp = tty->driver->termios[idx];
-       if (tp == NULL) {
-               tp = kzalloc(sizeof(struct ktermios[2]), GFP_KERNEL);
-               if (tp == NULL)
-                       return -ENOMEM;
-               memcpy(tp, &tty->driver->init_termios,
-                                               sizeof(struct ktermios));
-               tty->driver->termios[idx] = tp;
+       if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
+               tty->termios = tty->driver->init_termios;
+       else {
+               /* Check for lazy saved data */
+               tp = tty->driver->termios[idx];
+               if (tp != NULL)
+                       tty->termios = *tp;
+               else
+                       tty->termios = tty->driver->init_termios;
        }
-       tty->termios = tp;
-       tty->termios_locked = tp + 1;
-
        /* Compatibility until drivers always set this */
-       tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
-       tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
+       tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
+       tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
        return 0;
 }
 EXPORT_SYMBOL_GPL(tty_init_termios);
@@ -1403,10 +1407,18 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
        }
        initialize_tty_struct(tty, driver, idx);
 
+       tty_lock(tty);
        retval = tty_driver_install_tty(driver, tty);
        if (retval < 0)
                goto err_deinit_tty;
 
+       if (!tty->port)
+               tty->port = driver->ports[idx];
+
+       WARN_RATELIMIT(!tty->port,
+                       "%s: %s driver does not set tty->port. This will crash the kernel later. Fix the driver!\n",
+                       __func__, tty->driver->name);
+
        /*
         * Structures all installed ... call the ldisc open routines.
         * If we fail here just call release_tty to clean up.  No need
@@ -1415,9 +1427,11 @@ struct tty_struct *tty_init_dev(struct tty_driver *driver, int idx)
        retval = tty_ldisc_setup(tty, tty->link);
        if (retval)
                goto err_release_tty;
+       /* Return the tty locked so that it cannot vanish under the caller */
        return tty;
 
 err_deinit_tty:
+       tty_unlock(tty);
        deinitialize_tty_struct(tty);
        free_tty_struct(tty);
 err_module_put:
@@ -1426,6 +1440,7 @@ err_module_put:
 
        /* call the tty release_tty routine to clean out this slot */
 err_release_tty:
+       tty_unlock(tty);
        printk_ratelimited(KERN_INFO "tty_init_dev: ldisc open failed, "
                                 "clearing slot %d\n", idx);
        release_tty(tty, idx);
@@ -1436,22 +1451,25 @@ void tty_free_termios(struct tty_struct *tty)
 {
        struct ktermios *tp;
        int idx = tty->index;
-       /* Kill this flag and push into drivers for locking etc */
-       if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS) {
-               /* FIXME: Locking on ->termios array */
-               tp = tty->termios;
-               tty->driver->termios[idx] = NULL;
-               kfree(tp);
+
+       /* If the port is going to reset then it has no termios to save */
+       if (tty->driver->flags & TTY_DRIVER_RESET_TERMIOS)
+               return;
+
+       /* Stash the termios data */
+       tp = tty->driver->termios[idx];
+       if (tp == NULL) {
+               tp = kmalloc(sizeof(struct ktermios), GFP_KERNEL);
+               if (tp == NULL) {
+                       pr_warn("tty: no memory to save termios state.\n");
+                       return;
+               }
+               tty->driver->termios[idx] = tp;
        }
+       *tp = tty->termios;
 }
 EXPORT_SYMBOL(tty_free_termios);
 
-void tty_shutdown(struct tty_struct *tty)
-{
-       tty_driver_remove_tty(tty->driver, tty);
-       tty_free_termios(tty);
-}
-EXPORT_SYMBOL(tty_shutdown);
 
 /**
  *     release_one_tty         -       release tty structure memory
@@ -1462,7 +1480,6 @@ EXPORT_SYMBOL(tty_shutdown);
  *     in use. It also gets called when setup of a device fails.
  *
  *     Locking:
- *             tty_mutex - sometimes only
  *             takes the file list lock internally when working on the list
  *     of ttys that the driver keeps.
  *
@@ -1495,11 +1512,6 @@ static void queue_release_one_tty(struct kref *kref)
 {
        struct tty_struct *tty = container_of(kref, struct tty_struct, kref);
 
-       if (tty->ops->shutdown)
-               tty->ops->shutdown(tty);
-       else
-               tty_shutdown(tty);
-
        /* The hangup queue is now free so we can reuse it rather than
           waste a chunk of memory for each port */
        INIT_WORK(&tty->hangup_work, release_one_tty);
@@ -1528,16 +1540,20 @@ EXPORT_SYMBOL(tty_kref_put);
  *     and decrement the refcount of the backing module.
  *
  *     Locking:
- *             tty_mutex - sometimes only
+ *             tty_mutex
  *             takes the file list lock internally when working on the list
  *     of ttys that the driver keeps.
- *             FIXME: should we require tty_mutex is held here ??
  *
  */
 static void release_tty(struct tty_struct *tty, int idx)
 {
        /* This should always be true but check for the moment */
        WARN_ON(tty->index != idx);
+       WARN_ON(!mutex_is_locked(&tty_mutex));
+       if (tty->ops->shutdown)
+               tty->ops->shutdown(tty);
+       tty_free_termios(tty);
+       tty_driver_remove_tty(tty->driver, tty);
 
        if (tty->link)
                tty_kref_put(tty->link);
@@ -1572,22 +1588,12 @@ static int tty_release_checks(struct tty_struct *tty, struct tty_struct *o_tty,
                                __func__, idx, tty->name);
                return -1;
        }
-       if (tty->termios != tty->driver->termios[idx]) {
-               printk(KERN_DEBUG "%s: driver.termios[%d] not termios for (%s)\n",
-                               __func__, idx, tty->name);
-               return -1;
-       }
        if (tty->driver->other) {
                if (o_tty != tty->driver->other->ttys[idx]) {
                        printk(KERN_DEBUG "%s: other->table[%d] not o_tty for (%s)\n",
                                        __func__, idx, tty->name);
                        return -1;
                }
-               if (o_tty->termios != tty->driver->other->termios[idx]) {
-                       printk(KERN_DEBUG "%s: other->termios[%d] not o_termios for (%s)\n",
-                                       __func__, idx, tty->name);
-                       return -1;
-               }
                if (o_tty->link != tty) {
                        printk(KERN_DEBUG "%s: bad pty pointers\n", __func__);
                        return -1;
@@ -1628,7 +1634,7 @@ int tty_release(struct inode *inode, struct file *filp)
        if (tty_paranoia_check(tty, inode, __func__))
                return 0;
 
-       tty_lock();
+       tty_lock(tty);
        check_tty_count(tty, __func__);
 
        __tty_fasync(-1, filp, 0);
@@ -1637,10 +1643,11 @@ int tty_release(struct inode *inode, struct file *filp)
        pty_master = (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
                      tty->driver->subtype == PTY_TYPE_MASTER);
        devpts = (tty->driver->flags & TTY_DRIVER_DEVPTS_MEM) != 0;
+       /* Review: parallel close */
        o_tty = tty->link;
 
        if (tty_release_checks(tty, o_tty, idx)) {
-               tty_unlock();
+               tty_unlock(tty);
                return 0;
        }
 
@@ -1652,7 +1659,7 @@ int tty_release(struct inode *inode, struct file *filp)
        if (tty->ops->close)
                tty->ops->close(tty, filp);
 
-       tty_unlock();
+       tty_unlock(tty);
        /*
         * Sanity check: if tty->count is going to zero, there shouldn't be
         * any waiters on tty->read_wait or tty->write_wait.  We test the
@@ -1675,7 +1682,7 @@ int tty_release(struct inode *inode, struct file *filp)
                   opens on /dev/tty */
 
                mutex_lock(&tty_mutex);
-               tty_lock();
+               tty_lock_pair(tty, o_tty);
                tty_closing = tty->count <= 1;
                o_tty_closing = o_tty &&
                        (o_tty->count <= (pty_master ? 1 : 0));
@@ -1706,7 +1713,7 @@ int tty_release(struct inode *inode, struct file *filp)
 
                printk(KERN_WARNING "%s: %s: read/write wait queue active!\n",
                                __func__, tty_name(tty, buf));
-               tty_unlock();
+               tty_unlock_pair(tty, o_tty);
                mutex_unlock(&tty_mutex);
                schedule();
        }
@@ -1715,6 +1722,9 @@ int tty_release(struct inode *inode, struct file *filp)
         * The closing flags are now consistent with the open counts on
         * both sides, and we've completed the last operation that could
         * block, so it's safe to proceed with closing.
+        *
+        * We must *not* drop the tty_mutex until we ensure that a further
+        * entry into tty_open can not pick up this tty.
         */
        if (pty_master) {
                if (--o_tty->count < 0) {
@@ -1766,12 +1776,13 @@ int tty_release(struct inode *inode, struct file *filp)
        }
 
        mutex_unlock(&tty_mutex);
+       tty_unlock_pair(tty, o_tty);
+       /* At this point the TTY_CLOSING flag should ensure a dead tty
+          cannot be re-opened by a racing opener */
 
        /* check whether both sides are closing ... */
-       if (!tty_closing || (o_tty && !o_tty_closing)) {
-               tty_unlock();
+       if (!tty_closing || (o_tty && !o_tty_closing))
                return 0;
-       }
 
 #ifdef TTY_DEBUG_HANGUP
        printk(KERN_DEBUG "%s: freeing tty structure...\n", __func__);
@@ -1782,14 +1793,17 @@ int tty_release(struct inode *inode, struct file *filp)
        tty_ldisc_release(tty, o_tty);
        /*
         * The release_tty function takes care of the details of clearing
-        * the slots and preserving the termios structure.
+        * the slots and preserving the termios structure. The tty_unlock_pair
+        * should be safe as we keep a kref while the tty is locked (so the
+        * unlock never unlocks a freed tty).
         */
+       mutex_lock(&tty_mutex);
        release_tty(tty, idx);
+       mutex_unlock(&tty_mutex);
 
        /* Make this pty number available for reallocation */
        if (devpts)
                devpts_kill_index(inode, idx);
-       tty_unlock();
        return 0;
 }
 
@@ -1893,6 +1907,9 @@ static struct tty_driver *tty_lookup_driver(dev_t device, struct file *filp,
  *     Locking: tty_mutex protects tty, tty_lookup_driver and tty_init_dev.
  *              tty->count should protect the rest.
  *              ->siglock protects ->signal/->sighand
+ *
+ *     Note: the tty_unlock/lock cases without a ref are only safe due to
+ *     tty_mutex
  */
 
 static int tty_open(struct inode *inode, struct file *filp)
@@ -1916,8 +1933,7 @@ retry_open:
        retval = 0;
 
        mutex_lock(&tty_mutex);
-       tty_lock();
-
+       /* This is protected by the tty_mutex */
        tty = tty_open_current_tty(device, filp);
        if (IS_ERR(tty)) {
                retval = PTR_ERR(tty);
@@ -1938,17 +1954,19 @@ retry_open:
        }
 
        if (tty) {
+               tty_lock(tty);
                retval = tty_reopen(tty);
-               if (retval)
+               if (retval < 0) {
+                       tty_unlock(tty);
                        tty = ERR_PTR(retval);
-       } else
+               }
+       } else  /* Returns with the tty_lock held for now */
                tty = tty_init_dev(driver, index);
 
        mutex_unlock(&tty_mutex);
        if (driver)
                tty_driver_kref_put(driver);
        if (IS_ERR(tty)) {
-               tty_unlock();
                retval = PTR_ERR(tty);
                goto err_file;
        }
@@ -1977,7 +1995,7 @@ retry_open:
                printk(KERN_DEBUG "%s: error %d in opening %s...\n", __func__,
                                retval, tty->name);
 #endif
-               tty_unlock(); /* need to call tty_release without BTM */
+               tty_unlock(tty); /* need to call tty_release without BTM */
                tty_release(inode, filp);
                if (retval != -ERESTARTSYS)
                        return retval;
@@ -1989,17 +2007,15 @@ retry_open:
                /*
                 * Need to reset f_op in case a hangup happened.
                 */
-               tty_lock();
                if (filp->f_op == &hung_up_tty_fops)
                        filp->f_op = &tty_fops;
-               tty_unlock();
                goto retry_open;
        }
-       tty_unlock();
+       tty_unlock(tty);
 
 
        mutex_lock(&tty_mutex);
-       tty_lock();
+       tty_lock(tty);
        spin_lock_irq(&current->sighand->siglock);
        if (!noctty &&
            current->signal->leader &&
@@ -2007,11 +2023,10 @@ retry_open:
            tty->session == NULL)
                __proc_set_tty(current, tty);
        spin_unlock_irq(&current->sighand->siglock);
-       tty_unlock();
+       tty_unlock(tty);
        mutex_unlock(&tty_mutex);
        return 0;
 err_unlock:
-       tty_unlock();
        mutex_unlock(&tty_mutex);
        /* after locks to avoid deadlock */
        if (!IS_ERR_OR_NULL(driver))
@@ -2094,10 +2109,13 @@ out:
 
 static int tty_fasync(int fd, struct file *filp, int on)
 {
+       struct tty_struct *tty = file_tty(filp);
        int retval;
-       tty_lock();
+
+       tty_lock(tty);
        retval = __tty_fasync(fd, filp, on);
-       tty_unlock();
+       tty_unlock(tty);
+
        return retval;
 }
 
@@ -2756,7 +2774,7 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
        if (ld->ops->ioctl) {
                retval = ld->ops->ioctl(tty, file, cmd, arg);
                if (retval == -ENOIOCTLCMD)
-                       retval = -EINVAL;
+                       retval = -ENOTTY;
        }
        tty_ldisc_deref(ld);
        return retval;
@@ -2934,6 +2952,7 @@ void initialize_tty_struct(struct tty_struct *tty,
        tty->pgrp = NULL;
        tty->overrun_time = jiffies;
        tty_buffer_init(tty);
+       mutex_init(&tty->legacy_mutex);
        mutex_init(&tty->termios_mutex);
        mutex_init(&tty->ldisc_mutex);
        init_waitqueue_head(&tty->write_wait);
@@ -2991,6 +3010,15 @@ EXPORT_SYMBOL_GPL(tty_put_char);
 
 struct class *tty_class;
 
+static int tty_cdev_add(struct tty_driver *driver, dev_t dev,
+               unsigned int index, unsigned int count)
+{
+       /* init here, since reused cdevs cause crashes */
+       cdev_init(&driver->cdevs[index], &tty_fops);
+       driver->cdevs[index].owner = driver->owner;
+       return cdev_add(&driver->cdevs[index], dev, count);
+}
+
 /**
  *     tty_register_device - register a tty device
  *     @driver: the tty driver that describes the tty device
@@ -3013,8 +3041,46 @@ struct class *tty_class;
 struct device *tty_register_device(struct tty_driver *driver, unsigned index,
                                   struct device *device)
 {
+       return tty_register_device_attr(driver, index, device, NULL, NULL);
+}
+EXPORT_SYMBOL(tty_register_device);
+
+static void tty_device_create_release(struct device *dev)
+{
+       pr_debug("device: '%s': %s\n", dev_name(dev), __func__);
+       kfree(dev);
+}
+
+/**
+ *     tty_register_device_attr - register a tty device
+ *     @driver: the tty driver that describes the tty device
+ *     @index: the index in the tty driver for this tty device
+ *     @device: a struct device that is associated with this tty device.
+ *             This field is optional, if there is no known struct device
+ *             for this tty device it can be set to NULL safely.
+ *     @drvdata: Driver data to be set to device.
+ *     @attr_grp: Attribute group to be set on device.
+ *
+ *     Returns a pointer to the struct device for this tty device
+ *     (or ERR_PTR(-EFOO) on error).
+ *
+ *     This call is required to be made to register an individual tty device
+ *     if the tty driver's flags have the TTY_DRIVER_DYNAMIC_DEV bit set.  If
+ *     that bit is not set, this function should not be called by a tty
+ *     driver.
+ *
+ *     Locking: ??
+ */
+struct device *tty_register_device_attr(struct tty_driver *driver,
+                                  unsigned index, struct device *device,
+                                  void *drvdata,
+                                  const struct attribute_group **attr_grp)
+{
        char name[64];
-       dev_t dev = MKDEV(driver->major, driver->minor_start) + index;
+       dev_t devt = MKDEV(driver->major, driver->minor_start) + index;
+       struct device *dev = NULL;
+       int retval = -ENODEV;
+       bool cdev = false;
 
        if (index >= driver->num) {
                printk(KERN_ERR "Attempt to register invalid tty line number "
@@ -3027,9 +3093,40 @@ struct device *tty_register_device(struct tty_driver *driver, unsigned index,
        else
                tty_line_name(driver, index, name);
 
-       return device_create(tty_class, device, dev, NULL, name);
+       if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
+               retval = tty_cdev_add(driver, devt, index, 1);
+               if (retval)
+                       goto error;
+               cdev = true;
+       }
+
+       dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+       if (!dev) {
+               retval = -ENOMEM;
+               goto error;
+       }
+
+       dev->devt = devt;
+       dev->class = tty_class;
+       dev->parent = device;
+       dev->release = tty_device_create_release;
+       dev_set_name(dev, "%s", name);
+       dev->groups = attr_grp;
+       dev_set_drvdata(dev, drvdata);
+
+       retval = device_register(dev);
+       if (retval)
+               goto error;
+
+       return dev;
+
+error:
+       put_device(dev);
+       if (cdev)
+               cdev_del(&driver->cdevs[index]);
+       return ERR_PTR(retval);
 }
-EXPORT_SYMBOL(tty_register_device);
+EXPORT_SYMBOL_GPL(tty_register_device_attr);
 
 /**
  *     tty_unregister_device - unregister a tty device
@@ -3046,31 +3143,82 @@ void tty_unregister_device(struct tty_driver *driver, unsigned index)
 {
        device_destroy(tty_class,
                MKDEV(driver->major, driver->minor_start) + index);
+       if (!(driver->flags & TTY_DRIVER_DYNAMIC_ALLOC))
+               cdev_del(&driver->cdevs[index]);
 }
 EXPORT_SYMBOL(tty_unregister_device);
 
-struct tty_driver *__alloc_tty_driver(int lines, struct module *owner)
+/**
+ * __tty_alloc_driver -- allocate tty driver
+ * @lines: count of lines this driver can handle at most
+ * @owner: module which is repsonsible for this driver
+ * @flags: some of TTY_DRIVER_* flags, will be set in driver->flags
+ *
+ * This should not be called directly, some of the provided macros should be
+ * used instead. Use IS_ERR and friends on @retval.
+ */
+struct tty_driver *__tty_alloc_driver(unsigned int lines, struct module *owner,
+               unsigned long flags)
 {
        struct tty_driver *driver;
+       unsigned int cdevs = 1;
+       int err;
+
+       if (!lines || (flags & TTY_DRIVER_UNNUMBERED_NODE && lines > 1))
+               return ERR_PTR(-EINVAL);
 
        driver = kzalloc(sizeof(struct tty_driver), GFP_KERNEL);
-       if (driver) {
-               kref_init(&driver->kref);
-               driver->magic = TTY_DRIVER_MAGIC;
-               driver->num = lines;
-               driver->owner = owner;
-               /* later we'll move allocation of tables here */
+       if (!driver)
+               return ERR_PTR(-ENOMEM);
+
+       kref_init(&driver->kref);
+       driver->magic = TTY_DRIVER_MAGIC;
+       driver->num = lines;
+       driver->owner = owner;
+       driver->flags = flags;
+
+       if (!(flags & TTY_DRIVER_DEVPTS_MEM)) {
+               driver->ttys = kcalloc(lines, sizeof(*driver->ttys),
+                               GFP_KERNEL);
+               driver->termios = kcalloc(lines, sizeof(*driver->termios),
+                               GFP_KERNEL);
+               if (!driver->ttys || !driver->termios) {
+                       err = -ENOMEM;
+                       goto err_free_all;
+               }
        }
+
+       if (!(flags & TTY_DRIVER_DYNAMIC_ALLOC)) {
+               driver->ports = kcalloc(lines, sizeof(*driver->ports),
+                               GFP_KERNEL);
+               if (!driver->ports) {
+                       err = -ENOMEM;
+                       goto err_free_all;
+               }
+               cdevs = lines;
+       }
+
+       driver->cdevs = kcalloc(cdevs, sizeof(*driver->cdevs), GFP_KERNEL);
+       if (!driver->cdevs) {
+               err = -ENOMEM;
+               goto err_free_all;
+       }
+
        return driver;
+err_free_all:
+       kfree(driver->ports);
+       kfree(driver->ttys);
+       kfree(driver->termios);
+       kfree(driver);
+       return ERR_PTR(err);
 }
-EXPORT_SYMBOL(__alloc_tty_driver);
+EXPORT_SYMBOL(__tty_alloc_driver);
 
 static void destruct_tty_driver(struct kref *kref)
 {
        struct tty_driver *driver = container_of(kref, struct tty_driver, kref);
        int i;
        struct ktermios *tp;
-       void *p;
 
        if (driver->flags & TTY_DRIVER_INSTALLED) {
                /*
@@ -3087,13 +3235,14 @@ static void destruct_tty_driver(struct kref *kref)
                        if (!(driver->flags & TTY_DRIVER_DYNAMIC_DEV))
                                tty_unregister_device(driver, i);
                }
-               p = driver->ttys;
                proc_tty_unregister_driver(driver);
-               driver->ttys = NULL;
-               driver->termios = NULL;
-               kfree(p);
-               cdev_del(&driver->cdev);
+               if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC)
+                       cdev_del(&driver->cdevs[0]);
        }
+       kfree(driver->cdevs);
+       kfree(driver->ports);
+       kfree(driver->termios);
+       kfree(driver->ttys);
        kfree(driver);
 }
 
@@ -3124,15 +3273,8 @@ int tty_register_driver(struct tty_driver *driver)
        int error;
        int i;
        dev_t dev;
-       void **p = NULL;
        struct device *d;
 
-       if (!(driver->flags & TTY_DRIVER_DEVPTS_MEM) && driver->num) {
-               p = kzalloc(driver->num * 2 * sizeof(void *), GFP_KERNEL);
-               if (!p)
-                       return -ENOMEM;
-       }
-
        if (!driver->major) {
                error = alloc_chrdev_region(&dev, driver->minor_start,
                                                driver->num, driver->name);
@@ -3144,28 +3286,13 @@ int tty_register_driver(struct tty_driver *driver)
                dev = MKDEV(driver->major, driver->minor_start);
                error = register_chrdev_region(dev, driver->num, driver->name);
        }
-       if (error < 0) {
-               kfree(p);
-               return error;
-       }
+       if (error < 0)
+               goto err;
 
-       if (p) {
-               driver->ttys = (struct tty_struct **)p;
-               driver->termios = (struct ktermios **)(p + driver->num);
-       } else {
-               driver->ttys = NULL;
-               driver->termios = NULL;
-       }
-
-       cdev_init(&driver->cdev, &tty_fops);
-       driver->cdev.owner = driver->owner;
-       error = cdev_add(&driver->cdev, dev, driver->num);
-       if (error) {
-               unregister_chrdev_region(dev, driver->num);
-               driver->ttys = NULL;
-               driver->termios = NULL;
-               kfree(p);
-               return error;
+       if (driver->flags & TTY_DRIVER_DYNAMIC_ALLOC) {
+               error = tty_cdev_add(driver, dev, 0, driver->num);
+               if (error)
+                       goto err_unreg_char;
        }
 
        mutex_lock(&tty_mutex);
@@ -3177,7 +3304,7 @@ int tty_register_driver(struct tty_driver *driver)
                        d = tty_register_device(driver, i, NULL);
                        if (IS_ERR(d)) {
                                error = PTR_ERR(d);
-                               goto err;
+                               goto err_unreg_devs;
                        }
                }
        }
@@ -3185,7 +3312,7 @@ int tty_register_driver(struct tty_driver *driver)
        driver->flags |= TTY_DRIVER_INSTALLED;
        return 0;
 
-err:
+err_unreg_devs:
        for (i--; i >= 0; i--)
                tty_unregister_device(driver, i);
 
@@ -3193,13 +3320,11 @@ err:
        list_del(&driver->tty_drivers);
        mutex_unlock(&tty_mutex);
 
+err_unreg_char:
        unregister_chrdev_region(dev, driver->num);
-       driver->ttys = NULL;
-       driver->termios = NULL;
-       kfree(p);
+err:
        return error;
 }
-
 EXPORT_SYMBOL(tty_register_driver);
 
 /*
index a1b9a2f..12b1fa0 100644 (file)
@@ -410,7 +410,7 @@ EXPORT_SYMBOL_GPL(tty_termios_encode_baud_rate);
 
 void tty_encode_baud_rate(struct tty_struct *tty, speed_t ibaud, speed_t obaud)
 {
-       tty_termios_encode_baud_rate(tty->termios, ibaud, obaud);
+       tty_termios_encode_baud_rate(&tty->termios, ibaud, obaud);
 }
 EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
 
@@ -427,7 +427,7 @@ EXPORT_SYMBOL_GPL(tty_encode_baud_rate);
 
 speed_t tty_get_baud_rate(struct tty_struct *tty)
 {
-       speed_t baud = tty_termios_baud_rate(tty->termios);
+       speed_t baud = tty_termios_baud_rate(&tty->termios);
 
        if (baud == 38400 && tty->alt_speed) {
                if (!tty->warned) {
@@ -509,14 +509,14 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
        /* FIXME: we need to decide on some locking/ordering semantics
           for the set_termios notification eventually */
        mutex_lock(&tty->termios_mutex);
-       old_termios = *tty->termios;
-       *tty->termios = *new_termios;
-       unset_locked_termios(tty->termios, &old_termios, tty->termios_locked);
+       old_termios = tty->termios;
+       tty->termios = *new_termios;
+       unset_locked_termios(&tty->termios, &old_termios, &tty->termios_locked);
 
        /* See if packet mode change of state. */
        if (tty->link && tty->link->packet) {
                int extproc = (old_termios.c_lflag & EXTPROC) |
-                               (tty->termios->c_lflag & EXTPROC);
+                               (tty->termios.c_lflag & EXTPROC);
                int old_flow = ((old_termios.c_iflag & IXON) &&
                                (old_termios.c_cc[VSTOP] == '\023') &&
                                (old_termios.c_cc[VSTART] == '\021'));
@@ -542,7 +542,7 @@ int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
        if (tty->ops->set_termios)
                (*tty->ops->set_termios)(tty, &old_termios);
        else
-               tty_termios_copy_hw(tty->termios, &old_termios);
+               tty_termios_copy_hw(&tty->termios, &old_termios);
 
        ld = tty_ldisc_ref(tty);
        if (ld != NULL) {
@@ -578,7 +578,7 @@ static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
                return retval;
 
        mutex_lock(&tty->termios_mutex);
-       memcpy(&tmp_termios, tty->termios, sizeof(struct ktermios));
+       tmp_termios = tty->termios;
        mutex_unlock(&tty->termios_mutex);
 
        if (opt & TERMIOS_TERMIO) {
@@ -632,14 +632,14 @@ static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
 static void copy_termios(struct tty_struct *tty, struct ktermios *kterm)
 {
        mutex_lock(&tty->termios_mutex);
-       memcpy(kterm, tty->termios, sizeof(struct ktermios));
+       *kterm = tty->termios;
        mutex_unlock(&tty->termios_mutex);
 }
 
 static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm)
 {
        mutex_lock(&tty->termios_mutex);
-       memcpy(kterm, tty->termios_locked, sizeof(struct ktermios));
+       *kterm = tty->termios_locked;
        mutex_unlock(&tty->termios_mutex);
 }
 
@@ -707,16 +707,16 @@ static int get_sgflags(struct tty_struct *tty)
 {
        int flags = 0;
 
-       if (!(tty->termios->c_lflag & ICANON)) {
-               if (tty->termios->c_lflag & ISIG)
+       if (!(tty->termios.c_lflag & ICANON)) {
+               if (tty->termios.c_lflag & ISIG)
                        flags |= 0x02;          /* cbreak */
                else
                        flags |= 0x20;          /* raw */
        }
-       if (tty->termios->c_lflag & ECHO)
+       if (tty->termios.c_lflag & ECHO)
                flags |= 0x08;                  /* echo */
-       if (tty->termios->c_oflag & OPOST)
-               if (tty->termios->c_oflag & ONLCR)
+       if (tty->termios.c_oflag & OPOST)
+               if (tty->termios.c_oflag & ONLCR)
                        flags |= 0x10;          /* crmod */
        return flags;
 }
@@ -726,10 +726,10 @@ static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
        struct sgttyb tmp;
 
        mutex_lock(&tty->termios_mutex);
-       tmp.sg_ispeed = tty->termios->c_ispeed;
-       tmp.sg_ospeed = tty->termios->c_ospeed;
-       tmp.sg_erase = tty->termios->c_cc[VERASE];
-       tmp.sg_kill = tty->termios->c_cc[VKILL];
+       tmp.sg_ispeed = tty->termios.c_ispeed;
+       tmp.sg_ospeed = tty->termios.c_ospeed;
+       tmp.sg_erase = tty->termios.c_cc[VERASE];
+       tmp.sg_kill = tty->termios.c_cc[VKILL];
        tmp.sg_flags = get_sgflags(tty);
        mutex_unlock(&tty->termios_mutex);
 
@@ -787,7 +787,7 @@ static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
                return -EFAULT;
 
        mutex_lock(&tty->termios_mutex);
-       termios = *tty->termios;
+       termios = tty->termios;
        termios.c_cc[VERASE] = tmp.sg_erase;
        termios.c_cc[VKILL] = tmp.sg_kill;
        set_sgflags(&termios, tmp.sg_flags);
@@ -808,12 +808,12 @@ static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars)
        struct tchars tmp;
 
        mutex_lock(&tty->termios_mutex);
-       tmp.t_intrc = tty->termios->c_cc[VINTR];
-       tmp.t_quitc = tty->termios->c_cc[VQUIT];
-       tmp.t_startc = tty->termios->c_cc[VSTART];
-       tmp.t_stopc = tty->termios->c_cc[VSTOP];
-       tmp.t_eofc = tty->termios->c_cc[VEOF];
-       tmp.t_brkc = tty->termios->c_cc[VEOL2]; /* what is brkc anyway? */
+       tmp.t_intrc = tty->termios.c_cc[VINTR];
+       tmp.t_quitc = tty->termios.c_cc[VQUIT];
+       tmp.t_startc = tty->termios.c_cc[VSTART];
+       tmp.t_stopc = tty->termios.c_cc[VSTOP];
+       tmp.t_eofc = tty->termios.c_cc[VEOF];
+       tmp.t_brkc = tty->termios.c_cc[VEOL2];  /* what is brkc anyway? */
        mutex_unlock(&tty->termios_mutex);
        return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 }
@@ -825,12 +825,12 @@ static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars)
        if (copy_from_user(&tmp, tchars, sizeof(tmp)))
                return -EFAULT;
        mutex_lock(&tty->termios_mutex);
-       tty->termios->c_cc[VINTR] = tmp.t_intrc;
-       tty->termios->c_cc[VQUIT] = tmp.t_quitc;
-       tty->termios->c_cc[VSTART] = tmp.t_startc;
-       tty->termios->c_cc[VSTOP] = tmp.t_stopc;
-       tty->termios->c_cc[VEOF] = tmp.t_eofc;
-       tty->termios->c_cc[VEOL2] = tmp.t_brkc; /* what is brkc anyway? */
+       tty->termios.c_cc[VINTR] = tmp.t_intrc;
+       tty->termios.c_cc[VQUIT] = tmp.t_quitc;
+       tty->termios.c_cc[VSTART] = tmp.t_startc;
+       tty->termios.c_cc[VSTOP] = tmp.t_stopc;
+       tty->termios.c_cc[VEOF] = tmp.t_eofc;
+       tty->termios.c_cc[VEOL2] = tmp.t_brkc;  /* what is brkc anyway? */
        mutex_unlock(&tty->termios_mutex);
        return 0;
 }
@@ -842,14 +842,14 @@ static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
        struct ltchars tmp;
 
        mutex_lock(&tty->termios_mutex);
-       tmp.t_suspc = tty->termios->c_cc[VSUSP];
+       tmp.t_suspc = tty->termios.c_cc[VSUSP];
        /* what is dsuspc anyway? */
-       tmp.t_dsuspc = tty->termios->c_cc[VSUSP];
-       tmp.t_rprntc = tty->termios->c_cc[VREPRINT];
+       tmp.t_dsuspc = tty->termios.c_cc[VSUSP];
+       tmp.t_rprntc = tty->termios.c_cc[VREPRINT];
        /* what is flushc anyway? */
-       tmp.t_flushc = tty->termios->c_cc[VEOL2];
-       tmp.t_werasc = tty->termios->c_cc[VWERASE];
-       tmp.t_lnextc = tty->termios->c_cc[VLNEXT];
+       tmp.t_flushc = tty->termios.c_cc[VEOL2];
+       tmp.t_werasc = tty->termios.c_cc[VWERASE];
+       tmp.t_lnextc = tty->termios.c_cc[VLNEXT];
        mutex_unlock(&tty->termios_mutex);
        return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
 }
@@ -862,14 +862,14 @@ static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
                return -EFAULT;
 
        mutex_lock(&tty->termios_mutex);
-       tty->termios->c_cc[VSUSP] = tmp.t_suspc;
+       tty->termios.c_cc[VSUSP] = tmp.t_suspc;
        /* what is dsuspc anyway? */
-       tty->termios->c_cc[VEOL2] = tmp.t_dsuspc;
-       tty->termios->c_cc[VREPRINT] = tmp.t_rprntc;
+       tty->termios.c_cc[VEOL2] = tmp.t_dsuspc;
+       tty->termios.c_cc[VREPRINT] = tmp.t_rprntc;
        /* what is flushc anyway? */
-       tty->termios->c_cc[VEOL2] = tmp.t_flushc;
-       tty->termios->c_cc[VWERASE] = tmp.t_werasc;
-       tty->termios->c_cc[VLNEXT] = tmp.t_lnextc;
+       tty->termios.c_cc[VEOL2] = tmp.t_flushc;
+       tty->termios.c_cc[VWERASE] = tmp.t_werasc;
+       tty->termios.c_cc[VLNEXT] = tmp.t_lnextc;
        mutex_unlock(&tty->termios_mutex);
        return 0;
 }
@@ -920,12 +920,12 @@ static int tty_change_softcar(struct tty_struct *tty, int arg)
        struct ktermios old;
 
        mutex_lock(&tty->termios_mutex);
-       old = *tty->termios;
-       tty->termios->c_cflag &= ~CLOCAL;
-       tty->termios->c_cflag |= bit;
+       old = tty->termios;
+       tty->termios.c_cflag &= ~CLOCAL;
+       tty->termios.c_cflag |= bit;
        if (tty->ops->set_termios)
                tty->ops->set_termios(tty, &old);
-       if ((tty->termios->c_cflag & CLOCAL) != bit)
+       if ((tty->termios.c_cflag & CLOCAL) != bit)
                ret = -EINVAL;
        mutex_unlock(&tty->termios_mutex);
        return ret;
@@ -1031,7 +1031,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
                                               (struct termios __user *) arg))
                        return -EFAULT;
                mutex_lock(&real_tty->termios_mutex);
-               memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios));
+               real_tty->termios_locked = kterm;
                mutex_unlock(&real_tty->termios_mutex);
                return 0;
 #else
@@ -1048,7 +1048,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
                                               (struct termios __user *) arg))
                        return -EFAULT;
                mutex_lock(&real_tty->termios_mutex);
-               memcpy(real_tty->termios_locked, &kterm, sizeof(struct ktermios));
+               real_tty->termios_locked = kterm;
                mutex_unlock(&real_tty->termios_mutex);
                return ret;
 #endif
index 6f99c99..4d7b562 100644 (file)
@@ -413,7 +413,7 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush);
 static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
 {
        mutex_lock(&tty->termios_mutex);
-       tty->termios->c_line = num;
+       tty->termios.c_line = num;
        mutex_unlock(&tty->termios_mutex);
 }
 
@@ -568,7 +568,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
        if (IS_ERR(new_ldisc))
                return PTR_ERR(new_ldisc);
 
-       tty_lock();
+       tty_lock(tty);
        /*
         *      We need to look at the tty locking here for pty/tty pairs
         *      when both sides try to change in parallel.
@@ -582,12 +582,12 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
         */
 
        if (tty->ldisc->ops->num == ldisc) {
-               tty_unlock();
+               tty_unlock(tty);
                tty_ldisc_put(new_ldisc);
                return 0;
        }
 
-       tty_unlock();
+       tty_unlock(tty);
        /*
         *      Problem: What do we do if this blocks ?
         *      We could deadlock here
@@ -595,7 +595,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
 
        tty_wait_until_sent(tty, 0);
 
-       tty_lock();
+       tty_lock(tty);
        mutex_lock(&tty->ldisc_mutex);
 
        /*
@@ -605,10 +605,10 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
 
        while (test_bit(TTY_LDISC_CHANGING, &tty->flags)) {
                mutex_unlock(&tty->ldisc_mutex);
-               tty_unlock();
+               tty_unlock(tty);
                wait_event(tty_ldisc_wait,
                        test_bit(TTY_LDISC_CHANGING, &tty->flags) == 0);
-               tty_lock();
+               tty_lock(tty);
                mutex_lock(&tty->ldisc_mutex);
        }
 
@@ -623,7 +623,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
 
        o_ldisc = tty->ldisc;
 
-       tty_unlock();
+       tty_unlock(tty);
        /*
         *      Make sure we don't change while someone holds a
         *      reference to the line discipline. The TTY_LDISC bit
@@ -650,7 +650,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
 
        retval = tty_ldisc_wait_idle(tty, 5 * HZ);
 
-       tty_lock();
+       tty_lock(tty);
        mutex_lock(&tty->ldisc_mutex);
 
        /* handle wait idle failure locked */
@@ -665,7 +665,7 @@ int tty_set_ldisc(struct tty_struct *tty, int ldisc)
                clear_bit(TTY_LDISC_CHANGING, &tty->flags);
                mutex_unlock(&tty->ldisc_mutex);
                tty_ldisc_put(new_ldisc);
-               tty_unlock();
+               tty_unlock(tty);
                return -EIO;
        }
 
@@ -708,7 +708,7 @@ enable:
        if (o_work)
                schedule_work(&o_tty->buf.work);
        mutex_unlock(&tty->ldisc_mutex);
-       tty_unlock();
+       tty_unlock(tty);
        return retval;
 }
 
@@ -722,9 +722,9 @@ enable:
 static void tty_reset_termios(struct tty_struct *tty)
 {
        mutex_lock(&tty->termios_mutex);
-       *tty->termios = tty->driver->init_termios;
-       tty->termios->c_ispeed = tty_termios_input_baud_rate(tty->termios);
-       tty->termios->c_ospeed = tty_termios_baud_rate(tty->termios);
+       tty->termios = tty->driver->init_termios;
+       tty->termios.c_ispeed = tty_termios_input_baud_rate(&tty->termios);
+       tty->termios.c_ospeed = tty_termios_baud_rate(&tty->termios);
        mutex_unlock(&tty->termios_mutex);
 }
 
@@ -816,11 +816,11 @@ void tty_ldisc_hangup(struct tty_struct *tty)
         * need to wait for another function taking the BTM
         */
        clear_bit(TTY_LDISC, &tty->flags);
-       tty_unlock();
+       tty_unlock(tty);
        cancel_work_sync(&tty->buf.work);
        mutex_unlock(&tty->ldisc_mutex);
 retry:
-       tty_lock();
+       tty_lock(tty);
        mutex_lock(&tty->ldisc_mutex);
 
        /* At this point we have a closed ldisc and we want to
@@ -831,7 +831,7 @@ retry:
                if (atomic_read(&tty->ldisc->users) != 1) {
                        char cur_n[TASK_COMM_LEN], tty_n[64];
                        long timeout = 3 * HZ;
-                       tty_unlock();
+                       tty_unlock(tty);
 
                        while (tty_ldisc_wait_idle(tty, timeout) == -EBUSY) {
                                timeout = MAX_SCHEDULE_TIMEOUT;
@@ -846,7 +846,7 @@ retry:
 
                if (reset == 0) {
 
-                       if (!tty_ldisc_reinit(tty, tty->termios->c_line))
+                       if (!tty_ldisc_reinit(tty, tty->termios.c_line))
                                err = tty_ldisc_open(tty, tty->ldisc);
                        else
                                err = 1;
@@ -894,6 +894,23 @@ int tty_ldisc_setup(struct tty_struct *tty, struct tty_struct *o_tty)
        tty_ldisc_enable(tty);
        return 0;
 }
+
+static void tty_ldisc_kill(struct tty_struct *tty)
+{
+       mutex_lock(&tty->ldisc_mutex);
+       /*
+        * Now kill off the ldisc
+        */
+       tty_ldisc_close(tty, tty->ldisc);
+       tty_ldisc_put(tty->ldisc);
+       /* Force an oops if we mess this up */
+       tty->ldisc = NULL;
+
+       /* Ensure the next open requests the N_TTY ldisc */
+       tty_set_termios_ldisc(tty, N_TTY);
+       mutex_unlock(&tty->ldisc_mutex);
+}
+
 /**
  *     tty_ldisc_release               -       release line discipline
  *     @tty: tty being shut down
@@ -912,28 +929,21 @@ void tty_ldisc_release(struct tty_struct *tty, struct tty_struct *o_tty)
         * race with the set_ldisc code path.
         */
 
-       tty_unlock();
+       tty_lock_pair(tty, o_tty);
        tty_ldisc_halt(tty);
        tty_ldisc_flush_works(tty);
-       tty_lock();
-
-       mutex_lock(&tty->ldisc_mutex);
-       /*
-        * Now kill off the ldisc
-        */
-       tty_ldisc_close(tty, tty->ldisc);
-       tty_ldisc_put(tty->ldisc);
-       /* Force an oops if we mess this up */
-       tty->ldisc = NULL;
-
-       /* Ensure the next open requests the N_TTY ldisc */
-       tty_set_termios_ldisc(tty, N_TTY);
-       mutex_unlock(&tty->ldisc_mutex);
+       if (o_tty) {
+               tty_ldisc_halt(o_tty);
+               tty_ldisc_flush_works(o_tty);
+       }
 
        /* This will need doing differently if we need to lock */
+       tty_ldisc_kill(tty);
+
        if (o_tty)
-               tty_ldisc_release(o_tty, NULL);
+               tty_ldisc_kill(o_tty);
 
+       tty_unlock_pair(tty, o_tty);
        /* And the memory resources remaining (buffers, termios) will be
           disposed of when the kref hits zero */
 }
index 9ff986c..67feac9 100644 (file)
@@ -4,29 +4,70 @@
 #include <linux/semaphore.h>
 #include <linux/sched.h>
 
-/*
- * The 'big tty mutex'
- *
- * This mutex is taken and released by tty_lock() and tty_unlock(),
- * replacing the older big kernel lock.
- * It can no longer be taken recursively, and does not get
- * released implicitly while sleeping.
- *
- * Don't use in new code.
- */
-static DEFINE_MUTEX(big_tty_mutex);
+/* Legacy tty mutex glue */
+
+enum {
+       TTY_MUTEX_NORMAL,
+       TTY_MUTEX_NESTED,
+};
 
 /*
  * Getting the big tty mutex.
  */
-void __lockfunc tty_lock(void)
+
+static void __lockfunc tty_lock_nested(struct tty_struct *tty,
+                                      unsigned int subclass)
 {
-       mutex_lock(&big_tty_mutex);
+       if (tty->magic != TTY_MAGIC) {
+               printk(KERN_ERR "L Bad %p\n", tty);
+               WARN_ON(1);
+               return;
+       }
+       tty_kref_get(tty);
+       mutex_lock_nested(&tty->legacy_mutex, subclass);
+}
+
+void __lockfunc tty_lock(struct tty_struct *tty)
+{
+       return tty_lock_nested(tty, TTY_MUTEX_NORMAL);
 }
 EXPORT_SYMBOL(tty_lock);
 
-void __lockfunc tty_unlock(void)
+void __lockfunc tty_unlock(struct tty_struct *tty)
 {
-       mutex_unlock(&big_tty_mutex);
+       if (tty->magic != TTY_MAGIC) {
+               printk(KERN_ERR "U Bad %p\n", tty);
+               WARN_ON(1);
+               return;
+       }
+       mutex_unlock(&tty->legacy_mutex);
+       tty_kref_put(tty);
 }
 EXPORT_SYMBOL(tty_unlock);
+
+/*
+ * Getting the big tty mutex for a pair of ttys with lock ordering
+ * On a non pty/tty pair tty2 can be NULL which is just fine.
+ */
+void __lockfunc tty_lock_pair(struct tty_struct *tty,
+                                       struct tty_struct *tty2)
+{
+       if (tty < tty2) {
+               tty_lock(tty);
+               tty_lock_nested(tty2, TTY_MUTEX_NESTED);
+       } else {
+               if (tty2 && tty2 != tty)
+                       tty_lock(tty2);
+               tty_lock_nested(tty, TTY_MUTEX_NESTED);
+       }
+}
+EXPORT_SYMBOL(tty_lock_pair);
+
+void __lockfunc tty_unlock_pair(struct tty_struct *tty,
+                                               struct tty_struct *tty2)
+{
+       tty_unlock(tty);
+       if (tty2 && tty2 != tty)
+               tty_unlock(tty2);
+}
+EXPORT_SYMBOL(tty_unlock_pair);
index bf6e238..d7bdd8d 100644 (file)
@@ -33,6 +33,70 @@ void tty_port_init(struct tty_port *port)
 }
 EXPORT_SYMBOL(tty_port_init);
 
+/**
+ * tty_port_link_device - link tty and tty_port
+ * @port: tty_port of the device
+ * @driver: tty_driver for this device
+ * @index: index of the tty
+ *
+ * Provide the tty layer wit ha link from a tty (specified by @index) to a
+ * tty_port (@port). Use this only if neither tty_port_register_device nor
+ * tty_port_install is used in the driver. If used, this has to be called before
+ * tty_register_driver.
+ */
+void tty_port_link_device(struct tty_port *port,
+               struct tty_driver *driver, unsigned index)
+{
+       if (WARN_ON(index >= driver->num))
+               return;
+       driver->ports[index] = port;
+}
+EXPORT_SYMBOL_GPL(tty_port_link_device);
+
+/**
+ * tty_port_register_device - register tty device
+ * @port: tty_port of the device
+ * @driver: tty_driver for this device
+ * @index: index of the tty
+ * @device: parent if exists, otherwise NULL
+ *
+ * It is the same as tty_register_device except the provided @port is linked to
+ * a concrete tty specified by @index. Use this or tty_port_install (or both).
+ * Call tty_port_link_device as a last resort.
+ */
+struct device *tty_port_register_device(struct tty_port *port,
+               struct tty_driver *driver, unsigned index,
+               struct device *device)
+{
+       tty_port_link_device(port, driver, index);
+       return tty_register_device(driver, index, device);
+}
+EXPORT_SYMBOL_GPL(tty_port_register_device);
+
+/**
+ * tty_port_register_device_attr - register tty device
+ * @port: tty_port of the device
+ * @driver: tty_driver for this device
+ * @index: index of the tty
+ * @device: parent if exists, otherwise NULL
+ * @drvdata: Driver data to be set to device.
+ * @attr_grp: Attribute group to be set on device.
+ *
+ * It is the same as tty_register_device_attr except the provided @port is
+ * linked to a concrete tty specified by @index. Use this or tty_port_install
+ * (or both). Call tty_port_link_device as a last resort.
+ */
+struct device *tty_port_register_device_attr(struct tty_port *port,
+               struct tty_driver *driver, unsigned index,
+               struct device *device, void *drvdata,
+               const struct attribute_group **attr_grp)
+{
+       tty_port_link_device(port, driver, index);
+       return tty_register_device_attr(driver, index, device, drvdata,
+                       attr_grp);
+}
+EXPORT_SYMBOL_GPL(tty_port_register_device_attr);
+
 int tty_port_alloc_xmit_buf(struct tty_port *port)
 {
        /* We may sleep in get_zeroed_page() */
@@ -230,7 +294,7 @@ int tty_port_block_til_ready(struct tty_port *port,
 
        /* block if port is in the process of being closed */
        if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) {
-               wait_event_interruptible_tty(port->close_wait,
+               wait_event_interruptible_tty(tty, port->close_wait,
                                !(port->flags & ASYNC_CLOSING));
                if (port->flags & ASYNC_HUP_NOTIFY)
                        return -EAGAIN;
@@ -246,7 +310,7 @@ int tty_port_block_til_ready(struct tty_port *port,
        }
        if (filp->f_flags & O_NONBLOCK) {
                /* Indicate we are open */
-               if (tty->termios->c_cflag & CBAUD)
+               if (tty->termios.c_cflag & CBAUD)
                        tty_port_raise_dtr_rts(port);
                port->flags |= ASYNC_NORMAL_ACTIVE;
                return 0;
@@ -270,7 +334,7 @@ int tty_port_block_til_ready(struct tty_port *port,
 
        while (1) {
                /* Indicate we are open */
-               if (tty->termios->c_cflag & CBAUD)
+               if (tty->termios.c_cflag & CBAUD)
                        tty_port_raise_dtr_rts(port);
 
                prepare_to_wait(&port->open_wait, &wait, TASK_INTERRUPTIBLE);
@@ -296,9 +360,9 @@ int tty_port_block_til_ready(struct tty_port *port,
                        retval = -ERESTARTSYS;
                        break;
                }
-               tty_unlock();
+               tty_unlock(tty);
                schedule();
-               tty_lock();
+               tty_lock(tty);
        }
        finish_wait(&port->open_wait, &wait);
 
@@ -369,7 +433,7 @@ int tty_port_close_start(struct tty_port *port,
 
        /* Drop DTR/RTS if HUPCL is set. This causes any attached modem to
           hang up the line */
-       if (tty->termios->c_cflag & HUPCL)
+       if (tty->termios.c_cflag & HUPCL)
                tty_port_lower_dtr_rts(port);
 
        /* Don't call port->drop for the last reference. Callers will want
@@ -413,6 +477,24 @@ void tty_port_close(struct tty_port *port, struct tty_struct *tty,
 }
 EXPORT_SYMBOL(tty_port_close);
 
+/**
+ * tty_port_install - generic tty->ops->install handler
+ * @port: tty_port of the device
+ * @driver: tty_driver for this device
+ * @tty: tty to be installed
+ *
+ * It is the same as tty_standard_install except the provided @port is linked
+ * to a concrete tty specified by @tty. Use this or tty_port_register_device
+ * (or both). Call tty_port_link_device as a last resort.
+ */
+int tty_port_install(struct tty_port *port, struct tty_driver *driver,
+               struct tty_struct *tty)
+{
+       tty->port = port;
+       return tty_standard_install(driver, tty);
+}
+EXPORT_SYMBOL_GPL(tty_port_install);
+
 int tty_port_open(struct tty_port *port, struct tty_struct *tty,
                                                        struct file *filp)
 {
index 48cc6f2..681765b 100644 (file)
@@ -119,6 +119,7 @@ static const int NR_TYPES = ARRAY_SIZE(max_vals);
 
 static struct input_handler kbd_handler;
 static DEFINE_SPINLOCK(kbd_event_lock);
+static DEFINE_SPINLOCK(led_lock);
 static unsigned long key_down[BITS_TO_LONGS(KEY_CNT)]; /* keyboard key bitmap */
 static unsigned char shift_down[NR_SHIFT];             /* shift state counters.. */
 static bool dead_key_next;
@@ -310,7 +311,7 @@ static void put_queue(struct vc_data *vc, int ch)
 
        if (tty) {
                tty_insert_flip_char(tty, ch, 0);
-               con_schedule_flip(tty);
+               tty_schedule_flip(tty);
        }
 }
 
@@ -325,7 +326,7 @@ static void puts_queue(struct vc_data *vc, char *cp)
                tty_insert_flip_char(tty, *cp, 0);
                cp++;
        }
-       con_schedule_flip(tty);
+       tty_schedule_flip(tty);
 }
 
 static void applkey(struct vc_data *vc, int key, char mode)
@@ -586,7 +587,7 @@ static void fn_send_intr(struct vc_data *vc)
        if (!tty)
                return;
        tty_insert_flip_char(tty, 0, TTY_BREAK);
-       con_schedule_flip(tty);
+       tty_schedule_flip(tty);
 }
 
 static void fn_scroll_forw(struct vc_data *vc)
@@ -984,7 +985,7 @@ static void k_brl(struct vc_data *vc, unsigned char value, char up_flag)
  * or (ii) whatever pattern of lights people want to show using KDSETLED,
  * or (iii) specified bits of specified words in kernel memory.
  */
-unsigned char getledstate(void)
+static unsigned char getledstate(void)
 {
        return ledstate;
 }
@@ -992,7 +993,7 @@ unsigned char getledstate(void)
 void setledstate(struct kbd_struct *kbd, unsigned int led)
 {
         unsigned long flags;
-        spin_lock_irqsave(&kbd_event_lock, flags);
+        spin_lock_irqsave(&led_lock, flags);
        if (!(led & ~7)) {
                ledioctl = led;
                kbd->ledmode = LED_SHOW_IOCTL;
@@ -1000,7 +1001,7 @@ void setledstate(struct kbd_struct *kbd, unsigned int led)
                kbd->ledmode = LED_SHOW_FLAGS;
 
        set_leds();
-       spin_unlock_irqrestore(&kbd_event_lock, flags);
+       spin_unlock_irqrestore(&led_lock, flags);
 }
 
 static inline unsigned char getleds(void)
@@ -1049,13 +1050,13 @@ static int kbd_update_leds_helper(struct input_handle *handle, void *data)
  */
 int vt_get_leds(int console, int flag)
 {
-       unsigned long flags;
        struct kbd_struct * kbd = kbd_table + console;
        int ret;
+       unsigned long flags;
 
-       spin_lock_irqsave(&kbd_event_lock, flags);
+       spin_lock_irqsave(&led_lock, flags);
        ret = vc_kbd_led(kbd, flag);
-       spin_unlock_irqrestore(&kbd_event_lock, flags);
+       spin_unlock_irqrestore(&led_lock, flags);
 
        return ret;
 }
@@ -1091,11 +1092,11 @@ void vt_set_led_state(int console, int leds)
 void vt_kbd_con_start(int console)
 {
        struct kbd_struct * kbd = kbd_table + console;
-/*     unsigned long flags; */
-/*     spin_lock_irqsave(&kbd_event_lock, flags); */
+       unsigned long flags;
+       spin_lock_irqsave(&led_lock, flags);
        clr_vc_kbd_led(kbd, VC_SCROLLOCK);
        set_leds();
-/*     spin_unlock_irqrestore(&kbd_event_lock, flags); */
+       spin_unlock_irqrestore(&led_lock, flags);
 }
 
 /**
@@ -1104,21 +1105,15 @@ void vt_kbd_con_start(int console)
  *
  *     Handle console stop. This is a wrapper for the VT layer
  *     so that we can keep kbd knowledge internal
- *
- *     FIXME: We eventually need to hold the kbd lock here to protect
- *     the LED updating. We can't do it yet because fn_hold calls stop_tty
- *     and start_tty under the kbd_event_lock, while normal tty paths
- *     don't hold the lock. We probably need to split out an LED lock
- *     but not during an -rc release!
  */
 void vt_kbd_con_stop(int console)
 {
        struct kbd_struct * kbd = kbd_table + console;
-/*     unsigned long flags; */
-/*     spin_lock_irqsave(&kbd_event_lock, flags); */
+       unsigned long flags;
+       spin_lock_irqsave(&led_lock, flags);
        set_vc_kbd_led(kbd, VC_SCROLLOCK);
        set_leds();
-/*     spin_unlock_irqrestore(&kbd_event_lock, flags); */
+       spin_unlock_irqrestore(&led_lock, flags);
 }
 
 /*
@@ -1130,7 +1125,12 @@ void vt_kbd_con_stop(int console)
  */
 static void kbd_bh(unsigned long dummy)
 {
-       unsigned char leds = getleds();
+       unsigned char leds;
+       unsigned long flags;
+       
+       spin_lock_irqsave(&led_lock, flags);
+       leds = getleds();
+       spin_unlock_irqrestore(&led_lock, flags);
 
        if (leds != ledstate) {
                input_handler_for_each_handle(&kbd_handler, &leds,
@@ -2035,11 +2035,11 @@ int vt_do_kdskled(int console, int cmd, unsigned long arg, int perm)
                        return -EPERM;
                if (arg & ~0x77)
                        return -EINVAL;
-                spin_lock_irqsave(&kbd_event_lock, flags);
+                spin_lock_irqsave(&led_lock, flags);
                kbd->ledflagstate = (arg & 7);
                kbd->default_ledflagstate = ((arg >> 4) & 7);
                set_leds();
-                spin_unlock_irqrestore(&kbd_event_lock, flags);
+                spin_unlock_irqrestore(&led_lock, flags);
                return 0;
 
        /* the ioctls below only set the lights, not the functions */
@@ -2134,8 +2134,10 @@ void vt_reset_keyboard(int console)
        clr_vc_kbd_mode(kbd, VC_CRLF);
        kbd->lockstate = 0;
        kbd->slockstate = 0;
+       spin_lock(&led_lock);
        kbd->ledmode = LED_SHOW_FLAGS;
        kbd->ledflagstate = kbd->default_ledflagstate;
+       spin_unlock(&led_lock);
        /* do not do set_leds here because this causes an endless tasklet loop
           when the keyboard hasn't been initialized yet */
        spin_unlock_irqrestore(&kbd_event_lock, flags);
index 84cbf29..999ca63 100644 (file)
@@ -537,45 +537,27 @@ void complement_pos(struct vc_data *vc, int offset)
 
 static void insert_char(struct vc_data *vc, unsigned int nr)
 {
-       unsigned short *p, *q = (unsigned short *)vc->vc_pos;
+       unsigned short *p = (unsigned short *) vc->vc_pos;
 
-       p = q + vc->vc_cols - nr - vc->vc_x;
-       while (--p >= q)
-               scr_writew(scr_readw(p), p + nr);
-       scr_memsetw(q, vc->vc_video_erase_char, nr * 2);
+       scr_memmovew(p + nr, p, vc->vc_cols - vc->vc_x);
+       scr_memsetw(p, vc->vc_video_erase_char, nr * 2);
        vc->vc_need_wrap = 0;
-       if (DO_UPDATE(vc)) {
-               unsigned short oldattr = vc->vc_attr;
-               vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x, vc->vc_y, vc->vc_x + nr, 1,
-                                    vc->vc_cols - vc->vc_x - nr);
-               vc->vc_attr = vc->vc_video_erase_char >> 8;
-               while (nr--)
-                       vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y, vc->vc_x + nr);
-               vc->vc_attr = oldattr;
-       }
+       if (DO_UPDATE(vc))
+               do_update_region(vc, (unsigned long) p,
+                       (vc->vc_cols - vc->vc_x) / 2 + 1);
 }
 
 static void delete_char(struct vc_data *vc, unsigned int nr)
 {
-       unsigned int i = vc->vc_x;
-       unsigned short *p = (unsigned short *)vc->vc_pos;
+       unsigned short *p = (unsigned short *) vc->vc_pos;
 
-       while (++i <= vc->vc_cols - nr) {
-               scr_writew(scr_readw(p+nr), p);
-               p++;
-       }
-       scr_memsetw(p, vc->vc_video_erase_char, nr * 2);
+       scr_memcpyw(p, p + nr, vc->vc_cols - vc->vc_x - nr);
+       scr_memsetw(p + vc->vc_cols - vc->vc_x - nr, vc->vc_video_erase_char,
+                       nr * 2);
        vc->vc_need_wrap = 0;
-       if (DO_UPDATE(vc)) {
-               unsigned short oldattr = vc->vc_attr;
-               vc->vc_sw->con_bmove(vc, vc->vc_y, vc->vc_x + nr, vc->vc_y, vc->vc_x, 1,
-                                    vc->vc_cols - vc->vc_x - nr);
-               vc->vc_attr = vc->vc_video_erase_char >> 8;
-               while (nr--)
-                       vc->vc_sw->con_putc(vc, vc->vc_video_erase_char, vc->vc_y,
-                                    vc->vc_cols - 1 - nr);
-               vc->vc_attr = oldattr;
-       }
+       if (DO_UPDATE(vc))
+               do_update_region(vc, (unsigned long) p,
+                       (vc->vc_cols - vc->vc_x) / 2);
 }
 
 static int softcursor_original;
@@ -1172,45 +1154,26 @@ static void csi_J(struct vc_data *vc, int vpar)
                case 0: /* erase from cursor to end of display */
                        count = (vc->vc_scr_end - vc->vc_pos) >> 1;
                        start = (unsigned short *)vc->vc_pos;
-                       if (DO_UPDATE(vc)) {
-                               /* do in two stages */
-                               vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1,
-                                             vc->vc_cols - vc->vc_x);
-                               vc->vc_sw->con_clear(vc, vc->vc_y + 1, 0,
-                                             vc->vc_rows - vc->vc_y - 1,
-                                             vc->vc_cols);
-                       }
                        break;
                case 1: /* erase from start to cursor */
                        count = ((vc->vc_pos - vc->vc_origin) >> 1) + 1;
                        start = (unsigned short *)vc->vc_origin;
-                       if (DO_UPDATE(vc)) {
-                               /* do in two stages */
-                               vc->vc_sw->con_clear(vc, 0, 0, vc->vc_y,
-                                             vc->vc_cols);
-                               vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1,
-                                             vc->vc_x + 1);
-                       }
                        break;
                case 3: /* erase scroll-back buffer (and whole display) */
                        scr_memsetw(vc->vc_screenbuf, vc->vc_video_erase_char,
                                    vc->vc_screenbuf_size >> 1);
                        set_origin(vc);
-                       if (CON_IS_VISIBLE(vc))
-                               update_screen(vc);
                        /* fall through */
                case 2: /* erase whole display */
                        count = vc->vc_cols * vc->vc_rows;
                        start = (unsigned short *)vc->vc_origin;
-                       if (DO_UPDATE(vc))
-                               vc->vc_sw->con_clear(vc, 0, 0,
-                                             vc->vc_rows,
-                                             vc->vc_cols);
                        break;
                default:
                        return;
        }
        scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
+       if (DO_UPDATE(vc))
+               do_update_region(vc, (unsigned long) start, count);
        vc->vc_need_wrap = 0;
 }
 
@@ -1223,29 +1186,22 @@ static void csi_K(struct vc_data *vc, int vpar)
                case 0: /* erase from cursor to end of line */
                        count = vc->vc_cols - vc->vc_x;
                        start = (unsigned short *)vc->vc_pos;
-                       if (DO_UPDATE(vc))
-                               vc->vc_sw->con_clear(vc, vc->vc_y, vc->vc_x, 1,
-                                                    vc->vc_cols - vc->vc_x);
                        break;
                case 1: /* erase from start of line to cursor */
                        start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1));
                        count = vc->vc_x + 1;
-                       if (DO_UPDATE(vc))
-                               vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1,
-                                                    vc->vc_x + 1);
                        break;
                case 2: /* erase whole line */
                        start = (unsigned short *)(vc->vc_pos - (vc->vc_x << 1));
                        count = vc->vc_cols;
-                       if (DO_UPDATE(vc))
-                               vc->vc_sw->con_clear(vc, vc->vc_y, 0, 1,
-                                             vc->vc_cols);
                        break;
                default:
                        return;
        }
        scr_memsetw(start, vc->vc_video_erase_char, 2 * count);
        vc->vc_need_wrap = 0;
+       if (DO_UPDATE(vc))
+               do_update_region(vc, (unsigned long) start, count);
 }
 
 static void csi_X(struct vc_data *vc, int vpar) /* erase the following vpar positions */
@@ -1380,7 +1336,7 @@ static void respond_string(const char *p, struct tty_struct *tty)
                tty_insert_flip_char(tty, *p, 0);
                p++;
        }
-       con_schedule_flip(tty);
+       tty_schedule_flip(tty);
 }
 
 static void cursor_report(struct vc_data *vc, struct tty_struct *tty)
@@ -2792,41 +2748,52 @@ static void con_flush_chars(struct tty_struct *tty)
 /*
  * Allocate the console screen memory.
  */
-static int con_open(struct tty_struct *tty, struct file *filp)
+static int con_install(struct tty_driver *driver, struct tty_struct *tty)
 {
        unsigned int currcons = tty->index;
-       int ret = 0;
+       struct vc_data *vc;
+       int ret;
 
        console_lock();
-       if (tty->driver_data == NULL) {
-               ret = vc_allocate(currcons);
-               if (ret == 0) {
-                       struct vc_data *vc = vc_cons[currcons].d;
+       ret = vc_allocate(currcons);
+       if (ret)
+               goto unlock;
 
-                       /* Still being freed */
-                       if (vc->port.tty) {
-                               console_unlock();
-                               return -ERESTARTSYS;
-                       }
-                       tty->driver_data = vc;
-                       vc->port.tty = tty;
+       vc = vc_cons[currcons].d;
 
-                       if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
-                               tty->winsize.ws_row = vc_cons[currcons].d->vc_rows;
-                               tty->winsize.ws_col = vc_cons[currcons].d->vc_cols;
-                       }
-                       if (vc->vc_utf)
-                               tty->termios->c_iflag |= IUTF8;
-                       else
-                               tty->termios->c_iflag &= ~IUTF8;
-                       console_unlock();
-                       return ret;
-               }
+       /* Still being freed */
+       if (vc->port.tty) {
+               ret = -ERESTARTSYS;
+               goto unlock;
        }
+
+       ret = tty_port_install(&vc->port, driver, tty);
+       if (ret)
+               goto unlock;
+
+       tty->driver_data = vc;
+       vc->port.tty = tty;
+
+       if (!tty->winsize.ws_row && !tty->winsize.ws_col) {
+               tty->winsize.ws_row = vc_cons[currcons].d->vc_rows;
+               tty->winsize.ws_col = vc_cons[currcons].d->vc_cols;
+       }
+       if (vc->vc_utf)
+               tty->termios.c_iflag |= IUTF8;
+       else
+               tty->termios.c_iflag &= ~IUTF8;
+unlock:
        console_unlock();
        return ret;
 }
 
+static int con_open(struct tty_struct *tty, struct file *filp)
+{
+       /* everything done in install */
+       return 0;
+}
+
+
 static void con_close(struct tty_struct *tty, struct file *filp)
 {
        /* Nothing to do - we defer to shutdown */
@@ -2839,7 +2806,6 @@ static void con_shutdown(struct tty_struct *tty)
        console_lock();
        vc->port.tty = NULL;
        console_unlock();
-       tty_shutdown(tty);
 }
 
 static int default_italic_color    = 2; // green (ASCII)
@@ -2947,6 +2913,7 @@ static int __init con_init(void)
 console_initcall(con_init);
 
 static const struct tty_operations con_ops = {
+       .install = con_install,
        .open = con_open,
        .close = con_close,
        .write = con_write,
index 7065df6..7de2285 100644 (file)
@@ -13,7 +13,6 @@ config USB_ARCH_HAS_OHCI
        default y if PXA3xx
        default y if ARCH_EP93XX
        default y if ARCH_AT91
-       default y if ARCH_PNX4008
        default y if MFD_TC6393XB
        default y if ARCH_W90X900
        default y if ARCH_DAVINCI_DA8XX
index c7a032a..d214448 100644 (file)
@@ -78,8 +78,7 @@ static inline int ep_to_bit(struct ci13xxx *ci, int n)
 }
 
 /**
- * hw_device_state: enables/disables interrupts & starts/stops device (execute
- *                  without interruption)
+ * hw_device_state: enables/disables interrupts (execute without interruption)
  * @dma: 0 => disable, !0 => enable and set dma engine
  *
  * This function returns an error code
@@ -91,9 +90,7 @@ static int hw_device_state(struct ci13xxx *ci, u32 dma)
                /* interrupt, error, port change, reset, sleep/suspend */
                hw_write(ci, OP_USBINTR, ~0,
                             USBi_UI|USBi_UEI|USBi_PCI|USBi_URI|USBi_SLI);
-               hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS);
        } else {
-               hw_write(ci, OP_USBCMD, USBCMD_RS, 0);
                hw_write(ci, OP_USBINTR, ~0, 0);
        }
        return 0;
@@ -774,10 +771,7 @@ __acquires(mEp->lock)
 {
        struct ci13xxx_req *mReq, *mReqTemp;
        struct ci13xxx_ep *mEpTemp = mEp;
-       int uninitialized_var(retval);
-
-       if (list_empty(&mEp->qh.queue))
-               return -EINVAL;
+       int retval = 0;
 
        list_for_each_entry_safe(mReq, mReqTemp, &mEp->qh.queue,
                        queue) {
@@ -1420,6 +1414,21 @@ static int ci13xxx_vbus_draw(struct usb_gadget *_gadget, unsigned mA)
        return -ENOTSUPP;
 }
 
+/* Change Data+ pullup status
+ * this func is used by usb_gadget_connect/disconnet
+ */
+static int ci13xxx_pullup(struct usb_gadget *_gadget, int is_on)
+{
+       struct ci13xxx *ci = container_of(_gadget, struct ci13xxx, gadget);
+
+       if (is_on)
+               hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS);
+       else
+               hw_write(ci, OP_USBCMD, USBCMD_RS, 0);
+
+       return 0;
+}
+
 static int ci13xxx_start(struct usb_gadget *gadget,
                         struct usb_gadget_driver *driver);
 static int ci13xxx_stop(struct usb_gadget *gadget,
@@ -1432,6 +1441,7 @@ static int ci13xxx_stop(struct usb_gadget *gadget,
 static const struct usb_gadget_ops usb_gadget_ops = {
        .vbus_session   = ci13xxx_vbus_session,
        .wakeup         = ci13xxx_wakeup,
+       .pullup         = ci13xxx_pullup,
        .vbus_draw      = ci13xxx_vbus_draw,
        .udc_start      = ci13xxx_start,
        .udc_stop       = ci13xxx_stop,
@@ -1455,7 +1465,12 @@ static int init_eps(struct ci13xxx *ci)
 
                        mEp->ep.name      = mEp->name;
                        mEp->ep.ops       = &usb_ep_ops;
-                       mEp->ep.maxpacket = CTRL_PAYLOAD_MAX;
+                       /*
+                        * for ep0: maxP defined in desc, for other
+                        * eps, maxP is set by epautoconfig() called
+                        * by gadget layer
+                        */
+                       mEp->ep.maxpacket = (unsigned short)~0;
 
                        INIT_LIST_HEAD(&mEp->qh.queue);
                        mEp->qh.ptr = dma_pool_alloc(ci->qh_pool, GFP_KERNEL,
@@ -1475,6 +1490,7 @@ static int init_eps(struct ci13xxx *ci)
                                else
                                        ci->ep0in = mEp;
 
+                               mEp->ep.maxpacket = CTRL_PAYLOAD_MAX;
                                continue;
                        }
 
@@ -1484,6 +1500,17 @@ static int init_eps(struct ci13xxx *ci)
        return retval;
 }
 
+static void destroy_eps(struct ci13xxx *ci)
+{
+       int i;
+
+       for (i = 0; i < ci->hw_ep_max; i++) {
+               struct ci13xxx_ep *mEp = &ci->ci13xxx_ep[i];
+
+               dma_pool_free(ci->qh_pool, mEp->qh.ptr, mEp->qh.dma);
+       }
+}
+
 /**
  * ci13xxx_start: register a gadget driver
  * @gadget: our gadget
@@ -1691,7 +1718,7 @@ static int udc_start(struct ci13xxx *ci)
        if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) {
                if (ci->transceiver == NULL) {
                        retval = -ENODEV;
-                       goto free_pools;
+                       goto destroy_eps;
                }
        }
 
@@ -1729,7 +1756,7 @@ static int udc_start(struct ci13xxx *ci)
 
 remove_trans:
        if (!IS_ERR_OR_NULL(ci->transceiver)) {
-               otg_set_peripheral(ci->transceiver->otg, &ci->gadget);
+               otg_set_peripheral(ci->transceiver->otg, NULL);
                if (ci->global_phy)
                        usb_put_phy(ci->transceiver);
        }
@@ -1742,6 +1769,8 @@ unreg_device:
 put_transceiver:
        if (!IS_ERR_OR_NULL(ci->transceiver) && ci->global_phy)
                usb_put_phy(ci->transceiver);
+destroy_eps:
+       destroy_eps(ci);
 free_pools:
        dma_pool_destroy(ci->td_pool);
 free_qh_pool:
@@ -1756,18 +1785,12 @@ free_qh_pool:
  */
 static void udc_stop(struct ci13xxx *ci)
 {
-       int i;
-
        if (ci == NULL)
                return;
 
        usb_del_gadget_udc(&ci->gadget);
 
-       for (i = 0; i < ci->hw_ep_max; i++) {
-               struct ci13xxx_ep *mEp = &ci->ci13xxx_ep[i];
-
-               dma_pool_free(ci->qh_pool, mEp->qh.ptr, mEp->qh.dma);
-       }
+       destroy_eps(ci);
 
        dma_pool_destroy(ci->td_pool);
        dma_pool_destroy(ci->qh_pool);
index f763ed7..ff7b5a8 100644 (file)
@@ -826,7 +826,7 @@ static void acm_tty_set_termios(struct tty_struct *tty,
                                                struct ktermios *termios_old)
 {
        struct acm *acm = tty->driver_data;
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        struct usb_cdc_line_coding newline;
        int newctrl = acm->ctrlout;
 
@@ -1299,7 +1299,8 @@ skip_countries:
        usb_set_intfdata(data_interface, acm);
 
        usb_get_intf(control_interface);
-       tty_register_device(acm_tty_driver, minor, &control_interface->dev);
+       tty_port_register_device(&acm->port, acm_tty_driver, minor,
+                       &control_interface->dev);
 
        return 0;
 alloc_fail7:
index 65a55ab..5f0cb41 100644 (file)
@@ -109,12 +109,14 @@ static struct usb_driver wdm_driver;
 /* return intfdata if we own the interface, else look up intf in the list */
 static struct wdm_device *wdm_find_device(struct usb_interface *intf)
 {
-       struct wdm_device *desc = NULL;
+       struct wdm_device *desc;
 
        spin_lock(&wdm_device_list_lock);
        list_for_each_entry(desc, &wdm_device_list, device_list)
                if (desc->intf == intf)
-                       break;
+                       goto found;
+       desc = NULL;
+found:
        spin_unlock(&wdm_device_list_lock);
 
        return desc;
@@ -122,12 +124,14 @@ static struct wdm_device *wdm_find_device(struct usb_interface *intf)
 
 static struct wdm_device *wdm_find_device_by_minor(int minor)
 {
-       struct wdm_device *desc = NULL;
+       struct wdm_device *desc;
 
        spin_lock(&wdm_device_list_lock);
        list_for_each_entry(desc, &wdm_device_list, device_list)
                if (desc->intf->minor == minor)
-                       break;
+                       goto found;
+       desc = NULL;
+found:
        spin_unlock(&wdm_device_list_lock);
 
        return desc;
index f15501f..e77a8e8 100644 (file)
@@ -71,6 +71,10 @@ static const struct usb_device_id usb_quirk_list[] = {
        { USB_DEVICE(0x04b4, 0x0526), .driver_info =
                        USB_QUIRK_CONFIG_INTF_STRINGS },
 
+       /* Microchip Joss Optical infrared touchboard device */
+       { USB_DEVICE(0x04d8, 0x000c), .driver_info =
+                       USB_QUIRK_CONFIG_INTF_STRINGS },
+
        /* Samsung Android phone modem - ID conflict with SPH-I500 */
        { USB_DEVICE(0x04e8, 0x6601), .driver_info =
                        USB_QUIRK_CONFIG_INTF_STRINGS },
index c34452a..a68ff53 100644 (file)
@@ -436,16 +436,21 @@ static int __devinit dwc3_probe(struct platform_device *pdev)
                dev_err(dev, "missing IRQ\n");
                return -ENODEV;
        }
-       dwc->xhci_resources[1] = *res;
+       dwc->xhci_resources[1].start = res->start;
+       dwc->xhci_resources[1].end = res->end;
+       dwc->xhci_resources[1].flags = res->flags;
+       dwc->xhci_resources[1].name = res->name;
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(dev, "missing memory resource\n");
                return -ENODEV;
        }
-       dwc->xhci_resources[0] = *res;
+       dwc->xhci_resources[0].start = res->start;
        dwc->xhci_resources[0].end = dwc->xhci_resources[0].start +
                                        DWC3_XHCI_REGS_END;
+       dwc->xhci_resources[0].flags = res->flags;
+       dwc->xhci_resources[0].name = res->name;
 
         /*
          * Request memory region but exclude xHCI regs,
index 9b94886..e4d5ca8 100644 (file)
@@ -720,7 +720,6 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc,
                transferred = min_t(u32, ur->length,
                                transfer_size - length);
                memcpy(ur->buf, dwc->ep0_bounce, transferred);
-               dwc->ep0_bounced = false;
        } else {
                transferred = ur->length - length;
        }
index 58fdfad..c2813c2 100644 (file)
@@ -263,8 +263,11 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
        if (req->request.status == -EINPROGRESS)
                req->request.status = status;
 
-       usb_gadget_unmap_request(&dwc->gadget, &req->request,
-                       req->direction);
+       if (dwc->ep0_bounced && dep->number == 0)
+               dwc->ep0_bounced = false;
+       else
+               usb_gadget_unmap_request(&dwc->gadget, &req->request,
+                               req->direction);
 
        dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n",
                        req, dep->name, req->request.actual,
@@ -1026,6 +1029,7 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc,
        if (list_empty(&dep->request_list)) {
                dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n",
                        dep->name);
+               dep->flags |= DWC3_EP_PENDING_REQUEST;
                return;
        }
 
@@ -1089,6 +1093,17 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req)
        if (dep->flags & DWC3_EP_PENDING_REQUEST) {
                int     ret;
 
+               /*
+                * If xfernotready is already elapsed and it is a case
+                * of isoc transfer, then issue END TRANSFER, so that
+                * you can receive xfernotready again and can have
+                * notion of current microframe.
+                */
+               if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) {
+                       dwc3_stop_active_transfer(dwc, dep->number);
+                       return 0;
+               }
+
                ret = __dwc3_gadget_kick_transfer(dep, 0, true);
                if (ret && ret != -EBUSY) {
                        struct dwc3     *dwc = dep->dwc;
index c9e66df..1e35963 100644 (file)
@@ -475,8 +475,7 @@ static int at91_ep_enable(struct usb_ep *_ep,
        unsigned long   flags;
 
        if (!_ep || !ep
-                       || !desc || ep->ep.desc
-                       || _ep->name == ep0name
+                       || !desc || _ep->name == ep0name
                        || desc->bDescriptorType != USB_DT_ENDPOINT
                        || (maxpacket = usb_endpoint_maxp(desc)) == 0
                        || maxpacket > ep->maxpacket) {
@@ -530,7 +529,6 @@ ok:
        tmp |= AT91_UDP_EPEDS;
        __raw_writel(tmp, ep->creg);
 
-       ep->ep.desc = desc;
        ep->ep.maxpacket = maxpacket;
 
        /*
@@ -1635,7 +1633,6 @@ static int at91_start(struct usb_gadget *gadget,
        udc->driver = driver;
        udc->gadget.dev.driver = &driver->driver;
        udc->gadget.dev.of_node = udc->pdev->dev.of_node;
-       dev_set_drvdata(&udc->gadget.dev, &driver->driver);
        udc->enabled = 1;
        udc->selfpowered = 1;
 
@@ -1656,7 +1653,6 @@ static int at91_stop(struct usb_gadget *gadget,
        spin_unlock_irqrestore(&udc->lock, flags);
 
        udc->gadget.dev.driver = NULL;
-       dev_set_drvdata(&udc->gadget.dev, NULL);
        udc->driver = NULL;
 
        DBG("unbound from %s\n", driver->driver.name);
index b799106..afdbb1c 100644 (file)
@@ -1916,6 +1916,27 @@ done:
        return retval;
 }
 
+/* usb 3.0 root hub device descriptor */
+struct {
+       struct usb_bos_descriptor bos;
+       struct usb_ss_cap_descriptor ss_cap;
+} __packed usb3_bos_desc = {
+
+       .bos = {
+               .bLength                = USB_DT_BOS_SIZE,
+               .bDescriptorType        = USB_DT_BOS,
+               .wTotalLength           = cpu_to_le16(sizeof(usb3_bos_desc)),
+               .bNumDeviceCaps         = 1,
+       },
+       .ss_cap = {
+               .bLength                = USB_DT_USB_SS_CAP_SIZE,
+               .bDescriptorType        = USB_DT_DEVICE_CAPABILITY,
+               .bDevCapabilityType     = USB_SS_CAP_TYPE,
+               .wSpeedSupported        = cpu_to_le16(USB_5GBPS_OPERATION),
+               .bFunctionalitySupport  = ilog2(USB_5GBPS_OPERATION),
+       },
+};
+
 static inline void
 ss_hub_descriptor(struct usb_hub_descriptor *desc)
 {
@@ -2006,6 +2027,18 @@ static int dummy_hub_control(
                else
                        hub_descriptor((struct usb_hub_descriptor *) buf);
                break;
+
+       case DeviceRequest | USB_REQ_GET_DESCRIPTOR:
+               if (hcd->speed != HCD_USB3)
+                       goto error;
+
+               if ((wValue >> 8) != USB_DT_BOS)
+                       goto error;
+
+               memcpy(buf, &usb3_bos_desc, sizeof(usb3_bos_desc));
+               retval = sizeof(usb3_bos_desc);
+               break;
+
        case GetHubStatus:
                *(__le32 *) buf = cpu_to_le32(0);
                break;
@@ -2503,10 +2536,8 @@ static int dummy_hcd_probe(struct platform_device *pdev)
        hs_hcd->has_tt = 1;
 
        retval = usb_add_hcd(hs_hcd, 0, 0);
-       if (retval != 0) {
-               usb_put_hcd(hs_hcd);
-               return retval;
-       }
+       if (retval)
+               goto put_usb2_hcd;
 
        if (mod_data.is_super_speed) {
                ss_hcd = usb_create_shared_hcd(&dummy_hcd, &pdev->dev,
@@ -2525,6 +2556,8 @@ static int dummy_hcd_probe(struct platform_device *pdev)
 put_usb3_hcd:
        usb_put_hcd(ss_hcd);
 dealloc_usb2_hcd:
+       usb_remove_hcd(hs_hcd);
+put_usb2_hcd:
        usb_put_hcd(hs_hcd);
        the_controller.hs_hcd = the_controller.ss_hcd = NULL;
        return retval;
index 8adc79d..829aba7 100644 (file)
 /* Debugging ****************************************************************/
 
 #ifdef VERBOSE_DEBUG
+#ifndef pr_vdebug
 #  define pr_vdebug pr_debug
+#endif /* pr_vdebug */
 #  define ffs_dump_mem(prefix, ptr, len) \
        print_hex_dump_bytes(pr_fmt(prefix ": "), DUMP_PREFIX_NONE, ptr, len)
 #else
+#ifndef pr_vdebug
 #  define pr_vdebug(...)                 do { } while (0)
+#endif /* pr_vdebug */
 #  define ffs_dump_mem(prefix, ptr, len) do { } while (0)
 #endif /* VERBOSE_DEBUG */
 
index b13e0bb..0bb617e 100644 (file)
@@ -3599,6 +3599,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
 
        if (hsotg->num_of_eps == 0) {
                dev_err(dev, "wrong number of EPs (zero)\n");
+               ret = -EINVAL;
                goto err_supplies;
        }
 
@@ -3606,6 +3607,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
                      GFP_KERNEL);
        if (!eps) {
                dev_err(dev, "cannot get memory\n");
+               ret = -ENOMEM;
                goto err_supplies;
        }
 
@@ -3622,6 +3624,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev)
                                                     GFP_KERNEL);
        if (!hsotg->ctrl_req) {
                dev_err(dev, "failed to allocate ctrl req\n");
+               ret = -ENOMEM;
                goto err_ep_mem;
        }
 
index 5b3f5ff..f173952 100644 (file)
@@ -132,11 +132,15 @@ static unsigned   n_ports;
 
 
 #ifdef VERBOSE_DEBUG
+#ifndef pr_vdebug
 #define pr_vdebug(fmt, arg...) \
        pr_debug(fmt, ##arg)
+#endif /* pr_vdebug */
 #else
+#ifndef pr_vdebig
 #define pr_vdebug(fmt, arg...) \
        ({ if (0) pr_debug(fmt, ##arg); })
+#endif /* pr_vdebug */
 #endif
 
 /*-------------------------------------------------------------------------*/
@@ -1129,7 +1133,8 @@ int gserial_setup(struct usb_gadget *g, unsigned count)
        for (i = 0; i < count; i++) {
                struct device   *tty_dev;
 
-               tty_dev = tty_register_device(gs_tty_driver, i, &g->dev);
+               tty_dev = tty_port_register_device(&ports[i].port->port,
+                               gs_tty_driver, i, &g->dev);
                if (IS_ERR(tty_dev))
                        pr_warning("%s: no classdev for port %d, err %ld\n",
                                __func__, i, PTR_ERR(tty_dev));
index 075d2ec..276add2 100644 (file)
@@ -292,7 +292,7 @@ config USB_OHCI_HCD
        depends on USB && USB_ARCH_HAS_OHCI
        select ISP1301_OMAP if MACH_OMAP_H2 || MACH_OMAP_H3
        select USB_OTG_UTILS if ARCH_OMAP
-       select USB_ISP1301 if ARCH_LPC32XX || ARCH_PNX4008
+       select USB_ISP1301 if ARCH_LPC32XX
        ---help---
          The Open Host Controller Interface (OHCI) is a standard for accessing
          USB 1.1 host controller hardware.  It does more in hardware than Intel's
index 9bc39ca..4b66374 100644 (file)
@@ -128,9 +128,17 @@ qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh)
        else {
                qtd = list_entry (qh->qtd_list.next,
                                struct ehci_qtd, qtd_list);
-               /* first qtd may already be partially processed */
-               if (cpu_to_hc32(ehci, qtd->qtd_dma) == qh->hw->hw_current)
+               /*
+                * first qtd may already be partially processed.
+                * If we come here during unlink, the QH overlay region
+                * might have reference to the just unlinked qtd. The
+                * qtd is updated in qh_completions(). Update the QH
+                * overlay here.
+                */
+               if (cpu_to_hc32(ehci, qtd->qtd_dma) == qh->hw->hw_current) {
+                       qh->hw->hw_qtd_next = qtd->hw_next;
                        qtd = NULL;
+               }
        }
 
        if (qtd)
index a665b3e..aaa8d2b 100644 (file)
@@ -570,6 +570,16 @@ static int __devinit ohci_hcd_at91_drv_probe(struct platform_device *pdev)
 
        if (pdata) {
                at91_for_each_port(i) {
+                       /*
+                        * do not configure PIO if not in relation with
+                        * real USB port on board
+                        */
+                       if (i >= pdata->ports) {
+                               pdata->vbus_pin[i] = -EINVAL;
+                               pdata->overcurrent_pin[i] = -EINVAL;
+                               break;
+                       }
+
                        if (!gpio_is_valid(pdata->vbus_pin[i]))
                                continue;
                        gpio = pdata->vbus_pin[i];
index 2b1e8d8..6780010 100644 (file)
@@ -1049,7 +1049,7 @@ MODULE_LICENSE ("GPL");
 #define PLATFORM_DRIVER                ohci_hcd_at91_driver
 #endif
 
-#if defined(CONFIG_ARCH_PNX4008) || defined(CONFIG_ARCH_LPC32XX)
+#ifdef CONFIG_ARCH_LPC32XX
 #include "ohci-nxp.c"
 #define PLATFORM_DRIVER                usb_hcd_nxp_driver
 #endif
index a446386..1199666 100644 (file)
@@ -2,7 +2,6 @@
  * driver for NXP USB Host devices
  *
  * Currently supported OHCI host devices:
- * - Philips PNX4008
  * - NXP LPC32xx
  *
  * Authors: Dmitry Chigirev <source@mvista.com>
@@ -66,38 +65,6 @@ static struct clk *usb_pll_clk;
 static struct clk *usb_dev_clk;
 static struct clk *usb_otg_clk;
 
-static void isp1301_configure_pnx4008(void)
-{
-       /* PNX4008 only supports DAT_SE0 USB mode */
-       /* PNX4008 R2A requires setting the MAX603 to output 3.6V */
-       /* Power up externel charge-pump */
-
-       i2c_smbus_write_byte_data(isp1301_i2c_client,
-               ISP1301_I2C_MODE_CONTROL_1, MC1_DAT_SE0 | MC1_SPEED_REG);
-       i2c_smbus_write_byte_data(isp1301_i2c_client,
-               ISP1301_I2C_MODE_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR,
-               ~(MC1_DAT_SE0 | MC1_SPEED_REG));
-       i2c_smbus_write_byte_data(isp1301_i2c_client,
-               ISP1301_I2C_MODE_CONTROL_2,
-               MC2_BI_DI | MC2_PSW_EN | MC2_SPD_SUSP_CTRL);
-       i2c_smbus_write_byte_data(isp1301_i2c_client,
-               ISP1301_I2C_MODE_CONTROL_2 | ISP1301_I2C_REG_CLEAR_ADDR,
-               ~(MC2_BI_DI | MC2_PSW_EN | MC2_SPD_SUSP_CTRL));
-       i2c_smbus_write_byte_data(isp1301_i2c_client,
-               ISP1301_I2C_OTG_CONTROL_1, OTG1_DM_PULLDOWN | OTG1_DP_PULLDOWN);
-       i2c_smbus_write_byte_data(isp1301_i2c_client,
-               ISP1301_I2C_OTG_CONTROL_1 | ISP1301_I2C_REG_CLEAR_ADDR,
-               ~(OTG1_DM_PULLDOWN | OTG1_DP_PULLDOWN));
-       i2c_smbus_write_byte_data(isp1301_i2c_client,
-               ISP1301_I2C_INTERRUPT_LATCH | ISP1301_I2C_REG_CLEAR_ADDR, 0xFF);
-       i2c_smbus_write_byte_data(isp1301_i2c_client,
-               ISP1301_I2C_INTERRUPT_FALLING | ISP1301_I2C_REG_CLEAR_ADDR,
-               0xFF);
-       i2c_smbus_write_byte_data(isp1301_i2c_client,
-               ISP1301_I2C_INTERRUPT_RISING | ISP1301_I2C_REG_CLEAR_ADDR,
-               0xFF);
-}
-
 static void isp1301_configure_lpc32xx(void)
 {
        /* LPC32XX only supports DAT_SE0 USB mode */
@@ -149,10 +116,7 @@ static void isp1301_configure_lpc32xx(void)
 
 static void isp1301_configure(void)
 {
-       if (machine_is_pnx4008())
-               isp1301_configure_pnx4008();
-       else
-               isp1301_configure_lpc32xx();
+       isp1301_configure_lpc32xx();
 }
 
 static inline void isp1301_vbus_on(void)
@@ -241,47 +205,6 @@ static const struct hc_driver ohci_nxp_hc_driver = {
        .start_port_reset = ohci_start_port_reset,
 };
 
-static void nxp_set_usb_bits(void)
-{
-       if (machine_is_pnx4008()) {
-               start_int_set_falling_edge(SE_USB_OTG_ATX_INT_N);
-               start_int_ack(SE_USB_OTG_ATX_INT_N);
-               start_int_umask(SE_USB_OTG_ATX_INT_N);
-
-               start_int_set_rising_edge(SE_USB_OTG_TIMER_INT);
-               start_int_ack(SE_USB_OTG_TIMER_INT);
-               start_int_umask(SE_USB_OTG_TIMER_INT);
-
-               start_int_set_rising_edge(SE_USB_I2C_INT);
-               start_int_ack(SE_USB_I2C_INT);
-               start_int_umask(SE_USB_I2C_INT);
-
-               start_int_set_rising_edge(SE_USB_INT);
-               start_int_ack(SE_USB_INT);
-               start_int_umask(SE_USB_INT);
-
-               start_int_set_rising_edge(SE_USB_NEED_CLK_INT);
-               start_int_ack(SE_USB_NEED_CLK_INT);
-               start_int_umask(SE_USB_NEED_CLK_INT);
-
-               start_int_set_rising_edge(SE_USB_AHB_NEED_CLK_INT);
-               start_int_ack(SE_USB_AHB_NEED_CLK_INT);
-               start_int_umask(SE_USB_AHB_NEED_CLK_INT);
-       }
-}
-
-static void nxp_unset_usb_bits(void)
-{
-       if (machine_is_pnx4008()) {
-               start_int_mask(SE_USB_OTG_ATX_INT_N);
-               start_int_mask(SE_USB_OTG_TIMER_INT);
-               start_int_mask(SE_USB_I2C_INT);
-               start_int_mask(SE_USB_INT);
-               start_int_mask(SE_USB_NEED_CLK_INT);
-               start_int_mask(SE_USB_AHB_NEED_CLK_INT);
-       }
-}
-
 static int __devinit usb_hcd_nxp_probe(struct platform_device *pdev)
 {
        struct usb_hcd *hcd = 0;
@@ -376,9 +299,6 @@ static int __devinit usb_hcd_nxp_probe(struct platform_device *pdev)
                goto out8;
        }
 
-       /* Set all USB bits in the Start Enable register */
-       nxp_set_usb_bits();
-
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                dev_err(&pdev->dev, "Failed to get MEM resource\n");
@@ -413,7 +333,6 @@ static int __devinit usb_hcd_nxp_probe(struct platform_device *pdev)
 
        nxp_stop_hc();
 out8:
-       nxp_unset_usb_bits();
        usb_put_hcd(hcd);
 out7:
        clk_disable(usb_otg_clk);
@@ -441,7 +360,6 @@ static int usb_hcd_nxp_remove(struct platform_device *pdev)
        nxp_stop_hc();
        release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
        usb_put_hcd(hcd);
-       nxp_unset_usb_bits();
        clk_disable(usb_pll_clk);
        clk_put(usb_pll_clk);
        clk_disable(usb_dev_clk);
index f8b2d91..4531d03 100644 (file)
@@ -24,7 +24,7 @@
 #include <asm/io.h>
 #include <asm/mach-types.h>
 
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include <plat/fpga.h>
 
 #include <mach/hardware.h>
index c5e9e4a..966d148 100644 (file)
@@ -75,7 +75,9 @@
 #define        NB_PIF0_PWRDOWN_1       0x01100013
 
 #define USB_INTEL_XUSB2PR      0xD0
+#define USB_INTEL_USB2PRM      0xD4
 #define USB_INTEL_USB3_PSSEN   0xD8
+#define USB_INTEL_USB3PRM      0xDC
 
 static struct amd_chipset_info {
        struct pci_dev  *nb_dev;
@@ -772,10 +774,18 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev)
                return;
        }
 
-       ports_available = 0xffffffff;
+       /* Read USB3PRM, the USB 3.0 Port Routing Mask Register
+        * Indicate the ports that can be changed from OS.
+        */
+       pci_read_config_dword(xhci_pdev, USB_INTEL_USB3PRM,
+                       &ports_available);
+
+       dev_dbg(&xhci_pdev->dev, "Configurable ports to enable SuperSpeed: 0x%x\n",
+                       ports_available);
+
        /* Write USB3_PSSEN, the USB 3.0 Port SuperSpeed Enable
-        * Register, to turn on SuperSpeed terminations for all
-        * available ports.
+        * Register, to turn on SuperSpeed terminations for the
+        * switchable ports.
         */
        pci_write_config_dword(xhci_pdev, USB_INTEL_USB3_PSSEN,
                        cpu_to_le32(ports_available));
@@ -785,7 +795,16 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev)
        dev_dbg(&xhci_pdev->dev, "USB 3.0 ports that are now enabled "
                        "under xHCI: 0x%x\n", ports_available);
 
-       ports_available = 0xffffffff;
+       /* Read XUSB2PRM, xHCI USB 2.0 Port Routing Mask Register
+        * Indicate the USB 2.0 ports to be controlled by the xHCI host.
+        */
+
+       pci_read_config_dword(xhci_pdev, USB_INTEL_USB2PRM,
+                       &ports_available);
+
+       dev_dbg(&xhci_pdev->dev, "Configurable USB 2.0 ports to hand over to xCHI: 0x%x\n",
+                       ports_available);
+
        /* Write XUSB2PR, the xHC USB 2.0 Port Routing Register, to
         * switch the USB 2.0 power and data lines over to the xHCI
         * host.
@@ -822,12 +841,12 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev)
        void __iomem *op_reg_base;
        u32 val;
        int timeout;
+       int len = pci_resource_len(pdev, 0);
 
        if (!mmio_resource_enabled(pdev, 0))
                return;
 
-       base = ioremap_nocache(pci_resource_start(pdev, 0),
-                               pci_resource_len(pdev, 0));
+       base = ioremap_nocache(pci_resource_start(pdev, 0), len);
        if (base == NULL)
                return;
 
@@ -837,9 +856,17 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev)
         */
        ext_cap_offset = xhci_find_next_cap_offset(base, XHCI_HCC_PARAMS_OFFSET);
        do {
+               if ((ext_cap_offset + sizeof(val)) > len) {
+                       /* We're reading garbage from the controller */
+                       dev_warn(&pdev->dev,
+                                "xHCI controller failing to respond");
+                       return;
+               }
+
                if (!ext_cap_offset)
                        /* We've reached the end of the extended capabilities */
                        goto hc_init;
+
                val = readl(base + ext_cap_offset);
                if (XHCI_EXT_CAPS_ID(val) == XHCI_EXT_CAPS_LEGACY)
                        break;
@@ -870,9 +897,10 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev)
        /* Disable any BIOS SMIs and clear all SMI events*/
        writel(val, base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET);
 
+hc_init:
        if (usb_is_intel_switchable_xhci(pdev))
                usb_enable_xhci_ports(pdev);
-hc_init:
+
        op_reg_base = base + XHCI_HC_LENGTH(readl(base));
 
        /* Wait for the host controller to be ready before writing any
index ef004a5..7f69a39 100644 (file)
@@ -15,6 +15,7 @@ void usb_disable_xhci_ports(struct pci_dev *xhci_pdev);
 static inline void usb_amd_quirk_pll_disable(void) {}
 static inline void usb_amd_quirk_pll_enable(void) {}
 static inline void usb_amd_dev_put(void) {}
+static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {}
 #endif  /* CONFIG_PCI */
 
 #endif  /*  __LINUX_USB_PCI_QUIRKS_H  */
index 74bfc86..d5eb357 100644 (file)
@@ -493,11 +493,48 @@ static void xhci_hub_report_link_state(u32 *status, u32 status_reg)
                 * when this bit is set.
                 */
                pls |= USB_PORT_STAT_CONNECTION;
+       } else {
+               /*
+                * If CAS bit isn't set but the Port is already at
+                * Compliance Mode, fake a connection so the USB core
+                * notices the Compliance state and resets the port.
+                * This resolves an issue generated by the SN65LVPE502CP
+                * in which sometimes the port enters compliance mode
+                * caused by a delay on the host-device negotiation.
+                */
+               if (pls == USB_SS_PORT_LS_COMP_MOD)
+                       pls |= USB_PORT_STAT_CONNECTION;
        }
+
        /* update status field */
        *status |= pls;
 }
 
+/*
+ * Function for Compliance Mode Quirk.
+ *
+ * This Function verifies if all xhc USB3 ports have entered U0, if so,
+ * the compliance mode timer is deleted. A port won't enter
+ * compliance mode if it has previously entered U0.
+ */
+void xhci_del_comp_mod_timer(struct xhci_hcd *xhci, u32 status, u16 wIndex)
+{
+       u32 all_ports_seen_u0 = ((1 << xhci->num_usb3_ports)-1);
+       bool port_in_u0 = ((status & PORT_PLS_MASK) == XDEV_U0);
+
+       if (!(xhci->quirks & XHCI_COMP_MODE_QUIRK))
+               return;
+
+       if ((xhci->port_status_u0 != all_ports_seen_u0) && port_in_u0) {
+               xhci->port_status_u0 |= 1 << wIndex;
+               if (xhci->port_status_u0 == all_ports_seen_u0) {
+                       del_timer_sync(&xhci->comp_mode_recovery_timer);
+                       xhci_dbg(xhci, "All USB3 ports have entered U0 already!\n");
+                       xhci_dbg(xhci, "Compliance Mode Recovery Timer Deleted.\n");
+               }
+       }
+}
+
 int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
                u16 wIndex, char *buf, u16 wLength)
 {
@@ -651,6 +688,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
                /* Update Port Link State for super speed ports*/
                if (hcd->speed == HCD_USB3) {
                        xhci_hub_report_link_state(&status, temp);
+                       /*
+                        * Verify if all USB3 Ports Have entered U0 already.
+                        * Delete Compliance Mode Timer if so.
+                        */
+                       xhci_del_comp_mod_timer(xhci, temp, wIndex);
                }
                if (bus_state->port_c_suspend & (1 << wIndex))
                        status |= 1 << USB_PORT_FEAT_C_SUSPEND;
index 689bc18..df90fe5 100644 (file)
@@ -118,7 +118,7 @@ static int xhci_plat_probe(struct platform_device *pdev)
                goto put_hcd;
        }
 
-       hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
+       hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len);
        if (!hcd->regs) {
                dev_dbg(&pdev->dev, "error mapping memory\n");
                ret = -EFAULT;
index c59d5b5..6ece0ed 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/slab.h>
+#include <linux/dmi.h>
 
 #include "xhci.h"
 
@@ -398,6 +399,95 @@ static void xhci_msix_sync_irqs(struct xhci_hcd *xhci)
 
 #endif
 
+static void compliance_mode_recovery(unsigned long arg)
+{
+       struct xhci_hcd *xhci;
+       struct usb_hcd *hcd;
+       u32 temp;
+       int i;
+
+       xhci = (struct xhci_hcd *)arg;
+
+       for (i = 0; i < xhci->num_usb3_ports; i++) {
+               temp = xhci_readl(xhci, xhci->usb3_ports[i]);
+               if ((temp & PORT_PLS_MASK) == USB_SS_PORT_LS_COMP_MOD) {
+                       /*
+                        * Compliance Mode Detected. Letting USB Core
+                        * handle the Warm Reset
+                        */
+                       xhci_dbg(xhci, "Compliance Mode Detected->Port %d!\n",
+                                       i + 1);
+                       xhci_dbg(xhci, "Attempting Recovery routine!\n");
+                       hcd = xhci->shared_hcd;
+
+                       if (hcd->state == HC_STATE_SUSPENDED)
+                               usb_hcd_resume_root_hub(hcd);
+
+                       usb_hcd_poll_rh_status(hcd);
+               }
+       }
+
+       if (xhci->port_status_u0 != ((1 << xhci->num_usb3_ports)-1))
+               mod_timer(&xhci->comp_mode_recovery_timer,
+                       jiffies + msecs_to_jiffies(COMP_MODE_RCVRY_MSECS));
+}
+
+/*
+ * Quirk to work around issue generated by the SN65LVPE502CP USB3.0 re-driver
+ * that causes ports behind that hardware to enter compliance mode sometimes.
+ * The quirk creates a timer that polls every 2 seconds the link state of
+ * each host controller's port and recovers it by issuing a Warm reset
+ * if Compliance mode is detected, otherwise the port will become "dead" (no
+ * device connections or disconnections will be detected anymore). Becasue no
+ * status event is generated when entering compliance mode (per xhci spec),
+ * this quirk is needed on systems that have the failing hardware installed.
+ */
+static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci)
+{
+       xhci->port_status_u0 = 0;
+       init_timer(&xhci->comp_mode_recovery_timer);
+
+       xhci->comp_mode_recovery_timer.data = (unsigned long) xhci;
+       xhci->comp_mode_recovery_timer.function = compliance_mode_recovery;
+       xhci->comp_mode_recovery_timer.expires = jiffies +
+                       msecs_to_jiffies(COMP_MODE_RCVRY_MSECS);
+
+       set_timer_slack(&xhci->comp_mode_recovery_timer,
+                       msecs_to_jiffies(COMP_MODE_RCVRY_MSECS));
+       add_timer(&xhci->comp_mode_recovery_timer);
+       xhci_dbg(xhci, "Compliance Mode Recovery Timer Initialized.\n");
+}
+
+/*
+ * This function identifies the systems that have installed the SN65LVPE502CP
+ * USB3.0 re-driver and that need the Compliance Mode Quirk.
+ * Systems:
+ * Vendor: Hewlett-Packard -> System Models: Z420, Z620 and Z820
+ */
+static bool compliance_mode_recovery_timer_quirk_check(void)
+{
+       const char *dmi_product_name, *dmi_sys_vendor;
+
+       dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME);
+       dmi_sys_vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+
+       if (!(strstr(dmi_sys_vendor, "Hewlett-Packard")))
+               return false;
+
+       if (strstr(dmi_product_name, "Z420") ||
+                       strstr(dmi_product_name, "Z620") ||
+                       strstr(dmi_product_name, "Z820"))
+               return true;
+
+       return false;
+}
+
+static int xhci_all_ports_seen_u0(struct xhci_hcd *xhci)
+{
+       return (xhci->port_status_u0 == ((1 << xhci->num_usb3_ports)-1));
+}
+
+
 /*
  * Initialize memory for HCD and xHC (one-time init).
  *
@@ -421,6 +511,12 @@ int xhci_init(struct usb_hcd *hcd)
        retval = xhci_mem_init(xhci, GFP_KERNEL);
        xhci_dbg(xhci, "Finished xhci_init\n");
 
+       /* Initializing Compliance Mode Recovery Data If Needed */
+       if (compliance_mode_recovery_timer_quirk_check()) {
+               xhci->quirks |= XHCI_COMP_MODE_QUIRK;
+               compliance_mode_recovery_timer_init(xhci);
+       }
+
        return retval;
 }
 
@@ -629,6 +725,11 @@ void xhci_stop(struct usb_hcd *hcd)
        del_timer_sync(&xhci->event_ring_timer);
 #endif
 
+       /* Deleting Compliance Mode Recovery Timer */
+       if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
+                       (!(xhci_all_ports_seen_u0(xhci))))
+               del_timer_sync(&xhci->comp_mode_recovery_timer);
+
        if (xhci->quirks & XHCI_AMD_PLL_FIX)
                usb_amd_dev_put();
 
@@ -659,7 +760,7 @@ void xhci_shutdown(struct usb_hcd *hcd)
 {
        struct xhci_hcd *xhci = hcd_to_xhci(hcd);
 
-       if (xhci->quirks && XHCI_SPURIOUS_REBOOT)
+       if (xhci->quirks & XHCI_SPURIOUS_REBOOT)
                usb_disable_xhci_ports(to_pci_dev(hcd->self.controller));
 
        spin_lock_irq(&xhci->lock);
@@ -806,6 +907,16 @@ int xhci_suspend(struct xhci_hcd *xhci)
        }
        spin_unlock_irq(&xhci->lock);
 
+       /*
+        * Deleting Compliance Mode Recovery Timer because the xHCI Host
+        * is about to be suspended.
+        */
+       if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) &&
+                       (!(xhci_all_ports_seen_u0(xhci)))) {
+               del_timer_sync(&xhci->comp_mode_recovery_timer);
+               xhci_dbg(xhci, "Compliance Mode Recovery Timer Deleted!\n");
+       }
+
        /* step 5: remove core well power */
        /* synchronize irq when using MSI-X */
        xhci_msix_sync_irqs(xhci);
@@ -938,6 +1049,16 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
                usb_hcd_resume_root_hub(hcd);
                usb_hcd_resume_root_hub(xhci->shared_hcd);
        }
+
+       /*
+        * If system is subject to the Quirk, Compliance Mode Timer needs to
+        * be re-initialized Always after a system resume. Ports are subject
+        * to suffer the Compliance Mode issue again. It doesn't matter if
+        * ports have entered previously to U0 before system's suspension.
+        */
+       if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
+               compliance_mode_recovery_timer_init(xhci);
+
        return retval;
 }
 #endif /* CONFIG_PM */
index c713256..1a05908 100644 (file)
@@ -1495,6 +1495,7 @@ struct xhci_hcd {
 #define XHCI_LPM_SUPPORT       (1 << 11)
 #define XHCI_INTEL_HOST                (1 << 12)
 #define XHCI_SPURIOUS_REBOOT   (1 << 13)
+#define XHCI_COMP_MODE_QUIRK   (1 << 14)
        unsigned int            num_active_eps;
        unsigned int            limit_active_eps;
        /* There are two roothubs to keep track of bus suspend info for */
@@ -1511,6 +1512,11 @@ struct xhci_hcd {
        unsigned                sw_lpm_support:1;
        /* support xHCI 1.0 spec USB2 hardware LPM */
        unsigned                hw_lpm_support:1;
+       /* Compliance Mode Recovery Data */
+       struct timer_list       comp_mode_recovery_timer;
+       u32                     port_status_u0;
+/* Compliance Mode Timer Triggered every 2 seconds */
+#define COMP_MODE_RCVRY_MSECS 2000
 };
 
 /* convert between an HCD pointer and the corresponding EHCI_HCD */
index 4bb717d..1ae378d 100644 (file)
@@ -2049,7 +2049,7 @@ static int musb_urb_enqueue(
         * we only have work to do in the former case.
         */
        spin_lock_irqsave(&musb->lock, flags);
-       if (hep->hcpriv) {
+       if (hep->hcpriv || !next_urb(qh)) {
                /* some concurrent activity submitted another urb to hep...
                 * odd, rare, error prone, but legal.
                 */
index 57a6085..c1be687 100644 (file)
@@ -388,7 +388,7 @@ dma_controller_create(struct musb *musb, void __iomem *base)
        struct platform_device *pdev = to_platform_device(dev);
        int irq = platform_get_irq_byname(pdev, "dma");
 
-       if (irq == 0) {
+       if (irq <= 0) {
                dev_err(dev, "No DMA interrupt line!\n");
                return NULL;
        }
index 1a1bd9c..3416254 100644 (file)
@@ -1215,7 +1215,7 @@ static int __devinit tusb_probe(struct platform_device *pdev)
        ret = platform_device_add(musb);
        if (ret) {
                dev_err(&pdev->dev, "failed to register musb device\n");
-               goto err1;
+               goto err2;
        }
 
        return 0;
index b67b4bc..89f0709 100644 (file)
@@ -17,7 +17,6 @@
 #include <linux/dma-mapping.h>
 #include <linux/slab.h>
 #include <plat/dma.h>
-#include <plat/mux.h>
 
 #include "musb_core.h"
 #include "tusb6010.h"
index 7a88667..81f1f9a 100644 (file)
@@ -36,7 +36,7 @@
 #include <asm/irq.h>
 #include <asm/mach-types.h>
 
-#include <plat/mux.h>
+#include <mach/mux.h>
 
 #include <mach/usb.h>
 
index ecd1730..143c4e9 100644 (file)
@@ -818,7 +818,7 @@ static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done)
            usbhs_pipe_is_dcp(pipe))
                goto usbhsf_pio_prepare_push;
 
-       if (len % 4) /* 32bit alignment */
+       if (len & 0x7) /* 8byte alignment */
                goto usbhsf_pio_prepare_push;
 
        if ((uintptr_t)(pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */
@@ -905,7 +905,7 @@ static int usbhsf_dma_try_pop(struct usbhs_pkt *pkt, int *is_done)
        /* use PIO if packet is less than pio_dma_border */
        len = usbhsf_fifo_rcv_len(priv, fifo);
        len = min(pkt->length - pkt->actual, len);
-       if (len % 4) /* 32bit alignment */
+       if (len & 0x7) /* 8byte alignment */
                goto usbhsf_pio_prepare_pop_unselect;
 
        if (len < usbhs_get_dparam(priv, pio_dma_border))
index f8ce97d..3b98fb7 100644 (file)
@@ -215,7 +215,7 @@ static void ark3116_release(struct usb_serial *serial)
 
 static void ark3116_init_termios(struct tty_struct *tty)
 {
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        *termios = tty_std_termios;
        termios->c_cflag = B9600 | CS8
                                      | CREAD | HUPCL | CLOCAL;
@@ -229,7 +229,7 @@ static void ark3116_set_termios(struct tty_struct *tty,
 {
        struct usb_serial *serial = port->serial;
        struct ark3116_private *priv = usb_get_serial_port_data(port);
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        unsigned int cflag = termios->c_cflag;
        int bps = tty_get_baud_rate(tty);
        int quot;
index 6b73656..a46df73 100644 (file)
@@ -307,7 +307,7 @@ static void belkin_sa_set_termios(struct tty_struct *tty,
        unsigned long control_state;
        int bad_flow_control;
        speed_t baud;
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
 
        iflag = termios->c_iflag;
        cflag = termios->c_cflag;
index b9cca6d..9a56428 100644 (file)
@@ -165,8 +165,8 @@ static int usb_console_setup(struct console *co, char *options)
                }
 
                if (serial->type->set_termios) {
-                       tty->termios->c_cflag = cflag;
-                       tty_termios_encode_baud_rate(tty->termios, baud, baud);
+                       tty->termios.c_cflag = cflag;
+                       tty_termios_encode_baud_rate(&tty->termios, baud, baud);
                        memset(&dummy, 0, sizeof(struct ktermios));
                        serial->type->set_termios(tty, port, &dummy);
 
index 1e71079..ba5e07e 100644 (file)
@@ -469,7 +469,7 @@ static void cp210x_get_termios(struct tty_struct *tty,
 
        if (tty) {
                cp210x_get_termios_port(tty->driver_data,
-                       &tty->termios->c_cflag, &baud);
+                       &tty->termios.c_cflag, &baud);
                tty_encode_baud_rate(tty, baud, baud);
        }
 
@@ -631,7 +631,7 @@ static void cp210x_change_speed(struct tty_struct *tty,
 {
        u32 baud;
 
-       baud = tty->termios->c_ospeed;
+       baud = tty->termios.c_ospeed;
 
        /* This maps the requested rate to a rate valid on cp2102 or cp2103,
         * or to an arbitrary rate in [1M,2M].
@@ -665,10 +665,10 @@ static void cp210x_set_termios(struct tty_struct *tty,
        if (!tty)
                return;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
        old_cflag = old_termios->c_cflag;
 
-       if (tty->termios->c_ospeed != old_termios->c_ospeed)
+       if (tty->termios.c_ospeed != old_termios->c_ospeed)
                cp210x_change_speed(tty, port, old_termios);
 
        /* If the number of data bits is to be updated */
index b78c34e..be34f15 100644 (file)
@@ -922,38 +922,38 @@ static void cypress_set_termios(struct tty_struct *tty,
           early enough */
        if (!priv->termios_initialized) {
                if (priv->chiptype == CT_EARTHMATE) {
-                       *(tty->termios) = tty_std_termios;
-                       tty->termios->c_cflag = B4800 | CS8 | CREAD | HUPCL |
+                       tty->termios = tty_std_termios;
+                       tty->termios.c_cflag = B4800 | CS8 | CREAD | HUPCL |
                                CLOCAL;
-                       tty->termios->c_ispeed = 4800;
-                       tty->termios->c_ospeed = 4800;
+                       tty->termios.c_ispeed = 4800;
+                       tty->termios.c_ospeed = 4800;
                } else if (priv->chiptype == CT_CYPHIDCOM) {
-                       *(tty->termios) = tty_std_termios;
-                       tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL |
+                       tty->termios = tty_std_termios;
+                       tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL |
                                CLOCAL;
-                       tty->termios->c_ispeed = 9600;
-                       tty->termios->c_ospeed = 9600;
+                       tty->termios.c_ispeed = 9600;
+                       tty->termios.c_ospeed = 9600;
                } else if (priv->chiptype == CT_CA42V2) {
-                       *(tty->termios) = tty_std_termios;
-                       tty->termios->c_cflag = B9600 | CS8 | CREAD | HUPCL |
+                       tty->termios = tty_std_termios;
+                       tty->termios.c_cflag = B9600 | CS8 | CREAD | HUPCL |
                                CLOCAL;
-                       tty->termios->c_ispeed = 9600;
-                       tty->termios->c_ospeed = 9600;
+                       tty->termios.c_ispeed = 9600;
+                       tty->termios.c_ospeed = 9600;
                }
                priv->termios_initialized = 1;
        }
        spin_unlock_irqrestore(&priv->lock, flags);
 
        /* Unsupported features need clearing */
-       tty->termios->c_cflag &= ~(CMSPAR|CRTSCTS);
+       tty->termios.c_cflag &= ~(CMSPAR|CRTSCTS);
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        /* check if there are new settings */
        if (old_termios) {
                spin_lock_irqsave(&priv->lock, flags);
-               priv->tmp_termios = *(tty->termios);
+               priv->tmp_termios = tty->termios;
                spin_unlock_irqrestore(&priv->lock, flags);
        }
 
@@ -1021,7 +1021,7 @@ static void cypress_set_termios(struct tty_struct *tty,
                                "4800bps.");
                /* define custom termios settings for NMEA protocol */
 
-               tty->termios->c_iflag /* input modes - */
+               tty->termios.c_iflag /* input modes - */
                        &= ~(IGNBRK  /* disable ignore break */
                        | BRKINT     /* disable break causes interrupt */
                        | PARMRK     /* disable mark parity errors */
@@ -1031,10 +1031,10 @@ static void cypress_set_termios(struct tty_struct *tty,
                        | ICRNL      /* disable translate CR to NL */
                        | IXON);     /* disable enable XON/XOFF flow control */
 
-               tty->termios->c_oflag /* output modes */
+               tty->termios.c_oflag /* output modes */
                        &= ~OPOST;    /* disable postprocess output char */
 
-               tty->termios->c_lflag /* line discipline modes */
+               tty->termios.c_lflag /* line discipline modes */
                        &= ~(ECHO     /* disable echo input characters */
                        | ECHONL      /* disable echo new line */
                        | ICANON      /* disable erase, kill, werase, and rprnt
@@ -1200,7 +1200,7 @@ static void cypress_read_int_callback(struct urb *urb)
 
        /* hangup, as defined in acm.c... this might be a bad place for it
         * though */
-       if (tty && !(tty->termios->c_cflag & CLOCAL) &&
+       if (tty && !(tty->termios.c_cflag & CLOCAL) &&
                        !(priv->current_status & UART_CD)) {
                dbg("%s - calling hangup", __func__);
                tty_hangup(tty);
index b5cd838..afd9d2e 100644 (file)
@@ -687,8 +687,8 @@ static void digi_set_termios(struct tty_struct *tty,
                struct usb_serial_port *port, struct ktermios *old_termios)
 {
        struct digi_port *priv = usb_get_serial_port_data(port);
-       unsigned int iflag = tty->termios->c_iflag;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int iflag = tty->termios.c_iflag;
+       unsigned int cflag = tty->termios.c_cflag;
        unsigned int old_iflag = old_termios->c_iflag;
        unsigned int old_cflag = old_termios->c_cflag;
        unsigned char buf[32];
@@ -709,7 +709,7 @@ static void digi_set_termios(struct tty_struct *tty,
                        /* don't set RTS if using hardware flow control */
                        /* and throttling input */
                        modem_signals = TIOCM_DTR;
-                       if (!(tty->termios->c_cflag & CRTSCTS) ||
+                       if (!(tty->termios.c_cflag & CRTSCTS) ||
                            !test_bit(TTY_THROTTLED, &tty->flags))
                                modem_signals |= TIOCM_RTS;
                        digi_set_modem_signals(port, modem_signals, 1);
@@ -748,7 +748,7 @@ static void digi_set_termios(struct tty_struct *tty,
                }
        }
        /* set parity */
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        if ((cflag&(PARENB|PARODD)) != (old_cflag&(PARENB|PARODD))) {
                if (cflag&PARENB) {
@@ -1124,8 +1124,8 @@ static int digi_open(struct tty_struct *tty, struct usb_serial_port *port)
 
        /* set termios settings */
        if (tty) {
-               not_termios.c_cflag = ~tty->termios->c_cflag;
-               not_termios.c_iflag = ~tty->termios->c_iflag;
+               not_termios.c_cflag = ~tty->termios.c_cflag;
+               not_termios.c_iflag = ~tty->termios.c_iflag;
                digi_set_termios(tty, port, &not_termios);
        }
        return 0;
@@ -1500,7 +1500,7 @@ static int digi_read_oob_callback(struct urb *urb)
 
                rts = 0;
                if (tty)
-                       rts = tty->termios->c_cflag & CRTSCTS;
+                       rts = tty->termios.c_cflag & CRTSCTS;
                
                if (tty && opcode == DIGI_CMD_READ_INPUT_SIGNALS) {
                        spin_lock(&priv->dp_port_lock);
index cdf61dd..34e8638 100644 (file)
@@ -87,7 +87,7 @@ static int empeg_startup(struct usb_serial *serial)
 
 static void empeg_init_termios(struct tty_struct *tty)
 {
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
 
        /*
         * The empeg-car player wants these particular tty settings.
index 499b15f..79451ee 100644 (file)
@@ -173,10 +173,11 @@ static void f81232_set_termios(struct tty_struct *tty,
        /* FIXME - Stubbed out for now */
 
        /* Don't change anything if nothing has changed */
-       if (!tty_termios_hw_change(tty->termios, old_termios))
+       if (!tty_termios_hw_change(&tty->termios, old_termios))
                return;
 
        /* Do the real work here... */
+       tty_termios_copy_hw(&tty->termios, old_termios);
 }
 
 static int f81232_tiocmget(struct tty_struct *tty)
index 5620db6..0c8d1c2 100644 (file)
@@ -704,6 +704,7 @@ static struct usb_device_id id_table_combined [] = {
        { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) },
        { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) },
        { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) },
        { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) },
        { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) },
@@ -804,13 +805,32 @@ static struct usb_device_id id_table_combined [] = {
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
        { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
-       { USB_DEVICE(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID) },
+       { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID,
+                                       USB_CLASS_VENDOR_SPEC,
+                                       USB_SUBCLASS_VENDOR_SPEC, 0x00) },
        { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
        { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID),
                .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
        { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) },
        { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) },
+       { USB_DEVICE(FTDI_VID, PI_C865_PID) },
+       { USB_DEVICE(FTDI_VID, PI_C857_PID) },
+       { USB_DEVICE(PI_VID, PI_C866_PID) },
+       { USB_DEVICE(PI_VID, PI_C663_PID) },
+       { USB_DEVICE(PI_VID, PI_C725_PID) },
+       { USB_DEVICE(PI_VID, PI_E517_PID) },
+       { USB_DEVICE(PI_VID, PI_C863_PID) },
        { USB_DEVICE(PI_VID, PI_E861_PID) },
+       { USB_DEVICE(PI_VID, PI_C867_PID) },
+       { USB_DEVICE(PI_VID, PI_E609_PID) },
+       { USB_DEVICE(PI_VID, PI_E709_PID) },
+       { USB_DEVICE(PI_VID, PI_100F_PID) },
+       { USB_DEVICE(PI_VID, PI_1011_PID) },
+       { USB_DEVICE(PI_VID, PI_1012_PID) },
+       { USB_DEVICE(PI_VID, PI_1013_PID) },
+       { USB_DEVICE(PI_VID, PI_1014_PID) },
+       { USB_DEVICE(PI_VID, PI_1015_PID) },
+       { USB_DEVICE(PI_VID, PI_1016_PID) },
        { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) },
        { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
        { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
@@ -2082,7 +2102,7 @@ static void ftdi_set_termios(struct tty_struct *tty,
 {
        struct usb_device *dev = port->serial->dev;
        struct ftdi_private *priv = usb_get_serial_port_data(port);
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        unsigned int cflag = termios->c_cflag;
        __u16 urb_value; /* will hold the new flags */
 
index 5dd96ca..41fe582 100644 (file)
@@ -75,6 +75,9 @@
 #define FTDI_OPENDCC_GATEWAY_PID       0xBFDB
 #define FTDI_OPENDCC_GBM_PID   0xBFDC
 
+/* NZR SEM 16+ USB (http://www.nzr.de) */
+#define FTDI_NZR_SEM_USB_PID   0xC1E0  /* NZR SEM-LOG16+ */
+
 /*
  * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com)
  */
 /*
  * Microchip Technology, Inc.
  *
- * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are also used by:
+ * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are
+ * used by single function CDC ACM class based firmware demo
+ * applications.  The VID/PID has also been used in firmware
+ * emulating FTDI serial chips by:
  * Hornby Elite - Digital Command Control Console
  * http://www.hornby.com/hornby-dcc/controllers/
  */
  * Physik Instrumente
  * http://www.physikinstrumente.com/en/products/
  */
+/* These two devices use the VID of FTDI */
+#define PI_C865_PID    0xe0a0  /* PI C-865 Piezomotor Controller */
+#define PI_C857_PID    0xe0a1  /* PI Encoder Trigger Box */
+
 #define PI_VID              0x1a72  /* Vendor ID */
-#define PI_E861_PID         0x1008  /* E-861 piezo controller USB connection */
+#define PI_C866_PID    0x1000  /* PI C-866 Piezomotor Controller */
+#define PI_C663_PID    0x1001  /* PI C-663 Mercury-Step */
+#define PI_C725_PID    0x1002  /* PI C-725 Piezomotor Controller */
+#define PI_E517_PID    0x1005  /* PI E-517 Digital Piezo Controller Operation Module */
+#define PI_C863_PID    0x1007  /* PI C-863 */
+#define PI_E861_PID    0x1008  /* PI E-861 Piezomotor Controller */
+#define PI_C867_PID    0x1009  /* PI C-867 Piezomotor Controller */
+#define PI_E609_PID    0x100D  /* PI E-609 Digital Piezo Controller */
+#define PI_E709_PID    0x100E  /* PI E-709 Digital Piezo Controller */
+#define PI_100F_PID    0x100F  /* PI Digital Piezo Controller */
+#define PI_1011_PID    0x1011  /* PI Digital Piezo Controller */
+#define PI_1012_PID    0x1012  /* PI Motion Controller */
+#define PI_1013_PID    0x1013  /* PI Motion Controller */
+#define PI_1014_PID    0x1014  /* PI Device */
+#define PI_1015_PID    0x1015  /* PI Device */
+#define PI_1016_PID    0x1016  /* PI Digital Servo Module */
 
 /*
  * Kondo Kagaku Co.Ltd.
index e1f5ccd..f435575 100644 (file)
@@ -1458,7 +1458,7 @@ static void edge_throttle(struct tty_struct *tty)
        }
 
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                edge_port->shadowMCR &= ~MCR_RTS;
                status = send_cmd_write_uart_register(edge_port, MCR,
                                                        edge_port->shadowMCR);
@@ -1497,7 +1497,7 @@ static void edge_unthrottle(struct tty_struct *tty)
                        return;
        }
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                edge_port->shadowMCR |= MCR_RTS;
                send_cmd_write_uart_register(edge_port, MCR,
                                                edge_port->shadowMCR);
@@ -1516,9 +1516,9 @@ static void edge_set_termios(struct tty_struct *tty,
        struct edgeport_port *edge_port = usb_get_serial_port_data(port);
        unsigned int cflag;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
        dbg("%s - clfag %08x iflag %08x", __func__,
-           tty->termios->c_cflag, tty->termios->c_iflag);
+           tty->termios.c_cflag, tty->termios.c_iflag);
        dbg("%s - old clfag %08x old iflag %08x", __func__,
            old_termios->c_cflag, old_termios->c_iflag);
 
@@ -1987,7 +1987,7 @@ static void process_rcvd_status(struct edgeport_serial *edge_serial,
                tty = tty_port_tty_get(&edge_port->port->port);
                if (tty) {
                        change_port_settings(tty,
-                               edge_port, tty->termios);
+                               edge_port, &tty->termios);
                        tty_kref_put(tty);
                }
 
@@ -2570,7 +2570,7 @@ static void change_port_settings(struct tty_struct *tty,
                return;
        }
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        switch (cflag & CSIZE) {
        case CS5:
index 3936904..765978a 100644 (file)
@@ -1870,7 +1870,7 @@ static int edge_open(struct tty_struct *tty, struct usb_serial_port *port)
 
        /* set up the port settings */
        if (tty)
-               edge_set_termios(tty, port, tty->termios);
+               edge_set_termios(tty, port, &tty->termios);
 
        /* open up the port */
 
@@ -2272,13 +2272,13 @@ static void change_port_settings(struct tty_struct *tty,
 
        config = kmalloc (sizeof (*config), GFP_KERNEL);
        if (!config) {
-               *tty->termios = *old_termios;
+               tty->termios = *old_termios;
                dev_err(&edge_port->port->dev, "%s - out of memory\n",
                                                                __func__);
                return;
        }
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        config->wFlags = 0;
 
@@ -2362,7 +2362,7 @@ static void change_port_settings(struct tty_struct *tty,
        } else
                dbg("%s - OUTBOUND XON/XOFF is disabled", __func__);
 
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        /* Round the baud rate */
        baud = tty_get_baud_rate(tty);
@@ -2408,10 +2408,10 @@ static void edge_set_termios(struct tty_struct *tty,
        struct edgeport_port *edge_port = usb_get_serial_port_data(port);
        unsigned int cflag;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        dbg("%s - clfag %08x iflag %08x", __func__,
-           tty->termios->c_cflag, tty->termios->c_iflag);
+           tty->termios.c_cflag, tty->termios.c_iflag);
        dbg("%s - old clfag %08x old iflag %08x", __func__,
            old_termios->c_cflag, old_termios->c_iflag);
        dbg("%s - port %d", __func__, port->number);
index fc09414..5a96692 100644 (file)
@@ -381,7 +381,7 @@ static void ir_set_termios(struct tty_struct *tty,
                ir_xbof = ir_xbof_change(xbof) ;
 
        /* Only speed changes are supported */
-       tty_termios_copy_hw(tty->termios, old_termios);
+       tty_termios_copy_hw(&tty->termios, old_termios);
        tty_encode_baud_rate(tty, baud, baud);
 
        /*
index 22b1eb5..bf38640 100644 (file)
@@ -921,7 +921,7 @@ static void iuu_set_termios(struct tty_struct *tty,
 {
        const u32 supported_mask = CMSPAR|PARENB|PARODD;
        struct iuu_private *priv = usb_get_serial_port_data(port);
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
        int status;
        u32 actual;
        u32 parity;
@@ -930,7 +930,7 @@ static void iuu_set_termios(struct tty_struct *tty,
        u32 newval = cflag & supported_mask;
 
        /* Just use the ospeed. ispeed should be the same. */
-       baud = tty->termios->c_ospeed;
+       baud = tty->termios.c_ospeed;
 
        dbg("%s - enter c_ospeed or baud=%d", __func__, baud);
 
@@ -961,13 +961,13 @@ static void iuu_set_termios(struct tty_struct *tty,
         * settings back over and then adjust them
         */
        if (old_termios)
-               tty_termios_copy_hw(tty->termios, old_termios);
+               tty_termios_copy_hw(&tty->termios, old_termios);
        if (status != 0)        /* Set failed - return old bits */
                return;
        /* Re-encode speed, parity and csize */
        tty_encode_baud_rate(tty, baud, baud);
-       tty->termios->c_cflag &= ~(supported_mask|CSIZE);
-       tty->termios->c_cflag |= newval | csize;
+       tty->termios.c_cflag &= ~(supported_mask|CSIZE);
+       tty->termios.c_cflag |= newval | csize;
 }
 
 static void iuu_close(struct usb_serial_port *port)
@@ -993,14 +993,14 @@ static void iuu_close(struct usb_serial_port *port)
 
 static void iuu_init_termios(struct tty_struct *tty)
 {
-       *(tty->termios) = tty_std_termios;
-       tty->termios->c_cflag = CLOCAL | CREAD | CS8 | B9600
+       tty->termios = tty_std_termios;
+       tty->termios.c_cflag = CLOCAL | CREAD | CS8 | B9600
                                | TIOCM_CTS | CSTOPB | PARENB;
-       tty->termios->c_ispeed = 9600;
-       tty->termios->c_ospeed = 9600;
-       tty->termios->c_lflag = 0;
-       tty->termios->c_oflag = 0;
-       tty->termios->c_iflag = 0;
+       tty->termios.c_ispeed = 9600;
+       tty->termios.c_ospeed = 9600;
+       tty->termios.c_lflag = 0;
+       tty->termios.c_oflag = 0;
+       tty->termios.c_iflag = 0;
 }
 
 static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port)
@@ -1012,8 +1012,8 @@ static int iuu_open(struct tty_struct *tty, struct usb_serial_port *port)
        u32 actual;
        struct iuu_private *priv = usb_get_serial_port_data(port);
 
-       baud = tty->termios->c_ospeed;
-       tty->termios->c_ispeed = baud;
+       baud = tty->termios.c_ospeed;
+       tty->termios.c_ispeed = baud;
        /* Re-encode speed */
        tty_encode_baud_rate(tty, baud, baud);
 
index af0b70e..7bcbb47 100644 (file)
@@ -158,7 +158,7 @@ static void keyspan_set_termios(struct tty_struct *tty,
 
        p_priv = usb_get_serial_port_data(port);
        d_details = p_priv->device_details;
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
        device_port = port->number - port->serial->minor;
 
        /* Baud rate calculation takes baud rate as an integer
@@ -179,7 +179,7 @@ static void keyspan_set_termios(struct tty_struct *tty,
        p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none;
 
        /* Mark/Space not supported */
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        keyspan_send_setup(port, 0);
 }
@@ -1086,7 +1086,7 @@ static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)
 
        device_port = port->number - port->serial->minor;
        if (tty) {
-               cflag = tty->termios->c_cflag;
+               cflag = tty->termios.c_cflag;
                /* Baud rate calculation takes baud rate as an integer
                   so other rates can be generated if desired. */
                baud_rate = tty_get_baud_rate(tty);
index a4ac3cf..dcada86 100644 (file)
@@ -338,7 +338,7 @@ static void keyspan_pda_set_termios(struct tty_struct *tty,
           7[EOMS]1: 10 bit, b0/b7 is parity
           7[EOMS]2: 11 bit, b0/b7 is parity, extra bit always (mark?)
 
-          HW flow control is dictated by the tty->termios->c_cflags & CRTSCTS
+          HW flow control is dictated by the tty->termios.c_cflags & CRTSCTS
           bit.
 
           For now, just do baud. */
@@ -353,7 +353,7 @@ static void keyspan_pda_set_termios(struct tty_struct *tty,
        }
        /* Only speed can change so copy the old h/w parameters
           then encode the new speed */
-       tty_termios_copy_hw(tty->termios, old_termios);
+       tty_termios_copy_hw(&tty->termios, old_termios);
        tty_encode_baud_rate(tty, speed, speed);
 }
 
index 5bed59c..def9ad2 100644 (file)
@@ -311,12 +311,12 @@ static int  klsi_105_open(struct tty_struct *tty, struct usb_serial_port *port)
 
        /* set up termios structure */
        spin_lock_irqsave(&priv->lock, flags);
-       priv->termios.c_iflag = tty->termios->c_iflag;
-       priv->termios.c_oflag = tty->termios->c_oflag;
-       priv->termios.c_cflag = tty->termios->c_cflag;
-       priv->termios.c_lflag = tty->termios->c_lflag;
+       priv->termios.c_iflag = tty->termios.c_iflag;
+       priv->termios.c_oflag = tty->termios.c_oflag;
+       priv->termios.c_cflag = tty->termios.c_cflag;
+       priv->termios.c_lflag = tty->termios.c_lflag;
        for (i = 0; i < NCCS; i++)
-               priv->termios.c_cc[i] = tty->termios->c_cc[i];
+               priv->termios.c_cc[i] = tty->termios.c_cc[i];
        priv->cfg.pktlen   = cfg->pktlen;
        priv->cfg.baudrate = cfg->baudrate;
        priv->cfg.databits = cfg->databits;
@@ -445,9 +445,9 @@ static void klsi_105_set_termios(struct tty_struct *tty,
                                 struct ktermios *old_termios)
 {
        struct klsi_105_private *priv = usb_get_serial_port_data(port);
-       unsigned int iflag = tty->termios->c_iflag;
+       unsigned int iflag = tty->termios.c_iflag;
        unsigned int old_iflag = old_termios->c_iflag;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
        unsigned int old_cflag = old_termios->c_cflag;
        struct klsi_105_port_settings *cfg;
        unsigned long flags;
@@ -560,7 +560,7 @@ static void klsi_105_set_termios(struct tty_struct *tty,
        if ((cflag & (PARENB|PARODD)) != (old_cflag & (PARENB|PARODD))
            || (cflag & CSTOPB) != (old_cflag & CSTOPB)) {
                /* Not currently supported */
-               tty->termios->c_cflag &= ~(PARENB|PARODD|CSTOPB);
+               tty->termios.c_cflag &= ~(PARENB|PARODD|CSTOPB);
 #if 0
                priv->last_lcr = 0;
 
@@ -587,7 +587,7 @@ static void klsi_105_set_termios(struct tty_struct *tty,
            || (iflag & IXON) != (old_iflag & IXON)
            ||  (cflag & CRTSCTS) != (old_cflag & CRTSCTS)) {
                /* Not currently supported */
-               tty->termios->c_cflag &= ~CRTSCTS;
+               tty->termios.c_cflag &= ~CRTSCTS;
                /* Drop DTR/RTS if no flow control otherwise assert */
 #if 0
                if ((iflag & IXOFF) || (iflag & IXON) || (cflag & CRTSCTS))
index fafeabb..bf5c749 100644 (file)
@@ -191,11 +191,11 @@ static void kobil_release(struct usb_serial *serial)
 static void kobil_init_termios(struct tty_struct *tty)
 {
        /* Default to echo off and other sane device settings */
-       tty->termios->c_lflag = 0;
-       tty->termios->c_lflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE);
-       tty->termios->c_iflag = IGNBRK | IGNPAR | IXOFF;
+       tty->termios.c_lflag = 0;
+       tty->termios.c_iflag &= ~(ISIG | ICANON | ECHO | IEXTEN | XCASE);
+       tty->termios.c_iflag |= IGNBRK | IGNPAR | IXOFF;
        /* do NOT translate CR to CR-NL (0x0A -> 0x0A 0x0D) */
-       tty->termios->c_oflag &= ~ONLCR;
+       tty->termios.c_oflag &= ~ONLCR;
 }
 
 static int kobil_open(struct tty_struct *tty, struct usb_serial_port *port)
@@ -581,14 +581,14 @@ static void kobil_set_termios(struct tty_struct *tty,
        struct kobil_private *priv;
        int result;
        unsigned short urb_val = 0;
-       int c_cflag = tty->termios->c_cflag;
+       int c_cflag = tty->termios.c_cflag;
        speed_t speed;
 
        priv = usb_get_serial_port_data(port);
        if (priv->device_type == KOBIL_USBTWIN_PRODUCT_ID ||
                        priv->device_type == KOBIL_KAAN_SIM_PRODUCT_ID) {
                /* This device doesn't support ioctl calls */
-               *tty->termios = *old;
+               tty_termios_copy_hw(&tty->termios, old);
                return;
        }
 
@@ -612,7 +612,7 @@ static void kobil_set_termios(struct tty_struct *tty,
                        urb_val |= SUSBCR_SPASB_EvenParity;
        } else
                urb_val |= SUSBCR_SPASB_NoParity;
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
        tty_encode_baud_rate(tty, speed, speed);
 
        result = usb_control_msg(port->serial->dev,
index a71fa0a..df98cff 100644 (file)
@@ -454,7 +454,7 @@ static int  mct_u232_open(struct tty_struct *tty, struct usb_serial_port *port)
         * either.
         */
        spin_lock_irqsave(&priv->lock, flags);
-       if (tty && (tty->termios->c_cflag & CBAUD))
+       if (tty && (tty->termios.c_cflag & CBAUD))
                priv->control_state = TIOCM_DTR | TIOCM_RTS;
        else
                priv->control_state = 0;
@@ -634,7 +634,7 @@ static void mct_u232_set_termios(struct tty_struct *tty,
 {
        struct usb_serial *serial = port->serial;
        struct mct_u232_private *priv = usb_get_serial_port_data(port);
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        unsigned int cflag = termios->c_cflag;
        unsigned int old_cflag = old_termios->c_cflag;
        unsigned long flags;
index d47eb06..2b0627b 100644 (file)
@@ -130,12 +130,6 @@ static void metrousb_read_int_callback(struct urb *urb)
 
        /* Set the data read from the usb port into the serial port buffer. */
        tty = tty_port_tty_get(&port->port);
-       if (!tty) {
-               dev_err(&port->dev, "%s - bad tty pointer - exiting\n",
-                       __func__);
-               return;
-       }
-
        if (tty && urb->actual_length) {
                /* Loop through the data copying each byte to the tty layer. */
                tty_insert_flip_string(tty, data, urb->actual_length);
index a07dd3c..012f67b 100644 (file)
@@ -1349,7 +1349,7 @@ static void mos7720_throttle(struct tty_struct *tty)
        }
 
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                mos7720_port->shadowMCR &= ~UART_MCR_RTS;
                write_mos_reg(port->serial, port->number - port->serial->minor,
                              MCR, mos7720_port->shadowMCR);
@@ -1383,7 +1383,7 @@ static void mos7720_unthrottle(struct tty_struct *tty)
        }
 
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                mos7720_port->shadowMCR |= UART_MCR_RTS;
                write_mos_reg(port->serial, port->number - port->serial->minor,
                              MCR, mos7720_port->shadowMCR);
@@ -1604,8 +1604,8 @@ static void change_port_settings(struct tty_struct *tty,
        lStop = 0x00;   /* 1 stop bit */
        lParity = 0x00; /* No parity */
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        /* Change the number of bits */
        switch (cflag & CSIZE) {
@@ -1753,11 +1753,11 @@ static void mos7720_set_termios(struct tty_struct *tty,
 
        dbg("%s\n", "setting termios - ASPIRE");
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        dbg("%s - cflag %08x iflag %08x", __func__,
-           tty->termios->c_cflag,
-           RELEVANT_IFLAG(tty->termios->c_iflag));
+           tty->termios.c_cflag,
+           RELEVANT_IFLAG(tty->termios.c_iflag));
 
        dbg("%s - old cflag %08x old iflag %08x", __func__,
            old_termios->c_cflag,
index 2f6da1e..402c32d 100644 (file)
@@ -1651,7 +1651,7 @@ static void mos7840_throttle(struct tty_struct *tty)
                        return;
        }
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                mos7840_port->shadowMCR &= ~MCR_RTS;
                status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
                                         mos7840_port->shadowMCR);
@@ -1694,7 +1694,7 @@ static void mos7840_unthrottle(struct tty_struct *tty)
        }
 
        /* if we are implementing RTS/CTS, toggle that line */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                mos7840_port->shadowMCR |= MCR_RTS;
                status = mos7840_set_uart_reg(port, MODEM_CONTROL_REGISTER,
                                         mos7840_port->shadowMCR);
@@ -2000,8 +2000,8 @@ static void mos7840_change_port_settings(struct tty_struct *tty,
        lStop = LCR_STOP_1;
        lParity = LCR_PAR_NONE;
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        /* Change the number of bits */
        if (cflag & CSIZE) {
@@ -2161,10 +2161,10 @@ static void mos7840_set_termios(struct tty_struct *tty,
 
        dbg("%s", "setting termios - ");
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        dbg("%s - clfag %08x iflag %08x", __func__,
-           tty->termios->c_cflag, RELEVANT_IFLAG(tty->termios->c_iflag));
+           tty->termios.c_cflag, RELEVANT_IFLAG(tty->termios.c_iflag));
        dbg("%s - old clfag %08x old iflag %08x", __func__,
            old_termios->c_cflag, RELEVANT_IFLAG(old_termios->c_iflag));
        dbg("%s - port %d", __func__, port->number);
index cc40f47..5ce88d1 100644 (file)
@@ -886,8 +886,6 @@ static const struct usb_device_id option_ids[] = {
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff),
          .driver_info = (kernel_ulong_t)&net_intf4_blacklist },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) },
-       { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1018, 0xff, 0xff, 0xff),
-         .driver_info = (kernel_ulong_t)&net_intf3_blacklist },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) },
@@ -1092,6 +1090,10 @@ static const struct usb_device_id option_ids[] = {
         .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist },
        { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff),
         .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist },
+       { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) },
+       { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) },
+       { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) },
+
        { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
        { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) },
        { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */
index 5976b65..9f55556 100644 (file)
@@ -404,10 +404,10 @@ static int oti6858_chars_in_buffer(struct tty_struct *tty)
 
 static void oti6858_init_termios(struct tty_struct *tty)
 {
-       *(tty->termios) = tty_std_termios;
-       tty->termios->c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
-       tty->termios->c_ispeed = 38400;
-       tty->termios->c_ospeed = 38400;
+       tty->termios = tty_std_termios;
+       tty->termios.c_cflag = B38400 | CS8 | CREAD | HUPCL | CLOCAL;
+       tty->termios.c_ispeed = 38400;
+       tty->termios.c_ospeed = 38400;
 }
 
 static void oti6858_set_termios(struct tty_struct *tty,
@@ -425,7 +425,7 @@ static void oti6858_set_termios(struct tty_struct *tty,
                return;
        }
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        spin_lock_irqsave(&priv->lock, flags);
        divisor = priv->pending_setup.divisor;
index 13b8dd6..2b9108a 100644 (file)
@@ -260,16 +260,16 @@ static void pl2303_set_termios(struct tty_struct *tty,
           serial settings even to the same values as before. Thus
           we actually need to filter in this specific case */
 
-       if (!tty_termios_hw_change(tty->termios, old_termios))
+       if (!tty_termios_hw_change(&tty->termios, old_termios))
                return;
 
-       cflag = tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        buf = kzalloc(7, GFP_KERNEL);
        if (!buf) {
                dev_err(&port->dev, "%s - out of memory.\n", __func__);
                /* Report back no change occurred */
-               *tty->termios = *old_termios;
+               tty->termios = *old_termios;
                return;
        }
 
index 151670b..7df9cdb 100644 (file)
@@ -275,7 +275,7 @@ static void qt2_set_termios(struct tty_struct *tty,
 {
        struct usb_device *dev = port->serial->dev;
        struct qt2_port_private *port_priv;
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        u16 baud;
        unsigned int cflag = termios->c_cflag;
        u16 new_lcr = 0;
@@ -406,7 +406,7 @@ static int qt2_open(struct tty_struct *tty, struct usb_serial_port *port)
        port_priv->device_port = (u8) device_port;
 
        if (tty)
-               qt2_set_termios(tty, port, tty->termios);
+               qt2_set_termios(tty, port, &tty->termios);
 
        return 0;
 
index 0274710..b14ebbd 100644 (file)
@@ -382,7 +382,7 @@ static int sierra_send_setup(struct usb_serial_port *port)
 static void sierra_set_termios(struct tty_struct *tty,
                struct usb_serial_port *port, struct ktermios *old_termios)
 {
-       tty_termios_copy_hw(tty->termios, old_termios);
+       tty_termios_copy_hw(&tty->termios, old_termios);
        sierra_send_setup(port);
 }
 
index cad6089..ab68a4d 100644 (file)
@@ -316,10 +316,10 @@ static void spcp8x5_dtr_rts(struct usb_serial_port *port, int on)
 static void spcp8x5_init_termios(struct tty_struct *tty)
 {
        /* for the 1st time call this function */
-       *(tty->termios) = tty_std_termios;
-       tty->termios->c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL;
-       tty->termios->c_ispeed = 115200;
-       tty->termios->c_ospeed = 115200;
+       tty->termios = tty_std_termios;
+       tty->termios.c_cflag = B115200 | CS8 | CREAD | HUPCL | CLOCAL;
+       tty->termios.c_ispeed = 115200;
+       tty->termios.c_ospeed = 115200;
 }
 
 /* set the serial param for transfer. we should check if we really need to
@@ -330,7 +330,7 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
        struct usb_serial *serial = port->serial;
        struct spcp8x5_private *priv = usb_get_serial_port_data(port);
        unsigned long flags;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
        unsigned int old_cflag = old_termios->c_cflag;
        unsigned short uartdata;
        unsigned char buf[2] = {0, 0};
@@ -340,7 +340,7 @@ static void spcp8x5_set_termios(struct tty_struct *tty,
 
 
        /* check that they really want us to change something */
-       if (!tty_termios_hw_change(tty->termios, old_termios))
+       if (!tty_termios_hw_change(&tty->termios, old_termios))
                return;
 
        /* set DTR/RTS active */
index 3fee23b..cf2d30c 100644 (file)
@@ -216,7 +216,7 @@ static void ssu100_set_termios(struct tty_struct *tty,
                               struct ktermios *old_termios)
 {
        struct usb_device *dev = port->serial->dev;
-       struct ktermios *termios = tty->termios;
+       struct ktermios *termios = &tty->termios;
        u16 baud, divisor, remainder;
        unsigned int cflag = termios->c_cflag;
        u16 urb_value = 0; /* will hold the new flags */
@@ -322,7 +322,7 @@ static int ssu100_open(struct tty_struct *tty, struct usb_serial_port *port)
                dbg("%s - set uart failed", __func__);
 
        if (tty)
-               ssu100_set_termios(tty, port, tty->termios);
+               ssu100_set_termios(tty, port, &tty->termios);
 
        return usb_serial_generic_open(tty, port);
 }
index a4404f5..f502a16 100644 (file)
@@ -520,7 +520,7 @@ static int ti_open(struct tty_struct *tty, struct usb_serial_port *port)
        }
 
        if (tty)
-               ti_set_termios(tty, port, tty->termios);
+               ti_set_termios(tty, port, &tty->termios);
 
        dbg("%s - sending TI_OPEN_PORT", __func__);
        status = ti_command_out_sync(tdev, TI_OPEN_PORT,
@@ -562,7 +562,7 @@ static int ti_open(struct tty_struct *tty, struct usb_serial_port *port)
        usb_clear_halt(dev, port->read_urb->pipe);
 
        if (tty)
-               ti_set_termios(tty, port, tty->termios);
+               ti_set_termios(tty, port, &tty->termios);
 
        dbg("%s - sending TI_OPEN_PORT (2)", __func__);
        status = ti_command_out_sync(tdev, TI_OPEN_PORT,
@@ -831,8 +831,8 @@ static void ti_set_termios(struct tty_struct *tty,
        int port_number = port->number - port->serial->minor;
        unsigned int mcr;
 
-       cflag = tty->termios->c_cflag;
-       iflag = tty->termios->c_iflag;
+       cflag = tty->termios.c_cflag;
+       iflag = tty->termios.c_iflag;
 
        dbg("%s - cflag %08x, iflag %08x", __func__, cflag, iflag);
        dbg("%s - old clfag %08x, old iflag %08x", __func__,
@@ -871,7 +871,7 @@ static void ti_set_termios(struct tty_struct *tty,
        }
 
        /* CMSPAR isn't supported by this driver */
-       tty->termios->c_cflag &= ~CMSPAR;
+       tty->termios.c_cflag &= ~CMSPAR;
 
        if (cflag & PARENB) {
                if (cflag & PARODD) {
index 27483f9..aa4b0d7 100644 (file)
@@ -207,7 +207,7 @@ static int serial_install(struct tty_driver *driver, struct tty_struct *tty)
        if (retval)
                goto error_get_interface;
 
-       retval = tty_standard_install(driver, tty);
+       retval = tty_port_install(&port->port, driver, tty);
        if (retval)
                goto error_init_termios;
 
@@ -305,8 +305,7 @@ static void serial_close(struct tty_struct *tty, struct file *filp)
  * Do the resource freeing and refcount dropping for the port.
  * Avoid freeing the console.
  *
- * Called asynchronously after the last tty kref is dropped,
- * and the tty layer has already done the tty_shutdown(tty);
+ * Called asynchronously after the last tty kref is dropped.
  */
 static void serial_cleanup(struct tty_struct *tty)
 {
@@ -423,7 +422,7 @@ static void serial_set_termios(struct tty_struct *tty, struct ktermios *old)
        if (port->serial->type->set_termios)
                port->serial->type->set_termios(tty, port, old);
        else
-               tty_termios_copy_hw(tty->termios, old);
+               tty_termios_copy_hw(&tty->termios, old);
 }
 
 static int serial_break(struct tty_struct *tty, int break_state)
index 6855d5e..72b678d 100644 (file)
@@ -67,7 +67,7 @@ void usb_wwan_set_termios(struct tty_struct *tty,
        struct usb_wwan_intf_private *intfdata = port->serial->private;
 
        /* Doesn't support option setting */
-       tty_termios_copy_hw(tty->termios, old_termios);
+       tty_termios_copy_hw(&tty->termios, old_termios);
 
        if (intfdata->send_setup)
                intfdata->send_setup(port);
index 473635e..b36077d 100644 (file)
@@ -724,7 +724,7 @@ static void firm_setup_port(struct tty_struct *tty)
 {
        struct usb_serial_port *port = tty->driver_data;
        struct whiteheat_port_settings port_settings;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
        port_settings.port = port->number + 1;
 
index 77da6a2..c03ecdd 100644 (file)
@@ -987,7 +987,6 @@ err_regfb:
        fb_dealloc_cmap(&info->cmap);
 err_cmap:
        fb_deferred_io_cleanup(info);
-       kfree(info->fbdefio);
 err_defio:
        vfree((void *)info->screen_base);
 err_irq:
@@ -1022,7 +1021,6 @@ int  __devexit auok190x_common_remove(struct platform_device *pdev)
        fb_dealloc_cmap(&info->cmap);
 
        fb_deferred_io_cleanup(info);
-       kfree(info->fbdefio);
 
        vfree((void *)info->screen_base);
 
index bfdc5fb..9a046a4 100644 (file)
 #include <linux/fb.h>
 #include <linux/backlight.h>
 #include <linux/slab.h>
+#include <linux/platform_data/omap1_bl.h>
 
 #include <mach/hardware.h>
-#include <plat/board.h>
-#include <plat/mux.h>
+#include <mach/mux.h>
 
 #define OMAPBL_MAX_INTENSITY           0xff
 
index 28b1a83..61b182b 100644 (file)
@@ -162,7 +162,7 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info,
        image.depth = 1;
 
        if (attribute) {
-               buf = kmalloc(cellsize, GFP_KERNEL);
+               buf = kmalloc(cellsize, GFP_ATOMIC);
                if (!buf)
                        return;
        }
index 88e9204..fdefa8f 100644 (file)
@@ -449,7 +449,7 @@ static int __init fb_console_setup(char *this_opt)
 
        while ((options = strsep(&this_opt, ",")) != NULL) {
                if (!strncmp(options, "font:", 5))
-                       strcpy(fontname, options + 5);
+                       strlcpy(fontname, options + 5, sizeof(fontname));
                
                if (!strncmp(options, "scrollback:", 11)) {
                        options += 11;
index 00ce1f3..57d940b 100644 (file)
@@ -328,6 +328,8 @@ static int mb862xxfb_ioctl(struct fb_info *fbi, unsigned int cmd,
        case MB862XX_L1_SET_CFG:
                if (copy_from_user(l1_cfg, argp, sizeof(*l1_cfg)))
                        return -EFAULT;
+               if (l1_cfg->dh == 0 || l1_cfg->dw == 0)
+                       return -EINVAL;
                if ((l1_cfg->sw >= l1_cfg->dw) && (l1_cfg->sh >= l1_cfg->dh)) {
                        /* downscaling */
                        outreg(cap, GC_CAP_CSC,
index d3a3113..ed4cad8 100644 (file)
@@ -27,8 +27,7 @@
 #include <linux/lcd.h>
 #include <linux/gpio.h>
 
-#include <plat/board-ams-delta.h>
-#include <mach/hardware.h>
+#include <mach/board-ams-delta.h>
 
 #include "omapfb.h"
 
index e3880c4..b739600 100644 (file)
@@ -25,7 +25,7 @@
 #include <linux/spi/spi.h>
 #include <linux/module.h>
 
-#include <plat/lcd_mipid.h>
+#include <linux/platform_data/lcd-mipid.h>
 
 #include "omapfb.h"
 
index 5914220..3aa62da 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/platform_device.h>
 
 #include <asm/gpio.h>
-#include <plat/mux.h>
+#include <mach/mux.h>
 #include "omapfb.h"
 
 static int osk_panel_init(struct lcd_panel *panel, struct omapfb_device *fbdev)
index 5b289c5..ee9e296 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 
+#include <plat/cpu.h>
 #include <plat/clock.h>
 
 #include <video/omapdss.h>
index 5d31699..f43bfe1 100644 (file)
@@ -105,6 +105,20 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev)
 
        sdi_config_lcd_manager(dssdev);
 
+       /*
+        * LCLK and PCLK divisors are located in shadow registers, and we
+        * normally write them to DISPC registers when enabling the output.
+        * However, SDI uses pck-free as source clock for its PLL, and pck-free
+        * is affected by the divisors. And as we need the PLL before enabling
+        * the output, we need to write the divisors early.
+        *
+        * It seems just writing to the DISPC register is enough, and we don't
+        * need to care about the shadow register mechanism for pck-free. The
+        * exact reason for this is unknown.
+        */
+       dispc_mgr_set_clock_div(dssdev->manager->id,
+                       &sdi.mgr_config.clock_info);
+
        dss_sdi_init(dssdev->phy.sdi.datapairs);
        r = dss_sdi_enable();
        if (r)
index 08ec1a7..3c39aa8 100644 (file)
@@ -31,6 +31,7 @@
 #include <linux/omapfb.h>
 
 #include <video/omapdss.h>
+#include <plat/cpu.h>
 #include <plat/vram.h>
 #include <plat/vrfb.h>
 
@@ -1192,7 +1193,7 @@ static int _setcolreg(struct fb_info *fbi, u_int regno, u_int red, u_int green,
                        break;
 
                if (regno < 16) {
-                       u16 pal;
+                       u32 pal;
                        pal = ((red >> (16 - var->red.length)) <<
                                        var->red.offset) |
                                ((green >> (16 - var->green.length)) <<
index 4b0fcf3..fee195a 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/pm_runtime.h>
 
 #include <asm/irq.h>
-#include <mach/hardware.h>
 
 #include "../w1.h"
 #include "../w1_int.h"
@@ -644,7 +643,7 @@ static int omap_hdq_remove(struct platform_device *pdev)
 
        /* remove module dependency */
        pm_runtime_disable(&pdev->dev);
-       free_irq(INT_24XX_HDQ_IRQ, hdq_data);
+       free_irq(platform_get_irq(pdev, 0), hdq_data);
        platform_set_drvdata(pdev, NULL);
        iounmap(hdq_data->hdq_base);
        kfree(hdq_data);
index 53d7571..ad1bb93 100644 (file)
@@ -237,12 +237,12 @@ config OMAP_WATCHDOG
          here to enable the OMAP1610/OMAP1710/OMAP2420/OMAP3430/OMAP4430 watchdog timer.
 
 config PNX4008_WATCHDOG
-       tristate "PNX4008 and LPC32XX Watchdog"
-       depends on ARCH_PNX4008 || ARCH_LPC32XX
+       tristate "LPC32XX Watchdog"
+       depends on ARCH_LPC32XX
        select WATCHDOG_CORE
        help
          Say Y here if to include support for the watchdog timer
-         in the PNX4008 or LPC32XX processor.
+         in the LPC32XX processor.
          This driver can be built as a module by choosing M. The module
          will be called pnx4008_wdt.
 
index 59e75d9..c1a4d3b 100644 (file)
 #include <linux/io.h>
 #include <linux/uaccess.h>
 #include <mach/hardware.h>
-#include <mach/regs-timer.h>
+
+#define KS8695_TMR_OFFSET      (0xF0000 + 0xE400)
+#define KS8695_TMR_VA          (KS8695_IO_VA + KS8695_TMR_OFFSET)
+
+/*
+ * Timer registers
+ */
+#define KS8695_TMCON           (0x00)          /* Timer Control Register */
+#define KS8695_T0TC            (0x08)          /* Timer 0 Timeout Count Register */
+#define TMCON_T0EN             (1 << 0)        /* Timer 0 Enable */
+
+/* Timer0 Timeout Counter Register */
+#define T0TC_WATCHDOG          (0xff)          /* Enable watchdog mode */
 
 #define WDT_DEFAULT_TIME       5       /* seconds */
 #define WDT_MAX_TIME           171     /* seconds */
index fceec4f..f5db18d 100644 (file)
@@ -46,6 +46,7 @@
 #include <linux/slab.h>
 #include <linux/pm_runtime.h>
 #include <mach/hardware.h>
+#include <plat/cpu.h>
 #include <plat/prcm.h>
 
 #include "omap_wdt.h"
@@ -218,12 +219,16 @@ static long omap_wdt_ioctl(struct file *file, unsigned int cmd,
        case WDIOC_GETSTATUS:
                return put_user(0, (int __user *)arg);
        case WDIOC_GETBOOTSTATUS:
+#ifdef CONFIG_ARCH_OMAP1
                if (cpu_is_omap16xx())
                        return put_user(__raw_readw(ARM_SYSST),
                                        (int __user *)arg);
+#endif
+#ifdef CONFIG_ARCH_OMAP2PLUS
                if (cpu_is_omap24xx())
                        return put_user(omap_prcm_get_reset_sources(),
                                        (int __user *)arg);
+#endif
                return put_user(0, (int __user *)arg);
        case WDIOC_KEEPALIVE:
                spin_lock(&wdt_lock);
index 1afb4fb..4d51948 100644 (file)
@@ -232,7 +232,7 @@ xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size,
                return ret;
 
        if (hwdev && hwdev->coherent_dma_mask)
-               dma_mask = hwdev->coherent_dma_mask;
+               dma_mask = dma_alloc_coherent_mask(hwdev, flags);
 
        phys = virt_to_phys(ret);
        dev_addr = xen_phys_to_bus(phys);
index 097e536..0334272 100644 (file)
@@ -353,16 +353,16 @@ static int __devinit pcistub_init_device(struct pci_dev *dev)
        if (err)
                goto config_release;
 
-       dev_dbg(&dev->dev, "reseting (FLR, D3, etc) the device\n");
-       __pci_reset_function_locked(dev);
-
        /* We need the device active to save the state. */
        dev_dbg(&dev->dev, "save state of device\n");
        pci_save_state(dev);
        dev_data->pci_saved_state = pci_store_saved_state(dev);
        if (!dev_data->pci_saved_state)
                dev_err(&dev->dev, "Could not store PCI conf saved state!\n");
-
+       else {
+               dev_dbg(&dev->dev, "reseting (FLR, D3, etc) the device\n");
+               __pci_reset_function_locked(dev);
+       }
        /* Now disable the device (this also ensures some private device
         * data is setup before we export)
         */
index 344713b..fdc9ff0 100644 (file)
@@ -40,7 +40,6 @@ fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-6.2.1a.fw \
                             bnx2/bnx2-mips-06-6.2.1.fw \
                             bnx2/bnx2-rv2p-06-6.0.15.fw
 fw-shipped-$(CONFIG_CASSINI) += sun/cassini.bin
-fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin
 fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \
                                   cxgb3/t3c_psram-1.1.0.bin \
                                   cxgb3/t3fw-7.10.0.bin \
diff --git a/firmware/intelliport2.bin.ihex b/firmware/intelliport2.bin.ihex
deleted file mode 100644 (file)
index e9cfe8c..0000000
+++ /dev/null
@@ -1,2147 +0,0 @@
-:100000003C4237180201030000000000000000001D
-:10001000576564204465632030312031323A3234F0
-:100020003A33302031393939000000000000000037
-:10003000E96C0F426547694E6E496E47206F462056
-:10004000634F6445CC135A15E8167618041A921BB0
-:10005000201DAE1E3C20CA215823E6247426022807
-:1000600090291E2BAC2C3A2EC82F5631E432723414
-:1000700000368E371C39AA3A383CC63D543FE24020
-:100080007042FE438C451A47A848364AC44B524D2D
-:10009000E04E6E50FC518A531855A6563458C2593A
-:1000A000505BDE5C6C5EFA5F88611663A464326646
-:1000B000C0674E69DC6A6A6CF86D866F1471A27253
-:1000C0003074BE754C776C778C77AC7733DB8ADC19
-:1000D0005333DB250700750A8A1E080183E30CEB06
-:1000E00020903C01750A8A1E080180E3C0EB129043
-:1000F0008A1E0D013C02750680E30CEB049080E340
-:10010000C053508B1EBA138EDBE86A65558BEC53D7
-:100110001E2BC08ED88B5E04C1E304035E06D1E3C0
-:100120002E8B9F44008D472A1E5A1F5B5DC3558B43
-:10013000EC531E2BC08ED88B5E04C1E304035E0615
-:10014000D1E32E8B9F44008D47341E5A1F5B5DC345
-:10015000FB558BEC53515256571E061E0733C08E6B
-:10016000D88B5E04268A47592503008BF0D1E62EF2
-:100170008BB4C400C1E0042602471AD1E08BE82EFC
-:100180008BAE4400892C268A471C88440F268A4758
-:100190001D884410268A471E884411268A471F88D6
-:1001A0004412268A4720884413268A472388441409
-:1001B000268A4724884415268A475A88440E33C025
-:1001C00089440689440888440B88440AB021B464F1
-:1001D000894404894402B05588440D88440CE86A77
-:1001E00000725BE8C900E8C110894408807C0F01F7
-:1001F0007429E82B02E87F02807C0F03741DE8A9B4
-:10020000108BF82B44083DA00F7210897C0833C076
-:1002100087440685C07504C6440AFF8A440A84C020
-:10022000750BB80800E86A4AE8A90173BFE84F01F6
-:100230008166487FFF83667ABFB002E8040E8A4475
-:100240000A98071F5F5E5A595B5DC3814E48800064
-:10025000B040E83D4AE88940732AE84D108BD8B099
-:1002600005E82E4AF6462702751AE83D102BC33DD5
-:10027000581B72EB8166487FFFB002E8C40DC6448C
-:100280000A01F9C3834E7A40F8C3FBB001E8024A81
-:10029000FAE8991EE40A84C075F0B04EE60AFBB095
-:1002A00001E8EE49FAE8851EE40A84C075F0C3FA55
-:1002B000E87A1EE4EC884416E4E4884417E4F888FD
-:1002C0004418E4F0884419E41088441AE41288447D
-:1002D0001BE41488441CE43488441DE43688441E1E
-:1002E000E4D824018AE0E4DA24020AC488441F8A9C
-:1002F0004410E8CD1F8A4411E835218A4412E88968
-:10030000218A4413E84321C686A10000E414241086
-:10031000E614E412243DE6128A44153C01721E776D
-:1003200016B011E634B013E636E4140C10E614E40B
-:10033000120C40E612EB06E4120C02E6128A440F9D
-:100340003C0174063C02740AEB0EE4120C08E6123F
-:10035000EB06E4120C10E612E82FFF8A44143C026C
-:100360007508B05588440C88440DB021B4648944A4
-:1003700004894402E40C0C10E60CE8ED39FBC3E8F8
-:100380005F3F7308FBB00AE80849EBF3FAE89D1DEC
-:100390008A64168A441789869400E6E48AC4E6ECE7
-:1003A0008A64188A441989869600E6F08AC4E6F8B9
-:1003B0008A441AE6108A441BE6128A441CE6148A10
-:1003C000441DE6348A441EE6368A441FE6D8E6DA3F
-:1003D000E9B7FE90FA8A440EE6FEE402A80175052C
-:1003E00033C0FBF8C333C0E400FBF9C38A64148054
-:1003F000FC02742BFEC0FEC780FF4E721C74098085
-:10040000FF507308B00AEB17B00DEB1302DC32FF9C
-:1004100080FB7F7C02B3218AC33C7F7C02B021C376
-:10042000FA807C0B047602FBC38B46243D080072E5
-:10043000F68E46028B7E228A440C8B5C02AAE8ABC5
-:10044000FFAAE8A7FFAAE8A3FFAAE89FFF88440C39
-:10045000895C0280440B04897E22836E24048346D7
-:100460001A04807E26027406806626FDFBC360B0F7
-:10047000FDE8023F61FBC3FA807C0F037509C644A7
-:100480000B00E8E538FBC3C47E148B4E3A85C97572
-:1004900035268B0D4747E3EA3B7E047622B80200FF
-:1004A00039462E7707C7462E0000EB138B5E2C894A
-:1004B0005E0426C70700004343895E2C29462E852B
-:1004C000C978CE894E3A8A440D8B5C04268A25472A
-:1004D0003AC47516FE4C0BFF4406E80FFFE2ED88A8
-:1004E000440D895C04894E3AEBA7C6440AFEE879BC
-:1004F00038FBC390E8B30D8AE88A0ECB13B3078AA2
-:10050000C1EEEB00EC3AC1750902CDFECB75F0EB04
-:100510000C90880ECB138AE8BBFFFFF9C3880ECB83
-:1005200013F8C390BB3F3F8A8E9E00BAFE00EC8A50
-:10053000E832C122C37502F8C3F9C390E8E5FF733E
-:1005400001C3BAD000BB03038A8E9F00EC8AE83255
-:10055000C122C37502F8C3F9C39033C08ED88EC0D0
-:10056000803EC813007507B00AE82647EBF2FB335C
-:10057000DB8A1EC913434383FB7E760733DBB0025D
-:10058000E80F472E8BAF4400837E080074E7881E77
-:10059000C913B002E8FB46FAF7463840007414E885
-:1005A000961BE87FFF721C33D28A969F0083C20E8F
-:1005B000EB0C90E8771BE883FF7208BA4800E83339
-:1005C000FF73AB23CB898E9A0089969C00FE86B57B
-:1005D00000C606C81300B00AE8670AFBEB891018CA
-:1005E000082833C0A005018AC824407524C7067CAA
-:1005F000128E45C70642120100C606541202B00808
-:10060000F6C1017402B004A34612A24C12A29412C5
-:10061000C3C7067C12B645A00F0184C0750E6A00E0
-:100620001FC60693121E9C0EE8B10C90C70644121A
-:100630000100A342128BD8C1E304881E9412BEE2CB
-:10064000052BF08BC833DB8BFB2EAC888548128AD8
-:10065000D80C05E6FE8AE0EB00E4FE32C4A83F7445
-:1006600003E99E00E400888550128AE02430BA1025
-:10067000FF3C30741280FC04740ABA0403F60608C6
-:1006800001FE7403BA080F88954C1202FA32C0F6C4
-:10069000C4087402B001888558128AC43C35745B62
-:1006A0003C3674573C3474533C04744F3C14744BC4
-:1006B0003C157447A8407425C685541204D1E7B48C
-:1006C000038AC389855C128AC38AE380CC01898549
-:1006D0006412D1EF47E203EB1A90E96CFFC6855430
-:1006E0001202D1E78AE68AC30C0489855C12D1EF35
-:1006F00047E2E733C08AC7A34612C3C68554120631
-:10070000EBBBC68554120033C08885501288854CD7
-:100710001288855812EBA6C7462602128B461E8900
-:1007200046008946228B4620894624C7461A000087
-:10073000C3C7463C8000C7463801001E568B763042
-:100740008976048976148E5E0633C089044646890C
-:10075000762C89463A8B4632484889462E5E1FC31E
-:1007600033C089464889464AC74646AE0189464E47
-:100770008B46448946508B4642894640894608C389
-:1007800033C0894676894678C7467A1000561E8B54
-:10079000767089761089760C8E5E12C70400008B05
-:1007A00046728946741F5EC3895618895602895657
-:1007B0000689560A89560E8956128956168BD84BC9
-:1007C0004BC1E302BF0200897E1E03FB897E30031A
-:1007D000FB897E4203FB897E7083EB08895E20895A
-:1007E0005E32895E44895E7250E82BFFE871FFE853
-:1007F0003FFFE88BFF58C3B83075C1E8040E5B03B8
-:10080000C3A3BA13833E4212007407803E941200C1
-:10081000750E6A001FC60693121E9C0EE8BD0A9054
-:10082000B8307AC1E80440A3C0132B061201F7D8F0
-:1008300033D28BCA8A0E9412F7F13D8000770E6A8C
-:10084000001FC6069312259C0EE8900A90483DFFB3
-:10085000077203B8FF07A3C21333C98A0E94123379
-:10086000F6B800092E8BAC440089464C404646E25F
-:10087000F38A0E941233F68B16C013A1C2132E8B7B
-:10088000AC4400E822FF03D04646E2F2C333C02E58
-:100890008BAD44008946084747E2F4C35133C00A90
-:1008A000C22E8BAD440089869E00814E38002047C1
-:1008B00047FEC480FC04720432E4FEC0E2E35983C4
-:1008C000E9107405F7D9E8C4FFC35133C00AC22E3A
-:1008D0008BAD440089869E00834E3840474780C4D4
-:1008E00010790432E4FEC0E2E65983E9107405F79A
-:1008F000D9E899FFC3E8D2FFC38D089C08CA08F560
-:10090000088B0E421233F6515633DB8BCB8A944858
-:10091000128A8C4C128A9C54128BFEC1E70585DB2F
-:100920007502B1102EFF97F9085E5946E2D9C3014E
-:10093000CC03D000E802D000E801D000E800D000ED
-:10094000E804D0A8DA00DC00DE01D803CC03CC0335
-:10095000CC04D0A8DA20DC00DE03CC03CC03CC002E
-:10096000D803CC03CC03CC03CC03CC03CC03CC0303
-:10097000CC03CC03CC03CC03CC03CC03CC03CC03FF
-:10098000CC04D000DA20DC03DE01D803CC03CC0396
-:10099000CC03CC00D800CC00D0000056521E0E1F55
-:1009A000BE2F0933D2FCAD85C0740D8AD4EEAD855F
-:1009B000C074058AD4EEEBEE1F5A5EC3E48084C097
-:1009C00074167814B027E6FCB011E634E4FC3C273A
-:1009D0007506E4117502F8C3F9C383C206B0BFEE11
-:1009E00083EA02B010EE8886AF00B01183C204EE35
-:1009F00083C202EEB01383C202EE83C202EE2EA1C6
-:100A00004C2D8986940083EA0EEE83C2028AC4EEDE
-:100A100083C204B003EE8886A80083EA0432C0EEE5
-:100A200083C202B089EE8886A6000C06EEB040B400
-:100A30003889461CC74636380083C20432C0EE8867
-:100A400086A700C383C206B0BFEE83EA02EC3A86F3
-:100A5000AF00752483C204EC3C11751C83C206EC04
-:100A60003C13751483EA088A86A800EE83EA02EC38
-:100A700024C03CC07502F8C3F9C333C98BD18BF1D4
-:100A80008A0E9412C1E9022E8BAC4400F74638005E
-:100A900020740E8A869E00E6FE32C0E68042E8FAA6
-:100AA000FE83C608E2E185D27403E80508C333C9B2
-:100AB0008BF18A0E94122E8BAC4400F7463840001E
-:100AC0007406E87316E812FF4646E2EAC333C98BA0
-:100AD000F18A0E9412C1E9022E8BAC4400F746381D
-:100AE00000207416E84616E8D2FE730E6A001FC690
-:100AF0000693121C9C0EE8E3079083C608E2D9C354
-:100B000033C98BF18A0E94122E8BAC4400F7463811
-:100B100040007416E82116E82AFF730E6A001FC60B
-:100B20000693121C9C0EE8B307904646E2DAC30C0B
-:100B300000001000131200001400283C001B3E00AF
-:100B4000002A00002C0000420014D80000DA000047
-:100B50003400113600133800113A001300005650CB
-:100B600052BE2F0B2EAD85C07406922EACEEEBF468
-:100B70005A585EC3532EA16022E6E4E6F08AC4E62A
-:100B8000ECE6F8E8D8FFB04BE610B050E612B0380B
-:100B9000E614E8AE15B046E60AE8A715B01AE60A6C
-:100BA000E8A015B022E60AE89915E8FD068BD8E41E
-:100BB00016A8047518E8F2062BC33D320072F06ADD
-:100BC000001FC6069312239C0EE8100790E8DA0671
-:100BD0002BC33D2400771BB031E6FC565155B910AC
-:100BE000002E8BAC4400814E3880004646E2F25D18
-:100BF000595EE869FFE84B15B046E60AE844155B24
-:100C0000C333F68B0E42122E8BAC4400F7463800ED
-:100C1000207406E81715E85BFF83C620E2E9C38B62
-:100C2000C20504008946282EA14C2D89868E008994
-:100C300086900089869200C686A3000AC686C300F5
-:100C4000035283C2048A86A6000C06EE5A83C202AF
-:100C5000B005EE8886A500C3E803FFE8E514B042BE
-:100C6000E60AF74638800074062EA19C22EB042E7B
-:100C7000A16C22C7461C0C008986940089869600C8
-:100C800089868E008986900089869200E6F0E6E4E7
-:100C90008AC4E6F8E6ECC686C30003E8A514B01AD9
-:100CA000E60AB0108886A500E60CC333C98BF18A2A
-:100CB0000E94122E8BAC4400F7463840007406E8C0
-:100CC0007614E85AFF4646E2EAC333C98BF18A0E2E
-:100CD00094122E8BAC4400F7463800207406E84C82
-:100CE00014E874FF4646E2EAC390833E441200755E
-:100CF00014B001BA0601EE2AC0EEB002EEB004EE66
-:100D0000B80002EB0FBA0601B040EEB801008A0E3F
-:100D10000E01D3E0A38812C3A18812A384122D2050
-:100D200000A38A122D2000A38212C706861220007B
-:100D3000C70680123200C3833E44120074768B0EC5
-:100D4000421233F68AA4541284E4745F8A844812EF
-:100D50000C04E6FEF6C4047425B01BBA0000EEEBEA
-:100D6000002AC0BA0200EEEB00B003EEEB0032C086
-:100D7000BA0200EEEB00BA0000B000EEEB2DB01F9F
-:100D8000BA0000EEEB002AC0BA0200EEEB00B0039E
-:100D9000EEEB00D1E68A845D12D1EEF6D0BA020005
-:100DA000EEEB00BA0000B00AEEEB00E404EB00E466
-:100DB0000446E290C390B81400BA3EFFEFB80600B4
-:100DC000BA32FFEFB80F00BA34FFEFBA36FFEF8345
-:100DD0003E4412007516B81100BA38FFEFB8120081
-:100DE000BA3AFFEFB81B00BA3CFFEFC3B81100BA24
-:100DF00038FFEFB81200BA3AFFEFB81B00BA3CFF59
-:100E0000EFC3B8FC00BA28FFEFFB833E4412007426
-:100E100007B8CC00BA28FFEFC300FFFF202428FF4B
-:100E20002CFFFF303438FFFF3C903C0F770EBB198E
-:100E30000E2ED73CFF74058AD8F8C3902ADBF9C37D
-:100E4000833E4412007427A00601802606013080EC
-:100E50003E0601307518B90200BFC413BA0601EC92
-:100E6000A82075F8BA0401EDABE2F1EB1690B904D5
-:100E700000BFC413BA0601ECA82075F8BA0401EC4F
-:100E8000AAE2F1FA90BEC413AD80E43F80FC027484
-:100E90000E6A001FC60693120A9C0EE83E0490AD2F
-:100EA0003C0F75ED8AC4E881FF72E6881E1A01C600
-:100EB000068E1200B0000A061A01BA0001EEC6063C
-:100EC0008F1240833E4412007506B80C00EB04906C
-:100ED000B84C00BA28FFEFC3833E4412007501C32B
-:100EE000A150120B0652120AC4A80874F2A00F01F6
-:100EF0002AE450FF36BA131FE8505683C4026A0032
-:100F00001F33C0A3BC13A00F01A3BE138B1EBC13C1
-:100F10008A875012F687501208740D24078AE0BEA3
-:100F2000CC00A0BC13E8943DFF06BC13FF0EBE131B
-:100F300075DAC3901E33C08ED8B001E8543D1FC38C
-:100F400033C98BF18A0E94122E8BAC4400C74662D3
-:100F50003844C7467CFC3BC7467EE23BC7868000E0
-:100F6000EC3CE8AB16C686C00011837E080074070F
-:100F70005156E833335E594646E2CDC333C98BF14F
-:100F80008BF98A0E9412C1E902E3132E8BAC440054
-:100F90008A869E0088856C1283C60847E2EDC3FAF4
-:100FA000FCB0C0BA0001EE33C08ED88EC08ED0BF68
-:100FB0001601B9CC772BCFD1E9F3ABBC4012E8D9FD
-:100FC00002E8703CBECC0FE8F23CF49033C08ED8FF
-:100FD0008EC08ED0F6060A0180740BBE3555E8DB54
-:100FE0003CB001E8AC3CE8B300E8F6F5E808F8E806
-:100FF0000FF9E885FAE8B6FAE8EFFCE8C210E80372
-:101000003CE8B2FDE830FDE85402C6068F12C0E8A5
-:10101000BBFAE8EBFAE8E9FBE8AFFCE88DFCE81F77
-:10102000FFE858FFE8DBFDE816FE33C0BE5A05E8CE
-:101030008A3CE8A3FEE8E0FCFBBEA444E87D3CE972
-:10104000CA2D56988BF08B425285C07527C74252E5
-:10105000010053368B9C2C01F6C301750C36896850
-:10106000523689AC2C015B5EC33689AC2C013689C3
-:10107000AC1C015B5EC356988BF033ED368B841C41
-:1010800001A80175158BE833C08742523689841C4C
-:1010900001A80174053689842C015EC3565133F6CC
-:1010A000B80100B9080089841C0189842C014646D6
-:1010B000E2F4595EC390BB01008BE8FF4E6E740AE8
-:1010C0008BDD8B4658A80174F0C38B4648A90800F5
-:1010D0007445F7463840007427E85C1080C2068AE1
-:1010E00086A80024BF8886A800EE60B0FEE886329D
-:1010F00061B002E84CFF8B464824F7894648EB175D
-:10110000E82A10814E2600408A86A5000C028886B7
-:10111000A500E60C8B4648A904007414B002E8212F
-:10112000FF8B464824FB89464860B0DFE8473261C0
-:1011300033C0874658F6C301750B36894758A80156
-:10114000750DE974FFA32201A8017503E96AFF89FF
-:101150001E3201C3BB01008BE8F74638400074150E
-:10116000E8D50F80C20AECA840750A8BDD8B465685
-:10117000A80174E3C38B462680E4FE80CC02894636
-:1011800026B002E8BCFE33C0874656F6C301750A96
-:1011900036894756A801750BEBBDA32001A8017540
-:1011A00002EBB4891E3001C3601E062BC08ED8A08E
-:1011B000901284C07549A12201A8017503E8F6FECA
-:1011C000A12001A8017503E88AFFA1AC13487805A6
-:1011D0007445A3AC13A1AE134878057451A3AE13A4
-:1011E000A1B0134878057463A3B013A17E124078B0
-:1011F00003A37E12B80080BA22FFEF071F61CFA0C1
-:101200009112403C02720B33C0A29112FF167C1265
-:10121000EBA4A29112EB9FA08E1232068F12A28E27
-:10122000120A061A01BA0001EEB82C01EBA4833EA3
-:101230008412107211BA28FFED0C81EFE85337BA0F
-:1012400028FFED247EEFB80400EB92C6068D120154
-:10125000E83F37C6068D1200A1B213EB8B908A1EB1
-:101260000B012AFF6BC319BA62FFEFB80A00BA601C
-:10127000FFEFB801E0BA66FFEFB8FFFFBA52FFEF29
-:10128000B809C0BA56FFEFC706AC132C01C706AEAB
-:10129000130400C606911200C3908A1E0B012AFF98
-:1012A0006BC305D1E8A31801C39052BA50FFED5AA1
-:1012B000C39053518B1E1801B9320590E2FE4B7555
-:1012C000F7595BC3B080BA00010A061A01EEC39059
-:1012D000B040EBF2B0C0EBEEB000EBEAFA60061EF5
-:1012E000162BDB8EDB2EA1BA4C2EA3924CA09312B0
-:1012F000988BE889262D7A803ECA13007403E96B27
-:1013000042E8C0FFE8ABFFE8A8FFB020C606901295
-:1013100000FF167C128BFD83FF0A7211E8B9FFE80B
-:1013200090FFE8ABFFE88AFF83EF0AEBEA0BFF745C
-:101330000FE8A4FFE87BFFE89AFFE875FF4F75F11F
-:10134000E895FFE86CFFEBB98A86A50024FDEE88DE
-:1013500086A500C38A86A6000C02EEC38B7638F7FA
-:10136000C6010074EF8B4E368B462E3BC173028B49
-:10137000C82BC189462E014E34C47E0426010D8B34
-:101380007E2C83EA04F36C8EC1897E2C3B463C7232
-:1013900012F7C62000750B83CE20897638B000E89E
-:1013A000A0FCC3F7C60400741B8BD883CE108976CB
-:1013B000388A86A70024FE8886A70083C208EE83A9
-:1013C000EA088BC33D40007201C3814E380004839C
-:1013D000C2028A86A50024FA8886A500EEC38A8602
-:1013E000A6000C02EEC3F74638010074F18B4E2EB6
-:1013F00032DB8ABEA30083C206C476048B7E2C83B4
-:10140000F908722CECA80174168AE083EA0AEC83CE
-:10141000C20A84E77551AAFEC34983F90873E5320D
-:10142000FF26011C015E34897604894E2E897E2CAC
-:101430003B4E3C7211F64638207401C3834E38206F
-:10144000B000E8FDFBC3F64638047415834E38102F
-:101450008A86A70024FE8886A70083EA02EE83C25C
-:10146000023D4000725DC332FF26031C85DB740918
-:1014700026891C8BF74747494980E41E80CCC0264B
-:101480008904F6C41074278B7638F7C60010740BE5
-:1014900050FE86B200B00AE8A8FB58F7C6000174F7
-:1014A0000DE882268B76388B4E2E8B7E04AB8BF725
-:1014B00033C0AB32DB8ABEA300494983F9087217F7
-:1014C000E941FF814E38000483C2F88A86A50024D2
-:1014D000FA8886A500EEC3E945FF83C208EC88863A
-:1014E000AA00C0E8048AE08AC88686A90032E08B98
-:1014F0005E3E84E3744F8AC18B4E26F6C504740C9D
-:10150000A808740580E1BFEB0380C940F6C50874E4
-:101510000CA802740580E17FEB0380C980884E2609
-:101520008BF08A86A50084C97408A802741524FD6E
-:10153000EB06A802750D0C028886A50083EA0AEE68
-:1015400083C20A8BC684E77501C3C686BA0001B0A0
-:101550000EE8EEFAF74638000274EE837E2E06722D
-:10156000E88AA6AA00C45E048B7E2CB0FFAAB00253
-:10157000AB26830703836E2E03897E2CF646382024
-:101580007401C3834E3820B000E8B6FAC39083EAF2
-:1015900008E9B4FD83C2068B5E26F6C3C075EF8BE7
-:1015A0004E1CEC8886A40083EA0AA82075028ACD26
-:1015B00032ED8B461A3BC87318014E2A2BC189465F
-:1015C0001AC57600F36E8ED98976003D2000723000
-:1015D000C385C074318BC801462AC57600F36E8E70
-:1015E000D980CB02895E26E832F1F6C701751683F1
-:1015F000C202E853FDF6C710750BB002E843FAC308
-:10160000F6C70174F0C380CB02895E26F6C7017469
-:10161000DE83C202E831FDF686A40040740B80E749
-:10162000FE80CF02895E26EBCCB004E814FAC3C07A
-:10163000C2C8CAC4C6CCCED0D2D8DAD4D6DCDE90EA
-:10164000E90E01E4C48AE0E4C48BD083F90872F0A7
-:1016500026833F0074048BDF49498BFB8ADE83E3DA
-:101660000F2E8AA72F16ABF6C4107424F7C60010ED
-:10167000740B50FE86B200B00AE8C6F958F7C600EF
-:1016800001740DE8A0248B76388B4E2E8B7E04AB34
-:10169000897E0433C0AB4949894E2E897E2C8BC18B
-:1016A000EB4E90EB9E90E4D684C07963E6D08AC876
-:1016B00025030003D8D1E32E8BAF4400888EAE0003
-:1016C0008B4E2EC45E048B7E2C8B7638E4862407EA
-:1016D0003C0375CFE41C913BC173028BC82BC189BD
-:1016E000462E014E3426010FBAC400F36C897E2CBD
-:1016F0003B463C721CF7C62000750B83CE208976D2
-:1017000038B000E83CF98A86AE00243FE6D6C3F93B
-:10171000C3F7C60A007435F7C61000752F83CE10C4
-:10172000897638F7C60200740E50E4D824FEE6D855
-:1017300058F7C6080074155051B9E803E40A84C08C
-:10174000E0FA84C07504B024E60A59583D4000739D
-:10175000B58A86A50024EF8886A500E60C81CE1008
-:1017600004897638EBA00008040C0109050D020A73
-:10177000060E030B070F004080C02060A0E0105051
-:1017800090D03070B0F0E4D2E6D08AC825030003D0
-:10179000D8D1E32E8BAF4400888EAE00E4D8C0E8E9
-:1017A000048BD82E8A8766178AE08AC88686A900A5
-:1017B00032E0E4988B5E3E84E374548AC18B4E26FB
-:1017C000F6C504740CA808740580E1BFEB0380C95A
-:1017D00040F6C508740CA802740580E17FEB038015
-:1017E000C980884E268BF08A86A500F6C1FD740854
-:1017F000A806741924F9EB0FA8067511F6C5017532
-:10180000040C04EB020C028886A500E60C8BC6844F
-:10181000E775098A86AE00243FE6D2C3C686BA00C1
-:1018200001B00EE81CF8F74638000274E6837E2EFD
-:101830000672E08A86A9008AE08686AA008AC832F3
-:10184000C480C90B22C1C0E4040AE0C45E048B7EDC
-:101850002CB0FFAAB002AB26830703836E2E038948
-:101860007E2CF646382075AB834E3820B000E8D188
-:10187000F7EBA090E41224DFE61281E3FE9F895E7D
-:1018800026836648F7EB7390F6C72075E7E4120CE1
-:1018900020E61232C0E6C6B083E6C680CF20895E5D
-:1018A000268A86A5000C028886A500E60CEB7490BB
-:1018B000F6C74075D3E4120C20E61232C0E6C6B07B
-:1018C00081E6C680E7DF80CB01895E26B006E8713D
-:1018D000F7908A86A50024F9E60C8886A500EB43DC
-:1018E000E4D4E6D08BF825030003D8D1E32E8BAFE8
-:1018F00044008B5E26F6C76075B6F6C3C075D3BAD2
-:10190000C6008B4E1C8B461A3BC8731E014E2A2BF9
-:10191000C189461AC57600F36E8ED98976003D20BE
-:1019200000723D8BC7243FE6D4C385C074398BC891
-:1019300001462AC57600F36E8ED983CB02895E26D6
-:10194000E8D9EDF6C70175398A86A50024F9E60CB9
-:101950008886A500F6C71075CAB002E8E4F6EBC3A6
-:10196000F6C70174EFEBBCF6C70174DC8A86A500EC
-:10197000A802741181E3FFFE81CB0002895E26EB91
-:10198000C78A86A50024FB0C02E60C8886A500EB1E
-:101990009290FDF7DF7FFEFBEFBF0004000405041B
-:1019A00005040104000405040504060406040504F6
-:1019B00005040604060405040504020400040504E5
-:1019C00005040104000405040504060406040504D6
-:1019D00005040604060405040504070407040504B9
-:1019E00005040704070405040504060406040504A9
-:1019F0000504060406040504050407040704050499
-:101A00000504070407040504050406040604050488
-:101A10000504060406040504050403040004050483
-:101A20000504010400040504050406040604050475
-:101A30000504060406040504050402040004050464
-:101A40000504010400040504050406040604050455
-:101A50000504060406040504050407040704050438
-:101A60000504070407040504050406040604050428
-:101A70000504060406040504050407040704050418
-:101A80000504070407040504050406040604050408
-:101A90000504060406040504050433DB8AD88A8796
-:101AA0006C12E6FEC1E302E4CEA8047509A8027434
-:101AB00003E92CFEF9C35053E8CBFC5B58A8027431
-:101AC00003E91CFEF8C333DB8AD88A876C12E6FE72
-:101AD000C1E302E9D0FB9A1AC61A00000200040012
-:101AE00002000600020004000200080002000400D8
-:101AF000020006000200040002000A0002000400C6
-:101B000002000600020004000200080002000400B7
-:101B1000020006000200040002000C0002000400A3
-:101B20000200060002000400020008000200040097
-:101B3000020006000200040002000A000200040085
-:101B40000200060002000400020008000200040077
-:101B5000020006000200040002000E000200040061
-:101B60000200060002000400020008000200040057
-:101B7000020006000200040002000A000200040045
-:101B80000200060002000400020008000200040037
-:101B9000020006000200040002000C000200040023
-:101BA0000200060002000400020008000200040017
-:101BB000020006000200040002000A000200040005
-:101BC00002000600020004000200080002000400F7
-:101BD00002000600020004000200C390DA1494150B
-:101BE0005C13E613DA1BDA1BE613DA1B8B94641220
-:101BF000C1E604A80174355033C08AC2E6FEE4A0F1
-:101C000085C074278BD82E8A9FDA1A52562E8BA83D
-:101C100044008B5628ECA801750D8886AD00240E73
-:101C20008AD82EFF97DC1B5E5AEBCD58A80274367B
-:101C300083C61033C08AC6E6FEE4A085C074278B35
-:101C4000D82E8A9FDA1A52562E8BA844008B56281B
-:101C5000ECA801750D8886AD00240E8AD82EFF975A
-:101C6000DC1B5E5AEBCDC39032E48BD88BD02E8A2E
-:101C70009F9A192E2297921956528AC3240303C69B
-:101C800080E304D0EB2EFF97D61A585EA955007555
-:101C9000D9C3601E062BC08ED8A15C12E6FEE400FC
-:101CA00022C4740833F6E8BFFFEBEE90E40407E4C7
-:101CB000041FB80080BA22FFEF61CF90601E062B90
-:101CC000C08ED8A15E12E6FEE40022C47408BE04F1
-:101CD00000E894FFEBEDE40407E4041FB80080BAC9
-:101CE00022FFEF61CF90601E062BC08ED8A15C1240
-:101CF000E6FEE40022C4741833F6E86BFFA160121C
-:101D0000E6FEE40022C474E5BE0800E85AFFEBDDFD
-:101D1000A16012E6FEE40022C475EDE40407E404C9
-:101D2000A15C12E6FEE4041FE404B80080BA22FFBE
-:101D3000EF61CF90601E062BC08ED8A15E12E6FE2A
-:101D4000E40022C47419BE0400E81CFFA16212E67C
-:101D5000FEE40022C474E4BE0C00E80BFFEBDCA13F
-:101D60006212E6FEE40022C475EDE40407E404A177
-:101D70005E12E6FEE4041FE404B80080BA22FFEF1E
-:101D800061CF601E062BC08ED8A15C12E6FEE480F7
-:101D900084C4740833F6E853FEEBEE90B80080BAC2
-:101DA00022FFEF071F61CF90601E062BC08ED8A1C7
-:101DB0005E12E6FEE48084C47408BE0200E82CFED5
-:101DC000EBEDB80080BA22FFEF071F61CF90601ED5
-:101DD000062BC08ED8A16012E6FEE48084C474088D
-:101DE000BE0400E806FEEBEDB80080BA22FFEF0764
-:101DF0001F61CF90601E062BC08ED8A16212E6FE36
-:101E0000E48084C47408BE0600E8E0FDEBEDB80091
-:101E100080BA22FFEF071F61CF90601E062BC08E95
-:101E2000D8A15C12E6FEE40022C4741833F6E83749
-:101E3000FEA16012E6FEE48084C474E5BE0400E8FE
-:101E4000AAFDEBDDA16012E6FEE48084C475EDA17D
-:101E50005C12E6FEE40407E4041FB80080BA22FF27
-:101E6000EF61CF90601E062BC08ED8A15E12E6FEF9
-:101E7000E40022C47419BE0400E8ECFDA16212E67D
-:101E8000FEE48084C474E4BE0600E85FFDEBDCA1E0
-:101E90006212E6FEE48084C475EDA15E12E6FEE403
-:101EA0000407E4041FB80080BA22FFEF61CF601E70
-:101EB000062BC08ED8A15C12E6FEE48084C47418A0
-:101EC00033F6E827FDA16012E6FEE40022C474E5C3
-:101ED000BE0800E892FDEBDDA16012E6FEE4002200
-:101EE000C475EDE40407E4041FB80080BA22FFEFD4
-:101EF00061CF601E062BC08ED8A15E12E6FEE48084
-:101F000084C47419BE0200E8E2FCA16212E6FEE499
-:101F10000022C474E4BE0C00E84DFDEBDCA16212AB
-:101F2000E6FEE40022C475EDE40407E4041FB800F3
-:101F300080BA22FFEF61CF90601E062BC08ED8A121
-:101F40005C12E6FEE48084C4741833F6E89DFCA1BC
-:101F50006012E6FEE48084C474E5BE0400E88CFCF4
-:101F6000EBDDA16012E6FEE48084C475ED071FB8C6
-:101F70000080BA22FFEF61CF601E062BC08ED8A171
-:101F80005E12E6FEE48084C47419BE0200E85CFCC4
-:101F9000A16212E6FEE48084C474E4BE0600E84B4D
-:101FA000FCEBDCA16212E6FEE48084C475ED071F41
-:101FB000B80080BA22FFEF61CF90601E062BC08E62
-:101FC000D8902AC0E6FEE4CEA801741433DBE8D52D
-:101FD000F6EBEF90B80080BA22FFEF071F61CF90B9
-:101FE000F60605010175EDB001E6FEE4CEA8017428
-:101FF000E3BB0400E8AFF6EBC990601E062BC08E71
-:10200000D890FB90FA2AC0E6FEE4CEA802741333FF
-:10201000DBE8CCF8EBECB80080BA22FFEF071F61D9
-:10202000CF90A80474F033DBE85BF7EBD590601E2B
-:10203000062BC08ED890FB90FAB001E6FEE4CEA845
-:10204000027415BB0400E897F8EBEB90B80080BA77
-:1020500022FFEF071F61CF90A80474F0BB0400E8D3
-:1020600024F7EBD26A001FC6069312099C0EE86B98
-:10207000F2906A001FC6069312299C0EE85DF2904A
-:10208000722072207220CE1D921CE61C1A1E722035
-:10209000821DAE1E381F7220821D72207220381FD2
-:1020A000722072207220F41DBC1C341D641E72202C
-:1020B000A81DF21E781F7220A81D72207220781FA2
-:1020C000FCB940008CCBB864202BFFAB93AB93E200
-:1020D000FAC7064C00A811833E4412007520C706BB
-:1020E0003C00084BC7063000BA1FC7063400FA1F71
-:1020F000F6060501017506C70638002E20C3C7067F
-:102100003C00564B33DB8A1E5412C1E302021E56BA
-:10211000122E8B878020A330008A1E5512C1E30245
-:10212000021E57122E8B87A020A33400C38B869EDD
-:1021300000E6FE86C4E6D0C38B869E00E6FE33D260
-:102140008AD4C351B91027E40A909084C07405E280
-:10215000F659F9C359F8C384C0781E518AE88AC871
-:10216000B80100D3E0098698003AAEA00059751076
-:10217000E8A9E5834E2602F9C39889869800EBF01A
-:10218000F8C384C07812518AE08AC8B80100D3E04D
-:1021900059F7D021869800C3C78698000000C383F2
-:1021A000C2048A86A6000C04EE83EA04C3E893FF07
-:1021B0007204B082E60AC38B4626A8FD74118A8693
-:1021C000A500A806740824F98886A500E60CC3F6C5
-:1021D000C401740A8A86A50024FB0C02EB0CA80239
-:1021E000750F8A86A50024FD0C043A86A50075D8D3
-:1021F000C38A86A500EBCFE4D833DB8AD8C0EB04D2
-:102200002E8A9F6617889EA9008B5E2680E33FF684
-:10221000C7047407A810750380CB40F6C70874077D
-:10222000A880750380CB40885E268A86A500F6C309
-:10223000FD740DA806740824F98886A500E60CC371
-:10224000F6C70174040C02EBF0F6C30275E90C0446
-:10225000EBE7C404C4048504590448044104C303DF
-:10226000820341038202570241028201410182003E
-:1022700041004E02AD0157012D002B002700210027
-:102280001600F404F404A3046F045B045104F40383
-:10229000A3035103A3026D025102A3015101A30044
-:1022A00051006202D9016D01380036003100290069
-:1022B0001B005157BF0200EB0F905156BF0100EBBE
-:1022C00007905156BF0300903C197602B017988BC7
-:1022D000F08A82C4002AE48BF083FE187346D1E6AC
-:1022E0002E8B8C5222F74638800074052E8B8C8200
-:1022F00022F7C7020074123B8E9400740C898E94EE
-:10230000008AC5E6EC8AC1E6E4F7C7010074123B17
-:102310008E9600740C898E96008AC5E6F88AC1E60E
-:10232000F05E59C377068B8E8E00EBC58B8E9000C6
-:10233000EBBFD503F6003E0010000400CA043301D1
-:102340004D00140005000103050709000102030404
-:1023500080841E00A02526000000608BF033FF2E35
-:10236000A150232E8B165223BB3223F74638800010
-:10237000740C2EA154232E8B165623BB3C23B90577
-:10238000002E3B31730A4747E2F7B8FFFFEB1D9081
-:10239000D1EF2E8A8D46232AEDD1EAD1D8E2FAF781
-:1023A000F6050200C1E8022E8AA54B232EA358236E
-:1023B000612EA15823C3080020008000000260099C
-:1023C0000800200080000002000800000100020058
-:1023D0000300040052565785C074053D0109760379
-:1023E000B80109BF5B01F7463880007403BFB20132
-:1023F00033F62E3B84B62376044646EBF5F7E72EFC
-:102400008BBCC02303C783D200D1E7F7F72E8AA481
-:10241000CA235F5E5AC3E43E80BEC30003750CF757
-:10242000467A200074050C80E63EC3247FE63EC356
-:1024300024038886C3008AE0E41024FC0AC4E61062
-:10244000808EA10042E8CEFFC390568BF083E60752
-:10245000D1E62EFFA458249068246C2470247424A0
-:102460007824872487248724B400EB0EB4C0EB0AB9
-:10247000B440EB06B420EB02B4A0E410241F0AC45D
-:10248000E610808EA100425EC3903C0277128AE083
-:10249000E41024F3C0E4020AC4E610808EA10042D6
-:1024A000C3908B5E3884C0741F3C02742083CB08B9
-:1024B0008B462E3B463C770CE888FC7207B024E63E
-:1024C0000A83CB10895E38C383E3F7EBF7F7C310B9
-:1024D0000074F5E86DFC72EC8A86C000E638B02323
-:1024E000E60AEBE08B5E388B462E3B463CE4D87721
-:1024F0000B24FE80CB12E6D8895E38C30C0180CB5A
-:1025000002EBF35033DBC1E804250F0F8AD82E8A83
-:102510008766178ADC2E8AA7661709463E58C3507D
-:1025200033DBC1E804250F0F8AD82E8A8766178A05
-:10253000DC2E8AA76617F7D021463E58C38B463E4D
-:1025400033DB8AD80ADC2E8A877617E62C8AE0E409
-:102550002A240F0AC4E62A8A86A50084E4750DA8F9
-:10256000807411247F8886A500E60CC3A8807504BA
-:102570000C80EBF1C31E6033C933D233F68ED98D94
-:10258000BEFD00578B0584C074168BD1428BFE4F65
-:10259000780938A3E40074084F79F788A2E400466C
-:1025A0005F83C7094183F91072D989B6860089967D
-:1025B0008400611FC353C7466600008B4664A94070
-:1025C00000740DB300A980007402B37F889EC1001F
-:1025D00032DBA90200740380CB40A9004074038061
-:1025E000CB02A90080740380CB01A9301E74038044
-:1025F000CBBCA90020740380CB08A904017403801C
-:10260000CB10A90800740380CB20889EC2005BC356
-:102610000651575016078DBEC400B91F0033C0AA1B
-:1026200040E2FC8B86920089868E00898690005855
-:102630005F5907C3E4D8C0E80453250F008BD82E98
-:102640008A8766178886A9005AC30886AC00C686A2
-:10265000BA0001B00EE8EAE9C3AD36A3B413AD3653
-:10266000A3B613AD36A3B81383E90636F706B6133F
-:102670000F00C38A4626F74648800074020C108873
-:1026800086BD0032C0837E1A00750E8B5E4043808B
-:10269000E3FE3B5E0875020C01837E3A00750D1E59
-:1026A000C55E148B1F1F85DB75020C02F7463810C0
-:1026B0000074020C048B5E7AF7C3020074020C08EB
-:1026C000F7C3040074020C10F7C3080074020C2056
-:1026D000F7C3400074020C408886BF00C3906A00B4
-:1026E0001FC60693120D9C0EE8F1EB90B002E6DADD
-:1026F000F8C333C0E6DAF8C3B001E6D8F8C333C094
-:10270000E6D8F8C3B0FFE84EFAE8A1FAF8C3AC493E
-:10271000E8AFFBF8C390AC49E815FDF8C390AC49AD
-:10272000E867FDF8C390AC49E81FFDF8C390AC49D9
-:10273000E634F8C3AC49E636F8C3AC493C02771F2F
-:1027400084C0751DE41424EFE614E412243FE6125D
-:10275000E416A8047409E8EAF97204B018E60AF865
-:10276000C38AE0E4140C10E614E4120CC0F6C401B1
-:102770007402247FE612F8C3AC49E825FDF8C39043
-:10278000B80040E87DFDE8B4FDE8A8FEB001E8B976
-:10279000FEF8C390B80040E885FDE8A0FDF8C390BE
-:1027A000B80010E85DFDE894FDE888FEB008E899FF
-:1027B000FEF8C390B80010E865FDE880FDF8C3900E
-:1027C000B80080E83DFDE874FDE868FEB002E879F5
-:1027D000FEF8C390B80080E845FDE860FDF8C390BE
-:1027E000B80020E81DFDE854FDE848FEB004E859B3
-:1027F000FEF8C390B80020E825FDE840FDF8C3903E
-:10280000AC49E84814E43C24E70AC4E63CF8C39029
-:10281000B8FC3B89467CE43C0C18E63CF8C3E41267
-:102820000C02E612F8C3E41224FDEBF6E8B5FCF85E
-:10283000C390836638FDF8C3AC49A8017406834E83
-:102840007A20EB0483667ADFE8CBFBF8C3908A86B4
-:10285000A5000C0224FB8886A500E60C814E26010B
-:1028600020AC4932E489466E834E48084946F9C394
-:102870008A86A5000C0224FB8886A500E60C814E02
-:10288000260120ACB40AF6E4EBD8E8FA13E43C24C1
-:10289000F80AC4E63CF8C390AD4949894664A901E9
-:1028A00000741B8BD883E3FA751AA90400740FE433
-:1028B0003E0C02E63EB83844894662F8C390E43ED6
-:1028C00024FCEBEFE43E24FCE63EE8E8FCB8AA403A
-:1028D000EBE6E86EF87205B018E60AF8C390AC496A
-:1028E000E8CFF9F8C390AC49E8CFF9F8C390E868AD
-:1028F000FD750632C0E6DAF8C3B002E6DA36A0B4F7
-:102900001324103410E8160136A1B413A901007481
-:1029100005E8FCFEEB0EA90200740432C0EB02B025
-:1029200001E8DEFE36A1B413E8B513E43C24F80A4E
-:10293000C4E63C36A1B413C1E805250100E8FAFE5F
-:1029400036A0B5132410E859FB32C0368A26B513D9
-:10295000F6C4047409FEC0F6C4087402FEC0E8DBC5
-:10296000FD36A1B613250F00E857F936A1B613C1FD
-:10297000E804250300E8B8FA36A1B613C1E8052536
-:102980000200E805FB36A1B613F6C401750432C097
-:10299000EB0980E402D0ECB0022AC4E8ACFA36F6C7
-:1029A00006B713407405E883FEEB03E884FE36F6B1
-:1029B00006B713207405E865FEEB03E868FEF8C36C
-:1029C000E4120C01E612F8C3E41224FEEBF6E41460
-:1029D00024F00C05E614E42A24F00C06E62AF8C3D9
-:1029E000E42A24F0E62AE41424F00C07E614F8C3E1
-:1029F000AD4949E864F989868E00F8C3AD4949E8D4
-:102A000058F989869000F8C3834E2604E8A8F7F8A1
-:102A1000C390836626FBE89EF7F8C390AC4984C058
-:102A2000750DE41024EFE610808EA10042F8C3E497
-:102A3000100C10EBF190AC493C02760232C0C0E0C1
-:102A400004A82074020C0824188AE0E41224E70A7F
-:102A5000C4E612808EA10044F8C3AC498886C00049
-:102A6000F8C3AC49E63AF8C3AC4984C07408E41230
-:102A70000C04E612F8C3E41224FBEBF6AC49E8D6EA
-:102A8000F67303E827F7F8C3E412A802740424FDE0
-:102A9000E612B8F000E887FA816626FFF3E857F7F8
-:102AA000E89AFAF8C390B88000E857FA804E2708F1
-:102AB000E844F7E887FAF8C3B88000E861FA81666D
-:102AC00026FFF7E831F7E874FAF8C390B81000E889
-:102AD00031FA804E2704E81EF7E861FAF8C3B8100F
-:102AE00000E83BFA816626FFFBE80BF7E84EFAF8B0
-:102AF000C39033C0AC493C017304B001EB063C0CFD
-:102B00007602B00C89461CF8C390814E2600208ABC
-:102B100086A5000C0224FB8886A500E60C834E26C1
-:102B200001F8C390814E2600408A86A5000C0288D9
-:102B300086A500E60CF8C390AC4950E805F658723B
-:102B400008E638B023E60AF8C3F9C390AC50ADE804
-:102B500082F85AF6C201741239869600740C89867E
-:102B60009600E6F086E0E6F886E0F6C202741039D8
-:102B7000869400740A89869400E6E486E0E6EC8395
-:102B8000E903C390E4168886BC00E8E6FA33DBE488
-:102B90000CA806740380CB01A810740380CB02A894
-:102BA00080740380CB04E4128AE024180AD8E4DAA3
-:102BB000F6C4027407A840750380CB20A8027509EB
-:102BC000E42AA80F740380CB40F74638020074094A
-:102BD000E4D8A801750380CB80889EBE00FE86B431
-:102BE00000B00AE85CE4F8C3AC493C027441771FCA
-:102BF00050E84FF558720C84C0740AB012E60A808F
-:102C00004E3801F8C3B011E60A806638FEF8C38B6F
-:102C1000463825FFF7894638A9000475E68A86A557
-:102C200000A81075DE0C108886A500E60CF8C3819C
-:102C30004E3800088A86A500A81074C724EFEBE779
-:102C4000AD49493C0172113C0C770D508AE0E41407
-:102C500025F00F0AC4E614588AC484C07402E64200
-:102C6000F8C3E8CFF9FE86B900B00EE8D4E3F8C3A4
-:102C70003A86AF00741F8886AF008AE080C206B033
-:102C8000BFEE80EA028AC4EE8A86A80080C202EE05
-:102C900080EA068AC4C38B463E85C08A86A5007436
-:102CA00012A808750D0C088886A50080C202EE8067
-:102CB000EA02C3A80874FB24F7EBEC8B462684C019
-:102CC00074168A86A500A802740D24FD8886A500C6
-:102CD00083C202EE83EA02C38A86A500A80275F7C2
-:102CE0000C02EBE85283C20CECC0E8048886A90011
-:102CF0008B5E2680E33FF6C7047407A8087503803F
-:102D0000CB40F6C7087407A802750380CB80885EA5
-:102D1000268A86A50084DB7410A802740A24FD8824
-:102D200086A50083EA0AEE5AC3A80275FA0C02EBE4
-:102D3000EE90FFFF00480030BA20C41A00180012BD
-:102D4000000C0006000300028001C000600030009B
-:102D50001800CD0100018000100010000E000C00D2
-:102D6000080000000000060004000300020001004B
-:102D70005251563C1E7747988BF08A82C40032E449
-:102D800083FE18743D83FE19743E83FE1E772FD197
-:102D9000E62E8B8C322D3B8E94007422898E94000B
-:102DA00083C2068A86A8008AE00C80EE83EA068A3F
-:102DB000C1EE83C2028AC5EE83C2048AC4EE5E59A4
-:102DC0005AC38B8E8E00EBCE8B8E9000EBC8525187
-:102DD0003D05007703B805008BC8BA0200B800D0E3
-:102DE000F7F1050100D1E8595AC38B467AA820743F
-:102DF0000B80BEC3000375040C01EB0224FE894660
-:102E00007AC324038886C3008AA6A8008ADC80E4EB
-:102E1000FC0AC43AC3740B8886A80083C206EE83FA
-:102E2000EA06E8C5FFC30008183828903C04772359
-:102E300032E48BD82E8A87262E8AA6A8008ADC80C8
-:102E4000E4C70AC43AC3740B8886A80083C206EE9E
-:102E500083EA06C384C07402B0048AA6A8008ADC90
-:102E600080E4FB0AC43AC3740B8886A80083C206B8
-:102E7000EE83EA06C3908B5E3884C074343C0274DF
-:102E80003B8A86AF000C04E8E6FD8B462E3B463CB1
-:102E9000771BF7C30004751581CB000483C2028A37
-:102EA00086A50024FA8886A500EE83EA02895E38AA
-:102EB000C38A86AF0024FBE8B6FDEBF1F7C3100030
-:102EC00074EFEBED83C20CEC83EA0CC0E804888657
-:102ED000A900C3908A86A7000C018886A7008BDA18
-:102EE00080C208EE8BD3F8C38A86A70024FEEBEAE3
-:102EF0008A86A7000C02EBE28A86A70024FDEBDAA3
-:102F0000B0FFE852F2E897F2F8C3AC49E861FEF886
-:102F1000C390AC49E8EBFEF8C390AC49E835FFF844
-:102F2000C390AC49E805FFF8C3905283C206B0BF16
-:102F3000EE5283C202AC49EE5A8A86A800EE5AF8D5
-:102F4000C3905283C206B0BFEE5283C206EBE69036
-:102F5000AC493C02770D84C0750B8A86AF0024FD16
-:102F6000E80DFDF8C3508A86AF000C02E801FD5B56
-:102F700083C2088A86A700F6C301740C24DF888602
-:102F8000A700EE83EA08F8C30C20EBF2AC49E8E5B1
-:102F9000FEF8C390B80040E869F5E8F9FCE824FFC2
-:102FA000B001E8A5F6F8C390B80040E871F5E8E58F
-:102FB000FCF8C390B80010E849F5E8D9FCE804FF34
-:102FC000B008E885F6F8C390B80010E851F5E8C5F8
-:102FD000FCF8C390B80080E829F5E8B9FCE8E4FE05
-:102FE000B002E865F6F8C390B80080E831F5E8A5CE
-:102FF000FCF8C390B80020E809F5E899FCE8C4FEA5
-:10300000B004E845F6F8C390B80020E811F5E8856B
-:10301000FCF8C390AC49E8340CF8C390B8FC3B8989
-:10302000467CF8C38A86AF000C80E843FCF8C39066
-:103030008A86AF00247FEBF28A86AF000C40E82F2F
-:10304000FCF8C3908A86AF0024BFEBF2AC49A8011C
-:103050007407834E7A20EB059083667ADFE88AFD59
-:10306000F8C383C2068A86A8000C408886A800EEB2
-:1030700083EA06AC4932E489466E834E2601834ECC
-:103080004808B006E8BBDF4946F9C39083C2068A08
-:1030900086A8000C408886A800EE83EA06ACB40A35
-:1030A000F6E4EBD0E8E00BF8C390AD4949894664FB
-:1030B000A9010074198BD883E3FA750AA904007476
-:1030C0000DB8E23FEB0BE8ECF4B8AA40EB03B838DC
-:1030D00044894662F8C38A86AF00A802740A24FDB8
-:1030E000E88DFB0C02E888FBF8C3AC49E881FCF8EA
-:1030F000C390AC49E879FCF8C390E85CF57505E845
-:10310000E6FDF8C3E8CDFD36A0B41324103410E872
-:10311000260136A1B413A901007405E8FEFEEB0EEA
-:10312000A90200740432C0EB02B001E8E8FE36A147
-:10313000B413E8AB0B36A1B413C1E805250100E8D0
-:103140000CFF36A0B5132410E82BFD32C0368A26BA
-:10315000B513F6C4047409FEC0F6C4087402FEC0B8
-:10316000E8EFFD36A1B613250F00E803FC36A1B643
-:1031700013C1E804250300E888FC36A1B613C1E8B2
-:1031800005250200E8CDFC36A1B613F6C40175048E
-:1031900032C0EB0980E402D0ECB0022AC4E88CFC17
-:1031A00036F606B713407405E88DFEEB03E894FE8F
-:1031B00036F606B713207405E869FEEB03E870FEE7
-:1031C000F8C3F8C38B4638A9040075230D040089A1
-:1031D000463883C2088B462E3B463C7314834E38D8
-:1031E000108A86A70024FE8886A700EE83EA08F8E6
-:1031F000C38A86A7000C01EBEE908B4638A9040029
-:10320000740625FBFF894638F8C3AD4949E8BEFB83
-:1032100089868E00F8C3AD4949E8B2FB89869000E3
-:10322000F8C3834E2604E892FAF8C390836626FB1F
-:10323000E888FAF8C390AC4984C07507808EA30073
-:1032400004F8C380A6A300FBF8C3AC4983C2083CC2
-:1032500002760232C03C017412770B8A86A70024E2
-:10326000EF8886A700EE83EA08F8C38A86A7000CD9
-:1032700010EBEE905283C206B0BFEE5283C204AC94
-:1032800049EE5A8A86A800EE5AF8C3905283C206C5
-:10329000B0BFEE5283C208EBE690AC49F8C3AC492C
-:1032A000E8B4EE7303E8F7EEF8C38A86AF00247F34
-:1032B000E8BDF9B8F000E866F2816626FFF3E8237E
-:1032C000FAE8D2F9F8C3B88000E837F2804E270850
-:1032D000E811FAE8C0F9F8C3B88000E841F2816665
-:1032E00026FFF7E8FEF9E8ADF9F8C390B81000E85A
-:1032F00011F2804E2704E8EBF9E89AF9F8C3B81008
-:1033000000E8FFF1816626FFFBE8D8F9F8C3AC4975
-:10331000F8C383C2068A86A8000C408886A800EEFF
-:1033200083EA06F8C39083C2068A86A80024BFEB0E
-:10333000EA90AC498AE080C20AEC80EA0AA82074CC
-:10334000058AC4EEF8C30651578B4E24E3344989ED
-:103350004E24FF461A8E46028B7E228AC4AA897E9C
-:10336000228B462624FD89462675298A86A500A833
-:1033700002752180C2020C028886A500EE80EA0256
-:10338000EB12C47E003B7E1E760A4F268825897E7E
-:1033900000FF461A5F5907F8C390ACAD83E9038577
-:1033A000C074053D00207205B8FFFFEB03C1E003C8
-:1033B0003B8694007426898694008BD85283C2067B
-:1033C0008A86A8008AE00C80EE83EA068AC3EE8330
-:1033D000C2028AC7EE83C2048AC4EE5AF8C3B08818
-:1033E0008886BC00E88CF233DB8A86A500A80274CC
-:1033F0000380CB01A805740380CB02A80874038066
-:10340000CB04F686A70010740380CB108A86A9002F
-:10341000F6C304750A83C20CEC83EA0CC0E8048A84
-:10342000E08A86AF00A8807408F6C401750380CBDB
-:1034300020F686A70002750AF74638040074038058
-:10344000CB40889EBE00FE86B400B00AE8F3DBF8ED
-:10345000C3FE86B400B00AE8E8DBF8C3AC493C021E
-:103460007437771084C07406804E3801F8C38066C4
-:1034700038FEF8C38B463825FFF7894638A9000483
-:1034800075EA8A86A500A80175E20C0583C2028848
-:1034900086A500EE83EA02F8C3814E3800088A86CA
-:1034A000A500A80174C624FAEBE2AD4949F8C3901F
-:1034B000E811FAFE86B900B00EE886DBF8C3B0FF6B
-:1034C000E8BFECF8C39083667AFBB000E873DBF8E2
-:1034D000C390AC49E853D9721136881E1A0136A040
-:1034E0008E120AC352BA0001EE5AF8C3AC4932E454
-:1034F00036A38612050600368B1E88122BD8368915
-:103500001E8A12F8C390AD8BD8AD83E90403C32B98
-:103510004676894678F7467A0200740A83667AFD11
-:10352000B80000E81CDBF8C3061607AC49250F00FD
-:103530006BC0098DBEFD0003F8AC49250F00AA85BC
-:10354000C074082BC8518BC8F3A459E827F0E8448D
-:103550000307F8C333C0AC4936A3B21336A3B01384
-:10356000F8C383667AEFE82C03F8C390834E7A1091
-:10357000EBF4E89BF0F8C390AD3C19770E3C19775B
-:103580000A8BF881E7FF0088A6C400F8C390834E39
-:103590002620AC4932E4D1E08BD8C1E30203C389D1
-:1035A000466E834E4804B006E897DA4946F9C39060
-:1035B000FE86B300B00AE889DAF8C39033C0AC499C
-:1035C0006BC00A89868A00F8C390AC4932E43D0A90
-:1035D000007705B80A00EB083D5A007203B85A009C
-:1035E00051F7D80564008BC88B4644F7E1B96400F5
-:1035F000F7F189464659F8C3AC49E885EBF8C39022
-:10360000AC4984C07507816638FFFDF8C3814E3828
-:103610000002F74638400075088A86A9008886AA05
-:1036200000F8C3905156E87F0C5E59F8C390FE86AF
-:10363000B600B00AE80BDAF8C390FE86B700B00A0D
-:10364000E8FFD9F8C390FE86B800B00AE8F3D9F8CD
-:10365000C39000905155AC2EA2523633C9AD8BF9B0
-:10366000C1E705A9010074232E8BAD4400837E08B9
-:103670000074182E803E523601740960B004E8BB15
-:103680000C61EB0760B0FBE8EC0C614747D1E875D3
-:10369000D24183F90472C65D5983E905F746384083
-:1036A000007405E887EAF8C3E88DEAF8C39036C6E7
-:1036B00006C81301F8C333C0AC4936A38012AC4925
-:1036C000362B068812F7D836A38212F8C390DE266E
-:1036D000DE26EC26F226F826FE2604270E271627DD
-:1036E0001E2726272E273427BE34C634D2343A2745
-:1036F000782780279427A027B427C027D427E0273E
-:10370000F42700281028EC34DE261E2826282C2832
-:10371000322838284E288A28063528359828BE2889
-:10372000D228DE28E628543562356C35EE28C029CB
-:10373000C829CE29E02972357835F029FC298E3543
-:10374000082A122A1C2AB035362ABC355A2A622A7F
-:10375000682ACA357C2AF835882AA62AB82ACC2AAB
-:10376000DE2AF22A00360A2B242B2436382B4C2B47
-:10377000842B2E363A3646365436E82BAE36402C5D
-:10378000622CB6367028DE26DE26D42EE82EF02EE9
-:10379000F82E002F0A2F122F1A2F222F2A2F422FF6
-:1037A000BE34C634D234502F8C2F942FA82FB42F70
-:1037B000C82FD42FE82FF42F083014301C30EC34ED
-:1037C000DE2624303030383044304C306230A43083
-:1037D00006352835AA30CE30D630EA30F2305435AE
-:1037E00062356C35FA30C231C231C431FA317235CA
-:1037F00078350A3216328E3522322C323632B035D6
-:103800004A32BC3574328C329A32CA359E32F8351F
-:10381000AA32C632D832EC32FE320E3300361233C0
-:103820002633243632339A33DE332E363A36463652
-:1038300054365C34AE36AA34B034B6368C30E32815
-:10384000F7463840007532E8E3E833C0AC493D5BE9
-:103850000077198BD8D1E32EFF97CE36720B85C92E
-:1038600075E88B4648E81A0CC34E41C36A001FC670
-:103870000693120C9C0EE863DAE8BCE833C0AC494E
-:103880003D5B0077E78BD8D1E32EFF97863772D95F
-:1038900085C975E8C3F7467A1000750F83BE8400AA
-:1038A000007408B8483A89868000C381BE8000EC65
-:1038B0003C74F783BE8800007505B8EC3CEBE7F775
-:1038C000467A080075401E608B8E88003B4E7477E8
-:1038D000333B4E78772EC47E108BDF26033D47475F
-:1038E00033C08ED88DB6F4008BC1F7467A010075CF
-:1038F0001DF3A4260107294678014676294674B0AF
-:103900000CE83ED7611FC78688000000EBACE3E3FC
-:103910005090AC247FAAE2FA58EBD8908B8E8800A6
-:10392000E3468B9E8A0085DB743EBA50FFED2B8602
-:1039300082003BC372378DB6F400C47E108BDF2645
-:10394000033D47478BC1161FF7467A01007524F3E4
-:10395000A4260107294678014676294674C7868839
-:10396000000000B00CE8DAD683667AF7C3B000E84E
-:10397000D0D6C3E3DC50AC247FAAE2FA58EBD29055
-:103980001E6033C08ED88DB6FD008B8688008B9666
-:1039900084003A0475108BDE468BC88DBEF400F3AC
-:1039A000A674668BF39083C6094A75E68DB6FD0052
-:1039B0008B9684003A0473108BDE468BC88DBEF460
-:1039C00000F3A674768BF39083C6094A75E68DB62C
-:1039D000F400ACF7467A01007402247F1EC55E1025
-:1039E0008B37884002468937FF4E78FF4676FF4E78
-:1039F000741F8B8E880049898E8800E3438DB6F44E
-:103A0000008BFE46F3A4E97DFFC576108B1C85DB99
-:103A1000740803F383C60383E6FE8B8684002BC2FF
-:103A2000B48089044646C7040000897610834E7A24
-:103A300004C78688000000611FF9C333C0611FC33B
-:103A4000B08084C0611FC3908B4E782B8E88007627
-:103A50002789B68C008B5E743BCB72028BCB3BC844
-:103A600072028BC88BC1E34433D28EC28BD183BE2A
-:103A70008800007406E98E0033C0C38B5E10031FFC
-:103A8000434352F7467A0100752AAC8DBEE4008BA1
-:103A90008E8600F2AE74348807434A75ED588B5E0B
-:103AA0001001072946780146762946748BC62B8675
-:103AB0008C00C390AC8DBEE4008B8E8600F2AE7499
-:103AC0000A247F8807434A75EBEBD28886F400C747
-:103AD0008688000100582BC2740E8B5E10010729E6
-:103AE000467801467629467440E894FE72BE4A75CF
-:103AF0001583BE8A000074B4BA50FFED8986820037
-:103B0000834E7A08EBA68DBEF40003BE8800A4FFA6
-:103B1000868800E86AFE729479064A748FE95BFF32
-:103B20004A74CEEBE19050E811CC8B467439467262
-:103B300074271E565133C9C5760CAD74107809032D
-:103B4000C805010024FE03F03B761076ED294E7681
-:103B5000014E78E837CC595E1F58C390C47E1026BA
-:103B60008B1D83C30326891D4B03FBAB91AAB803AE
-:103B700000294678014676294674C390C47E1026F3
-:103B80008B1D4326891D4303FBAAFF4E78FF467613
-:103B9000FF4E74C3E8E5FFC38081848582838687F6
-:103BA00050538ADC83E30ED1EB2E8A87983B08863C
-:103BB000B000FE86B100B00AE887D45B58C3508AD3
-:103BC000C8B8FF00E895FF58C3908A86BB00E8ABF1
-:103BD000FFC3E8CBFFE8F2FFC390E8C3FFE8B4FF00
-:103BE000C39033C0E895FFC3B8FF0033C9E86CFF4A
-:103BF000C390B8FF01B110E862FFC390C3FC3BE281
-:103C00003BF23BF23BFC3BE23BE83BE83BFC3BE26C
-:103C10003BE83BE83BFC3BE23BE23BE23B00100085
-:103C20000000100000001000000010000000100054
-:103C3000000010000000100000001000000008004C
-:103C40000000080000000800000008000051538B2D
-:103C50004E3881E1FFEEA804740481C900018AE0B6
-:103C600080E4032418D0E40AC433DB8AD82E8B877F
-:103C7000FD3B89467C2E0B8F1D3C894E38D1EB2EA7
-:103C80008AA73D3C5B59C3AC493C01721D74203C82
-:103C900003722374283C08722B74303C20723774F2
-:103CA0003ABBDA3B32E4895E7EC3BBA03BEBF5BB9B
-:103CB000943BB401EBF0BBFC3BB402EBE9BBE23B51
-:103CC000B403EBE2BBBE3BB404EBDBBBCA3BAC4989
-:103CD0008886BB00EBCEBBD23BEBF3BBFC3BEBC41B
-:103CE000A9040075D1A9080075DAEBD18B5E748B3D
-:103CF0004E783BCB72028BCB3BC872028BC88BC118
-:103D0000E32CC47E108BDF26033D4747F7467A013C
-:103D100000751CF7C70100740249A4D1E9F3A5732B
-:103D200001A4260107294678014676294674C35026
-:103D300053BB7F7FF7C70100740549AC22C3AAD1EA
-:103D4000E9E31D9CAD23C3AB497414AD23C3AB4958
-:103D5000740DAD23C3AB497406AD23C3ABE2E59D3F
-:103D60007304AC22C3AB5B58EBB8E8CEC98B5E38AA
-:103D7000F7C310047501C3F7C340007405E8B8E346
-:103D8000EB03E8A8E3816638EFFBF6C310743CF65A
-:103D9000C3027406E4D80C01E6D8F6C30474118398
-:103DA000C2088A86A7000C01EE8886A70083EA086D
-:103DB000F6C308740FE88BE3720A8A86C000E638FF
-:103DC000B023E60AF7C300047501C3F7C300087502
-:103DD000F98A86A500F6C340750DA81075EC0C1085
-:103DE0008886A500E60CC3A80175DF83C2020C0516
-:103DF000EE8886A500C3B000E847D2EB0FB002E81A
-:103E0000900EEB08836638DF834E7A0233C08ED87B
-:103E1000FAA0921240A292123C05721EC60692129D
-:103E200000FBB001E86B0EFAA1260123062A01A8C7
-:103E3000017507E8E207E8610990B000E837D2FBB6
-:103E400085ED74B9FAF7467A460075C08B46783D21
-:103E50000A0072B08B4E7483F950729A836638DF11
-:103E6000C576148B463A85C07558AD85C0750FE888
-:103E7000F8FEF7467A08007493E8A0FAEB8E3B76DA
-:103E8000047621B90200394E2E7705C7462E000070
-:103E9000568B762C897604C7040000464689762C1A
-:103EA000294E2E5E85C07917F6C4107405FF567C26
-:103EB000EB03FF567E897614B00CE885D1EB86893A
-:103EC000463AFF96800029463A897614B00CE8718C
-:103ED000D1E971FF0000000000000000080410029A
-:103EE00001200000000000000000000000000000B1
-:103EF00000000000808080808080808080808080C2
-:103F000080808080808080808080808080808080B1
-:103F100080808080808080808080808080808080A1
-:103F20008080808080808080808080808080808091
-:103F30008080808080C0C0C0C0C0C0C0C0C0C0C0C1
-:103F4000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C080B1
-:103F500080808000808080808080808080808080E1
-:103F60008080808080808080808080808080808051
-:103F70008080808080808080808080808080808041
-:103F80008080808080808080808080808080808031
-:103F90008080808080808080808080808080808021
-:103FA0008080808080808080808080808080808011
-:103FB0008080808080808080808080808080808001
-:103FC00080808080808080808080808080808080F1
-:103FD000808080804E417841D041F44106421842B1
-:103FE000C3908E46028B7E22897E6C806627FD8B75
-:103FF000562483FA0472E983EA028BD93BCA76021B
-:104000008BCAB00A57518BFEF2AE8BC1595F751E39
-:1040100050402BC874062BD12BD9F3A4594B4A4AD4
-:10402000B00DAAA43BCA76028BCAE313EBD42BD9FA
-:10403000F7C601007402A449D1E9F3A57301A4896C
-:104040007E222B7E6C297E24017E1A8BCB807E26DD
-:10405000027405806626FDC360B0FDE8180361C3E5
-:10406000C390E87C0272F990834E26208B466A89C1
-:10407000466E8B46480D040025BFFF894648B006B2
-:10408000E8BFCFC3897E222B7E6C017E1A297E2455
-:10409000807E26027405836626FDC360B0FDE8D5E8
-:1040A0000261C3908ABEC200EB24F7464840007507
-:1040B000B18E46028B7E22897E6C8B562483EA0A5F
-:1040C000789E03D7806627FD33C08ABEC200E3B462
-:1040D0003BFA77B0AC49932E8A87D43E9322DF75A2
-:1040E00017AAE3A03BFA779CAC49932E8A87D43E6B
-:1040F0009322DF7503AAEBD6F6C37F7505FF4666EC
-:10410000EBDFF6C340750C8BD883EB08D1E32EFFB1
-:10411000A7D43FFF46662C20EBC785C0742C894688
-:104120006A834E4840897E222B7E6C017E1A297E4E
-:1041300024807E26027408836626FDE8A301C360FE
-:10414000B0FDE8310261E89801C3E957FF908B5E4A
-:10415000664B7803895E66AA8B5E64F7C3002075A0
-:1041600003E940FFF7C3400074088A86C100AAE94A
-:1041700032FFB83200EBA3908B5E66895E6883C322
-:104180000880E3F8895E668B5E6481E3001881FB3A
-:104190000018742DAA85DB7425F746644000751855
-:1041A00081FB0010740C8B46662B4668C1E004E965
-:1041B00068FFB86400E962FF8A86C100AAAAE9E341
-:1041C000FE518B4E662B4E68B020F3AA59E9D4FEFF
-:1041D0008B5E66895E688B5E64F7C324007410C7CB
-:1041E00046660000F7C304007405B00DAAB00AAA21
-:1041F000EB489090AAF7466400407406B8D007E9EF
-:1042000018FFE99FFE90AAF7466400807406B8D0B4
-:1042100007E906FFE98DFE908B5E66895E6885DBA7
-:10422000750C8B5E64F7C310007406E976FE8B5E36
-:1042300064F7C308007427B00AAAF7C32000751FEB
-:10424000F7C300017503E95BFEF7C340007506B8CC
-:104250006400E9C5FE8A86C100AAAAE946FEAAC78B
-:1042600046660000F7C3000674F1F7C340007419F6
-:104270008A86C10081E3000681FB00047206760293
-:10428000AAAAAAAAAAAAE91BFE81E3000681FB004A
-:1042900004720E7606B89600E97FFEB86400E979EC
-:1042A000FE8B4668E973FE90368B0EDA1283F93284
-:1042B000731D1E0633C08ED88EC08D764CBFDC12A7
-:1042C00003F9A5A5A583C106890EDA12071FC3B09D
-:1042D00008E86ECDC390836648FEE893C4E8C8FF43
-:1042E000C3F6462702750F9CFA837E1A0074098074
-:1042F0004E27019DF9C3F8C35052F7463840007469
-:104300001DE834DE83C20AECA840752783EA088AD8
-:1043100086A5000C028886A500EE5A58EBD1E80C61
-:10432000DE8A86A50024FB0C028886A500E60C5ACE
-:1043300058EBBC804E27025A589DF8C30846269C6D
-:10434000FA8A8EA500F7463840007514F6C1067447
-:1043500023E8D9DD8AC124F98886A500E60C9DC32F
-:10436000F6C102740FE8D0DD83C2028AC124FD8841
-:1043700086A500EE9DC38B5E2622C3884626740167
-:10438000C3806627FD9CFA8A8EA500F74638400058
-:104390007516F6C104750FE893DD8AC124FD0C047F
-:1043A0008886A500E60C9DC3F6C10275F9E888DD94
-:1043B00083C20AECA820750E83EA088AC10C028821
-:1043C00086A500EE9DC383EA0A33C98A4E1C8B463C
-:1043D0001A3BC8731B014E2A2BC189461A1EC5768B
-:1043E00000F36E1F89760083C2028A86A500EBCD9A
-:1043F00085C0741201462A8BC81EC57600F36E1F55
-:10440000897600894E1AF6C701752380CB02895E32
-:1044100026E808C383C2028A86A50024FDEE8886AA
-:10442000A500F6C7107505B002E816CC9DC383C27F
-:10443000028A86A500EB86908BD18B46243BC876FA
-:10444000028BC82BD12BC18BD9E322806627FD8E2E
-:1044500046028B7E22F7C601007402A449D1E9F31B
-:10446000A57301A4897E22894624015E1A8BCA8025
-:104470007E26027405806626FDC360B0FDE8F6FE68
-:1044800061C350E40A84C0750A8686A10084C074A2
-:104490000AE60A580C20894648F9C35824DF8946A1
-:1044A00048F8C390FBB002E8E807FAE82E01FBB039
-:1044B00001E8DE07FAB002E8BCCBFB85ED74E5FA53
-:1044C0008E5E0AFB90FA8B46488B7640A88C75DE90
-:1044D000A820741A50E855DC58E8A6FF7310B00203
-:1044E000E85FCBEBC99025FF008BC8EB3690A801A5
-:1044F00075224683E6FE3B76087479AD8AFCB3F0FC
-:1045000022FB3AFB74E03ABEA000742EE8D2FD73A1
-:1045100077EB9B908AE024FC8846488B4E4AF6C491
-:1045200002741DE8BBFD7286E813F3897640E393BD
-:10453000834E4803894E4AE974FF25FF0F8BC890CC
-:104540008B86980085C0741A518A8EA000C0E90439
-:10455000BA0100D3E25923C2740803F1897640E915
-:1045600061FFFF5662E3F5834E4801894E4A897622
-:1045700040E93AFF814E2600108B46503B46467775
-:1045800003E852FDE927FF9088BEA000EBAC0A06C5
-:1045900090128AE0BA0601B004EEEC84C07512B045
-:1045A00004EE8AC4EE32E4A8807406C706841200C2
-:1045B0000088269012C30A0690128AE0BA0601EC1F
-:1045C000A80175EDBA08018AC4EE32E4A88074E14E
-:1045D000C7068412000088269012C39036F706247E
-:1045E0000101007530368B0EDA1280F936732633EE
-:1045F000C08EC08ED8BFDC1203F9B008E877CA8538
-:10460000ED740E8D764CA5A5A580C10680F9367295
-:10461000E9890EDA12C3C390F7062601010075F688
-:104620008B0E201385C975EE33C08EC08ED8BF2483
-:1046300013B93600B00AE83DCA85ED7506E91201E6
-:10464000E90A0133DB8A464C8AA6B300FECC780E19
-:1046500088A6B3000ADCB40AAB83E90276E28AA634
-:10466000B200FECC780E88A6B2000ADCB408AB8398
-:10467000E90276CC8AA6B100FECC78188ABEB000DA
-:10468000750488A6B00088A6B1000ADC8AE7AB836F
-:10469000E90276AC8AA6B400FECC781F88A6B400E6
-:1046A0000ADCB40BAB8A86BC008AA6BD00AB8B8645
-:1046B000BE00AB83E90676888A464C8AA6B600FE21
-:1046C000CC781988A6B6000ADCB40CABE8DBCBAB1F
-:1046D0008B462AAB83E90676748A464C8AA6B700D5
-:1046E000FECC781988A6B7000ADCB40DABE8BACBCB
-:1046F000AB8B4634AB83E90676538A464C8AA6B820
-:1047000000FECC781988A6B8000ADCB40EABA15024
-:1047100012ABA15212AB83E90676328A464C8AA6C6
-:10472000B500FECC781888A6B5000ADCB40FAB8BB8
-:10473000869A00AB8B869C00AB83E906760F84DB00
-:104740007503E9EFFEB00AE8F8C8E9E7FEB00AE849
-:10475000F0C8F7D983C1368BC10D800086C4A3226F
-:10476000134141890E2013C3A184122BC17211A3DE
-:104770008412BE2213D1E9F36F90890E2013F8C37F
-:10478000F9C3C381EF6A1374F98BC70D800086C427
-:10479000A368134747893E6613C3F7062A01010041
-:1047A00075E08B0E6613E30780F92077D54949330E
-:1047B000C08EC08ED8BF6A138BF703F983C6343B13
-:1047C000FE77C0B00EE8AEC885ED74B78A464C8A55
-:1047D000B6B900FECE781588B6B9008AA6A90080C1
-:1047E000CCC0AB84F67405B00EE856C88AB6BA00E1
-:1047F000FECE78CB8A9EA9008ABEAB008A563F8A3D
-:10480000F332F70AB6AC00C686AC000022F2744B55
-:10481000F6C608740FB402F6C3087502B403AB8081
-:10482000E6F77437F6C601740FB400F6C3017502DB
-:10483000B401AB80E6FE7423F6C602740FB404F62E
-:10484000C3027502B405AB80E6FD740FF6C60474AE
-:104850000AB406F6C3047502B407ABC686BA0000F4
-:10486000889EAB00E958FF90A184122BC17211A35E
-:104870008412BE6813D1E9F36F90890E6613F8C3F2
-:10488000F9C3A1841241412BC17223A384128BC1AD
-:10489000484832E40C8086C4EF9090909090BEDC43
-:1048A000124949D1E9F36F90890EDA12F8C3F9C3BE
-:1048B0008AC88A464CB40183EB06EF9090909090A2
-:1048C000B80100EF90909090908AC1EF90909090F6
-:1048D00090E99700E9AC0033C08ED8891E8412C3DA
-:1048E000368B1E8412FB90FAB00CE889C785ED74F4
-:1048F000E6C5760C83FB1472DBFB90FAAD85C078BD
-:10490000AF74E28BFE03F8368B0E86123BC1770242
-:104910008BC883EB043BD977028BCB33C08A464CE0
-:10492000EF90909090908BC1EF90909090904180FC
-:10493000E1FE2BD951D1E9F36F90598BC74024FE8A
-:104940003BC674272BFE4E4E538B5E103BF3721307
-:10495000031F83C30380E3FEC7070000836E740256
-:10496000895E105B893C89760CEB8989760C3976F7
-:104970001077817208833C007403E977FFE80DBE6D
-:10498000E962FF36891E8412B00CE8B5C633C08ECA
-:10499000D8C3A184123D10007277BA04013B068887
-:1049A000127506C7067E1200008B0EDA12E30BE8C2
-:1049B000D0FE7257C7067E12FF7F8B0E2013E30BCB
-:1049C000E8A5FD7246C7067E12FF7F8B0E6613E3D5
-:1049D0000BE894FE7235C7067E12FF7FA12801A95D
-:1049E00001007503E8F9FE803E8D1200751DA1845B
-:1049F000123D200076153B0682127609A17E123BFD
-:104A0000068012720C800E901280C3B080FF167C5C
-:104A100012C3800E901240C36A001FC6069312177D
-:104A20009C0EE8B7C86A001FC6069312209C0EE8C9
-:104A3000AAC86A001FC6069312169C0EE89DC8906D
-:104A4000BA0601ECA82075CAFB90FABA0401ED90F1
-:104A5000909090903A06941277BE33DB8AD8D1E3D7
-:104A60002E8BAF4400C47E0885FF74B9F6C4C075B0
-:104A70005532C0C1E00280E4F08BF0ED9090909050
-:104A80009085C074BB8BC84180E1FE0BC68B5E5025
-:104A90004B4B2BD9789CAB8BC1404001464ED1E9A2
-:104AA000F36D90895E50897E088B462680E4EF89FD
-:104AB0004626F6C401750CF746480C007505B00291
-:104AC000E87FC5E97AFF86C48BC883E13F4180E176
-:104AD000FEE30A3C807209243FB4F0EBB0E960FFCA
-:104AE000253F0033FF8EC7BF96128BF7D1E9F36DD8
-:104AF000908BC8E848EDE947FF906A001FC606930F
-:104B0000121B9C0EE8D5C790601E0633C08ED88E4F
-:104B1000C0BA0601ECA80474E1B006EEECA28C1257
-:104B2000A8407411A18812A38412C6068D1200E851
-:104B300060FEA08C12A8807403E804FFB80080BA5D
-:104B400022FFEF071F61CF906A001FC60693121B5A
-:104B50009C0EE887C790601E0633C08ED88EC0BA00
-:104B60000601ECA80474E1BA0801ECA28C12A8407A
-:104B70007411A18812A38412C6068D1200E812FED9
-:104B8000A08C12A8807403E8B6FEB80080BA22FF99
-:104B9000EF071F61CF90EE86E0EE86E0EC86E0EC5A
-:104BA00086E080E1FEF36C9080E1FEF36E900500FC
-:104BB0007547A84B05007548A84B0500A348A84BAE
-:104BC00005003549A84B06009848964B0600BA48A0
-:104BD000964B0600C348964B0600CB48964B060002
-:104BE0002049964B06002849964B06004E4A9C4B9E
-:104BF00006007B4A9C4B05009E4AA24B0500EC4AEE
-:104C0000A24B00001E06833E4412007409A0060158
-:104C100024303C30741A8CC88ED88EC0BBAE4B8BFF
-:104C20000FE30D8B7F028B7704F3A483C306EBEFB6
-:104C3000071FC39033C0A33E01B90C01BE40018BD6
-:104C4000FE81C6B40F89048BC62BF13BC777F6A350
-:104C50003C01C3901E0660368B2E3E018B5E003BEE
-:104C6000EB742B8B7602891C89770236A13C018973
-:104C7000460036892E3C018BEBFF4E0674088B6E86
-:104C800000FF4E0675F836892E3E018B66046107DB
-:104C90001FC31E0660368B2E3E0198894606896624
-:104CA000043B6E0074108B6E00FF4E0675F836895B
-:104CB0002E3E018B660461071FC3C3901E06609CD5
-:104CC000FA33ED8EDD8B2E3C0185ED743D8B4E006D
-:104CD000890E3C018BCC8DA60A01561E06608966A2
-:104CE00004C746080F1AC7460601008B1E3E018501
-:104CF000DB741D8BC58707894600895E028BD889C6
-:104D00006F028BE19D61071FF8C39D61071FF9C307
-:104D1000892E3E01896E00896E0287E19D8BE1EB51
-:104D2000E4000D0A5465726D696E616C73207375D1
-:104D300070706F727465643A0D0A312920414E53C8
-:104D40004920636F6D70617469626C650D0A322968
-:104D500020577973652033300D0A506C6561736597
-:104D60002073656C6563743A20000D0A636F646597
-:104D7000207365676D656E743D000D0A4D6F6E6939
-:104D8000746F722076322E350A0D0A3E000D0A50DD
-:104D90006172646F6E3F000D0A4E6F206164647231
-:104DA00065737320737065636966696564000D0AD5
-:104DB0003A000D0A004C6F633D000D0A4641544114
-:104DC0004C204552524F523D000D0A4D6F6E697492
-:104DD0006F7220636F6D6D616E64733A2D0D0A20E2
-:104DE0002020442C645B5B787878783A5D7878781A
-:104DF000785D202D2064756D70206D656D6F727902
-:104E00000D0A2020204C2C6C5B5B787878783A5D1A
-:104E1000787878785D202D2064756D702073696EC8
-:104E2000676C65206C696E650D0A202020452C6535
-:104E30005B5B787878783A5D787878785D202D209B
-:104E400065646974206D656D6F72790D0A2020208C
-:104E5000462C665B5B78787878205D787878785D2A
-:104E6000202D2066696C6C206D656D6F72792070E5
-:104E70006172616772617068730D0A202020495B5E
-:104E8000787878785D202020202020202020202D78
-:104E900020776F726420696E7075742066726F6D12
-:104EA00020706F72740D0A202020695B7878787802
-:104EB0005D202020202020202020202D20627974B9
-:104EC0006520696E7075742066726F6D20706F72E8
-:104ED000740D0A2020204F78787878207878202068
-:104EE000202020202020202D206F757470757420C4
-:104EF000776F726420746F20706F72740D0A2020B7
-:104F0000206F787878782078782020202020202042
-:104F100020202D206F75747075742062797465205F
-:104F2000746F20706F72740D0A202020475B5B78CD
-:104F30007878783A5D787878785D2020202D206721
-:104F40006F746F20616464726573730D0A20202092
-:104F5000575B5B787878783A5D787878785D202050
-:104F6000202D207761746368206120776F72640D53
-:104F70000A20202043202020202020202020202024
-:104F800020202020202D20696E7465727275707447
-:104F900073206F66660D0A202020532020202020D9
-:104FA00020202020202020202020202D20696E7409
-:104FB00065727275707473206F6E0D0A20202073F5
-:104FC00020202020202020202020202020202020E1
-:104FD0002D2073696E676C6520737465700D0A20EF
-:104FE000202042787878782020202020202020203F
-:104FF0002020202D20627265616B706F696E7420B5
-:105000007365740D0A20202062202020202020209B
-:105010002020202020202020202D20627265616B1E
-:10502000706F696E7420636C6561720D0A202020B8
-:10503000522020202020202020202020202020203E
-:10504000202D207265737461727420627265616BC9
-:10505000706F696E740D0A2020207220202020209D
-:1050600020202020202020202020202D2072656755
-:105070006973746572732061742062726B70740D51
-:105080000A202020582C78206E202020202020204C
-:1050900020202020202D206578616D696E652063B9
-:1050A00068616E6E656C206E0D0A202020482C3FD2
-:1050B00020202020202020202020202020202D20E3
-:1050C00074686973206D657373616765001B5B327B
-:1050D0004A1B5B313B3148414E5349205465726D48
-:1050E000696E616C0D0A0A001B5B4B001B5B4A007A
-:1050F0001B5B324A1B5B313B3148001B5B44201B6E
-:105100005B44001B5B313B373248001B5B003B00BC
-:1051100048001B5B73001B5B75001B7A2B0B7F1B0E
-:105120007A2E0C7F1B7A2D087F1B7A2C0A7F1B7A24
-:1051300022087F1A57797365203330205465726DC9
-:10514000696E616C0D0A001B54001B59001A001E89
-:105150000008200800001B3D0000001B46000D0059
-:105160003F4464456546664767486849694F6F43F1
-:1051700063537342625272577758784C6C3C60D4D8
-:1051800057D45750585058D659D659B459B4593C99
-:10519000603C606C57485726570657905790579871
-:1051A00057485F0C5F585F335F405FA057A057FEC2
-:1051B00059FE59DC57DC5788619861C061CC61D8D1
-:1051C00061F66102622262F8564A625862605920B2
-:1051D00020666C6167733D00202061783D002020CF
-:1051E00062783D00202063783D00202064783D00F7
-:1051F000202063733D00202064733D0020206573F0
-:105200003D00202073733D00202064693D00202074
-:1052100073693D00202062703D00202073703D00C6
-:10522000202069703D00206368616E656C3D002040
-:105230002020207365673D002074695F7374723DA0
-:10524000002074695F746F733D002074695F6D6145
-:10525000783D002074695F6261733D002074695F6E
-:1052600073697A3D002074695F7374663D00207431
-:10527000695F726F6F3D002074695F666C673D0007
-:105280002074695F746F743D002072695F70636E93
-:105290003D002072695F7374723D002072695F7314
-:1052A00074663D002072695F726F6F3D0020726905
-:1052B0005F6261733D002072695F73697A3D00200F
-:1052C00072695F746F743D002072695F6D696E3D35
-:1052D000002072695F666C673D002072695F746FC1
-:1052E000733D002072695F7468723D002074685FCE
-:1052F0007374663D002074685F7374723D0020749F
-:10530000685F6261733D002074685F73697A3D0075
-:105310002074685F7472673D002074685F666C6714
-:105320003D002074685F636E743D002072685F7397
-:1053300074723D002072685F7374663D002072686D
-:105340005F6261733D002072685F73697A3D00207F
-:1053500072685F7370613D002072685F61736F3DBA
-:10536000002072685F726F6F3D002072685F666C2C
-:10537000673D00206D5F636172653D002070745F62
-:10538000666C6F3D002061735F666C6F3D0020723C
-:105390006D5F666C6F3D00202020715F696E3D007F
-:1053A0002020715F6F75743D0020715F6472616EC3
-:1053B0003D002020715F74696D3D00202020715FE9
-:1053C00066633D0020715F737461743D0020715FFE
-:1053D000646174613D0020715F6D6F646D3D0020FC
-:1053E00068616E645F6F3D002068616E645F623D5E
-:1053F000002068616E645F653D002068616E645FD7
-:10540000693D0020206F706F73743D002020746927
-:105410006D656F3D0020637573746D313D002063D1
-:105420007573746D323D0020637573746D643D0057
-:10543000207478726174653D0020727872617465C1
-:105440003D002020635F6D61703D0020635F6164FB
-:1054500064723D0020635F616973723D0020635F89
-:10546000787461673D0020635F646566723D00206B
-:10547000635F666C73683D002074786D6178733D7E
-:10548000002072695F656D733D002020635F6C735F
-:10549000723D002020635F6965723D002020635FDC
-:1054A0006663723D002020635F6D63723D002020C3
-:1054B000635F6C63723D002020635F6473733D0023
-:1054C00020635F647373693D0020635F647373726C
-:1054D0003D002020635F6973723D002020635F639D
-:1054E00061723D002020635F6566723D0020635F4E
-:1054F000657273743D0020635F65636E743D0020C8
-:10550000635F62726B633D0020635F626F6B633D3C
-:105510000020635F7265706C3D0020635F6363739E
-:10552000723D0020635F737474313D0020635F73CC
-:105530007474323D002BC08ED88EC0E8C200E8E5FE
-:1055400000FABF8400C705DC568C4D02BF0C00C7B3
-:10555000056E5E8C4D02BF0400C705BA5E8C4D021D
-:10556000E8F10090E84901E81600F490E8E500BE93
-:10557000BA4DE8090CA09312E85D0CE8C209EBE40F
-:10558000E8D50CE8C40C0AC074F68B1EF8793C0D03
-:10559000742E3C0874173C7F741383FB207FE188D2
-:1055A00087D67943891EF879E8770CEBD30BDB7447
-:1055B000CF4B891EF8798B36167AE8C10BEBC19078
-:1055C000E80200EBBBC687D679000BDB741EA0D6C1
-:1055D00079BF6051B91D008BD9060E07F2AE077571
-:1055E00017412BD9D1E32EFF977D519033C0A3F8FB
-:1055F00079BE894DE8870BC3BE8D4DE8800BEBEC7F
-:10560000BA0002B093EEB055EEBA1002B093EEB00D
-:10561000AAEEBA0002EC3C557508BA1002EC3CAA9E
-:105620007403E82FF6C3BA0402B01AEEB020EEB04D
-:1056300030EEB040EEB080EEBA0002B013EEB0072C
-:10564000EEBA0802B080EEBA0202B0BBEEBA0402B3
-:10565000B005EEC3C606CA1301C706F8790000C636
-:1056600006F67901C706D0790000C706D279000096
-:10567000C706D4790000C706FA790000C706FC798E
-:105680000000C706FE790000C706007A0000C706C2
-:10569000027ACE598C0E047AC706067A0000C70635
-:1056A000277A0000C606297A00C6062A7A00C39027
-:1056B000BE224DE8C80AE83F002C313C0177F7E8EC
-:1056C00081098B360C7AE8B50ABE6A4DE8AF0A0E3E
-:1056D00058E8F80ABE7A4DE8A40AC39060D1E38383
-:1056E000FB1873111EBA00008EDA2EFF97B7518B8C
-:1056F000EC8946101F61CF90E84F0B0AC07505E892
-:10570000560BEBF4C390833EF879017416BED7793B
-:10571000E8310A8BD0AC3C2C74043C207505E8239E
-:105720000AEEC3E9D2FE833EF8790174F6BED7795A
-:10573000E8110A8BD0AC3C2C74083C207404E9B707
-:10574000FE90E8FF09EFC3908B16067A833EF87946
-:1057500001740BBED779E8EB098BD0A3067AB02091
-:10576000E8570B8B16067AECE86F0BC38B16067A9C
-:10577000833EF87901740BBED779E8C7098BD0A3B3
-:10578000067AB020E8330B8B16067AEDE8670BC378
-:10579000FAC606F67900C390C606F67901FBC390F7
-:1057A00006E85809B020E8110B268B05E8470BB036
-:1057B00008E8060BE8030BE8000BE8FD0AB8010057
-:1057C000E8CFF4BA0202EC24017502EBDCBA06025F
-:1057D000EC07C390C706087A1000EB06C706087AE4
-:1057E0000100068E06FC798B3EFA79E80E09E80B7B
-:1057F00000893EFA798C06FC7907C390BEB24DE869
-:105800007C098B16087A52E82A09E80F0AE80C0A84
-:1058100033DBB9100090268A01E8BC09E8FD094392
-:10582000E2F4E8F709E8F40933DBB9100090268ABE
-:10583000013C2072053C7E760390B02EE8E30943DC
-:10584000E2ECBEB24DE8360983C7105A4A75B7C3B9
-:10585000068E06007A8B3EFE79E8A008893EFE7926
-:105860008C06007A578B360E7AE81209C706087A3A
-:105870001000BA0002E8E800E881FF5FBA0000E823
-:10588000DE00BEB54DE8F6088CC0E83F09B03AE846
-:1058900090098BC7E83509E87E08E8C30090E8B7AF
-:1058A00009E8A6090AC074F63C0B750683EF10EBF5
-:1058B00019903C0A750683C710EB0F903C0C7504D9
-:1058C00047EB07903C0875244F908B36FE798BC7C9
-:1058D0002BC63D000172A53D1001720483EE20909D
-:1058E00083C6108936FE79578BFEEB803C2E7508F7
-:1058F000BA0113E86A0007C3C6060A7A0232C990E1
-:105900003C30724C3C39760C245F3C4172423C4640
-:10591000773E2C072C3050E8CC085802C8FE0E0AFF
-:105920007A740FC0E104E82F09E81E090AC074F672
-:10593000EBCE26880DE8E0078AD0E823008AC13C38
-:105940002072053C7E760390B02EE8D508E970FF02
-:10595000E8C507E80A00268A05E87C08E91DFF90EB
-:10596000F606267A02750286F2528B361A7AE80D0E
-:10597000085A528AC60206247AF606267A01750665
-:10598000E89F08EB0D9032E4E80D088B361C7AE8AE
-:10599000EC075A8AC20206257AF606267A017506AF
-:1059A000E87F08EB069032E4E8ED078B361E7AE8D4
-:1059B000CC07C390068E06047A8B3E027AE83C0739
-:1059C000893E027A8C06047A07FF1E027AC3BE97CC
-:1059D0004DE8AA07CB900657BED779E866078BD863
-:1059E000E861078BC82BCB78118EC3BF0000B8FFCE
-:1059F000FF51B90800F3AB59E2F75F07C39006BE49
-:105A0000D779E83F078BD8D1E32E8B9F4400BE2681
-:105A100052E8F1088BC3E8DD08B80100E873F2E84A
-:105A2000E008BE2F52E8DD088B4718E8C808BE77AB
-:105A300052E8D1088B4726E8BC08BE5352E8C50897
-:105A40008B471EE8B008BE5C52E8B9088B4720E8D7
-:105A5000A408BE6E52E8AD088B4724E89808BE80C3
-:105A600052E8A1088B472AE88C08E89508BE38520E
-:105A7000E892088B07E87E08BE4152E887088B470A
-:105A80001AE87208BE4A52E87B088B471CE8660891
-:105A9000BE6552E86F088B4722E85A08E86308BEE3
-:105AA000D152E860088B4738E84B08BEAD52E85445
-:105AB000088B4730E83F08BEB652E848088B4732AB
-:105AC000E83308BEA452E83C088B472EE82708BEFE
-:105AD000BF52E830088B4734E81B08E82408BE8929
-:105AE00052E821088B4704E80C08BE9252E81508DA
-:105AF0008B4714E80008BE9B52E809088B472CE846
-:105B0000F407BEC852E8FD078B4736E8E807BEDA5F
-:105B100052E8F1078B473AE8DC07BEE352E8E507B5
-:105B20008B473CE8D007E8D907BE1953E8D6078B66
-:105B30004748E8C107BEFE52E8CA078B4742E8B5AE
-:105B400007BE0753E8BE078B4744E8A907BE7C534E
-:105B5000E8B2078B474CE89D07BE8553E8A6078B44
-:105B6000474EE89107BE8E53E89A078B4750E88569
-:105B700007E88E07BE2253E88B078B474AE8760773
-:105B8000BEEC52E87F078B4708E86A07BEF552E88B
-:105B900073078B4740E85E07BE1053E867078B47E3
-:105BA00046E85207E85B07BE6A53E858078B477A16
-:105BB000E84307BE3D53E84C078B4770E83707BE04
-:105BC0004653E840078B4772E82B07BE4F53E83433
-:105BD000078B4774E81F07E82807BE2B53E8250703
-:105BE0008B470CE81007BE3453E819078B4710E8C1
-:105BF0000407BE5853E80D078B4776E8F806BE61E8
-:105C000053E801078B4778E8EC06BE7353E8F506C6
-:105C10008B473EE8E006E8E906BE9753E8E6068BC8
-:105C20004752E8D106BEA053E8DA068B4754E8C5D0
-:105C300006BEA953E8CE068B4756E8B906BEB25356
-:105C4000E8C2068B4758E8AD06BEBB53E8B6068BE4
-:105C5000475AE8A106BEC453E8AA068B475CE895FC
-:105C600006E89E06BECD53E89B068B475EE8860697
-:105C7000BED653E88F068B4760E87A06BEDF53E84E
-:105C800083068B4762E86E06BEE853E877068B47CB
-:105C90007CE86206BEF153E86B068B477EE8560649
-:105CA000BEFA53E85F068B878000E84906E8520693
-:105CB000BE4254E84F068B879E00E83906BE035467
-:105CC000E842068B4764E82D06BE0C54E836068B86
-:105CD000476EE82106BE1554E82A068B878E00E839
-:105CE0001406BE1E54E81D068B879000E80706BE0A
-:105CF0002754E810068B879200E8FA05E80306BEF1
-:105D00003054E800068B879400E8EA05BE3954E871
-:105D1000F3058B879600E8DD05BE6F54E8E6058B3A
-:105D2000879800E8D005BE5D54E8D9058A87A000B1
-:105D3000E8A705BE5454E8CC058A4728E89B05BE71
-:105D40006654E8C0058A87A100E88E05E8B305BE61
-:105D50007854E8B0058A87A200E87E05BE8154E841
-:105D6000A3058A87A300E87105BE8A54E896058AD0
-:105D700087A400E86405BE9354E889058A87A500D6
-:105D8000E85705BE9C54E87C058A87A600E84A05CA
-:105D9000BEA554E86F058A87A700E83D05BEAE544E
-:105DA000E862058A87A800E83005E85505BEB754C3
-:105DB000E852058A87A900E82005BEC054E84505D9
-:105DC0008A87AA00E81305BEC954E838058A87AB5C
-:105DD00000E80605BED254E82B058A87AD00E8F935
-:105DE00004BEDB54E81E058A87AE00E8EC04BEE47E
-:105DF00054E811058A87AF00E8DF04BEED54E804DB
-:105E0000058A87B000E8D204E8F704BEF654E8F447
-:105E1000048A87B100E8C204BEFF54E8E7048A8719
-:105E2000B200E8B504BE0855E8DA048A87B300E892
-:105E3000A804BE1155E8CD048A87BB00E89B04E89E
-:105E4000C004BE1A55E8BD048A87BC00E88B04BEB6
-:105E50002355E8B0048A87BE00E87E04BE2C55E8CE
-:105E6000A3048A87BF00E87104E8960407C36006AC
-:105E70001E168BECFF4E16F7461A00027401FBB893
-:105E800000008ED88EC0892E2D7AE8CB0081661A4C
-:105E9000FFFEC6062A7A00E8D800B8005FA32B7A76
-:105EA000E85D00803E2A7A00740A814E1A0001C61D
-:105EB000062A7A00171F0761CF9060061E168BEC2A
-:105EC000F7461A00027401FBB800008ED88EC08914
-:105ED0002E2D7A81661AFFFEC6062A7A00E8920005
-:105EE000B8005FA32B7AE81700803E2A7A00740A74
-:105EF000814E1A0001C6062A7A00171F0761CF904B
-:105F0000B8F000E88CEDFF262B7AC390065356803C
-:105F10003E297A007403E83F00BED779E825028B5A
-:105F2000D8A3277A2E8A07A2297AB0CC2E88075EBA
-:105F30005B07C3C6062A7A00B80A5FA32B7AC39010
-:105F40008B2E2D7AE82B00C3C6062A7A01E80800BA
-:105F5000B80A5FA32B7AC39057803E297A00740F4A
-:105F60008B3E277AA0297A2E8805C606297A005FFB
-:105F7000C390BEB24DE80602BED851E80002FF76DB
-:105F80001458E84702BEDE51E8F301FF760E58E8E8
-:105F90003A02BEE451E8E601FF761258E82D02BE4F
-:105FA000EA51E8D901FF761058E82002BE1452E801
-:105FB000CC01FF760A58E81302BE1A52E8BF01FF6F
-:105FC000760C58E80602BECF51E8B201FF761A58A7
-:105FD000E8F901BEB24DE8A501BEF051E89F01FF0E
-:105FE000761858E8E601BEF651E89201FF760258AD
-:105FF000E8D901BEFC51E88501FF760458E8CC01E0
-:10600000BE0252E87801FF760058E8BF01BE085290
-:10601000E86B01FF760658E8B201BE0E52E85E0159
-:10602000FF760858E8A501BE2052E85101FF761618
-:1060300058E89801BE894DE84401C390BEC94DE8B7
-:106040003C01C33C0074053C017459C3C7060C7A7B
-:10605000CD50C7060E7AF050C706107AE850C70632
-:10606000127AEC50C706147AF450C706167AFB5021
-:10607000C706187A0351C7061A7A0B51C7061C7A4D
-:106080000E51C7061E7A1051C706207A1251C70654
-:10609000227A1651C606247A01C606257A01C6065A
-:1060A000267A03C3C7060C7A1A51C7060E7A4D51D9
-:1060B000C706107A4751C706127A4A51C706147AA2
-:1060C0004F51C706167A5151C706187A5551C7065F
-:1060D0001A7A5651C7061C7A5951C7061E7A5A5168
-:1060E000C706207A5B51C706227A5E51C606247A1B
-:1060F00020C606257A20C606267A02C3A1F879486A
-:106100007414BED779E83C008BF8AC3C3A75078E26
-:10611000C7E830008BF8C3908BC72B06FE798AF056
-:10612000240F8AD002D002D080C20BC0EE0480C6F9
-:1061300003043DC38CC0E89300B03AE8E4008BC789
-:10614000E88900C35133C990AC3C2074FB900AC06D
-:1061500074262C3072223C0976143C11721A2C07DA
-:106160003C0F760A3C2A72102C203C0F770A98C10B
-:10617000E10403C8ACEBD7904E8BC159C390068C99
-:10618000C88EC0E8020007C3268A04460AC0740607
-:10619000E88F00EBF390C3900BC0747A5133D2B9FF
-:1061A000E803F7F18BCAE803008BC159BA6400F623
-:1061B000F2E80C008AC498B20AF6F2E802008AC437
-:1061C000500AF074050430E8580058C386C4E80744
-:1061D0000086C4E80200C390C1C804E80800C1C03A
-:1061E00004E80200C3905350240FBBCA622ED7E8C4
-:1061F0003000585BC39086C4E8070086C4E80200FC
-:10620000C39050B908008AE032C0D1C00430E81110
-:1062100000E2F558C390B030E80700C3B020E801B1
-:1062200000C3568B36D0798884D0774681E6FF014B
-:10623000FF06D4798936D079813ED479FE0175087C
-:1062400056E814005EEBF1905EC3BA0202EC240142
-:106250007404BA0602ECC390803EF67900740960BB
-:10626000B80100E82CEA6190BA0202ECA804742894
-:106270008B36D279833ED47900741D8A84D07746D8
-:1062800081E6FF018936D279FF0ED479BA0602EE93
-:10629000BA0202ECA80475DCA1D479C352BA060292
-:1062A000EE5AC3905250BA0202ECA8047408585A2D
-:1062B000E8E9FFF9C390585AF8C35250BA0202EC09
-:1062C000A80474FB585AE8D3FFC330313233343555
-:1062D0003637383941424344454653508AE080E4DA
-:1062E0000FBBCA62C0E8042ED7E8CEFF8AC42ED7FF
-:1062F000E8C7FF585BC386E0E8DFFF86E0E8DAFF27
-:10630000C390BEB24D502EAC3C007405E8ABFFEB21
-:10631000F558C390C808000056578B7604BF040098
-:10632000C746FC0000C746FA0000C746F8000083D5
-:106330007E0600750E56E8B60E590BC075058BC764
-:10634000E95B018B46FC8946FE0BFF7505B8010031
-:10635000EB0233C05056E8A40D5959B4008946FCED
-:106360008B5EFC83FB087603E92B01D1E32EFFA7AC
-:10637000B264B80300E92601837EFA007414C746AC
-:10638000FA00008A445898508A44599850E8C20F3D
-:106390005959837EF800740AC746F8000056E89BF6
-:1063A0000859837E060075058BC7E9F10083FF0459
-:1063B0007503E9E6008BC7E9E400837EFE00750300
-:1063C000BF0200E9D500837EFE007503BF0100E92E
-:1063D000C9008B5EFE83FB077603E98600D1E32EBE
-:1063E000FFA7A26433FFE97F00BF0400807C580F41
-:1063F0007422837EF800751CFE44586A0856E87EB5
-:106400000C59598A445804805056E8720C5959C79F
-:1064100046FA0100837EF800740AC746F800005669
-:10642000E8190859EB42BF0400807C5800742283AD
-:106430007EF800751CFE4C586A0856E8410C595904
-:106440008A445804805056E8350C5959C746FA0119
-:1064500000837EF800740AC746F8000056E8DC079F
-:1064600059EB05BF0400EB00EB31BF0400EB2CC778
-:1064700046F801006A0856E8050C5959807C58090D
-:106480007D04B00FEB02B00004805056E8F00B59C9
-:1064900059BF0400EB05BF0400EB00E9A5FE5F5EF9
-:1064A000C9C3E4636364636463646364E963266427
-:1064B00051647863BA63C6639664D2636A646A643B
-:1064C0006F647263C808000056578B76048B7E0891
-:1064D0006A0156E8A90B59598A4606C0E0060480AD
-:1064E0005056E89A0B5959C746FE0000897EF8EBD2
-:1064F00003FF46FE8B5EF8FF46F8803F0075F2838F
-:106500007EFE107D25B810002B46FED1F88946FC92
-:10651000C746FA0000EB0B6A2056E8620B5959FF98
-:1065200046FA8B46FA3B46FC7CEDEB0C8BDF478A48
-:10653000075056E8490B5959803D0075EF6A0256DD
-:10654000E83C0B5959EB005F5EC9C3C80400005614
-:10655000578B7E04C746FE0000BE1400E909018B7C
-:106560005EFE83C3042BDF8A87AC0B88445AC64483
-:1065700058088A46FE884459C744060000C6441994
-:1065800000C6441A00C6441B00C6441D0DC6441E66
-:1065900003C6441F00C6442000C6442100C6445B15
-:1065A00000C6445D00C6445E00C6445F00C6446049
-:1065B00000C746FC0000EB0D8B5EFCD1E3C740300A
-:1065C0000000FF46FC837EFC107CEDC746FC00000B
-:1065D000EB0A8B5EFCC6405000FF46FC837EFC0449
-:1065E0007CF0C744540000C7445600008A445A98BF
-:1065F000BAF80023D0B805000BC28946FC9CFA8A81
-:1066000046FCBAFE00EEBA0000EC9D24088846FC69
-:10661000837EFC007502EB4AFF76FEE87A0C59682F
-:10662000350256E8320A59590BC07534683802569B
-:10663000E8250A59590BC0752768420256E8180A1E
-:1066400059590BC0751A684C0256E80B0A59590B78
-:10665000C0750D68560256E8FE0959590BC0740200
-:10666000EB00FF46FE83C662397EFE7D03E9EFFE46
-:10667000EB005F5EC9C3C808000056578B4604BADA
-:106680006200F7EA0514008BF0837E06007405B8FB
-:106690001000EB03B808008944048A460888445C6B
-:1066A00056E85904598BF88BC78944568944548A53
-:1066B000445D88442F0BFF751D68C20F6A0156E8C0
-:1066C00002FE83C406EB006A0156E847FC59590BE9
-:1066D000C075F4BF0100897EFAB90500BBE96A2ED6
-:1066E0008B073B46FA74074343E2F4E9A4032EFF09
-:1066F000670AC744060200C74408F4088B5E04D149
-:10670000E38B87FC0889440A33C08BF8894454E939
-:10671000800356E8BB0559BF01008A445D88446088
-:10672000E96F03837C04087530807C5C0175158AF1
-:10673000445DB400D1E08BD8FFB7E40856E8F70811
-:106740005959EB138A445DB400D1E08BD8FFB7C42C
-:106750000856E8E2085959EB2E807C5C0175158AD1
-:10676000445DB400D1E08BD8FFB7D40856E8C70821
-:106770005959EB138A445DB400D1E08BD8FFB7B40C
-:106780000856E8B20859596A0156E887FB59598BEF
-:10679000D883FB03772AD1E32EFFA7E16ABF01006C
-:1067A0008A445D88445EEB188A445D04FF240788B0
-:1067B000445DEB0C8A445DFEC0240788445DEB0019
-:1067C000E9CF028A445DB400D1E08BD8FFB7FD0267
-:1067D00056E863085959681D0356E85A0859596A1A
-:1067E0000156E82FFB59598BD883FB037736D1E349
-:1067F0002EFFA7D96ABF01008A445D88445FEB245D
-:106800008A445D04FF8A540480C2FF22C288445D2A
-:10681000EB128A445DFEC08A540480C2FF22C28803
-:10682000445DEB00E96B028B5C0683C3FED1E38B16
-:10683000400889048B1CFF77066A0056E885FC83B4
-:10684000C4068B5C064BD1E38B40088944028B5C09
-:1068500002FF77066A0156E86AFC83C4066A01569D
-:10686000E8B1FA59598BD883FB037603E91F02D1AB
-:10687000E32EFFA7D16A8B5C028B47048944028B0D
-:106880005C02803F44750D8B5C028A4701B4003B7B
-:1068900044047DE28B4604D1E08B1C03D88B440278
-:1068A0008947088B5C064BD1E38B4402894008E999
-:1068B000DE018B5C028B47028944028B5C02803FC5
-:1068C00044750D8B5C028A4701B4003B44047DE2B1
-:1068D0008B4604D1E08B1C03D88B44028947088B7C
-:1068E0005C064BD1E38B4402894008E9A201BF0159
-:1068F00000E99C018B5C028A07B4008946F8B90C58
-:1069000000BBA16A2E8B073B46F874074343E2F4B1
-:10691000E977012EFF67188B4604D1E08B5C0203F8
-:10692000D88B47088B5C06FF4406D1E38940088B6F
-:106930001C807F010074128B5C028A47018B1C8AC9
-:106940005701B6008BDA884018E94001FF4C06E990
-:106950003A018B5C028A47018B1C8A5701B6008B77
-:10696000DA884018E925018B5C028A47018B1C8A72
-:106970005701B6008BDA884018FF4C06E90D018BF1
-:106980005C028A47018B1C8A5701B6008BDA3040C3
-:1069900018E9F800B8F0108BF88944548A445F88ED
-:1069A000445DE9E7008A441C983D020074073D03FA
-:1069B000007402EB07C746FE0000EB2B8A441C98CC
-:1069C000D1E08BD8FFB7690256E86B0659596A01C6
-:1069D00056E840F959598946FE837EFE00740683C5
-:1069E0007EFE0375E9EB00837EFE0374628A441C1D
-:1069F00098D1E08BD8FFB76D0256E83A0659595640
-:106A0000E84D97598946FC8B5EFC83EBFE83FB03C4
-:106A10007733D1E32EFFA7996A68AC0256E81706D0
-:106A20005959EB23688F0256E80C065959EB186840
-:106A3000750256E801065959EB0D68C60256E8F68C
-:106A4000055959EB02EB006A0156E8C7F85959BFDE
-:106A50000100EB3868DD0256E8DC0559596A015639
-:106A6000E8B1F85959BF0100EB22B8D0308BF88952
-:106A700044548A446088445DEB12B8E0208BF88966
-:106A800044548A445E88445DEB02EB00EB02EB0069
-:106A9000EB00E941FC5F5EC9C3196A246A2F6A3AB8
-:106AA0006A0000010002000400410042004300446B
-:106AB00000800081008200FF001769546A7A6AA58D
-:106AC00069526994696A6A676952697F6967694C42
-:106AD00069F4687668B268EE68F56700681268F570
-:106AE000679D67A867B4679D6700000100F010E02C
-:106AF00020D0302768F266C36723671267C8040096
-:106B00000056578B76048A4459988946FC6A098B4B
-:106B100046FC05840150E8930859598BF88BC7252A
-:106B200000F03D001075558BC725F0003DF0007555
-:106B30004B8BC725000FC1F8088946FE8B44043BE8
-:106B400046FE7D0533C0E9EF008BC7250F00BA0F65
-:106B5000002BD03B56FE740533C0E9DB00C744026E
-:106B600004098A46FE88445F88445D8B5EFCD1E35D
-:106B7000C787FC080409B8F010E9BC008BC72500E2
-:106B8000F03D002075528BC725F0003DE0007548B0
-:106B90008BC725000FC1F8088946FE837EFE087E5C
-:106BA0000533C0E992008BC7250F00BA0F002BD028
-:106BB0003B56FE740533C0EB7F90C744020C098A34
-:106BC00046FE88445E88445D8B5EFCD1E3C787FC4B
-:106BD000080C09B8E020EB608BC72500F03D0030C1
-:106BE00075528BC725F0003DD00075488BC7250036
-:106BF0000FC1F8088946FE8B44043B46FE7D0433F2
-:106C0000C0EB358BC7250F00BA0F002BD03B56FECB
-:106C1000740433C0EB22C7440214098A46FE884438
-:106C20006088445D8B5EFCD1E3C787FC081409B81B
-:106C3000D030EB0433C0EB005F5EC9C3C806000070
-:106C4000568B76046A0856E8350459598A44580424
-:106C5000805056E8290459598B44543B4456750AD0
-:106C60008A445D3A442F7502EB648B445489445640
-:106C70008B5C028A470188442F8A445DB400C1E0DE
-:106C8000088B54540BD08A445DB400BB0F002BD842
-:106C90000BD38956FE6A108A445998050400990559
-:106CA000400183D2005250E8540883C4068956FC40
-:106CB0008946FA8B46FE0946FA834EFC006A19FFA4
-:106CC00076FCFF76FAE8730783C406E8FE075EC920
-:106CD000C3C81C000056578B5E048A4759988BF036
-:106CE0008B5E048A475DB4008946E6837EE6007DBC
-:106CF0000A8B5E048B4704488946E68B5E048B470B
-:106D0000043B46E67F05C746E600008B5E048A46E4
-:106D1000E688475D8BDED1E38B9F5902C647022090
-:106D20008BDED1E38B9F5902C64703308BDED1E364
-:106D30008B9F6102C64702208BDED1E38B9F6102ED
-:106D4000C64703308B46E68946FA837EFA007418FC
-:106D50008B46FABB0A0033D2F7F380C2308BDED108
-:106D6000E38B9F5902885703BB0A008B46FA33D244
-:106D7000F7F38946FA837EFA0074188B46FABB0A49
-:106D80000033D2F7F380C2308BDED1E38B9F590200
-:106D90008857028B46E68946FA837EFA0074188B80
-:106DA00046FABB0A0033D2F7F380C2308BDED1E360
-:106DB0008B9F6102885703BB0A008B46FA33D2F7D8
-:106DC000F38946FA837EFA0074188B46FABB0A00F0
-:106DD00033D2F7F380C2308BDED1E38B9F61028820
-:106DE00057028B5EE6D1E3FFB712026A00FF76041A
-:106DF000E8D1F683C40668D30F6A01FF7604E8C3BE
-:106E0000F683C406FF76E656E8019359598956F28F
-:106E10008946F0FF76E656E8149359598956EE896B
-:106E200046EC9CFAC45EF0268B078946EAC45EEC09
-:106E3000268B078946E8BA50FFED8946FE9DC74676
-:106E4000E40100E8EEA0BA50FFED8946FC8B46FC59
-:106E50002B46FE3DE8037303E980019CFABA50FF1C
-:106E6000ED8946FC8B46FC2B46FE8946F8C45EF055
-:106E7000268B072B46EA8946F6C45EF0268B0789E7
-:106E800046EAC45EEC268B072B46E88946F4C45ECE
-:106E9000EC268B078946E8BA50FFED8946FE9D81B6
-:106EA0007EF8E803761CFF76F8FF76F6E87601595F
-:106EB000598946F6FF76F8FF76F4E8680159598952
-:106EC00046F4BF0E00EB178BDED1E38B9F5902C651
-:106ED00001208BDED1E38B9F6102C601204783FF37
-:106EE0001176E48BDED1E38B9F5902C6470D308BC0
-:106EF000DED1E38B9F6102C6470D30837EF60977B2
-:106F000005B80D00EB26837EF6637705B80E00EB1F
-:106F10001B817EF6E7037705B80F00EB0F817EF645
-:106F20000F277705B81000EB03B811008BF8EB259D
-:106F30008B46F6BB0A0033D2F7F380C2308BDED12A
-:106F4000E38B9F590288114FBB0A008B46F633D260
-:106F5000F7F38946F6837EF60075D5837EF40977CC
-:106F600005B80D00EB26837EF4637705B80E00EBC1
-:106F70001B817EF4E7037705B80F00EB0F817EF4E9
-:106F80000F277705B81000EB03B811008BF8EB253D
-:106F90008B46F4BB0A0033D2F7F380C2308BDED1CC
-:106FA000E38B9F610288114FBB0A008B46F433D2FA
-:106FB000F7F38946F4837EF40075D58BDED1E3FFC9
-:106FC000B75902FF7604E86E0059598BDED1E3FF12
-:106FD000B76102FF7604E85E0059596A00FF760443
-:106FE000E831F359598BD883FB04771FD1E32EFF87
-:106FF000A71B70EB22C746E40000FF4EE6EB0CC770
-:1070000046E40000FF46E6EB02EB00837EE40074FA
-:1070100003E92AFEE9D4FC5F5EC9C3F36FF56FFF95
-:107020006FF36F0970558BEC8B4604B9E803F7E1F9
-:107030008B4E06F7F15DC3558BEC568B7606EB0E47
-:107040008BDE468A0750FF7604E833005959803CAE
-:107050000075EDEB005E5DC3558BEC568B7606EB51
-:10706000148BDE468A0750FF7604E8450059590B19
-:10707000C07402EB07803C0075E7EB005E5DC3C89F
-:10708000020000568B76048A445A988946FE9CFA80
-:107090008A46FEBAFE00EEBA0200ECA80274069D13
-:1070A000E8919EEBE9BA00008A4606EE9DEB005E91
-:1070B000C9C3C8040000568B76048A445A9889468E
-:1070C000FEE8E6A18946FCE8E0A12B46FC3DB80BB2
-:1070D0007605B80100EB239CFA8A46FEBAFE00EE64
-:1070E000BA0200ECA80274069DE8489EEBD9BA00EB
-:1070F000008A4606EE9D33C0EB005EC9C3C804009B
-:107100000056578B7604837E0600740756E8030109
-:1071100059EB0556E8A200598846FF807EFF0877A4
-:10712000068A46FFE98400807EFF0F7603EB7990A4
-:107130008A46FFB4002D0A008BD883FB047767D101
-:10714000E32EFFA7AF71B000EB6156E86B0059B4B6
-:1071500000250F008946FC56E85E0059B4008BF804
-:1071600056E8550059B400C1E0088BD703D08BFA1C
-:107170008B5EFCD1E3897830EB2E56E83B005988D2
-:10718000445BEB2456E831005988445056E8290006
-:107190005988445156E821005988445256E819004C
-:1071A00059884453EB02EB00E95BFF5F5EC9C346BD
-:1071B00071A6714A717A718471C8040000568B7689
-:1071C000048A445A988946FE9CFA8A46FEBAFE0012
-:1071D000EEBA0200ECA80175069DE8579DEBE9BAEE
-:1071E0000000EC8846FD9D8A46FDEB005EC9C3C8E1
-:1071F000020000568B76048A445A988946FE9CFA0F
-:107200008A46FEBAFE00EEBA0200EC32E424019D8A
-:107210005EC9C3C8060000568B76048A445A988912
-:1072200046FEE885A08946FAE87FA02B46FA3DB8DD
-:107230000B7604B008EB249CFA8A46FEBAFE00EEF8
-:10724000BA0200ECA80175069DE8E89CEBDABA00EA
-:1072500000EC8846FD9D8A46FDEB005EC9C3558B58
-:10726000EC568B56048A4606EE33F6EB035058462E
-:1072700083FE147CF85E5DC3C8020000568B560482
-:10728000EC8846FF33F6EB0350584683FE147CF837
-:107290008A46FFEB005EC9C3C802000056578B76D2
-:1072A00004833EB00B00751FBA8801B000EEBA86A9
-:1072B00001B000EE6A096A00683001E87D0183C40C
-:1072C00006C706B00B01006A098BC605800150E8AD
-:1072D000DA0059598BF88BC7C1E80C250F00894695
-:1072E000FE8BC7C1E808250F008B56FE83F20C3BCE
-:1072F000C275218BC7C1E804250F008B56FE83F2AF
-:10730000063BC2750F8BC7250F008B56FE83F20913
-:107310003BC2740D6A0756E838005959C746FE0744
-:10732000008A46FE0480A233028BC6BA6200F7EAE6
-:107330008A56FE8BD888976C006832028BC6BA6278
-:1073400000F7EA05140050E80EFD5959EB005F5EA6
-:10735000C9C3C8020000568B760683E60F8BC6C1F0
-:10736000E00C8BD683F20CC1E2080BC28BD683F201
-:1073700006C1E2040BC28BD683F2090BC28946FE1A
-:107380006A196A108B46049905400183D200525055
-:10739000E86B0183C4060B46FE83CA005250E89A8C
-:1073A0000083C406E82501EB005EC9C3558BEC568B
-:1073B0005733FF6A01688601E8A3FE5959B1102AC4
-:1073C0004E06D3660433F6EB2E817E0400807204F1
-:1073D000B001EB02B00050688801E881FE59596A9B
-:1073E00003688601E877FE59596A01688601E86DED
-:1073F000FE5959D16604463B76067CCD33F6EB2424
-:10740000D1E76A03688601E854FE59596A01688623
-:1074100001E84AFE5959688801E85CFE599825013F
-:10742000000BF84683FE107CD76A00688601E82DC1
-:10743000FE59598BC7EB005F5E5DC3558BEC565709
-:107440008B7E086A01688601E813FE5959B820004E
-:107450002BC750FF7606FF7604E8A20083C4068996
-:10746000560689460433F6EB47817E060080720C8F
-:107470007506837E04007204B001EB02B000506810
-:107480008801E8D9FD59596A03688601E8CFFD599A
-:10749000596A01688601E8C5FD59596A01FF7606F7
-:1074A000FF7604E8580083C40689560689460446D8
-:1074B0003BF77CB56A00688601E8A2FD59596A006D
-:1074C000688601E898FD59595F5E5DC3558BEC569F
-:1074D0006A01688601E886FD595933F6EB00688831
-:1074E00001E894FD59A80175088BC6463D64007CEF
-:1074F000ED6A00688601E865FD59595E5DC3C80400
-:1075000000008B46048B56068B4E08E306D1E0D173
-:10751000D2E2FA8946FC8956FE8B56FE8B46FCEB7E
-:1075200000C9C300000000000000000000000000CF
-:1075300050726576696F7573204D656E7500426592
-:1075400067696E00000000000000000000000000FD
-:10755000000000000000000000000000000000002B
-:10756000000000000000000000000000000000001B
-:10757000000000000000000000000000000000000B
-:1075800000000000000000000000000000000000FB
-:1075900000000000000000000000000000000000EB
-:1075A00000000000000000000000000000000000DB
-:1075B00000000000000000000000000000000000CB
-:1075C00000000000000000000000000000000000BB
-:1075D00000000000000000000000000000000000AB
-:1075E000000000000000000000000000000000009B
-:1075F000000000000000000000000000000000008B
-:10760000000000000000000000000000000000007A
-:10761000000000000000000000000000000000006A
-:10762000000000000000000000000000000000005A
-:10763000000000000000000000000000000000004A
-:10764000000000000000000000000000000000003A
-:10765000000000000000000000000000000000002A
-:10766000000000000000000000000000000000001A
-:10767000000000000000000000000000000000000A
-:1076800000000000000000000000000000000000FA
-:1076900000000000000000000000000000000000EA
-:1076A00000000000000000000000000000000000DA
-:1076B00000000000000000000000000000000000CA
-:1076C000000000000000000000000000506F727415
-:1076D000203000506F7274203100506F727420326D
-:1076E00000506F7274203300506F72742034005059
-:1076F0006F7274203500506F7274203600506F72B4
-:1077000074203700506F7274203800506F727420EC
-:107710003900506F727420313000506F7274203114
-:107720003100506F727420313200506F727420310A
-:107730003300506F727420313400506F72742031F6
-:1077400035009C01A301AA01B101B801BF01C60126
-:10775000CD01D401DB01E201EA01F201FA010202EA
-:107760000A02080000078100038080809F919591A4
-:107770009F000381848E95848484840003828484A2
-:107780008484958E8400048800B20BC60BDA0BEE5D
-:107790000B020C160C2A0C3E0C520C770C9C0CBEE7
-:1077A0000CE00C020D01802054657374205061734D
-:1077B000736564201F20507265737320800200017E
-:1077C00080204D697373696E67205278204461741C
-:1077D000611F205072657373208002000180204277
-:1077E00061642052782044617461201F20507265CA
-:1077F000737320800200018020586D7472204275DE
-:1078000073791F20507265737320800200018020FD
-:107810006E6F742063757272656E746C791F2020B0
-:10782000696D706C656D656E7465640200240D2F62
-:107830000D3A0D450D500D5B0D660D710D7C0D87DC
-:107840000D920D9D0DA80DB30DBE0DC90D53802CCD
-:107850003254442053862C334454522053822C33C8
-:10786000525453201F53812C3252442053852C32C2
-:1078700043442053832C334354532053842C3344A8
-:1078800053522053872C3252492702000180202076
-:10789000444344202D2070696E2032301F275385C9
-:1078A0002E31818263908081828384858687888956
-:1078B0008A8B8C8D8E8F27020001802020445352AA
-:1078C000202D2070696E2031311F2753842E318185
-:1078D000826390808182838485868788898A8B8C65
-:1078E0008D8E8F27020001802020435453202D20AD
-:1078F00070696E20341F2753832E318182639080FC
-:107900008182838485868788898A8B8C8D8E8F2758
-:107910000200018020205249202D2070696E203203
-:10792000321F2753872E3181826390808182838426
-:1079300085868788898A8B8C8D8E8F2702000180AF
-:107940002020445452202D2070696E20362F381F7D
-:107950002753862E3181826390808182838485863D
-:107960008788898A8B8C8D8E8F270200018020204A
-:10797000525453202D2070696E20351F2753822EBC
-:107980003181826390808182838485868788898A19
-:107990008B8C8D8E8F27020001802020527844200E
-:1079A0002D2070696E20321F2753812E30534D8158
-:1079B000826390808182838485868788898A8B8C84
-:1079C0008D8E8F27020001802020547844202D20A6
-:1079D00070696E20331F2753802E30534D81826390
-:1079E00090808182838485868788898A8B8C8D8E1E
-:1079F0008F27020001802020444344202D207069FD
-:107A00006E20351F2753852E3181826390808182BD
-:107A1000838485868788898A8B8C8D8E8F27020048
-:107A200001802020445352202D2070696E20351F84
-:107A30002753842E3181826390808182838485865E
-:107A40008788898A8B8C8D8E8F2702000180202069
-:107A5000435453202D2070696E20311F2753832EED
-:107A60003181826390808182838485868788898A38
-:107A70008B8C8D8E8F270200018020205249202D73
-:107A800020286E2E632E291F2753872E3181826373
-:107A900090808182838485868788898A8B8C8D8E6D
-:107AA0008F27020001802020445452202D2070692D
-:107AB0006E20321F2753862E31818263908081820F
-:107AC000838485868788898A8B8C8D8E8F27020098
-:107AD00001802020525453202D2070696E20371FC2
-:107AE0002753822E318182639080818283848586B0
-:107AF0008788898A8B8C8D8E8F27020001802020B9
-:107B0000527844202D2070696E20361F2753812E15
-:107B100030534D81826390808182838485868788FB
-:107B2000898A8B8C8D8E8F270200018020205478CB
-:107B300044202D2070696E20331F2753802E305330
-:107B40004D81826390808182838485868788898A3B
-:107B50008B8C8D8E8F27020001802020444344208F
-:107B60002D2070696E20351F202020202753852E60
-:107B700031818263888081828384858687270200A1
-:107B800001802020445352202D2070696E20351F23
-:107B9000202020202753842E318182638880818297
-:107BA0008384858687270200018020204354532048
-:107BB0002D2070696E20311F202020202753832E16
-:107BC0003181826388808182838485868727020051
-:107BD000018020205249202D20286E2E632E291F3F
-:107BE000202020202753872E318182638880818244
-:107BF00083848586872702000180202044545220F8
-:107C00002D2070696E20321F202020202753862EC1
-:107C10003181826388808182838485868727020000
-:107C200001802020525453202D2070696E20371F70
-:107C3000202020202753822E3181826388808182F8
-:107C40008384858687270200018020205278442083
-:107C50002D2070696E20361F202020202753812E72
-:107C600030534D8182638880818283848586872713
-:107C7000020001802020547844202D2070696E205D
-:107C8000331F202020202753802E30534D818263C4
-:107C90008880818283848586872702000180202056
-:107CA000444344202D2070696E2032301F20202054
-:107CB000202753852E318182638880818283848549
-:107CC000868727020001802020445352202D2070F7
-:107CD000696E2031311F202020202753842E3181CE
-:107CE0008263888081828384858687270200018061
-:107CF0002020435453202D2070696E20341F2020F3
-:107D000020202753832E318182638880818283845F
-:107D1000858687270200018020205249202D20706F
-:107D2000696E2032321F202020202753872E318178
-:107D30008263888081828384858687270200018010
-:107D40002020445452202D2070696E20362F381F79
-:107D5000202020202753862E3181826388808182D3
-:107D60008384858687270200018020205254532077
-:107D70002D2070696E20351F202020202753822E51
-:107D8000318182638880818283848586872702008F
-:107D900001802020527844202D2070696E20321FEF
-:107DA000202020202753812E30534D8182638880EC
-:107DB0008182838485868727020001802020547871
-:107DC00044202D2070696E20331F2020202027534F
-:107DD000802E30534D8182638880818283848586A2
-:107DE0008727020068049604B6033C040E04890346
-:107DF0005C03E20360088A08BE0738080E0895078E
-:107E00006C07E6071C057405FA05C404F004CC05EC
-:107E1000A00548057806C806420728065006180738
-:107E2000F006A0060000F408F408D40D04090409C3
-:107E30000409040942000C091C09E50D020014099B
-:107E40000409F40D43001C090C09050E0004040983
-:107E50001409120E2C092C092C092C0900003C09CC
-:107E60006C091E0E740974097409740900014C0927
-:107E70002C092D0E740974097409740900025C0937
-:107E80003C093D0E740974097409740900036C09F6
-:107E90004C094D0E7409740974097409FF002C090A
-:107EA0005C09000000058409EC095E0EF409F40980
-:107EB000F409F409000694097409680EAC0AAC0AC6
-:107EC000AC0AAC0A0007A4098409720EBC0ABC0AF9
-:107ED000BC0ABC0A0008B40994097C0ED40AD40A6E
-:107EE000D40AD40A000BC409A409830EFC0AFC0AB4
-:107EF000FC0AFC0A000CD409B409900E140B140BF4
-:107F0000140B140B0002E409C409A00E2C0B2C0B5B
-:107F10002C0B2C0B0400EC09D4090E00FF00740993
-:107F2000E40900008201FC09A40AAC0E8202040AE2
-:107F3000F409AF0E82030C0AFC09B20E8204140A83
-:107F4000040AB60E82051C0A0C0ABC0E8206240A1C
-:107F5000140AC00E82072C0A1C0AC40E8208340AB6
-:107F6000240AC80E82093C0A2C0ACC0E820A440A52
-:107F7000340AD10E82104C0A3C0AD60E820B540AE7
-:107F8000440ADB0E82115C0A4C0AE00E820C640A81
-:107F9000540AE50E82126C0A5C0AEA0E820D740A1B
-:107FA000640AEF0E820E7C0A6C0AF40E820F840AB9
-:107FB000740AFB0E82138C0A7C0A020F8214940A44
-:107FC000840A090F82159C0A8C0A100F8216A40AD3
-:107FD000940A170F8217F4099C0A1E0F8202B40A32
-:107FE000B40A260F8203AC0AAC0A2D0F8200C40A21
-:107FF000CC0A340F8201CC0ABC0A3F0F8202BC0AB1
-:10800000C40A4D0F8200DC0AF40A590F8201E40A07
-:10801000D40A630F8202EC0ADC0A6E0F8203F40AB0
-:10802000E40A7A0F8204D40AEC0A870F8200040B58
-:108030000C0B930F82010C0BFC0A9B0F8202FC0AB3
-:10804000040BA70F82001C0B240BB00F8201240B22
-:10805000140BB50F8202140B1C0BBE0F4400340B23
-:10806000A40B9C0144013C0B2C0BA3014402440BC8
-:10807000340BAA0144034C0B3C0BB1014404540BD8
-:10808000440BB80144055C0B4C0BBF014406640B68
-:10809000540BC60144076C0B5C0BCD014408740BF8
-:1080A000640BD40144097C0B6C0BDB01440A840B88
-:1080B000740BE201440B8C0B7C0BEA01440C940B17
-:1080C000840BF201440D9C0B8C0BFA01440EA40BA3
-:1080D000940B0202440F2C0B9C0B0A02171F0F2F4C
-:1080E0000000018078783A20747820637073202A29
-:1080F0002A2A2A2A0200018078783A20747820639C
-:108100007073202A2A2A2A2A0200018078783A20CD
-:10811000747820637073202A2A2A2A2A0200018098
-:1081200078783A20747820637073202A2A2A2A2AC1
-:10813000020001C078783A20726320637073202AAD
-:108140002A2A2A2A020001C078783A207263206322
-:108150007073202A2A2A2A2A020001C078783A203D
-:10816000726320637073202A2A2A2A2A020001C01F
-:1081700078783A20726320637073202A2A2A2A2A88
-:1081800002000180496E7374616C6C204C6F6F70DB
-:108190006261636B1F5072657373208020746F205F
-:1081A000737461727402000180204361626C652007
-:1081B000746F2052656D6F74651F50726573732004
-:1081C0008020746F20737461727402000180204CEF
-:1081D0006F63616C204C6F6F706261636B201F2056
-:1081E0002052756E6E696E67202E2E2E0200018061
-:1081F00052656D6F7465204C6F6F706261636B20A8
-:108200001F202052756E6E696E67202E2E2E020082
-:10821000018020496E74726E6C204C6F6F706261C9
-:10822000636B1F202052756E6E696E67202E2E2E96
-:10823000020001805472616E736D69742050617424
-:108240007465726E1F202052756E6E696E67202EE7
-:108250002E2E020001802020303A2027438000018A
-:10826000802020313A202743810001802020323AAB
-:10827000202743820001802020333A2027438300B7
-:1082800001802020343A20274384000180202035BB
-:108290003A202743850001802020363A2027438654
-:1082A0000001802020373A202743870001802020CA
-:1082B000383A202743880001802020393A2027437C
-:1082C000890001802031303A2027438A0001802034
-:1082D00031313A2027438B0001802031323A202768
-:1082E000438C0001802031333A2027438D000180E8
-:1082F0002031343A2027438E0001802031353A2046
-:1083000027438F002A2A204D61696E20204D656E1B
-:1083100075202A2A004D6F6E69746F72206120509B
-:108320006F7274004D6F6E69746F722061205369B3
-:10833000676E616C00457374696D617465204350AC
-:108340005300446961676E6F7374696373004C6FA7
-:1083500063616C204C6F6F706261636B0052656D7E
-:108360006F7465204C6F6F706261636B00496E744F
-:10837000726E6C204C6F6F706261636B005472613F
-:108380006E736D6974205061747465726E00426121
-:10839000756420526174650044617461204269749F
-:1083A000730053746F702042697473005061726976
-:1083B00074790044617461205061747465726E0058
-:1083C000547820466C6F7720436F6E74726F6C0028
-:1083D000506F7274204E756D6265720035300037D3
-:1083E0003500313130003133342E35003135300035
-:1083F00032303000333030003630300031323030FF
-:10840000003138303000323030300032343030001B
-:1084100033363030003438303000373230300039C5
-:108420003630300031392C3230300033382C343093
-:10843000300035362C3030300035372C36303000B7
-:1084400036342C3030300037362C38303000313173
-:10845000352C323030003720626974730038206266
-:1084600069747300312073746F7020626974003115
-:108470002E352073746F702062697473003220731C
-:10848000746F702062697473006E6F20706172691E
-:108490007479006F64642070617269747900657624
-:1084A000656E207061726974790073706163652014
-:1084B000706172697479006D61726B2070617269AC
-:1084C000747900436F6C756D6E7300426172626502
-:1084D0007220506F6C650055555555552E2E2E0047
-:1084E0004E6F6E6500586F6E2F586F66660043546E
-:1084F00053005072657373208020666F72206D6523
-:108500006E750028636F756E74696E672E2E2E2946
-:108510000000654E64204F6620436F4465000000F4
-:10852000000000000000000000000000000000004B
-:10853000000000000000000000000000000000003B
-:10854000000000000000000000000000000000002B
-:10855000000000000000000000000000000000001B
-:10856000000000000000000000000000000000000B
-:1085700000000000000000000000000000000000FB
-:1085800000000000000000000000000000000000EB
-:1085900000000000000000000000000000000000DB
-:1085A00000000000000000000000000000000000CB
-:1085B00000000000000000000000000000000000BB
-:1085C00000000000000000000000000000000000AB
-:1085D000000000000000000000000000000000009B
-:1085E000000000000000000000000000000000008B
-:1085F000000000000000000000000000000000007B
-:00000001FF
-/*  Intelliport II loadware */
-/* -31232 bytes read from ff.lod */
index 38b42e7..b650155 100644 (file)
@@ -1371,10 +1371,8 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans,
 
        if (srcid) {
                srcgroup = find_qgroup_rb(fs_info, srcid);
-               if (!srcgroup) {
-                       ret = -EINVAL;
+               if (!srcgroup)
                        goto unlock;
-               }
                dstgroup->rfer = srcgroup->rfer - level_size;
                dstgroup->rfer_cmpr = srcgroup->rfer_cmpr - level_size;
                srcgroup->excl = level_size;
@@ -1383,10 +1381,8 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans,
                qgroup_dirty(fs_info, srcgroup);
        }
 
-       if (!inherit) {
-               ret = -EINVAL;
+       if (!inherit)
                goto unlock;
-       }
 
        i_qgroups = (u64 *)(inherit + 1);
        for (i = 0; i < inherit->num_qgroups; ++i) {
index 074923c..f0cf934 100644 (file)
@@ -1576,9 +1576,14 @@ cifs_readv_callback(struct mid_q_entry *mid)
                /* result already set, check signature */
                if (server->sec_mode &
                    (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
-                       if (cifs_verify_signature(rdata->iov, rdata->nr_iov,
-                                         server, mid->sequence_number + 1))
-                               cERROR(1, "Unexpected SMB signature");
+                       int rc = 0;
+
+                       rc = cifs_verify_signature(rdata->iov, rdata->nr_iov,
+                                                  server,
+                                                  mid->sequence_number + 1);
+                       if (rc)
+                               cERROR(1, "SMB signature verification returned "
+                                      "error = %d", rc);
                }
                /* FIXME: should this be counted toward the initiating task? */
                task_io_account_read(rdata->bytes);
index cbe709a..781025b 100644 (file)
@@ -356,19 +356,12 @@ cifs_create_get_file_info:
 cifs_create_set_dentry:
        if (rc != 0) {
                cFYI(1, "Create worked, get_inode_info failed rc = %d", rc);
+               CIFSSMBClose(xid, tcon, *fileHandle);
                goto out;
        }
        d_drop(direntry);
        d_add(direntry, newinode);
 
-       /* ENOENT for create?  How weird... */
-       rc = -ENOENT;
-       if (!newinode) {
-               CIFSSMBClose(xid, tcon, *fileHandle);
-               goto out;
-       }
-       rc = 0;
-
 out:
        kfree(buf);
        kfree(full_path);
index 9154192..71e9ad9 100644 (file)
@@ -917,7 +917,7 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile)
        if (!buf) {
                mutex_unlock(&cinode->lock_mutex);
                free_xid(xid);
-               return rc;
+               return -ENOMEM;
        }
 
        for (i = 0; i < 2; i++) {
index 7354877..cb79c7e 100644 (file)
@@ -124,10 +124,10 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
 {
        struct cifsInodeInfo *cifs_i = CIFS_I(inode);
        struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
-       unsigned long oldtime = cifs_i->time;
 
        cifs_revalidate_cache(inode, fattr);
 
+       spin_lock(&inode->i_lock);
        inode->i_atime = fattr->cf_atime;
        inode->i_mtime = fattr->cf_mtime;
        inode->i_ctime = fattr->cf_ctime;
@@ -148,9 +148,6 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
        else
                cifs_i->time = jiffies;
 
-       cFYI(1, "inode 0x%p old_time=%ld new_time=%ld", inode,
-                oldtime, cifs_i->time);
-
        cifs_i->delete_pending = fattr->cf_flags & CIFS_FATTR_DELETE_PENDING;
 
        cifs_i->server_eof = fattr->cf_eof;
@@ -158,7 +155,6 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
         * Can't safely change the file size here if the client is writing to
         * it due to potential races.
         */
-       spin_lock(&inode->i_lock);
        if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) {
                i_size_write(inode, fattr->cf_eof);
 
@@ -859,12 +855,14 @@ struct inode *cifs_root_iget(struct super_block *sb)
 
        if (rc && tcon->ipc) {
                cFYI(1, "ipc connection - fake read inode");
+               spin_lock(&inode->i_lock);
                inode->i_mode |= S_IFDIR;
                set_nlink(inode, 2);
                inode->i_op = &cifs_ipc_inode_ops;
                inode->i_fop = &simple_dir_operations;
                inode->i_uid = cifs_sb->mnt_uid;
                inode->i_gid = cifs_sb->mnt_gid;
+               spin_unlock(&inode->i_lock);
        } else if (rc) {
                iget_failed(inode);
                inode = ERR_PTR(rc);
@@ -1110,6 +1108,15 @@ undo_setattr:
        goto out_close;
 }
 
+/* copied from fs/nfs/dir.c with small changes */
+static void
+cifs_drop_nlink(struct inode *inode)
+{
+       spin_lock(&inode->i_lock);
+       if (inode->i_nlink > 0)
+               drop_nlink(inode);
+       spin_unlock(&inode->i_lock);
+}
 
 /*
  * If dentry->d_inode is null (usually meaning the cached dentry
@@ -1166,13 +1173,13 @@ retry_std_delete:
 psx_del_no_retry:
        if (!rc) {
                if (inode)
-                       drop_nlink(inode);
+                       cifs_drop_nlink(inode);
        } else if (rc == -ENOENT) {
                d_drop(dentry);
        } else if (rc == -ETXTBSY) {
                rc = cifs_rename_pending_delete(full_path, dentry, xid);
                if (rc == 0)
-                       drop_nlink(inode);
+                       cifs_drop_nlink(inode);
        } else if ((rc == -EACCES) && (dosattr == 0) && inode) {
                attrs = kzalloc(sizeof(*attrs), GFP_KERNEL);
                if (attrs == NULL) {
@@ -1241,9 +1248,10 @@ cifs_mkdir_qinfo(struct inode *inode, struct dentry *dentry, umode_t mode,
         * setting nlink not necessary except in cases where we failed to get it
         * from the server or was set bogus
         */
+       spin_lock(&dentry->d_inode->i_lock);
        if ((dentry->d_inode) && (dentry->d_inode->i_nlink < 2))
                set_nlink(dentry->d_inode, 2);
-
+       spin_unlock(&dentry->d_inode->i_lock);
        mode &= ~current_umask();
        /* must turn on setgid bit if parent dir has it */
        if (inode->i_mode & S_ISGID)
index 09e4b3a..e6ce3b1 100644 (file)
@@ -433,7 +433,9 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
        if (old_file->d_inode) {
                cifsInode = CIFS_I(old_file->d_inode);
                if (rc == 0) {
+                       spin_lock(&old_file->d_inode->i_lock);
                        inc_nlink(old_file->d_inode);
+                       spin_unlock(&old_file->d_inode->i_lock);
 /* BB should we make this contingent on superblock flag NOATIME? */
 /*                     old_file->d_inode->i_ctime = CURRENT_TIME;*/
                        /* parent dir timestamps will update from srv
index a4ff5d5..e4d3b99 100644 (file)
@@ -52,7 +52,8 @@ check_smb2_hdr(struct smb2_hdr *hdr, __u64 mid)
                        cERROR(1, "Bad protocol string signature header %x",
                                  *(unsigned int *) hdr->ProtocolId);
                if (mid != hdr->MessageId)
-                       cERROR(1, "Mids do not match");
+                       cERROR(1, "Mids do not match: %llu and %llu", mid,
+                                 hdr->MessageId);
        }
        cERROR(1, "Bad SMB detected. The Mid=%llu", hdr->MessageId);
        return 1;
@@ -107,7 +108,7 @@ smb2_check_message(char *buf, unsigned int length)
         * ie Validate the wct via smb2_struct_sizes table above
         */
 
-       if (length < 2 + sizeof(struct smb2_hdr)) {
+       if (length < sizeof(struct smb2_pdu)) {
                if ((length >= sizeof(struct smb2_hdr)) && (hdr->Status != 0)) {
                        pdu->StructureSize2 = 0;
                        /*
@@ -121,15 +122,15 @@ smb2_check_message(char *buf, unsigned int length)
                return 1;
        }
        if (len > CIFSMaxBufSize + MAX_SMB2_HDR_SIZE - 4) {
-               cERROR(1, "SMB length greater than maximum, mid=%lld", mid);
+               cERROR(1, "SMB length greater than maximum, mid=%llu", mid);
                return 1;
        }
 
        if (check_smb2_hdr(hdr, mid))
                return 1;
 
-       if (hdr->StructureSize != SMB2_HEADER_SIZE) {
-               cERROR(1, "Illegal structure size %d",
+       if (hdr->StructureSize != SMB2_HEADER_STRUCTURE_SIZE) {
+               cERROR(1, "Illegal structure size %u",
                          le16_to_cpu(hdr->StructureSize));
                return 1;
        }
@@ -161,8 +162,9 @@ smb2_check_message(char *buf, unsigned int length)
        if (4 + len != clc_len) {
                cFYI(1, "Calculated size %u length %u mismatch mid %llu",
                        clc_len, 4 + len, mid);
-               if (clc_len == 4 + len + 1) /* BB FIXME (fix samba) */
-                       return 0; /* BB workaround Samba 3 bug SessSetup rsp */
+               /* server can return one byte more */
+               if (clc_len == 4 + len + 1)
+                       return 0;
                return 1;
        }
        return 0;
index f37a1b4..15dc8ee 100644 (file)
 
 #define SMB2_PROTO_NUMBER __constant_cpu_to_le32(0x424d53fe)
 
-#define SMB2_HEADER_SIZE __constant_le16_to_cpu(64)
-
-#define SMB2_ERROR_STRUCTURE_SIZE2 __constant_le16_to_cpu(9)
-
 /*
  * SMB2 Header Definition
  *
@@ -99,6 +95,9 @@
  * "PDU" :  "Protocol Data Unit" (ie a network "frame")
  *
  */
+
+#define SMB2_HEADER_STRUCTURE_SIZE __constant_cpu_to_le16(64)
+
 struct smb2_hdr {
        __be32 smb2_buf_length; /* big endian on wire */
                                /* length is only two or three bytes - with
@@ -140,6 +139,9 @@ struct smb2_pdu {
  *  command code name for the struct. Note that structures must be packed.
  *
  */
+
+#define SMB2_ERROR_STRUCTURE_SIZE2 __constant_cpu_to_le16(9)
+
 struct smb2_err_rsp {
        struct smb2_hdr hdr;
        __le16 StructureSize;
index 83867ef..d9b639b 100644 (file)
@@ -503,13 +503,16 @@ cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server,
        /* convert the length into a more usable form */
        if (server->sec_mode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) {
                struct kvec iov;
+               int rc = 0;
 
                iov.iov_base = mid->resp_buf;
                iov.iov_len = len;
                /* FIXME: add code to kill session */
-               if (cifs_verify_signature(&iov, 1, server,
-                                         mid->sequence_number + 1) != 0)
-                       cERROR(1, "Unexpected SMB signature");
+               rc = cifs_verify_signature(&iov, 1, server,
+                                          mid->sequence_number + 1);
+               if (rc)
+                       cERROR(1, "SMB signature verification returned error = "
+                              "%d", rc);
        }
 
        /* BB special case reconnect tid and uid here? */
index 44ce5c6..d45ba45 100644 (file)
@@ -275,8 +275,14 @@ out:
 
 static int ecryptfs_flush(struct file *file, fl_owner_t td)
 {
-       return file->f_mode & FMODE_WRITE
-              ? filemap_write_and_wait(file->f_mapping) : 0;
+       struct file *lower_file = ecryptfs_file_to_lower(file);
+
+       if (lower_file->f_op && lower_file->f_op->flush) {
+               filemap_write_and_wait(file->f_mapping);
+               return lower_file->f_op->flush(lower_file, td);
+       }
+
+       return 0;
 }
 
 static int ecryptfs_release(struct inode *inode, struct file *file)
index 534b129..cc7709e 100644 (file)
@@ -619,6 +619,7 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        struct dentry *lower_old_dir_dentry;
        struct dentry *lower_new_dir_dentry;
        struct dentry *trap = NULL;
+       struct inode *target_inode;
 
        lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
        lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry);
@@ -626,6 +627,7 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,
        dget(lower_new_dentry);
        lower_old_dir_dentry = dget_parent(lower_old_dentry);
        lower_new_dir_dentry = dget_parent(lower_new_dentry);
+       target_inode = new_dentry->d_inode;
        trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
        /* source should not be ancestor of target */
        if (trap == lower_old_dentry) {
@@ -641,6 +643,9 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,
                        lower_new_dir_dentry->d_inode, lower_new_dentry);
        if (rc)
                goto out_lock;
+       if (target_inode)
+               fsstack_copy_attr_all(target_inode,
+                                     ecryptfs_inode_to_lower(target_inode));
        fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode);
        if (new_dir != old_dir)
                fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode);
index 2768138..9b627c1 100644 (file)
@@ -162,6 +162,7 @@ void ecryptfs_put_lower_file(struct inode *inode)
        inode_info = ecryptfs_inode_to_private(inode);
        if (atomic_dec_and_mutex_lock(&inode_info->lower_file_count,
                                      &inode_info->lower_file_mutex)) {
+               filemap_write_and_wait(inode->i_mapping);
                fput(inode_info->lower_file);
                inode_info->lower_file = NULL;
                mutex_unlock(&inode_info->lower_file_mutex);
index a075973..ff574b4 100644 (file)
@@ -3072,6 +3072,8 @@ static int ext3_do_update_inode(handle_t *handle,
        struct ext3_inode_info *ei = EXT3_I(inode);
        struct buffer_head *bh = iloc->bh;
        int err = 0, rc, block;
+       int need_datasync = 0;
+       __le32 disksize;
        uid_t i_uid;
        gid_t i_gid;
 
@@ -3113,7 +3115,11 @@ again:
                raw_inode->i_gid_high = 0;
        }
        raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
-       raw_inode->i_size = cpu_to_le32(ei->i_disksize);
+       disksize = cpu_to_le32(ei->i_disksize);
+       if (disksize != raw_inode->i_size) {
+               need_datasync = 1;
+               raw_inode->i_size = disksize;
+       }
        raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
        raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
        raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
@@ -3129,8 +3135,11 @@ again:
        if (!S_ISREG(inode->i_mode)) {
                raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl);
        } else {
-               raw_inode->i_size_high =
-                       cpu_to_le32(ei->i_disksize >> 32);
+               disksize = cpu_to_le32(ei->i_disksize >> 32);
+               if (disksize != raw_inode->i_size_high) {
+                       raw_inode->i_size_high = disksize;
+                       need_datasync = 1;
+               }
                if (ei->i_disksize > 0x7fffffffULL) {
                        struct super_block *sb = inode->i_sb;
                        if (!EXT3_HAS_RO_COMPAT_FEATURE(sb,
@@ -3183,6 +3192,8 @@ again:
        ext3_clear_inode_state(inode, EXT3_STATE_NEW);
 
        atomic_set(&ei->i_sync_tid, handle->h_transaction->t_tid);
+       if (need_datasync)
+               atomic_set(&ei->i_datasync_tid, handle->h_transaction->t_tid);
 out_brelse:
        brelse (bh);
        ext3_std_error(inode->i_sb, err);
index 03ff5b1..75a20c0 100644 (file)
@@ -117,7 +117,7 @@ static ssize_t fuse_conn_max_background_write(struct file *file,
                                              const char __user *buf,
                                              size_t count, loff_t *ppos)
 {
-       unsigned val;
+       unsigned uninitialized_var(val);
        ssize_t ret;
 
        ret = fuse_conn_limit_write(file, buf, count, ppos, &val,
@@ -154,7 +154,7 @@ static ssize_t fuse_conn_congestion_threshold_write(struct file *file,
                                                    const char __user *buf,
                                                    size_t count, loff_t *ppos)
 {
-       unsigned val;
+       unsigned uninitialized_var(val);
        ssize_t ret;
 
        ret = fuse_conn_limit_write(file, buf, count, ppos, &val,
index 3426521..ee8d550 100644 (file)
@@ -396,7 +396,7 @@ err_device:
 err_region:
        unregister_chrdev_region(devt, 1);
 err:
-       fc->conn_error = 1;
+       fuse_conn_kill(fc);
        goto out;
 }
 
@@ -532,8 +532,6 @@ static int cuse_channel_release(struct inode *inode, struct file *file)
                cdev_del(cc->cdev);
        }
 
-       /* kill connection and shutdown channel */
-       fuse_conn_kill(&cc->fc);
        rc = fuse_dev_release(inode, file);     /* puts the base reference */
 
        return rc;
index 7df2b5e..f4246cf 100644 (file)
@@ -1576,6 +1576,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode,
                req->pages[req->num_pages] = page;
                req->num_pages++;
 
+               offset = 0;
                num -= this_num;
                total_len += this_num;
                index++;
index ce0a283..fca222d 100644 (file)
@@ -367,11 +367,6 @@ void fuse_conn_kill(struct fuse_conn *fc)
        wake_up_all(&fc->waitq);
        wake_up_all(&fc->blocked_waitq);
        wake_up_all(&fc->reserved_req_waitq);
-       mutex_lock(&fuse_mutex);
-       list_del(&fc->entry);
-       fuse_ctl_remove_conn(fc);
-       mutex_unlock(&fuse_mutex);
-       fuse_bdi_destroy(fc);
 }
 EXPORT_SYMBOL_GPL(fuse_conn_kill);
 
@@ -380,7 +375,14 @@ static void fuse_put_super(struct super_block *sb)
        struct fuse_conn *fc = get_fuse_conn_super(sb);
 
        fuse_send_destroy(fc);
+
        fuse_conn_kill(fc);
+       mutex_lock(&fuse_mutex);
+       list_del(&fc->entry);
+       fuse_ctl_remove_conn(fc);
+       mutex_unlock(&fuse_mutex);
+       fuse_bdi_destroy(fc);
+
        fuse_conn_put(fc);
 }
 
index d1d791e..382000f 100644 (file)
@@ -323,6 +323,29 @@ static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 }
 
 /**
+ * gfs2_size_hint - Give a hint to the size of a write request
+ * @file: The struct file
+ * @offset: The file offset of the write
+ * @size: The length of the write
+ *
+ * When we are about to do a write, this function records the total
+ * write size in order to provide a suitable hint to the lower layers
+ * about how many blocks will be required.
+ *
+ */
+
+static void gfs2_size_hint(struct file *filep, loff_t offset, size_t size)
+{
+       struct inode *inode = filep->f_dentry->d_inode;
+       struct gfs2_sbd *sdp = GFS2_SB(inode);
+       struct gfs2_inode *ip = GFS2_I(inode);
+       size_t blks = (size + sdp->sd_sb.sb_bsize - 1) >> sdp->sd_sb.sb_bsize_shift;
+       int hint = min_t(size_t, INT_MAX, blks);
+
+       atomic_set(&ip->i_res->rs_sizehint, hint);
+}
+
+/**
  * gfs2_allocate_page_backing - Use bmap to allocate blocks
  * @page: The (locked) page to allocate backing for
  *
@@ -382,8 +405,7 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
        if (ret)
                return ret;
 
-       atomic_set(&ip->i_res->rs_sizehint,
-                  PAGE_CACHE_SIZE >> sdp->sd_sb.sb_bsize_shift);
+       gfs2_size_hint(vma->vm_file, pos, PAGE_CACHE_SIZE);
 
        gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
        ret = gfs2_glock_nq(&gh);
@@ -663,7 +685,8 @@ static ssize_t gfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
        if (ret)
                return ret;
 
-       atomic_set(&ip->i_res->rs_sizehint, writesize >> sdp->sd_sb.sb_bsize_shift);
+       gfs2_size_hint(file, pos, writesize);
+
        if (file->f_flags & O_APPEND) {
                struct gfs2_holder gh;
 
@@ -789,7 +812,7 @@ static long gfs2_fallocate(struct file *file, int mode, loff_t offset,
        if (unlikely(error))
                goto out_uninit;
 
-       atomic_set(&ip->i_res->rs_sizehint, len >> sdp->sd_sb.sb_bsize_shift);
+       gfs2_size_hint(file, offset, len);
 
        while (len > 0) {
                if (len < bytes)
index 4ce22e5..753af3d 100644 (file)
@@ -1722,7 +1722,9 @@ static int gfs2_setxattr(struct dentry *dentry, const char *name,
        gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
        ret = gfs2_glock_nq(&gh);
        if (ret == 0) {
-               ret = generic_setxattr(dentry, name, data, size, flags);
+               ret = gfs2_rs_alloc(ip);
+               if (ret == 0)
+                       ret = generic_setxattr(dentry, name, data, size, flags);
                gfs2_glock_dq(&gh);
        }
        gfs2_holder_uninit(&gh);
@@ -1757,7 +1759,9 @@ static int gfs2_removexattr(struct dentry *dentry, const char *name)
        gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
        ret = gfs2_glock_nq(&gh);
        if (ret == 0) {
-               ret = generic_removexattr(dentry, name);
+               ret = gfs2_rs_alloc(ip);
+               if (ret == 0)
+                       ret = generic_removexattr(dentry, name);
                gfs2_glock_dq(&gh);
        }
        gfs2_holder_uninit(&gh);
index 4d34887..c9ed814 100644 (file)
@@ -1961,7 +1961,7 @@ static void gfs2_rgrp_error(struct gfs2_rgrpd *rgd)
  * @dinode: 1 if this block is a dinode block, otherwise data block
  * @nblocks: desired extent length
  *
- * Lay claim to previously allocated block reservation blocks.
+ * Lay claim to previously reserved blocks.
  * Returns: Starting block number of the blocks claimed.
  * Sets *nblocks to the actual extent length allocated.
  */
@@ -1970,19 +1970,17 @@ static u64 claim_reserved_blks(struct gfs2_inode *ip, bool dinode,
 {
        struct gfs2_blkreserv *rs = ip->i_res;
        struct gfs2_rgrpd *rgd = rs->rs_rgd;
-       struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
        struct gfs2_bitmap *bi;
        u64 start_block = gfs2_rs_startblk(rs);
        const unsigned int elen = *nblocks;
 
-       /*BUG_ON(!gfs2_glock_is_locked_by_me(ip->i_gl));*/
-       gfs2_assert_withdraw(sdp, rgd);
-       /*BUG_ON(!gfs2_glock_is_locked_by_me(rgd->rd_gl));*/
        bi = rs->rs_bi;
        gfs2_trans_add_bh(rgd->rd_gl, bi->bi_bh, 1);
 
        for (*nblocks = 0; *nblocks < elen && rs->rs_free; (*nblocks)++) {
-               /* Make sure the bitmap hasn't changed */
+               if (gfs2_testbit(rgd, bi->bi_bh->b_data + bi->bi_offset,
+                                bi->bi_len, rs->rs_biblk) != GFS2_BLKST_FREE)
+                       break;
                gfs2_setbit(rgd, bi->bi_clone, bi, rs->rs_biblk,
                            dinode ? GFS2_BLKST_DINODE : GFS2_BLKST_USED);
                rs->rs_biblk++;
@@ -1991,20 +1989,12 @@ static u64 claim_reserved_blks(struct gfs2_inode *ip, bool dinode,
                BUG_ON(!rgd->rd_reserved);
                rgd->rd_reserved--;
                dinode = false;
-               trace_gfs2_rs(ip, rs, TRACE_RS_CLAIM);
        }
 
-       if (!rs->rs_free) {
-               struct gfs2_rgrpd *rgd = ip->i_res->rs_rgd;
-
+       trace_gfs2_rs(ip, rs, TRACE_RS_CLAIM);
+       if (!rs->rs_free || *nblocks != elen)
                gfs2_rs_deltree(rs);
-               /* -nblocks because we haven't returned to do the math yet.
-                  I'm doing the math backwards to prevent negative numbers,
-                  but think of it as:
-                  if (unclaimed_blocks(rgd) - *nblocks >= RGRP_RSRV_MINBLKS */
-               if (unclaimed_blocks(rgd) >= RGRP_RSRV_MINBLKS + *nblocks)
-                       rg_mblk_search(rgd, ip);
-       }
+
        return start_block;
 }
 
@@ -2037,34 +2027,34 @@ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *nblocks,
        if (ip->i_res->rs_requested == 0)
                return -ECANCELED;
 
-       /* Check if we have a multi-block reservation, and if so, claim the
-          next free block from it. */
+       /* If we have a reservation, claim blocks from it. */
        if (gfs2_rs_active(ip->i_res)) {
                BUG_ON(!ip->i_res->rs_free);
                rgd = ip->i_res->rs_rgd;
                block = claim_reserved_blks(ip, dinode, nblocks);
-       } else {
-               rgd = ip->i_rgd;
+               if (*nblocks)
+                       goto found_blocks;
+       }
 
-               if (!dinode && rgrp_contains_block(rgd, ip->i_goal))
-                       goal = ip->i_goal - rgd->rd_data0;
-               else
-                       goal = rgd->rd_last_alloc;
-
-               blk = rgblk_search(rgd, goal, GFS2_BLKST_FREE, &bi);
-
-               /* Since all blocks are reserved in advance, this shouldn't
-                  happen */
-               if (blk == BFITNOENT) {
-                       printk(KERN_WARNING "BFITNOENT, nblocks=%u\n",
-                              *nblocks);
-                       printk(KERN_WARNING "FULL=%d\n",
-                              test_bit(GBF_FULL, &rgd->rd_bits->bi_flags));
-                       goto rgrp_error;
-               }
+       rgd = ip->i_rgd;
 
-               block = gfs2_alloc_extent(rgd, bi, blk, dinode, nblocks);
+       if (!dinode && rgrp_contains_block(rgd, ip->i_goal))
+               goal = ip->i_goal - rgd->rd_data0;
+       else
+               goal = rgd->rd_last_alloc;
+
+       blk = rgblk_search(rgd, goal, GFS2_BLKST_FREE, &bi);
+
+       /* Since all blocks are reserved in advance, this shouldn't happen */
+       if (blk == BFITNOENT) {
+               printk(KERN_WARNING "BFITNOENT, nblocks=%u\n", *nblocks);
+               printk(KERN_WARNING "FULL=%d\n",
+                      test_bit(GBF_FULL, &rgd->rd_bits->bi_flags));
+               goto rgrp_error;
        }
+
+       block = gfs2_alloc_extent(rgd, bi, blk, dinode, nblocks);
+found_blocks:
        ndata = *nblocks;
        if (dinode)
                ndata--;
index 75d6d0a..6a7fcab 100644 (file)
@@ -287,10 +287,12 @@ nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
        struct inode *inode = file->f_path.dentry->d_inode;
 
        ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
+       if (ret != 0)
+               goto out;
        mutex_lock(&inode->i_mutex);
        ret = nfs_file_fsync_commit(file, start, end, datasync);
        mutex_unlock(&inode->i_mutex);
-
+out:
        return ret;
 }
 
index c6e895f..9b47610 100644 (file)
@@ -154,7 +154,7 @@ static void nfs_zap_caches_locked(struct inode *inode)
        nfsi->attrtimeo = NFS_MINATTRTIMEO(inode);
        nfsi->attrtimeo_timestamp = jiffies;
 
-       memset(NFS_COOKIEVERF(inode), 0, sizeof(NFS_COOKIEVERF(inode)));
+       memset(NFS_I(inode)->cookieverf, 0, sizeof(NFS_I(inode)->cookieverf));
        if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode))
                nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE;
        else
index d6b3b5f..6932209 100644 (file)
@@ -643,7 +643,7 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
                  u64 cookie, struct page **pages, unsigned int count, int plus)
 {
        struct inode            *dir = dentry->d_inode;
-       __be32                  *verf = NFS_COOKIEVERF(dir);
+       __be32                  *verf = NFS_I(dir)->cookieverf;
        struct nfs3_readdirargs arg = {
                .fh             = NFS_FH(dir),
                .cookie         = cookie,
index acb65e7..eb5eb8e 100644 (file)
@@ -96,13 +96,15 @@ nfs4_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
        struct inode *inode = file->f_path.dentry->d_inode;
 
        ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
+       if (ret != 0)
+               goto out;
        mutex_lock(&inode->i_mutex);
        ret = nfs_file_fsync_commit(file, start, end, datasync);
        if (!ret && !datasync)
                /* application has asked for meta-data sync */
                ret = pnfs_layoutcommit_inode(inode, true);
        mutex_unlock(&inode->i_mutex);
-
+out:
        return ret;
 }
 
index 6352741..1e50326 100644 (file)
@@ -3215,11 +3215,11 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
                        dentry->d_parent->d_name.name,
                        dentry->d_name.name,
                        (unsigned long long)cookie);
-       nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
+       nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args);
        res.pgbase = args.pgbase;
        status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
        if (status >= 0) {
-               memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
+               memcpy(NFS_I(dir)->cookieverf, res.verifier.data, NFS4_VERIFIER_SIZE);
                status += args.pgbase;
        }
 
@@ -3653,11 +3653,11 @@ static inline int nfs4_server_supports_acls(struct nfs_server *server)
                && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL);
 }
 
-/* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_CACHE_SIZE, and that
- * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_CACHE_SIZE) bytes on
+/* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_SIZE, and that
+ * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_SIZE) bytes on
  * the stack.
  */
-#define NFS4ACL_MAXPAGES (XATTR_SIZE_MAX >> PAGE_CACHE_SHIFT)
+#define NFS4ACL_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE)
 
 static int buf_to_pages_noslab(const void *buf, size_t buflen,
                struct page **pages, unsigned int *pgbase)
@@ -3668,7 +3668,7 @@ static int buf_to_pages_noslab(const void *buf, size_t buflen,
        spages = pages;
 
        do {
-               len = min_t(size_t, PAGE_CACHE_SIZE, buflen);
+               len = min_t(size_t, PAGE_SIZE, buflen);
                newpage = alloc_page(GFP_KERNEL);
 
                if (newpage == NULL)
@@ -3739,7 +3739,7 @@ static void nfs4_write_cached_acl(struct inode *inode, struct page **pages, size
        struct nfs4_cached_acl *acl;
        size_t buflen = sizeof(*acl) + acl_len;
 
-       if (pages && buflen <= PAGE_SIZE) {
+       if (buflen <= PAGE_SIZE) {
                acl = kmalloc(buflen, GFP_KERNEL);
                if (acl == NULL)
                        goto out;
@@ -3782,17 +3782,15 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
                .rpc_argp = &args,
                .rpc_resp = &res,
        };
-       int ret = -ENOMEM, npages, i;
-       size_t acl_len = 0;
+       unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE);
+       int ret = -ENOMEM, i;
 
-       npages = (buflen + PAGE_SIZE - 1) >> PAGE_SHIFT;
        /* As long as we're doing a round trip to the server anyway,
         * let's be prepared for a page of acl data. */
        if (npages == 0)
                npages = 1;
-
-       /* Add an extra page to handle the bitmap returned */
-       npages++;
+       if (npages > ARRAY_SIZE(pages))
+               return -ERANGE;
 
        for (i = 0; i < npages; i++) {
                pages[i] = alloc_page(GFP_KERNEL);
@@ -3808,11 +3806,6 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
        args.acl_len = npages * PAGE_SIZE;
        args.acl_pgbase = 0;
 
-       /* Let decode_getfacl know not to fail if the ACL data is larger than
-        * the page we send as a guess */
-       if (buf == NULL)
-               res.acl_flags |= NFS4_ACL_LEN_REQUEST;
-
        dprintk("%s  buf %p buflen %zu npages %d args.acl_len %zu\n",
                __func__, buf, buflen, npages, args.acl_len);
        ret = nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode),
@@ -3820,20 +3813,19 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
        if (ret)
                goto out_free;
 
-       acl_len = res.acl_len;
-       if (acl_len > args.acl_len)
-               nfs4_write_cached_acl(inode, NULL, 0, acl_len);
-       else
-               nfs4_write_cached_acl(inode, pages, res.acl_data_offset,
-                                     acl_len);
-       if (buf) {
+       /* Handle the case where the passed-in buffer is too short */
+       if (res.acl_flags & NFS4_ACL_TRUNC) {
+               /* Did the user only issue a request for the acl length? */
+               if (buf == NULL)
+                       goto out_ok;
                ret = -ERANGE;
-               if (acl_len > buflen)
-                       goto out_free;
-               _copy_from_pages(buf, pages, res.acl_data_offset,
-                               acl_len);
+               goto out_free;
        }
-       ret = acl_len;
+       nfs4_write_cached_acl(inode, pages, res.acl_data_offset, res.acl_len);
+       if (buf)
+               _copy_from_pages(buf, pages, res.acl_data_offset, res.acl_len);
+out_ok:
+       ret = res.acl_len;
 out_free:
        for (i = 0; i < npages; i++)
                if (pages[i])
@@ -3891,10 +3883,13 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl
                .rpc_argp       = &arg,
                .rpc_resp       = &res,
        };
+       unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE);
        int ret, i;
 
        if (!nfs4_server_supports_acls(server))
                return -EOPNOTSUPP;
+       if (npages > ARRAY_SIZE(pages))
+               return -ERANGE;
        i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase);
        if (i < 0)
                return i;
index 1bfbd67..8dba6bd 100644 (file)
@@ -5072,18 +5072,14 @@ static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req,
                 * are stored with the acl data to handle the problem of
                 * variable length bitmaps.*/
                res->acl_data_offset = xdr_stream_pos(xdr) - pg_offset;
-
-               /* We ignore &savep and don't do consistency checks on
-                * the attr length.  Let userspace figure it out.... */
                res->acl_len = attrlen;
-               if (attrlen > (xdr->nwords << 2)) {
-                       if (res->acl_flags & NFS4_ACL_LEN_REQUEST) {
-                               /* getxattr interface called with a NULL buf */
-                               goto out;
-                       }
+
+               /* Check for receive buffer overflow */
+               if (res->acl_len > (xdr->nwords << 2) ||
+                   res->acl_len + res->acl_data_offset > xdr->buf->page_len) {
+                       res->acl_flags |= NFS4_ACL_TRUNC;
                        dprintk("NFS: acl reply: attrlen %u > page_len %u\n",
                                        attrlen, xdr->nwords << 2);
-                       return -EINVAL;
                }
        } else
                status = -EOPNOTSUPP;
@@ -6229,7 +6225,8 @@ static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr,
        status = decode_open(xdr, res);
        if (status)
                goto out;
-       if (decode_getfh(xdr, &res->fh) != 0)
+       status = decode_getfh(xdr, &res->fh);
+       if (status)
                goto out;
        decode_getfattr(xdr, res->f_attr, res->server);
 out:
index 239aff7..b8eda70 100644 (file)
@@ -1867,6 +1867,7 @@ static int nfs23_validate_mount_data(void *options,
 
                memcpy(sap, &data->addr, sizeof(data->addr));
                args->nfs_server.addrlen = sizeof(data->addr);
+               args->nfs_server.port = ntohs(data->addr.sin_port);
                if (!nfs_verify_server_address(sap))
                        goto out_no_address;
 
@@ -2564,6 +2565,7 @@ static int nfs4_validate_mount_data(void *options,
                        return -EFAULT;
                if (!nfs_verify_server_address(sap))
                        goto out_no_address;
+               args->nfs_server.port = ntohs(((struct sockaddr_in *)sap)->sin_port);
 
                if (data->auth_flavourlen) {
                        if (data->auth_flavourlen > 1)
index b6ff118..4078022 100644 (file)
--- a/fs/stat.c
+++ b/fs/stat.c
@@ -58,7 +58,7 @@ EXPORT_SYMBOL(vfs_getattr);
 int vfs_fstat(unsigned int fd, struct kstat *stat)
 {
        int fput_needed;
-       struct file *f = fget_light(fd, &fput_needed);
+       struct file *f = fget_raw_light(fd, &fput_needed);
        int error = -EBADF;
 
        if (f) {
index 7f3f7ba..d1c6093 100644 (file)
 #include "udf_i.h"
 #include "udf_sb.h"
 
-static int udf_adinicb_readpage(struct file *file, struct page *page)
+static void __udf_adinicb_readpage(struct page *page)
 {
        struct inode *inode = page->mapping->host;
        char *kaddr;
        struct udf_inode_info *iinfo = UDF_I(inode);
 
-       BUG_ON(!PageLocked(page));
-
        kaddr = kmap(page);
-       memset(kaddr, 0, PAGE_CACHE_SIZE);
        memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, inode->i_size);
+       memset(kaddr + inode->i_size, 0, PAGE_CACHE_SIZE - inode->i_size);
        flush_dcache_page(page);
        SetPageUptodate(page);
        kunmap(page);
+}
+
+static int udf_adinicb_readpage(struct file *file, struct page *page)
+{
+       BUG_ON(!PageLocked(page));
+       __udf_adinicb_readpage(page);
        unlock_page(page);
 
        return 0;
@@ -77,6 +81,25 @@ static int udf_adinicb_writepage(struct page *page,
        return 0;
 }
 
+static int udf_adinicb_write_begin(struct file *file,
+                       struct address_space *mapping, loff_t pos,
+                       unsigned len, unsigned flags, struct page **pagep,
+                       void **fsdata)
+{
+       struct page *page;
+
+       if (WARN_ON_ONCE(pos >= PAGE_CACHE_SIZE))
+               return -EIO;
+       page = grab_cache_page_write_begin(mapping, 0, flags);
+       if (!page)
+               return -ENOMEM;
+       *pagep = page;
+
+       if (!PageUptodate(page) && len != PAGE_CACHE_SIZE)
+               __udf_adinicb_readpage(page);
+       return 0;
+}
+
 static int udf_adinicb_write_end(struct file *file,
                        struct address_space *mapping,
                        loff_t pos, unsigned len, unsigned copied,
@@ -98,8 +121,8 @@ static int udf_adinicb_write_end(struct file *file,
 const struct address_space_operations udf_adinicb_aops = {
        .readpage       = udf_adinicb_readpage,
        .writepage      = udf_adinicb_writepage,
-       .write_begin = simple_write_begin,
-       .write_end = udf_adinicb_write_end,
+       .write_begin    = udf_adinicb_write_begin,
+       .write_end      = udf_adinicb_write_end,
 };
 
 static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
index bdf0152..f462118 100644 (file)
 #define DRM_FORMAT_NV16                fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */
 #define DRM_FORMAT_NV61                fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */
 
-/* 2 non contiguous plane YCbCr */
-#define DRM_FORMAT_NV12M       fourcc_code('N', 'M', '1', '2') /* 2x2 subsampled Cr:Cb plane */
+/* special NV12 tiled format */
 #define DRM_FORMAT_NV12MT      fourcc_code('T', 'M', '1', '2') /* 2x2 subsampled Cr:Cb plane 64x32 macroblocks */
 
 /*
 #define DRM_FORMAT_YUV444      fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */
 #define DRM_FORMAT_YVU444      fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */
 
-/* 3 non contiguous plane YCbCr */
-#define DRM_FORMAT_YUV420M     fourcc_code('Y', 'M', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */
-
 #endif /* DRM_FOURCC_H */
index fa21760..c57e064 100644 (file)
@@ -84,7 +84,6 @@ header-y += capability.h
 header-y += capi.h
 header-y += cciss_defs.h
 header-y += cciss_ioctl.h
-header-y += cdk.h
 header-y += cdrom.h
 header-y += cgroupstats.h
 header-y += chio.h
@@ -93,7 +92,6 @@ header-y += cn_proc.h
 header-y += coda.h
 header-y += coda_psdev.h
 header-y += coff.h
-header-y += comstats.h
 header-y += connector.h
 header-y += const.h
 header-y += cramfs_fs.h
@@ -140,7 +138,6 @@ header-y += fuse.h
 header-y += futex.h
 header-y += gameport.h
 header-y += gen_stats.h
-header-y += generic_serial.h
 header-y += genetlink.h
 header-y += gfs2_ondisk.h
 header-y += gigaset_dev.h
@@ -372,6 +369,7 @@ header-y += tipc.h
 header-y += tipc_config.h
 header-y += toshiba.h
 header-y += tty.h
+header-y += tty_flags.h
 header-y += types.h
 header-y += udf_fs_i.h
 header-y += udp.h
index d117b29..f612c78 100644 (file)
@@ -205,7 +205,6 @@ struct amba_pl011_data {
        void *dma_tx_param;
         void (*init) (void);
        void (*exit) (void);
-       void (*reset) (void);
 };
 #endif
 
index 0602339..4eb3175 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <linux/platform_device.h>
 #include <linux/list.h>
+#include <linux/io.h>
 
 struct ssc_device {
        struct list_head        list;
diff --git a/include/linux/bcm2835_timer.h b/include/linux/bcm2835_timer.h
new file mode 100644 (file)
index 0000000..25680fe
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * Copyright 2012 Simon Arlott
+ *
+ * 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 __BCM2835_TIMER_H
+#define __BCM2835_TIMER_H
+
+#include <asm/mach/time.h>
+
+extern struct sys_timer bcm2835_timer;
+
+#endif
diff --git a/include/linux/cd1400.h b/include/linux/cd1400.h
deleted file mode 100644 (file)
index 1dc3ab0..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-/*****************************************************************************/
-
-/*
- *     cd1400.h  -- cd1400 UART hardware info.
- *
- *     Copyright (C) 1996-1998  Stallion Technologies
- *     Copyright (C) 1994-1996  Greg Ungerer.
- *
- *     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        _CD1400_H
-#define        _CD1400_H
-/*****************************************************************************/
-
-/*
- *     Define the number of async ports per cd1400 uart chip.
- */
-#define        CD1400_PORTS            4
-
-/*
- *     Define the cd1400 uarts internal FIFO sizes.
- */
-#define        CD1400_TXFIFOSIZE       12
-#define        CD1400_RXFIFOSIZE       12
-
-/*
- *     Local RX FIFO thresh hold level. Also define the RTS thresh hold
- *     based on the RX thresh hold.
- */
-#define        FIFO_RXTHRESHOLD        6
-#define        FIFO_RTSTHRESHOLD       7
-
-/*****************************************************************************/
-
-/*
- *     Define the cd1400 register addresses. These are all the valid
- *     registers with the cd1400. Some are global, some virtual, some
- *     per port.
- */
-#define        GFRCR           0x40
-#define        CAR             0x68
-#define        GCR             0x4b
-#define        SVRR            0x67
-#define        RICR            0x44
-#define        TICR            0x45
-#define        MICR            0x46
-#define        RIR             0x6b
-#define        TIR             0x6a
-#define        MIR             0x69
-#define        PPR             0x7e
-
-#define        RIVR            0x43
-#define        TIVR            0x42
-#define        MIVR            0x41
-#define        TDR             0x63
-#define        RDSR            0x62
-#define        MISR            0x4c
-#define        EOSRR           0x60
-
-#define        LIVR            0x18
-#define        CCR             0x05
-#define        SRER            0x06
-#define        COR1            0x08
-#define        COR2            0x09
-#define        COR3            0x0a
-#define        COR4            0x1e
-#define        COR5            0x1f
-#define        CCSR            0x0b
-#define        RDCR            0x0e
-#define        SCHR1           0x1a
-#define        SCHR2           0x1b
-#define        SCHR3           0x1c
-#define        SCHR4           0x1d
-#define        SCRL            0x22
-#define        SCRH            0x23
-#define        LNC             0x24
-#define        MCOR1           0x15
-#define        MCOR2           0x16
-#define        RTPR            0x21
-#define        MSVR1           0x6c
-#define        MSVR2           0x6d
-#define        PSVR            0x6f
-#define        RBPR            0x78
-#define        RCOR            0x7c
-#define        TBPR            0x72
-#define        TCOR            0x76
-
-/*****************************************************************************/
-
-/*
- *     Define the set of baud rate clock divisors.
- */
-#define        CD1400_CLK0     8
-#define        CD1400_CLK1     32
-#define        CD1400_CLK2     128
-#define        CD1400_CLK3     512
-#define        CD1400_CLK4     2048
-
-#define        CD1400_NUMCLKS  5
-
-/*****************************************************************************/
-
-/*
- *     Define the clock pre-scalar value to be a 5 ms clock. This should be
- *     OK for now. It would probably be better to make it 10 ms, but we
- *     can't fit that divisor into 8 bits!
- */
-#define        PPR_SCALAR      244
-
-/*****************************************************************************/
-
-/*
- *     Define values used to set character size options.
- */
-#define        COR1_CHL5       0x00
-#define        COR1_CHL6       0x01
-#define        COR1_CHL7       0x02
-#define        COR1_CHL8       0x03
-
-/*
- *     Define values used to set the number of stop bits.
- */
-#define        COR1_STOP1      0x00
-#define        COR1_STOP15     0x04
-#define        COR1_STOP2      0x08
-
-/*
- *     Define values used to set the parity scheme in use.
- */
-#define        COR1_PARNONE    0x00
-#define        COR1_PARFORCE   0x20
-#define        COR1_PARENB     0x40
-#define        COR1_PARIGNORE  0x10
-
-#define        COR1_PARODD     0x80
-#define        COR1_PAREVEN    0x00
-
-#define        COR2_IXM        0x80
-#define        COR2_TXIBE      0x40
-#define        COR2_ETC        0x20
-#define        COR2_LLM        0x10
-#define        COR2_RLM        0x08
-#define        COR2_RTSAO      0x04
-#define        COR2_CTSAE      0x02
-
-#define        COR3_SCDRNG     0x80
-#define        COR3_SCD34      0x40
-#define        COR3_FCT        0x20
-#define        COR3_SCD12      0x10
-
-/*
- *     Define values used by COR4.
- */
-#define        COR4_BRKINT     0x08
-#define        COR4_IGNBRK     0x18
-
-/*****************************************************************************/
-
-/*
- *     Define the modem control register values.
- *     Note that the actual hardware is a little different to the conventional
- *     pin names on the cd1400.
- */
-#define        MSVR1_DTR       0x01
-#define        MSVR1_DSR       0x10
-#define        MSVR1_RI        0x20
-#define        MSVR1_CTS       0x40
-#define        MSVR1_DCD       0x80
-
-#define        MSVR2_RTS       0x02
-#define        MSVR2_DSR       0x10
-#define        MSVR2_RI        0x20
-#define        MSVR2_CTS       0x40
-#define        MSVR2_DCD       0x80
-
-#define        MCOR1_DCD       0x80
-#define        MCOR1_CTS       0x40
-#define        MCOR1_RI        0x20
-#define        MCOR1_DSR       0x10
-
-#define        MCOR2_DCD       0x80
-#define        MCOR2_CTS       0x40
-#define        MCOR2_RI        0x20
-#define        MCOR2_DSR       0x10
-
-/*****************************************************************************/
-
-/*
- *     Define the bits used with the service (interrupt) enable register.
- */
-#define        SRER_NNDT       0x01
-#define        SRER_TXEMPTY    0x02
-#define        SRER_TXDATA     0x04
-#define        SRER_RXDATA     0x10
-#define        SRER_MODEM      0x80
-
-/*****************************************************************************/
-
-/*
- *     Define operational commands for the command register.
- */
-#define        CCR_RESET       0x80
-#define        CCR_CORCHANGE   0x4e
-#define        CCR_SENDCH      0x20
-#define        CCR_CHANCTRL    0x10
-
-#define        CCR_TXENABLE    (CCR_CHANCTRL | 0x08)
-#define        CCR_TXDISABLE   (CCR_CHANCTRL | 0x04)
-#define        CCR_RXENABLE    (CCR_CHANCTRL | 0x02)
-#define        CCR_RXDISABLE   (CCR_CHANCTRL | 0x01)
-
-#define        CCR_SENDSCHR1   (CCR_SENDCH | 0x01)
-#define        CCR_SENDSCHR2   (CCR_SENDCH | 0x02)
-#define        CCR_SENDSCHR3   (CCR_SENDCH | 0x03)
-#define        CCR_SENDSCHR4   (CCR_SENDCH | 0x04)
-
-#define        CCR_RESETCHAN   (CCR_RESET | 0x00)
-#define        CCR_RESETFULL   (CCR_RESET | 0x01)
-#define        CCR_TXFLUSHFIFO (CCR_RESET | 0x02)
-
-#define        CCR_MAXWAIT     10000
-
-/*****************************************************************************/
-
-/*
- *     Define the valid acknowledgement types (for hw ack cycle).
- */
-#define        ACK_TYPMASK     0x07
-#define        ACK_TYPTX       0x02
-#define        ACK_TYPMDM      0x01
-#define        ACK_TYPRXGOOD   0x03
-#define        ACK_TYPRXBAD    0x07
-
-#define        SVRR_RX         0x01
-#define        SVRR_TX         0x02
-#define        SVRR_MDM        0x04
-
-#define        ST_OVERRUN      0x01
-#define        ST_FRAMING      0x02
-#define        ST_PARITY       0x04
-#define        ST_BREAK        0x08
-#define        ST_SCHAR1       0x10
-#define        ST_SCHAR2       0x20
-#define        ST_SCHAR3       0x30
-#define        ST_SCHAR4       0x40
-#define        ST_RANGE        0x70
-#define        ST_SCHARMASK    0x70
-#define        ST_TIMEOUT      0x80
-
-#define        MISR_DCD        0x80
-#define        MISR_CTS        0x40
-#define        MISR_RI         0x20
-#define        MISR_DSR        0x10
-
-/*****************************************************************************/
-
-/*
- *     Defines for the CCSR status register.
- */
-#define        CCSR_RXENABLED  0x80
-#define        CCSR_RXFLOWON   0x40
-#define        CCSR_RXFLOWOFF  0x20
-#define        CCSR_TXENABLED  0x08
-#define        CCSR_TXFLOWON   0x04
-#define        CCSR_TXFLOWOFF  0x02
-
-/*****************************************************************************/
-
-/*
- *     Define the embedded commands.
- */
-#define        ETC_CMD         0x00
-#define        ETC_STARTBREAK  0x81
-#define        ETC_DELAY       0x82
-#define        ETC_STOPBREAK   0x83
-
-/*****************************************************************************/
-#endif
diff --git a/include/linux/cdk.h b/include/linux/cdk.h
deleted file mode 100644 (file)
index 80093a8..0000000
+++ /dev/null
@@ -1,486 +0,0 @@
-/*****************************************************************************/
-
-/*
- *     cdk.h  -- CDK interface definitions.
- *
- *     Copyright (C) 1996-1998  Stallion Technologies
- *     Copyright (C) 1994-1996  Greg Ungerer.
- *
- *     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        _CDK_H
-#define        _CDK_H
-/*****************************************************************************/
-
-#pragma        pack(2)
-
-/*
- *     The following set of definitions is used to communicate with the
- *     shared memory interface of the Stallion intelligent multiport serial
- *     boards. The definitions in this file are taken directly from the
- *     document titled "Generic Stackable Interface, Downloader and
- *     Communications Development Kit".
- */
-
-/*
- *     Define the set of important shared memory addresses. These are
- *     required to initialize the board and get things started. All of these
- *     addresses are relative to the start of the shared memory.
- */
-#define        CDK_SIGADDR     0x200
-#define        CDK_FEATADDR    0x280
-#define        CDK_CDKADDR     0x300
-#define        CDK_RDYADDR     0x262
-
-#define        CDK_ALIVEMARKER 13
-
-/*
- *     On hardware power up the ROMs located on the EasyConnection 8/64 will
- *     fill out the following signature information into shared memory. This
- *     way the host system can quickly determine that the board is present
- *     and is operational.
- */
-typedef struct cdkecpsig {
-       unsigned long   magic;
-       unsigned short  romver;
-       unsigned short  cputype;
-       unsigned char   panelid[8];
-} cdkecpsig_t;
-
-#define        ECP_MAGIC       0x21504345
-
-/*
- *     On hardware power up the ROMs located on the ONboard, Stallion and
- *     Brumbys will fill out the following signature information into shared
- *     memory. This way the host system can quickly determine that the board
- *     is present and is operational.
- */
-typedef struct cdkonbsig {
-       unsigned short  magic0;
-       unsigned short  magic1;
-       unsigned short  magic2;
-       unsigned short  magic3;
-       unsigned short  romver;
-       unsigned short  memoff;
-       unsigned short  memseg;
-       unsigned short  amask0;
-       unsigned short  pic;
-       unsigned short  status;
-       unsigned short  btype;
-       unsigned short  clkticks;
-       unsigned short  clkspeed;
-       unsigned short  amask1;
-       unsigned short  amask2;
-} cdkonbsig_t;
-
-#define        ONB_MAGIC0      0xf2a7
-#define        ONB_MAGIC1      0xa149
-#define        ONB_MAGIC2      0x6352
-#define        ONB_MAGIC3      0xf121
-
-/*
- *     Define the feature area structure. The feature area is the set of
- *     startup parameters used by the slave image when it starts executing.
- *     They allow for the specification of buffer sizes, debug trace, etc.
- */
-typedef struct cdkfeature {
-       unsigned long   debug;
-       unsigned long   banner;
-       unsigned long   etype;
-       unsigned long   nrdevs;
-       unsigned long   brdspec;
-       unsigned long   txrqsize;
-       unsigned long   rxrqsize;
-       unsigned long   flags;
-} cdkfeature_t;
-
-#define        ETYP_DDK        0
-#define        ETYP_CDK        1
-
-/*
- *     Define the CDK header structure. This is the info that the slave
- *     environment sets up after it has been downloaded and started. It
- *     essentially provides a memory map for the shared memory interface.
- */
-typedef struct cdkhdr {
-       unsigned short  command;
-       unsigned short  status;
-       unsigned short  port;
-       unsigned short  mode;
-       unsigned long   cmd_buf[14];
-       unsigned short  alive_cnt;
-       unsigned short  intrpt_mode;
-       unsigned char   intrpt_id[8];
-       unsigned char   ver_release;
-       unsigned char   ver_modification;
-       unsigned char   ver_fix;
-       unsigned char   deadman_restart;
-       unsigned short  deadman;
-       unsigned short  nrdevs;
-       unsigned long   memp;
-       unsigned long   hostp;
-       unsigned long   slavep;
-       unsigned char   hostreq;
-       unsigned char   slavereq;
-       unsigned char   cmd_reserved[30];
-} cdkhdr_t;
-
-#define        MODE_DDK        0
-#define        MODE_CDK        1
-
-#define        IMD_INTR        0x0
-#define        IMD_PPINTR      0x1
-#define        IMD_POLL        0xff
-
-/*
- *     Define the memory mapping structure. This structure is pointed to by
- *     the memp field in the stlcdkhdr struct. As many as these structures
- *     as required are laid out in shared memory to define how the rest of
- *     shared memory is divided up. There will be one for each port.
- */
-typedef struct cdkmem {
-       unsigned short  dtype;
-       unsigned long   offset;
-} cdkmem_t;
-
-#define        TYP_UNDEFINED   0x0
-#define        TYP_ASYNCTRL    0x1
-#define        TYP_ASYNC       0x20
-#define        TYP_PARALLEL    0x40
-#define        TYP_SYNCX21     0x60
-
-/*****************************************************************************/
-
-/*
- *     Following is a set of defines and structures used to actually deal
- *     with the serial ports on the board. Firstly is the set of commands
- *     that can be applied to ports.
- */
-#define        ASYCMD          (((unsigned long) 'a') << 8)
-
-#define        A_NULL          (ASYCMD | 0)
-#define        A_FLUSH         (ASYCMD | 1)
-#define        A_BREAK         (ASYCMD | 2)
-#define        A_GETPORT       (ASYCMD | 3)
-#define        A_SETPORT       (ASYCMD | 4)
-#define        A_SETPORTF      (ASYCMD | 5)
-#define        A_SETPORTFTX    (ASYCMD | 6)
-#define        A_SETPORTFRX    (ASYCMD | 7)
-#define        A_GETSIGNALS    (ASYCMD | 8)
-#define        A_SETSIGNALS    (ASYCMD | 9)
-#define        A_SETSIGNALSF   (ASYCMD | 10)
-#define        A_SETSIGNALSFTX (ASYCMD | 11)
-#define        A_SETSIGNALSFRX (ASYCMD | 12)
-#define        A_GETNOTIFY     (ASYCMD | 13)
-#define        A_SETNOTIFY     (ASYCMD | 14)
-#define        A_NOTIFY        (ASYCMD | 15)
-#define        A_PORTCTRL      (ASYCMD | 16)
-#define        A_GETSTATS      (ASYCMD | 17)
-#define        A_RQSTATE       (ASYCMD | 18)
-#define        A_FLOWSTATE     (ASYCMD | 19)
-#define        A_CLEARSTATS    (ASYCMD | 20)
-
-/*
- *     Define those arguments used for simple commands.
- */
-#define        FLUSHRX         0x1
-#define        FLUSHTX         0x2
-
-#define        BREAKON         -1
-#define        BREAKOFF        -2
-
-/*
- *     Define the port setting structure, and all those defines that go along
- *     with it. Basically this structure defines the characteristics of this
- *     port: baud rate, chars, parity, input/output char cooking etc.
- */
-typedef struct asyport {
-       unsigned long   baudout;
-       unsigned long   baudin;
-       unsigned long   iflag;
-       unsigned long   oflag;
-       unsigned long   lflag;
-       unsigned long   pflag;
-       unsigned long   flow;
-       unsigned long   spare1;
-       unsigned short  vtime;
-       unsigned short  vmin;
-       unsigned short  txlo;
-       unsigned short  txhi;
-       unsigned short  rxlo;
-       unsigned short  rxhi;
-       unsigned short  rxhog;
-       unsigned short  spare2;
-       unsigned char   csize;
-       unsigned char   stopbs;
-       unsigned char   parity;
-       unsigned char   stopin;
-       unsigned char   startin;
-       unsigned char   stopout;
-       unsigned char   startout;
-       unsigned char   parmark;
-       unsigned char   brkmark;
-       unsigned char   cc[11];
-} asyport_t;
-
-#define        PT_STOP1        0x0
-#define        PT_STOP15       0x1
-#define        PT_STOP2        0x2
-
-#define        PT_NOPARITY     0x0
-#define        PT_ODDPARITY    0x1
-#define        PT_EVENPARITY   0x2
-#define        PT_MARKPARITY   0x3
-#define        PT_SPACEPARITY  0x4
-
-#define        F_NONE          0x0
-#define        F_IXON          0x1
-#define        F_IXOFF         0x2
-#define        F_IXANY         0x4
-#define        F_IOXANY        0x8
-#define        F_RTSFLOW       0x10
-#define        F_CTSFLOW       0x20
-#define        F_DTRFLOW       0x40
-#define        F_DCDFLOW       0x80
-#define        F_DSROFLOW      0x100
-#define        F_DSRIFLOW      0x200
-
-#define        FI_NORX         0x1
-#define        FI_RAW          0x2
-#define        FI_ISTRIP       0x4
-#define        FI_UCLC         0x8
-#define        FI_INLCR        0x10
-#define        FI_ICRNL        0x20
-#define        FI_IGNCR        0x40
-#define        FI_IGNBREAK     0x80
-#define        FI_DSCRDBREAK   0x100
-#define        FI_1MARKBREAK   0x200
-#define        FI_2MARKBREAK   0x400
-#define        FI_XCHNGBREAK   0x800
-#define        FI_IGNRXERRS    0x1000
-#define        FI_DSCDRXERRS   0x2000
-#define        FI_1MARKRXERRS  0x4000
-#define        FI_2MARKRXERRS  0x8000
-#define        FI_XCHNGRXERRS  0x10000
-#define        FI_DSCRDNULL    0x20000
-
-#define        FO_OLCUC        0x1
-#define        FO_ONLCR        0x2
-#define        FO_OOCRNL       0x4
-#define        FO_ONOCR        0x8
-#define        FO_ONLRET       0x10
-#define        FO_ONL          0x20
-#define        FO_OBS          0x40
-#define        FO_OVT          0x80
-#define        FO_OFF          0x100
-#define        FO_OTAB1        0x200
-#define        FO_OTAB2        0x400
-#define        FO_OTAB3        0x800
-#define        FO_OCR1         0x1000
-#define        FO_OCR2         0x2000
-#define        FO_OCR3         0x4000
-#define        FO_OFILL        0x8000
-#define        FO_ODELL        0x10000
-
-#define        P_RTSLOCK       0x1
-#define        P_CTSLOCK       0x2
-#define        P_MAPRTS        0x4
-#define        P_MAPCTS        0x8
-#define        P_LOOPBACK      0x10
-#define        P_DTRFOLLOW     0x20
-#define        P_FAKEDCD       0x40
-
-#define        P_RXIMIN        0x10000
-#define        P_RXITIME       0x20000
-#define        P_RXTHOLD       0x40000
-
-/*
- *     Define a structure to communicate serial port signal and data state
- *     information.
- */
-typedef struct asysigs {
-       unsigned long   data;
-       unsigned long   signal;
-       unsigned long   sigvalue;
-} asysigs_t;
-
-#define        DT_TXBUSY       0x1
-#define        DT_TXEMPTY      0x2
-#define        DT_TXLOW        0x4
-#define        DT_TXHIGH       0x8
-#define        DT_TXFULL       0x10
-#define        DT_TXHOG        0x20
-#define        DT_TXFLOWED     0x40
-#define        DT_TXBREAK      0x80
-
-#define        DT_RXBUSY       0x100
-#define        DT_RXEMPTY      0x200
-#define        DT_RXLOW        0x400
-#define        DT_RXHIGH       0x800
-#define        DT_RXFULL       0x1000
-#define        DT_RXHOG        0x2000
-#define        DT_RXFLOWED     0x4000
-#define        DT_RXBREAK      0x8000
-
-#define        SG_DTR          0x1
-#define        SG_DCD          0x2
-#define        SG_RTS          0x4
-#define        SG_CTS          0x8
-#define        SG_DSR          0x10
-#define        SG_RI           0x20
-
-/*
- *     Define the notification setting structure. This is used to tell the
- *     port what events we want to be informed about. Fields here use the
- *     same defines as for the asysigs structure above.
- */
-typedef struct asynotify {
-       unsigned long   ctrl;
-       unsigned long   data;
-       unsigned long   signal;
-       unsigned long   sigvalue;
-} asynotify_t;
-
-/*
- *     Define the port control structure. It is used to do fine grain
- *     control operations on the port.
- */
-typedef struct {
-       unsigned long   rxctrl;
-       unsigned long   txctrl;
-       char            rximdch;
-       char            tximdch;
-       char            spare1;
-       char            spare2;
-} asyctrl_t;
-
-#define        CT_ENABLE       0x1
-#define        CT_DISABLE      0x2
-#define        CT_STOP         0x4
-#define        CT_START        0x8
-#define        CT_STARTFLOW    0x10
-#define        CT_STOPFLOW     0x20
-#define        CT_SENDCHR      0x40
-
-/*
- *     Define the stats structure kept for each port. This is a useful set
- *     of data collected for each port on the slave. The A_GETSTATS command
- *     is used to retrieve this data from the slave.
- */
-typedef struct asystats {
-       unsigned long   opens;
-       unsigned long   txchars;
-       unsigned long   rxchars;
-       unsigned long   txringq;
-       unsigned long   rxringq;
-       unsigned long   txmsgs;
-       unsigned long   rxmsgs;
-       unsigned long   txflushes;
-       unsigned long   rxflushes;
-       unsigned long   overruns;
-       unsigned long   framing;
-       unsigned long   parity;
-       unsigned long   ringover;
-       unsigned long   lost;
-       unsigned long   rxstart;
-       unsigned long   rxstop;
-       unsigned long   txstart;
-       unsigned long   txstop;
-       unsigned long   dcdcnt;
-       unsigned long   dtrcnt;
-       unsigned long   ctscnt;
-       unsigned long   rtscnt;
-       unsigned long   dsrcnt;
-       unsigned long   ricnt;
-       unsigned long   txbreaks;
-       unsigned long   rxbreaks;
-       unsigned long   signals;
-       unsigned long   state;
-       unsigned long   hwid;
-} asystats_t;
-
-/*****************************************************************************/
-
-/*
- *     All command and control communication with a device on the slave is
- *     via a control block in shared memory. Each device has its own control
- *     block, defined by the following structure. The control block allows
- *     the host to open, close and control the device on the slave.
- */
-typedef struct cdkctrl {
-       unsigned char   open;
-       unsigned char   close;
-       unsigned long   openarg;
-       unsigned long   closearg;
-       unsigned long   cmd;
-       unsigned long   status;
-       unsigned long   args[32];
-} cdkctrl_t;
-
-/*
- *     Each device on the slave passes data to and from the host via a ring
- *     queue in shared memory. Define a ring queue structure to hold the
- *     vital information about each ring queue. Two ring queues will be
- *     allocated for each port, one for receive data and one for transmit
- *     data.
- */
-typedef struct cdkasyrq {
-       unsigned long   offset;
-       unsigned short  size;
-       unsigned short  head;
-       unsigned short  tail;
-} cdkasyrq_t;
-
-/*
- *     Each asynchronous port is defined in shared memory by the following
- *     structure. It contains a control block to command a device, and also
- *     the necessary data channel information as well.
- */
-typedef struct cdkasy {
-       cdkctrl_t       ctrl;
-       unsigned short  notify;
-       asynotify_t     changed;
-       unsigned short  receive;
-       cdkasyrq_t      rxq;
-       unsigned short  transmit;
-       cdkasyrq_t      txq;
-} cdkasy_t;
-
-#pragma        pack()
-
-/*****************************************************************************/
-
-/*
- *     Define the set of ioctls used by the driver to do special things
- *     to the board. These include interrupting it, and initializing
- *     the driver after board startup and shutdown.
- */
-#include <linux/ioctl.h>
-
-#define        STL_BINTR       _IO('s',20)
-#define        STL_BSTART      _IO('s',21)
-#define        STL_BSTOP       _IO('s',22)
-#define        STL_BRESET      _IO('s',23)
-
-/*
- *     Define a set of ioctl extensions, used to get at special stuff.
- */
-#define        STL_GETPFLAG    _IO('s',80)
-#define        STL_SETPFLAG    _IO('s',81)
-
-/*****************************************************************************/
-#endif
index 77335fa..c127315 100644 (file)
@@ -26,6 +26,7 @@
 #define CLK_IGNORE_UNUSED      BIT(3) /* do not gate even if unused */
 #define CLK_IS_ROOT            BIT(4) /* root clk, has no parent */
 #define CLK_IS_BASIC           BIT(5) /* Basic clk, can't do a to_clk_foo() */
+#define CLK_GET_RATE_NOCACHE   BIT(6) /* do not use the cached clk rate */
 
 struct clk_hw;
 
@@ -360,6 +361,11 @@ int of_clk_add_provider(struct device_node *np,
 void of_clk_del_provider(struct device_node *np);
 struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec,
                                  void *data);
+struct clk_onecell_data {
+       struct clk **clks;
+       unsigned int clk_num;
+};
+struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data);
 const char *of_clk_get_parent_name(struct device_node *np, int index);
 void of_clk_init(const struct of_device_id *matches);
 
similarity index 83%
rename from arch/arm/mach-pnx4008/include/mach/param.h
rename to include/linux/clk/bcm2835.h
index 6ea02f2..aa937f6 100644 (file)
@@ -1,7 +1,5 @@
 /*
- *  arch/arm/mach-pnx4008/include/mach/param.h
- *
- *  Copyright (C) 1999 ARM Limited
+ * Copyright (C) 2010 Broadcom
  *
  * 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
@@ -18,4 +16,9 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
-#define HZ 100
+#ifndef __LINUX_CLK_BCM2835_H_
+#define __LINUX_CLK_BCM2835_H_
+
+void __init bcm2835_init_clocks(void);
+
+#endif
diff --git a/include/linux/comstats.h b/include/linux/comstats.h
deleted file mode 100644 (file)
index 3f5ea8e..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/*****************************************************************************/
-
-/*
- *     comstats.h  -- Serial Port Stats.
- *
- *     Copyright (C) 1996-1998  Stallion Technologies
- *     Copyright (C) 1994-1996  Greg Ungerer.
- *
- *     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        _COMSTATS_H
-#define        _COMSTATS_H
-/*****************************************************************************/
-
-/*
- *     Serial port stats structure. The structure itself is UART
- *     independent, but some fields may be UART/driver specific (for
- *     example state).
- */
-
-typedef struct {
-       unsigned long   brd;
-       unsigned long   panel;
-       unsigned long   port;
-       unsigned long   hwid;
-       unsigned long   type;
-       unsigned long   txtotal;
-       unsigned long   rxtotal;
-       unsigned long   txbuffered;
-       unsigned long   rxbuffered;
-       unsigned long   rxoverrun;
-       unsigned long   rxparity;
-       unsigned long   rxframing;
-       unsigned long   rxlost;
-       unsigned long   txbreaks;
-       unsigned long   rxbreaks;
-       unsigned long   txxon;
-       unsigned long   txxoff;
-       unsigned long   rxxon;
-       unsigned long   rxxoff;
-       unsigned long   txctson;
-       unsigned long   txctsoff;
-       unsigned long   rxrtson;
-       unsigned long   rxrtsoff;
-       unsigned long   modem;
-       unsigned long   state;
-       unsigned long   flags;
-       unsigned long   ttystate;
-       unsigned long   cflags;
-       unsigned long   iflags;
-       unsigned long   oflags;
-       unsigned long   lflags;
-       unsigned long   signals;
-} comstats_t;
-
-
-/*
- *     Board stats structure. Returns useful info about the board.
- */
-
-#define        COM_MAXPANELS   8
-
-typedef struct {
-       unsigned long   panel;
-       unsigned long   type;
-       unsigned long   hwid;
-       unsigned long   nrports;
-} companel_t;
-
-typedef struct {
-       unsigned long   brd;
-       unsigned long   type;
-       unsigned long   hwid;
-       unsigned long   state;
-       unsigned long   ioaddr;
-       unsigned long   ioaddr2;
-       unsigned long   memaddr;
-       unsigned long   irq;
-       unsigned long   nrpanels;
-       unsigned long   nrports;
-       companel_t      panels[COM_MAXPANELS];
-} combrd_t;
-
-
-/*
- *     Define the ioctl operations for stats stuff.
- */
-#include <linux/ioctl.h>
-
-#define        COM_GETPORTSTATS        _IO('c',30)
-#define        COM_CLRPORTSTATS        _IO('c',31)
-#define        COM_GETBRDSTATS         _IO('c',32)
-
-
-/*
- *     Define the set of ioctls that give user level access to the
- *     private port, panel and board structures. The argument required
- *     will be driver dependent!  
- */
-#define        COM_READPORT            _IO('c',40)
-#define        COM_READBOARD           _IO('c',41)
-#define        COM_READPANEL           _IO('c',42)
-
-/*****************************************************************************/
-#endif
diff --git a/include/linux/generic_serial.h b/include/linux/generic_serial.h
deleted file mode 100644 (file)
index 79b3eb3..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  generic_serial.h
- *
- *  Copyright (C) 1998 R.E.Wolff@BitWizard.nl
- *
- *  written for the SX serial driver.
- *
- *  Version 0.1 -- December, 1998.
- */
-
-#ifndef GENERIC_SERIAL_H
-#define GENERIC_SERIAL_H
-
-#warning Use of this header is deprecated.
-#warning Since nobody sets the constants defined here for you, you should not, in any case, use them. Including the header is thus pointless.
-
-/* Flags */
-/* Warning: serial.h defines some ASYNC_ flags, they say they are "only"
-   used in serial.c, but they are also used in all other serial drivers. 
-   Make sure they don't clash with these here... */
-#define GS_TX_INTEN      0x00800000
-#define GS_RX_INTEN      0x00400000
-#define GS_ACTIVE        0x00200000
-
-#define GS_TYPE_NORMAL   1
-
-#define GS_DEBUG_FLUSH   0x00000001
-#define GS_DEBUG_BTR     0x00000002
-#define GS_DEBUG_TERMIOS 0x00000004
-#define GS_DEBUG_STUFF   0x00000008
-#define GS_DEBUG_CLOSE   0x00000010
-#define GS_DEBUG_FLOW    0x00000020
-#define GS_DEBUG_WRITE   0x00000040
-
-#endif
index 1bc74af..49ed17f 100644 (file)
@@ -22,6 +22,7 @@ struct i2c_pnx_mif {
        struct timer_list       timer;          /* Timeout */
        u8 *                    buf;            /* Data buffer */
        int                     len;            /* Length of data buffer */
+       int                     order;          /* RX Bytes to order via TX */
 };
 
 struct i2c_pnx_algo_data {
index 7ea898c..a12a381 100644 (file)
@@ -561,9 +561,6 @@ struct twl4030_bci_platform_data {
 
 /* TWL4030_GPIO_MAX (18) GPIOs, with interrupts */
 struct twl4030_gpio_platform_data {
-       int             gpio_base;
-       unsigned        irq_base, irq_end;
-
        /* package the two LED signals as output-only GPIOs? */
        bool            use_leds;
 
similarity index 62%
rename from arch/arm/mach-integrator/include/mach/io.h
rename to include/linux/irqchip/bcm2835.h
index 8de70de..48a859b 100644 (file)
@@ -1,7 +1,5 @@
 /*
- *  arch/arm/mach-integrator/include/mach/io.h
- *
- *  Copyright (C) 1999 ARM Limited
+ * Copyright (C) 2010 Broadcom
  *
  * 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
  * 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_ARM_ARCH_IO_H
-#define __ASM_ARM_ARCH_IO_H
 
-/*
- * WARNING: this has to mirror definitions in platform.h
- */
-#define PCI_MEMORY_VADDR        0xe8000000
-#define PCI_CONFIG_VADDR        0xec000000
-#define PCI_V3_VADDR            0xed000000
-#define PCI_IO_VADDR            0xee000000
+#ifndef __LINUX_IRQCHIP_BCM2835_H_
+#define __LINUX_IRQCHIP_BCM2835_H_
+
+#include <asm/exception.h>
+
+extern void bcm2835_init_irq(void);
 
-#define __io(a)                        ((void __iomem *)(PCI_IO_VADDR + (a)))
+extern asmlinkage void __exception_irq_entry bcm2835_handle_irq(
+       struct pt_regs *regs);
 
 #endif
diff --git a/include/linux/istallion.h b/include/linux/istallion.h
deleted file mode 100644 (file)
index ad700a6..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-/*****************************************************************************/
-
-/*
- *     istallion.h  -- stallion intelligent multiport serial driver.
- *
- *     Copyright (C) 1996-1998  Stallion Technologies
- *     Copyright (C) 1994-1996  Greg Ungerer.
- *
- *     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        _ISTALLION_H
-#define        _ISTALLION_H
-/*****************************************************************************/
-
-/*
- *     Define important driver constants here.
- */
-#define        STL_MAXBRDS             4
-#define        STL_MAXPANELS           4
-#define        STL_MAXPORTS            64
-#define        STL_MAXCHANS            (STL_MAXPORTS + 1)
-#define        STL_MAXDEVS             (STL_MAXBRDS * STL_MAXPORTS)
-
-
-/*
- *     Define a set of structures to hold all the board/panel/port info
- *     for our ports. These will be dynamically allocated as required at
- *     driver initialization time.
- */
-
-/*
- *     Port and board structures to hold status info about each object.
- *     The board structure contains pointers to structures for each port
- *     connected to it. Panels are not distinguished here, since
- *     communication with the slave board will always be on a per port
- *     basis.
- */
-struct stliport {
-       unsigned long           magic;
-       struct tty_port         port;
-       unsigned int            portnr;
-       unsigned int            panelnr;
-       unsigned int            brdnr;
-       unsigned long           state;
-       unsigned int            devnr;
-       int                     baud_base;
-       int                     custom_divisor;
-       int                     closing_wait;
-       int                     rc;
-       int                     argsize;
-       void                    *argp;
-       unsigned int            rxmarkmsk;
-       wait_queue_head_t       raw_wait;
-       struct asysigs          asig;
-       unsigned long           addr;
-       unsigned long           rxoffset;
-       unsigned long           txoffset;
-       unsigned long           sigs;
-       unsigned long           pflag;
-       unsigned int            rxsize;
-       unsigned int            txsize;
-       unsigned char           reqbit;
-       unsigned char           portidx;
-       unsigned char           portbit;
-};
-
-/*
- *     Use a structure of function pointers to do board level operations.
- *     These include, enable/disable, paging shared memory, interrupting, etc.
- */
-struct stlibrd {
-       unsigned long   magic;
-       unsigned int    brdnr;
-       unsigned int    brdtype;
-       unsigned long   state;
-       unsigned int    nrpanels;
-       unsigned int    nrports;
-       unsigned int    nrdevs;
-       unsigned int    iobase;
-       int             iosize;
-       unsigned long   memaddr;
-       void            __iomem *membase;
-       unsigned long   memsize;
-       int             pagesize;
-       int             hostoffset;
-       int             slaveoffset;
-       int             bitsize;
-       int             enabval;
-       unsigned int    panels[STL_MAXPANELS];
-       int             panelids[STL_MAXPANELS];
-       void            (*init)(struct stlibrd *brdp);
-       void            (*enable)(struct stlibrd *brdp);
-       void            (*reenable)(struct stlibrd *brdp);
-       void            (*disable)(struct stlibrd *brdp);
-       void            __iomem *(*getmemptr)(struct stlibrd *brdp, unsigned long offset, int line);
-       void            (*intr)(struct stlibrd *brdp);
-       void            (*reset)(struct stlibrd *brdp);
-       struct stliport *ports[STL_MAXPORTS];
-};
-
-
-/*
- *     Define MAGIC numbers used for above structures.
- */
-#define        STLI_PORTMAGIC  0xe671c7a1
-#define        STLI_BOARDMAGIC 0x4bc6c825
-
-/*****************************************************************************/
-#endif
index daf4a3a..b7c8cdc 100644 (file)
@@ -65,7 +65,6 @@ struct kbd_struct {
 
 extern int kbd_init(void);
 
-extern unsigned char getledstate(void);
 extern void setledstate(struct kbd_struct *kbd, unsigned int led);
 
 extern int do_poke_blanked_console;
@@ -145,16 +144,4 @@ void compute_shiftstate(void);
 
 extern unsigned int keymap_count;
 
-/* console.c */
-
-static inline void con_schedule_flip(struct tty_struct *t)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&t->buf.lock, flags);
-       if (t->buf.tail != NULL)
-               t->buf.tail->commit = t->buf.tail->used;
-       spin_unlock_irqrestore(&t->buf.lock, flags);
-       schedule_work(&t->buf.work);
-}
-
 #endif
index 6043821..594b419 100644 (file)
        __x - (__x % (y));                              \
 }                                                      \
 )
+
+/*
+ * Divide positive or negative dividend by positive divisor and round
+ * to closest integer. Result is undefined for negative divisors.
+ */
 #define DIV_ROUND_CLOSEST(x, divisor)(                 \
 {                                                      \
-       typeof(divisor) __divisor = divisor;            \
-       (((x) + ((__divisor) / 2)) / (__divisor));      \
+       typeof(x) __x = x;                              \
+       typeof(divisor) __d = divisor;                  \
+       (((typeof(x))-1) >= 0 || (__x) >= 0) ?          \
+               (((__x) + ((__d) / 2)) / (__d)) :       \
+               (((__x) - ((__d) / 2)) / (__d));        \
 }                                                      \
 )
 
index fc615a9..1e57449 100644 (file)
@@ -224,7 +224,7 @@ static inline int kobject_uevent_env(struct kobject *kobj,
 
 static inline __printf(2, 3)
 int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)
-{ return 0; }
+{ return -ENOMEM; }
 
 static inline int kobject_action_type(const char *buf, size_t count,
                                      enum kobject_action *type)
index d0752ec..9d96d5d 100644 (file)
@@ -183,7 +183,7 @@ extern int  mISDN_initbchannel(struct bchannel *, unsigned short,
                                   unsigned short);
 extern int     mISDN_freedchannel(struct dchannel *);
 extern void    mISDN_clear_bchannel(struct bchannel *);
-extern int     mISDN_freebchannel(struct bchannel *);
+extern void    mISDN_freebchannel(struct bchannel *);
 extern int     mISDN_ctrl_bchannel(struct bchannel *, struct mISDN_ctrl_req *);
 extern void    queue_ch_frame(struct mISDNchannel *, u_int,
                        int, struct sk_buff *);
index 3a8435a..cebe97e 100644 (file)
@@ -16,6 +16,8 @@
 
 #include <linux/platform_device.h>
 
+struct irq_domain;
+
 /*
  * This struct describes the MFD part ("cell").
  * After registration the copy of this structure will become the platform data
@@ -98,7 +100,7 @@ static inline const struct mfd_cell *mfd_get_cell(struct platform_device *pdev)
 extern int mfd_add_devices(struct device *parent, int id,
                           struct mfd_cell *cells, int n_devs,
                           struct resource *mem_base,
-                          int irq_base);
+                          int irq_base, struct irq_domain *irq_domain);
 
 extern void mfd_remove_devices(struct device *parent);
 
index 5b90e94..c410d99 100644 (file)
@@ -136,6 +136,7 @@ enum prcmu_clock {
        PRCMU_TIMCLK,
        PRCMU_PLLSOC0,
        PRCMU_PLLSOC1,
+       PRCMU_ARMSS,
        PRCMU_PLLDDR,
        PRCMU_PLLDSI,
        PRCMU_DSI0CLK,
index 12c0687..7cd83d8 100644 (file)
@@ -22,6 +22,9 @@
 #include <linux/regulator/driver.h>
 #include <linux/regulator/machine.h>
 
+/* TPS chip id list */
+#define TPS65217                       0xF0
+
 /* I2C ID for TPS65217 part */
 #define TPS65217_I2C_ID                        0x24
 
@@ -248,13 +251,11 @@ struct tps_info {
 struct tps65217 {
        struct device *dev;
        struct tps65217_board *pdata;
+       unsigned int id;
        struct regulator_desc desc[TPS65217_NUM_REGULATOR];
        struct regulator_dev *rdev[TPS65217_NUM_REGULATOR];
        struct tps_info *info[TPS65217_NUM_REGULATOR];
        struct regmap *regmap;
-
-       /* Client devices */
-       struct platform_device *regulator_pdev[TPS65217_NUM_REGULATOR];
 };
 
 static inline struct tps65217 *dev_to_tps65217(struct device *dev)
@@ -262,6 +263,11 @@ static inline struct tps65217 *dev_to_tps65217(struct device *dev)
        return dev_get_drvdata(dev);
 }
 
+static inline int tps65217_chip_id(struct tps65217 *tps65217)
+{
+       return tps65217->id;
+}
+
 int tps65217_reg_read(struct tps65217 *tps, unsigned int reg,
                                        unsigned int *val);
 int tps65217_reg_write(struct tps65217 *tps, unsigned int reg,
index f350fd0..9451471 100644 (file)
@@ -14,6 +14,7 @@
 #define TPS6586X_SLEW_RATE_MASK         0x07
 
 enum {
+       TPS6586X_ID_SYS,
        TPS6586X_ID_SM_0,
        TPS6586X_ID_SM_1,
        TPS6586X_ID_SM_2,
index eaad49f..ba43d48 100644 (file)
@@ -194,7 +194,6 @@ struct twl6040_vibra_data {
 
 struct twl6040_platform_data {
        int audpwron_gpio;      /* audio power-on gpio */
-       unsigned int irq_base;
 
        struct twl6040_codec_data *codec;
        struct twl6040_vibra_data *vibra;
index bd6c9fc..6e1b0f9 100644 (file)
@@ -796,6 +796,19 @@ enum mlx4_net_trans_rule_id {
        MLX4_NET_TRANS_RULE_NUM, /* should be last */
 };
 
+extern const u16 __sw_id_hw[];
+
+static inline int map_hw_to_sw_id(u16 header_id)
+{
+
+       int i;
+       for (i = 0; i < MLX4_NET_TRANS_RULE_NUM; i++) {
+               if (header_id == __sw_id_hw[i])
+                       return i;
+       }
+       return -EINVAL;
+}
+
 enum mlx4_net_trans_promisc_mode {
        MLX4_FS_PROMISC_NONE = 0,
        MLX4_FS_PROMISC_UPLINK,
index 111aca5..4b27f9f 100644 (file)
@@ -239,6 +239,7 @@ struct mmc_card {
 #define MMC_QUIRK_BLK_NO_CMD23 (1<<7)          /* Avoid CMD23 for regular multiblock */
 #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8)  /* Avoid sending 512 bytes in */
 #define MMC_QUIRK_LONG_READ_TIME (1<<9)                /* Data read time > CSD says */
+#define MMC_QUIRK_SEC_ERASE_TRIM_BROKEN (1<<10)        /* Skip secure for erase/trim */
                                                /* byte mode */
        unsigned int    poweroff_notify_state;  /* eMMC4.5 notify feature */
 #define MMC_NO_POWER_NOTIFICATION      0
index 1f8fc7f..4b03f56 100644 (file)
@@ -265,11 +265,6 @@ static inline const struct nfs_rpc_ops *NFS_PROTO(const struct inode *inode)
        return NFS_SERVER(inode)->nfs_client->rpc_ops;
 }
 
-static inline __be32 *NFS_COOKIEVERF(const struct inode *inode)
-{
-       return NFS_I(inode)->cookieverf;
-}
-
 static inline unsigned NFS_MINATTRTIMEO(const struct inode *inode)
 {
        struct nfs_server *nfss = NFS_SERVER(inode);
index ac7c8ae..be9cf3c 100644 (file)
@@ -652,7 +652,7 @@ struct nfs_getaclargs {
 };
 
 /* getxattr ACL interface flags */
-#define NFS4_ACL_LEN_REQUEST   0x0001  /* zero length getxattr buffer */
+#define NFS4_ACL_TRUNC         0x0001  /* ACL was truncated */
 struct nfs_getaclres {
        size_t                          acl_len;
        size_t                          acl_data_offset;
index 4ff57e8..85af818 100644 (file)
@@ -220,7 +220,12 @@ struct omapfb_display_info {
 
 #ifdef __KERNEL__
 
-#include <plat/board.h>
+struct omap_lcd_config {
+       char panel_name[16];
+       char ctrl_name[16];
+       s16  nreset_gpio;
+       u8   data_lines;
+};
 
 struct omapfb_platform_data {
        struct omap_lcd_config          lcd;
index fc35260..6b4565c 100644 (file)
 #define PCI_DEVICE_ID_TIGON3_5704S     0x16a8
 #define PCI_DEVICE_ID_NX2_57800_VF     0x16a9
 #define PCI_DEVICE_ID_NX2_5706S                0x16aa
-#define PCI_DEVICE_ID_NX2_57840_MF     0x16ab
+#define PCI_DEVICE_ID_NX2_57840_MF     0x16a4
 #define PCI_DEVICE_ID_NX2_5708S                0x16ac
 #define PCI_DEVICE_ID_NX2_57840_VF     0x16ad
 #define PCI_DEVICE_ID_NX2_57810_MF     0x16ae
index 7602ccb..33ed9d6 100644 (file)
@@ -926,7 +926,7 @@ struct perf_event {
        struct hw_perf_event            hw;
 
        struct perf_event_context       *ctx;
-       struct file                     *filp;
+       atomic_long_t                   refcount;
 
        /*
         * These accumulate total time (in nanoseconds) that children
@@ -1296,6 +1296,7 @@ extern int perf_swevent_get_recursion_context(void);
 extern void perf_swevent_put_recursion_context(int rctx);
 extern void perf_event_enable(struct perf_event *event);
 extern void perf_event_disable(struct perf_event *event);
+extern int __perf_event_disable(void *info);
 extern void perf_event_task_tick(void);
 #else
 static inline void
@@ -1334,6 +1335,7 @@ static inline int  perf_swevent_get_recursion_context(void)               { return -1; }
 static inline void perf_swevent_put_recursion_context(int rctx)                { }
 static inline void perf_event_enable(struct perf_event *event)         { }
 static inline void perf_event_disable(struct perf_event *event)                { }
+static inline int __perf_event_disable(void *info)                     { return -1; }
 static inline void perf_event_task_tick(void)                          { }
 #endif
 
diff --git a/include/linux/platform_data/clk-realview.h b/include/linux/platform_data/clk-realview.h
new file mode 100644 (file)
index 0000000..2e426a7
--- /dev/null
@@ -0,0 +1 @@
+void realview_clk_init(void __iomem *sysbase, bool is_pb1176);
diff --git a/include/linux/platform_data/clk-ux500.h b/include/linux/platform_data/clk-ux500.h
new file mode 100644 (file)
index 0000000..3af0da1
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Clock definitions for ux500 platforms
+ *
+ * Copyright (C) 2012 ST-Ericsson SA
+ * Author: Ulf Hansson <ulf.hansson@linaro.org>
+ *
+ * License terms: GNU General Public License (GPL) version 2
+ */
+
+#ifndef __CLK_UX500_H
+#define __CLK_UX500_H
+
+void u8500_clk_init(void);
+void u9540_clk_init(void);
+void u8540_clk_init(void);
+
+#endif /* __CLK_UX500_H */
similarity index 94%
rename from arch/arm/plat-omap/include/plat/gpio.h
rename to include/linux/platform_data/gpio-omap.h
index 50fb7cc..e8741c2 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * arch/arm/plat-omap/include/mach/gpio.h
- *
  * OMAP GPIO handling defines and functions
  *
  * Copyright (C) 2003-2005 Nokia Corporation
 #define OMAP4_GPIO_CLEARDATAOUT                0x0190
 #define OMAP4_GPIO_SETDATAOUT          0x0194
 
+#define OMAP_MAX_GPIO_LINES            192
+
 #define OMAP_MPUIO(nr)         (OMAP_MAX_GPIO_LINES + (nr))
 #define OMAP_GPIO_IS_MPUIO(nr) ((nr) >= OMAP_MAX_GPIO_LINES)
 
@@ -213,16 +213,5 @@ extern void omap2_gpio_prepare_for_idle(int off_mode);
 extern void omap2_gpio_resume_after_idle(void);
 extern void omap_set_gpio_debounce(int gpio, int enable);
 extern void omap_set_gpio_debounce_time(int gpio, int enable);
-/*-------------------------------------------------------------------------*/
-
-/*
- * Wrappers for "new style" GPIO calls, using the new infrastructure
- * which lets us plug in FPGA, I2C, and other implementations.
- *
- * The original OMAP-specific calls should eventually be removed.
- */
-
-#include <linux/errno.h>
-#include <asm-generic/gpio.h>
 
 #endif
diff --git a/include/linux/platform_data/max310x.h b/include/linux/platform_data/max310x.h
new file mode 100644 (file)
index 0000000..91648bf
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ *  Maxim (Dallas) MAX3107/8 serial driver
+ *
+ *  Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru>
+ *
+ *  Based on max3100.c, by Christian Pellegrin <chripell@evolware.org>
+ *  Based on max3110.c, by Feng Tang <feng.tang@intel.com>
+ *  Based on max3107.c, by Aavamobile
+ *
+ *  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 _MAX310X_H_
+#define _MAX310X_H_
+
+/*
+ * Example board initialization data:
+ *
+ * static struct max310x_pdata max3107_pdata = {
+ *     .driver_flags   = MAX310X_EXT_CLK,
+ *     .uart_flags[0]  = MAX310X_ECHO_SUPRESS | MAX310X_AUTO_DIR_CTRL,
+ *     .frequency      = 3686400,
+ *     .gpio_base      = -1,
+ * };
+ *
+ * static struct spi_board_info spi_device_max3107[] = {
+ *     {
+ *             .modalias       = "max3107",
+ *             .irq            = IRQ_EINT3,
+ *             .bus_num        = 1,
+ *             .chip_select    = 1,
+ *             .platform_data  = &max3107_pdata,
+ *     },
+ * };
+ */
+
+#define MAX310X_MAX_UARTS      1
+
+/* MAX310X platform data structure */
+struct max310x_pdata {
+       /* Flags global to driver */
+       const u8                driver_flags:2;
+#define MAX310X_EXT_CLK                (0x00000001)    /* External clock enable */
+#define MAX310X_AUTOSLEEP      (0x00000002)    /* Enable AutoSleep mode */
+       /* Flags global to UART port */
+       const u8                uart_flags[MAX310X_MAX_UARTS];
+#define MAX310X_LOOPBACK       (0x00000001)    /* Loopback mode enable */
+#define MAX310X_ECHO_SUPRESS   (0x00000002)    /* Enable echo supress */
+#define MAX310X_AUTO_DIR_CTRL  (0x00000004)    /* Enable Auto direction
+                                                * control (RS-485)
+                                                */
+       /* Frequency (extrenal clock or crystal) */
+       const int               frequency;
+       /* GPIO base number (can be negative) */
+       const int               gpio_base;
+       /* Called during startup */
+       void (*init)(void);
+       /* Called before finish */
+       void (*exit)(void);
+       /* Suspend callback */
+       void (*suspend)(int do_suspend);
+};
+
+#endif
similarity index 96%
rename from arch/arm/plat-omap/include/plat/nand.h
rename to include/linux/platform_data/mtd-nand-omap2.h
index 67fc506..1a68c1e 100644 (file)
@@ -24,11 +24,10 @@ struct omap_nand_platform_data {
        struct gpmc_timings     *gpmc_t;
        int                     nr_parts;
        bool                    dev_ready;
-       int                     gpmc_irq;
        enum nand_io            xfer_type;
-       unsigned long           phys_base;
        int                     devsize;
        enum omap_ecc           ecc_opt;
+       struct gpmc_nand_regs   reg;
 };
 
 /* minimum size for IO mapping */
diff --git a/include/linux/platform_data/omap1_bl.h b/include/linux/platform_data/omap1_bl.h
new file mode 100644 (file)
index 0000000..881a8e9
--- /dev/null
@@ -0,0 +1,11 @@
+#ifndef __OMAP1_BL_H__
+#define __OMAP1_BL_H__
+
+#include <linux/device.h>
+
+struct omap_backlight_config {
+       int default_intensity;
+       int (*set_power)(struct device *dev, int state);
+};
+
+#endif
similarity index 72%
rename from arch/arm/mach-u300/include/mach/gpio-u300.h
rename to include/linux/platform_data/pinctrl-coh901.h
index e81400c..30dea25 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2011 ST-Ericsson AB
+ * Copyright (C) 2007-2012 ST-Ericsson AB
  * License terms: GNU General Public License (GPL) version 2
  * GPIO block resgister definitions and inline macros for
  * U300 GPIO COH 901 335 or COH 901 571/3
 #define __MACH_U300_GPIO_U300_H
 
 /**
- * enum u300_gpio_variant - the type of U300 GPIO employed
- */
-enum u300_gpio_variant {
-       U300_GPIO_COH901335,
-       U300_GPIO_COH901571_3_BS335,
-       U300_GPIO_COH901571_3_BS365,
-};
-
-/**
  * struct u300_gpio_platform - U300 GPIO platform data
- * @variant: IP block variant
  * @ports: number of GPIO block ports
  * @gpio_base: first GPIO number for this block (use a free range)
  * @gpio_irq_base: first GPIO IRQ number for this block (use a free range)
  * @pinctrl_device: pin control device to spawn as child
  */
 struct u300_gpio_platform {
-       enum u300_gpio_variant variant;
        u8 ports;
        int gpio_base;
        int gpio_irq_base;
diff --git a/include/linux/platform_data/sccnxp.h b/include/linux/platform_data/sccnxp.h
new file mode 100644 (file)
index 0000000..7311ccd
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ *  NXP (Philips) SCC+++(SCN+++) serial driver
+ *
+ *  Copyright (C) 2012 Alexander Shiyan <shc_work@mail.ru>
+ *
+ *  Based on sc26xx.c, by Thomas Bogendörfer (tsbogend@alpha.franken.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.
+ */
+
+#ifndef __SCCNXP_H
+#define __SCCNXP_H
+
+#define SCCNXP_MAX_UARTS       2
+
+/* Output lines */
+#define LINE_OP0               1
+#define LINE_OP1               2
+#define LINE_OP2               3
+#define LINE_OP3               4
+#define LINE_OP4               5
+#define LINE_OP5               6
+#define LINE_OP6               7
+#define LINE_OP7               8
+
+/* Input lines */
+#define LINE_IP0               9
+#define LINE_IP1               10
+#define LINE_IP2               11
+#define LINE_IP3               12
+#define LINE_IP4               13
+#define LINE_IP5               14
+#define LINE_IP6               15
+
+/* Signals */
+#define DTR_OP                 0       /* DTR */
+#define RTS_OP                 4       /* RTS */
+#define DSR_IP                 8       /* DSR */
+#define CTS_IP                 12      /* CTS */
+#define DCD_IP                 16      /* DCD */
+#define RNG_IP                 20      /* RNG */
+
+#define DIR_OP                 24      /* Special signal for control RS-485.
+                                        * Goes high when transmit,
+                                        * then goes low.
+                                        */
+
+/* Routing control signal 'sig' to line 'line' */
+#define MCTRL_SIG(sig, line)   ((line) << (sig))
+
+/*
+ * Example board initialization data:
+ *
+ * static struct resource sc2892_resources[] = {
+ *     DEFINE_RES_MEM(UART_PHYS_START, 0x10),
+ *     DEFINE_RES_IRQ(IRQ_EXT2),
+ * };
+ *
+ * static struct sccnxp_pdata sc2892_info = {
+ *     .frequency      = 3686400,
+ *     .mctrl_cfg[0]   = MCTRL_SIG(DIR_OP, LINE_OP0),
+ *     .mctrl_cfg[1]   = MCTRL_SIG(DIR_OP, LINE_OP1),
+ * };
+ *
+ * static struct platform_device sc2892 = {
+ *     .name           = "sc2892",
+ *     .id             = -1,
+ *     .resource       = sc2892_resources,
+ *     .num_resources  = ARRAY_SIZE(sc2892_resources),
+ *     .dev = {
+ *             .platform_data  = &sc2892_info,
+ *     },
+ * };
+ */
+
+/* SCCNXP platform data structure */
+struct sccnxp_pdata {
+       /* Frequency (extrenal clock or crystal) */
+       int                     frequency;
+       /* Shift for A0 line */
+       const u8                reg_shift;
+       /* Modem control lines configuration */
+       const u32               mctrl_cfg[SCCNXP_MAX_UARTS];
+       /* Called during startup */
+       void (*init)(void);
+       /* Called before finish */
+       void (*exit)(void);
+};
+
+#endif
index 3101e62..4a496eb 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/types.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
-#include <plat/voltage.h>
+#include <linux/platform_data/voltage-omap.h>
 
 /*
  * Different Smartreflex IPs version. The v1 is the 65nm version used in
diff --git a/include/linux/sc26198.h b/include/linux/sc26198.h
deleted file mode 100644 (file)
index 7ca35ab..0000000
+++ /dev/null
@@ -1,533 +0,0 @@
-/*****************************************************************************/
-
-/*
- *     sc26198.h  -- SC26198 UART hardware info.
- *
- *     Copyright (C) 1995-1998  Stallion Technologies
- *
- *     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        _SC26198_H
-#define        _SC26198_H
-/*****************************************************************************/
-
-/*
- *     Define the number of async ports per sc26198 uart device.
- */
-#define        SC26198_PORTS           8
-
-/*
- *     Baud rate timing clocks. All derived from a master 14.7456 MHz clock.
- */
-#define        SC26198_MASTERCLOCK     14745600L
-#define        SC26198_DCLK            (SC26198_MASTERCLOCK)
-#define        SC26198_CCLK            (SC26198_MASTERCLOCK / 2)
-#define        SC26198_BCLK            (SC26198_MASTERCLOCK / 4)
-
-/*
- *     Define internal FIFO sizes for the 26198 ports.
- */
-#define        SC26198_TXFIFOSIZE      16
-#define        SC26198_RXFIFOSIZE      16
-
-/*****************************************************************************/
-
-/*
- *     Global register definitions. These registers are global to each 26198
- *     device, not specific ports on it.
- */
-#define        TSTR            0x0d
-#define        GCCR            0x0f
-#define        ICR             0x1b
-#define        WDTRCR          0x1d
-#define        IVR             0x1f
-#define        BRGTRUA         0x84
-#define        GPOSR           0x87
-#define        GPOC            0x8b
-#define        UCIR            0x8c
-#define        CIR             0x8c
-#define        BRGTRUB         0x8d
-#define        GRXFIFO         0x8e
-#define        GTXFIFO         0x8e
-#define        GCCR2           0x8f
-#define        BRGTRLA         0x94
-#define        GPOR            0x97
-#define        GPOD            0x9b
-#define        BRGTCR          0x9c
-#define        GICR            0x9c
-#define        BRGTRLB         0x9d
-#define        GIBCR           0x9d
-#define        GITR            0x9f
-
-/*
- *     Per port channel registers. These are the register offsets within
- *     the port address space, so need to have the port address (0 to 7)
- *     inserted in bit positions 4:6.
- */
-#define        MR0             0x00
-#define        MR1             0x01
-#define        IOPCR           0x02
-#define        BCRBRK          0x03
-#define        BCRCOS          0x04
-#define        BCRX            0x06
-#define        BCRA            0x07
-#define        XONCR           0x08
-#define        XOFFCR          0x09
-#define        ARCR            0x0a
-#define        RXCSR           0x0c
-#define        TXCSR           0x0e
-#define        MR2             0x80
-#define        SR              0x81
-#define SCCR           0x81
-#define        ISR             0x82
-#define        IMR             0x82
-#define        TXFIFO          0x83
-#define        RXFIFO          0x83
-#define        IPR             0x84
-#define        IOPIOR          0x85
-#define        XISR            0x86
-
-/*
- *     For any given port calculate the address to use to access a specified
- *     register. This is only used for unusual access, mostly this is done
- *     through the assembler access routines.
- */
-#define        SC26198_PORTREG(port,reg)       ((((port) & 0x07) << 4) | (reg))
-
-/*****************************************************************************/
-
-/*
- *     Global configuration control register bit definitions.
- */
-#define        GCCR_NOACK              0x00
-#define        GCCR_IVRACK             0x02
-#define        GCCR_IVRCHANACK         0x04
-#define        GCCR_IVRTYPCHANACK      0x06
-#define        GCCR_ASYNCCYCLE         0x00
-#define        GCCR_SYNCCYCLE          0x40
-
-/*****************************************************************************/
-
-/*
- *     Mode register 0 bit definitions.
- */
-#define        MR0_ADDRNONE            0x00
-#define        MR0_AUTOWAKE            0x01
-#define        MR0_AUTODOZE            0x02
-#define        MR0_AUTOWAKEDOZE        0x03
-#define        MR0_SWFNONE             0x00
-#define        MR0_SWFTX               0x04
-#define        MR0_SWFRX               0x08
-#define        MR0_SWFRXTX             0x0c
-#define        MR0_TXMASK              0x30
-#define        MR0_TXEMPTY             0x00
-#define        MR0_TXHIGH              0x10
-#define        MR0_TXHALF              0x20
-#define        MR0_TXRDY               0x00
-#define        MR0_ADDRNT              0x00
-#define        MR0_ADDRT               0x40
-#define        MR0_SWFNT               0x00
-#define        MR0_SWFT                0x80
-
-/*
- *     Mode register 1 bit definitions.
- */
-#define        MR1_CS5                 0x00
-#define        MR1_CS6                 0x01
-#define        MR1_CS7                 0x02
-#define        MR1_CS8                 0x03
-#define        MR1_PAREVEN             0x00
-#define        MR1_PARODD              0x04
-#define        MR1_PARENB              0x00
-#define        MR1_PARFORCE            0x08
-#define        MR1_PARNONE             0x10
-#define        MR1_PARSPECIAL          0x18
-#define        MR1_ERRCHAR             0x00
-#define        MR1_ERRBLOCK            0x20
-#define        MR1_ISRUNMASKED         0x00
-#define        MR1_ISRMASKED           0x40
-#define        MR1_AUTORTS             0x80
-
-/*
- *     Mode register 2 bit definitions.
- */
-#define        MR2_STOP1               0x00
-#define        MR2_STOP15              0x01
-#define        MR2_STOP2               0x02
-#define        MR2_STOP916             0x03
-#define        MR2_RXFIFORDY           0x00
-#define        MR2_RXFIFOHALF          0x04
-#define        MR2_RXFIFOHIGH          0x08
-#define        MR2_RXFIFOFULL          0x0c
-#define        MR2_AUTOCTS             0x10
-#define        MR2_TXRTS               0x20
-#define        MR2_MODENORM            0x00
-#define        MR2_MODEAUTOECHO        0x40
-#define        MR2_MODELOOP            0x80
-#define        MR2_MODEREMECHO         0xc0
-
-/*****************************************************************************/
-
-/*
- *     Baud Rate Generator (BRG) selector values.
- */
-#define        BRG_50                  0x00
-#define        BRG_75                  0x01
-#define        BRG_150                 0x02
-#define        BRG_200                 0x03
-#define        BRG_300                 0x04
-#define        BRG_450                 0x05
-#define        BRG_600                 0x06
-#define        BRG_900                 0x07
-#define        BRG_1200                0x08
-#define        BRG_1800                0x09
-#define        BRG_2400                0x0a
-#define        BRG_3600                0x0b
-#define        BRG_4800                0x0c
-#define        BRG_7200                0x0d
-#define        BRG_9600                0x0e
-#define        BRG_14400               0x0f
-#define        BRG_19200               0x10
-#define        BRG_28200               0x11
-#define        BRG_38400               0x12
-#define        BRG_57600               0x13
-#define        BRG_115200              0x14
-#define        BRG_230400              0x15
-#define        BRG_GIN0                0x16
-#define        BRG_GIN1                0x17
-#define        BRG_CT0                 0x18
-#define        BRG_CT1                 0x19
-#define        BRG_RX2TX316            0x1b
-#define        BRG_RX2TX31             0x1c
-
-#define        SC26198_MAXBAUD         921600
-
-/*****************************************************************************/
-
-/*
- *     Command register command definitions.
- */
-#define        CR_NULL                 0x04
-#define        CR_ADDRNORMAL           0x0c
-#define        CR_RXRESET              0x14
-#define        CR_TXRESET              0x1c
-#define        CR_CLEARRXERR           0x24
-#define        CR_BREAKRESET           0x2c
-#define        CR_TXSTARTBREAK         0x34
-#define        CR_TXSTOPBREAK          0x3c
-#define        CR_RTSON                0x44
-#define        CR_RTSOFF               0x4c
-#define        CR_ADDRINIT             0x5c
-#define        CR_RXERRBLOCK           0x6c
-#define        CR_TXSENDXON            0x84
-#define        CR_TXSENDXOFF           0x8c
-#define        CR_GANGXONSET           0x94
-#define        CR_GANGXOFFSET          0x9c
-#define        CR_GANGXONINIT          0xa4
-#define        CR_GANGXOFFINIT         0xac
-#define        CR_HOSTXON              0xb4
-#define        CR_HOSTXOFF             0xbc
-#define        CR_CANCELXOFF           0xc4
-#define        CR_ADDRRESET            0xdc
-#define        CR_RESETALLPORTS        0xf4
-#define        CR_RESETALL             0xfc
-
-#define        CR_RXENABLE             0x01
-#define        CR_TXENABLE             0x02
-
-/*****************************************************************************/
-
-/*
- *     Channel status register.
- */
-#define        SR_RXRDY                0x01
-#define        SR_RXFULL               0x02
-#define        SR_TXRDY                0x04
-#define        SR_TXEMPTY              0x08
-#define        SR_RXOVERRUN            0x10
-#define        SR_RXPARITY             0x20
-#define        SR_RXFRAMING            0x40
-#define        SR_RXBREAK              0x80
-
-#define        SR_RXERRS               (SR_RXPARITY | SR_RXFRAMING | SR_RXOVERRUN)
-
-/*****************************************************************************/
-
-/*
- *     Interrupt status register and interrupt mask register bit definitions.
- */
-#define        IR_TXRDY                0x01
-#define        IR_RXRDY                0x02
-#define        IR_RXBREAK              0x04
-#define        IR_XONXOFF              0x10
-#define        IR_ADDRRECOG            0x20
-#define        IR_RXWATCHDOG           0x40
-#define        IR_IOPORT               0x80
-
-/*****************************************************************************/
-
-/*
- *     Interrupt vector register field definitions.
- */
-#define        IVR_CHANMASK            0x07
-#define        IVR_TYPEMASK            0x18
-#define        IVR_CONSTMASK           0xc0
-
-#define        IVR_RXDATA              0x10
-#define        IVR_RXBADDATA           0x18
-#define        IVR_TXDATA              0x08
-#define        IVR_OTHER               0x00
-
-/*****************************************************************************/
-
-/*
- *     BRG timer control register bit definitions.
- */
-#define        BRGCTCR_DISABCLK0       0x00
-#define        BRGCTCR_ENABCLK0        0x08
-#define        BRGCTCR_DISABCLK1       0x00
-#define        BRGCTCR_ENABCLK1        0x80
-
-#define        BRGCTCR_0SCLK16         0x00
-#define        BRGCTCR_0SCLK32         0x01
-#define        BRGCTCR_0SCLK64         0x02
-#define        BRGCTCR_0SCLK128        0x03
-#define        BRGCTCR_0X1             0x04
-#define        BRGCTCR_0X12            0x05
-#define        BRGCTCR_0IO1A           0x06
-#define        BRGCTCR_0GIN0           0x07
-
-#define        BRGCTCR_1SCLK16         0x00
-#define        BRGCTCR_1SCLK32         0x10
-#define        BRGCTCR_1SCLK64         0x20
-#define        BRGCTCR_1SCLK128        0x30
-#define        BRGCTCR_1X1             0x40
-#define        BRGCTCR_1X12            0x50
-#define        BRGCTCR_1IO1B           0x60
-#define        BRGCTCR_1GIN1           0x70
-
-/*****************************************************************************/
-
-/*
- *     Watch dog timer enable register.
- */
-#define        WDTRCR_ENABALL          0xff
-
-/*****************************************************************************/
-
-/*
- *     XON/XOFF interrupt status register.
- */
-#define        XISR_TXCHARMASK         0x03
-#define        XISR_TXCHARNORMAL       0x00
-#define        XISR_TXWAIT             0x01
-#define        XISR_TXXOFFPEND         0x02
-#define        XISR_TXXONPEND          0x03
-
-#define        XISR_TXFLOWMASK         0x0c
-#define        XISR_TXNORMAL           0x00
-#define        XISR_TXSTOPPEND         0x04
-#define        XISR_TXSTARTED          0x08
-#define        XISR_TXSTOPPED          0x0c
-
-#define        XISR_RXFLOWMASK         0x30
-#define        XISR_RXFLOWNONE         0x00
-#define        XISR_RXXONSENT          0x10
-#define        XISR_RXXOFFSENT         0x20
-
-#define        XISR_RXXONGOT           0x40
-#define        XISR_RXXOFFGOT          0x80
-
-/*****************************************************************************/
-
-/*
- *     Current interrupt register.
- */
-#define        CIR_TYPEMASK            0xc0
-#define        CIR_TYPEOTHER           0x00
-#define        CIR_TYPETX              0x40
-#define        CIR_TYPERXGOOD          0x80
-#define        CIR_TYPERXBAD           0xc0
-
-#define        CIR_RXDATA              0x80
-#define        CIR_RXBADDATA           0x40
-#define        CIR_TXDATA              0x40
-
-#define        CIR_CHANMASK            0x07
-#define        CIR_CNTMASK             0x38
-
-#define        CIR_SUBTYPEMASK         0x38
-#define        CIR_SUBNONE             0x00
-#define        CIR_SUBCOS              0x08
-#define        CIR_SUBADDR             0x10
-#define        CIR_SUBXONXOFF          0x18
-#define        CIR_SUBBREAK            0x28
-
-/*****************************************************************************/
-
-/*
- *     Global interrupting channel register.
- */
-#define        GICR_CHANMASK           0x07
-
-/*****************************************************************************/
-
-/*
- *     Global interrupting byte count register.
- */
-#define        GICR_COUNTMASK          0x0f
-
-/*****************************************************************************/
-
-/*
- *     Global interrupting type register.
- */
-#define        GITR_RXMASK             0xc0
-#define        GITR_RXNONE             0x00
-#define        GITR_RXBADDATA          0x80
-#define        GITR_RXGOODDATA         0xc0
-#define        GITR_TXDATA             0x20
-
-#define        GITR_SUBTYPEMASK        0x07
-#define        GITR_SUBNONE            0x00
-#define        GITR_SUBCOS             0x01
-#define        GITR_SUBADDR            0x02
-#define        GITR_SUBXONXOFF         0x03
-#define        GITR_SUBBREAK           0x05
-
-/*****************************************************************************/
-
-/*
- *     Input port change register.
- */
-#define        IPR_CTS                 0x01
-#define        IPR_DTR                 0x02
-#define        IPR_RTS                 0x04
-#define        IPR_DCD                 0x08
-#define        IPR_CTSCHANGE           0x10
-#define        IPR_DTRCHANGE           0x20
-#define        IPR_RTSCHANGE           0x40
-#define        IPR_DCDCHANGE           0x80
-
-#define        IPR_CHANGEMASK          0xf0
-
-/*****************************************************************************/
-
-/*
- *     IO port interrupt and output register.
- */
-#define        IOPR_CTS                0x01
-#define        IOPR_DTR                0x02
-#define        IOPR_RTS                0x04
-#define        IOPR_DCD                0x08
-#define        IOPR_CTSCOS             0x10
-#define        IOPR_DTRCOS             0x20
-#define        IOPR_RTSCOS             0x40
-#define        IOPR_DCDCOS             0x80
-
-/*****************************************************************************/
-
-/*
- *     IO port configuration register.
- */
-#define        IOPCR_SETCTS            0x00
-#define        IOPCR_SETDTR            0x04
-#define        IOPCR_SETRTS            0x10
-#define        IOPCR_SETDCD            0x00
-
-#define        IOPCR_SETSIGS           (IOPCR_SETRTS | IOPCR_SETRTS | IOPCR_SETDTR | IOPCR_SETDCD)
-
-/*****************************************************************************/
-
-/*
- *     General purpose output select register.
- */
-#define        GPORS_TXC1XA            0x08
-#define        GPORS_TXC16XA           0x09
-#define        GPORS_RXC16XA           0x0a
-#define        GPORS_TXC16XB           0x0b
-#define        GPORS_GPOR3             0x0c
-#define        GPORS_GPOR2             0x0d
-#define        GPORS_GPOR1             0x0e
-#define        GPORS_GPOR0             0x0f
-
-/*****************************************************************************/
-
-/*
- *     General purpose output register.
- */
-#define        GPOR_0                  0x01
-#define        GPOR_1                  0x02
-#define        GPOR_2                  0x04
-#define        GPOR_3                  0x08
-
-/*****************************************************************************/
-
-/*
- *     General purpose output clock register.
- */
-#define        GPORC_0NONE             0x00
-#define        GPORC_0GIN0             0x01
-#define        GPORC_0GIN1             0x02
-#define        GPORC_0IO3A             0x02
-
-#define        GPORC_1NONE             0x00
-#define        GPORC_1GIN0             0x04
-#define        GPORC_1GIN1             0x08
-#define        GPORC_1IO3C             0x0c
-
-#define        GPORC_2NONE             0x00
-#define        GPORC_2GIN0             0x10
-#define        GPORC_2GIN1             0x20
-#define        GPORC_2IO3E             0x20
-
-#define        GPORC_3NONE             0x00
-#define        GPORC_3GIN0             0x40
-#define        GPORC_3GIN1             0x80
-#define        GPORC_3IO3G             0xc0
-
-/*****************************************************************************/
-
-/*
- *     General purpose output data register.
- */
-#define        GPOD_0MASK              0x03
-#define        GPOD_0SET1              0x00
-#define        GPOD_0SET0              0x01
-#define        GPOD_0SETR0             0x02
-#define        GPOD_0SETIO3B           0x03
-
-#define        GPOD_1MASK              0x0c
-#define        GPOD_1SET1              0x00
-#define        GPOD_1SET0              0x04
-#define        GPOD_1SETR0             0x08
-#define        GPOD_1SETIO3D           0x0c
-
-#define        GPOD_2MASK              0x30
-#define        GPOD_2SET1              0x00
-#define        GPOD_2SET0              0x10
-#define        GPOD_2SETR0             0x20
-#define        GPOD_2SETIO3F           0x30
-
-#define        GPOD_3MASK              0xc0
-#define        GPOD_3SET1              0x00
-#define        GPOD_3SET0              0x40
-#define        GPOD_3SETR0             0x80
-#define        GPOD_3SETIO3H           0xc0
-
-/*****************************************************************************/
-#endif
index b8c8664..23bddac 100644 (file)
@@ -954,7 +954,6 @@ struct sched_domain {
        unsigned int smt_gain;
        int flags;                      /* See SD_* */
        int level;
-       int idle_buddy;                 /* cpu assigned to select_idle_sibling() */
 
        /* Runtime fields. */
        unsigned long last_balance;     /* init to jiffies. units in jiffies */
index 90e9f98..861e51d 100644 (file)
 
 #include <linux/types.h>
 
+#include <linux/tty_flags.h>
+
 #ifdef __KERNEL__
 #include <asm/page.h>
 
+
 /*
  * Counters of the input lines (CTS, DSR, RI, CD) interrupts
  */
@@ -83,89 +86,11 @@ struct serial_struct {
 #define SERIAL_IO_HUB6 1
 #define SERIAL_IO_MEM  2
 
-struct serial_uart_config {
-       char    *name;
-       int     dfl_xmit_fifo_size;
-       int     flags;
-};
-
 #define UART_CLEAR_FIFO                0x01
 #define UART_USE_FIFO          0x02
 #define UART_STARTECH          0x04
 #define UART_NATSEMI           0x08
 
-/*
- * Definitions for async_struct (and serial_struct) flags field
- *
- * Define ASYNCB_* for convenient use with {test,set,clear}_bit.
- */
-#define ASYNCB_HUP_NOTIFY       0 /* Notify getty on hangups and closes
-                                   * on the callout port */
-#define ASYNCB_FOURPORT                 1 /* Set OU1, OUT2 per AST Fourport settings */
-#define ASYNCB_SAK              2 /* Secure Attention Key (Orange book) */
-#define ASYNCB_SPLIT_TERMIOS    3 /* Separate termios for dialin/callout */
-#define ASYNCB_SPD_HI           4 /* Use 56000 instead of 38400 bps */
-#define ASYNCB_SPD_VHI          5 /* Use 115200 instead of 38400 bps */
-#define ASYNCB_SKIP_TEST        6 /* Skip UART test during autoconfiguration */
-#define ASYNCB_AUTO_IRQ                 7 /* Do automatic IRQ during
-                                   * autoconfiguration */
-#define ASYNCB_SESSION_LOCKOUT  8 /* Lock out cua opens based on session */
-#define ASYNCB_PGRP_LOCKOUT     9 /* Lock out cua opens based on pgrp */
-#define ASYNCB_CALLOUT_NOHUP   10 /* Don't do hangups for cua device */
-#define ASYNCB_HARDPPS_CD      11 /* Call hardpps when CD goes high  */
-#define ASYNCB_SPD_SHI         12 /* Use 230400 instead of 38400 bps */
-#define ASYNCB_LOW_LATENCY     13 /* Request low latency behaviour */
-#define ASYNCB_BUGGY_UART      14 /* This is a buggy UART, skip some safety
-                                   * checks.  Note: can be dangerous! */
-#define ASYNCB_AUTOPROBE       15 /* Port was autoprobed by PCI or PNP code */
-#define ASYNCB_LAST_USER       15
-
-/* Internal flags used only by kernel */
-#define ASYNCB_INITIALIZED     31 /* Serial port was initialized */
-#define ASYNCB_SUSPENDED       30 /* Serial port is suspended */
-#define ASYNCB_NORMAL_ACTIVE   29 /* Normal device is active */
-#define ASYNCB_BOOT_AUTOCONF   28 /* Autoconfigure port on bootup */
-#define ASYNCB_CLOSING         27 /* Serial port is closing */
-#define ASYNCB_CTS_FLOW                26 /* Do CTS flow control */
-#define ASYNCB_CHECK_CD                25 /* i.e., CLOCAL */
-#define ASYNCB_SHARE_IRQ       24 /* for multifunction cards, no longer used */
-#define ASYNCB_CONS_FLOW       23 /* flow control for console  */
-#define ASYNCB_FIRST_KERNEL    22
-
-#define ASYNC_HUP_NOTIFY       (1U << ASYNCB_HUP_NOTIFY)
-#define ASYNC_SUSPENDED                (1U << ASYNCB_SUSPENDED)
-#define ASYNC_FOURPORT         (1U << ASYNCB_FOURPORT)
-#define ASYNC_SAK              (1U << ASYNCB_SAK)
-#define ASYNC_SPLIT_TERMIOS    (1U << ASYNCB_SPLIT_TERMIOS)
-#define ASYNC_SPD_HI           (1U << ASYNCB_SPD_HI)
-#define ASYNC_SPD_VHI          (1U << ASYNCB_SPD_VHI)
-#define ASYNC_SKIP_TEST                (1U << ASYNCB_SKIP_TEST)
-#define ASYNC_AUTO_IRQ         (1U << ASYNCB_AUTO_IRQ)
-#define ASYNC_SESSION_LOCKOUT  (1U << ASYNCB_SESSION_LOCKOUT)
-#define ASYNC_PGRP_LOCKOUT     (1U << ASYNCB_PGRP_LOCKOUT)
-#define ASYNC_CALLOUT_NOHUP    (1U << ASYNCB_CALLOUT_NOHUP)
-#define ASYNC_HARDPPS_CD       (1U << ASYNCB_HARDPPS_CD)
-#define ASYNC_SPD_SHI          (1U << ASYNCB_SPD_SHI)
-#define ASYNC_LOW_LATENCY      (1U << ASYNCB_LOW_LATENCY)
-#define ASYNC_BUGGY_UART       (1U << ASYNCB_BUGGY_UART)
-#define ASYNC_AUTOPROBE                (1U << ASYNCB_AUTOPROBE)
-
-#define ASYNC_FLAGS            ((1U << (ASYNCB_LAST_USER + 1)) - 1)
-#define ASYNC_USR_MASK         (ASYNC_SPD_MASK|ASYNC_CALLOUT_NOHUP| \
-               ASYNC_LOW_LATENCY)
-#define ASYNC_SPD_CUST         (ASYNC_SPD_HI|ASYNC_SPD_VHI)
-#define ASYNC_SPD_WARP         (ASYNC_SPD_HI|ASYNC_SPD_SHI)
-#define ASYNC_SPD_MASK         (ASYNC_SPD_HI|ASYNC_SPD_VHI|ASYNC_SPD_SHI)
-
-#define ASYNC_INITIALIZED      (1U << ASYNCB_INITIALIZED)
-#define ASYNC_NORMAL_ACTIVE    (1U << ASYNCB_NORMAL_ACTIVE)
-#define ASYNC_BOOT_AUTOCONF    (1U << ASYNCB_BOOT_AUTOCONF)
-#define ASYNC_CLOSING          (1U << ASYNCB_CLOSING)
-#define ASYNC_CTS_FLOW         (1U << ASYNCB_CTS_FLOW)
-#define ASYNC_CHECK_CD         (1U << ASYNCB_CHECK_CD)
-#define ASYNC_SHARE_IRQ                (1U << ASYNCB_SHARE_IRQ)
-#define ASYNC_CONS_FLOW                (1U << ASYNCB_CONS_FLOW)
-#define ASYNC_INTERNAL_FLAGS   (~((1U << ASYNCB_FIRST_KERNEL) - 1))
 
 /*
  * Multiport serial configuration structure --- external structure
diff --git a/include/linux/serial167.h b/include/linux/serial167.h
deleted file mode 100644 (file)
index 59c81b7..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * serial167.h
- *
- * Richard Hirst [richard@sleepie.demon.co.uk]
- *
- * Based on cyclades.h
- */
-
-struct cyclades_monitor {
-        unsigned long           int_count;
-        unsigned long           char_count;
-        unsigned long           char_max;
-        unsigned long           char_last;
-};
-
-/*
- * This is our internal structure for each serial port's state.
- * 
- * Many fields are paralleled by the structure used by the serial_struct
- * structure.
- *
- * For definitions of the flags field, see tty.h
- */
-
-struct cyclades_port {
-       int                     magic;
-       int                     type;
-       int                     card;
-       int                     line;
-       int                     flags;          /* defined in tty.h */
-       struct tty_struct       *tty;
-       int                     read_status_mask;
-       int                     timeout;
-       int                     xmit_fifo_size;
-       int                     cor1,cor2,cor3,cor4,cor5,cor6,cor7;
-       int                     tbpr,tco,rbpr,rco;
-       int                     ignore_status_mask;
-       int                     close_delay;
-       int                     IER;    /* Interrupt Enable Register */
-       unsigned long           last_active;
-       int                     count;  /* # of fd on device */
-       int                     x_char; /* to be pushed out ASAP */
-       int                     x_break;
-       int                     blocked_open; /* # of blocked opens */
-       unsigned char           *xmit_buf;
-       int                     xmit_head;
-       int                     xmit_tail;
-       int                     xmit_cnt;
-        int                     default_threshold;
-        int                     default_timeout;
-       wait_queue_head_t       open_wait;
-       wait_queue_head_t       close_wait;
-        struct cyclades_monitor mon;
-};
-
-#define CYCLADES_MAGIC  0x4359
-
-#define CYGETMON                0x435901
-#define CYGETTHRESH             0x435902
-#define CYSETTHRESH             0x435903
-#define CYGETDEFTHRESH          0x435904
-#define CYSETDEFTHRESH          0x435905
-#define CYGETTIMEOUT            0x435906
-#define CYSETTIMEOUT            0x435907
-#define CYGETDEFTIMEOUT         0x435908
-#define CYSETDEFTIMEOUT         0x435909
-
-#define CyMaxChipsPerCard 1
-
-/**** cd2401 registers ****/
-
-#define CyGFRCR         (0x81)
-#define CyCCR          (0x13)
-#define      CyCLR_CHAN                (0x40)
-#define      CyINIT_CHAN       (0x20)
-#define      CyCHIP_RESET      (0x10)
-#define      CyENB_XMTR                (0x08)
-#define      CyDIS_XMTR                (0x04)
-#define      CyENB_RCVR                (0x02)
-#define      CyDIS_RCVR                (0x01)
-#define CyCAR          (0xee)
-#define CyIER          (0x11)
-#define      CyMdmCh           (0x80)
-#define      CyRxExc           (0x20)
-#define      CyRxData          (0x08)
-#define      CyTxMpty          (0x02)
-#define      CyTxRdy           (0x01)
-#define CyLICR         (0x26)
-#define CyRISR         (0x89)
-#define      CyTIMEOUT         (0x80)
-#define      CySPECHAR         (0x70)
-#define      CyOVERRUN         (0x08)
-#define      CyPARITY          (0x04)
-#define      CyFRAME           (0x02)
-#define      CyBREAK           (0x01)
-#define CyREOIR                (0x84)
-#define CyTEOIR                (0x85)
-#define CyMEOIR                (0x86)
-#define      CyNOTRANS         (0x08)
-#define CyRFOC         (0x30)
-#define CyRDR          (0xf8)
-#define CyTDR          (0xf8)
-#define CyMISR         (0x8b)
-#define CyRISR         (0x89)
-#define CyTISR         (0x8a)
-#define CyMSVR1                (0xde)
-#define CyMSVR2                (0xdf)
-#define      CyDSR             (0x80)
-#define      CyDCD             (0x40)
-#define      CyCTS             (0x20)
-#define      CyDTR             (0x02)
-#define      CyRTS             (0x01)
-#define CyRTPRL                (0x25)
-#define CyRTPRH                (0x24)
-#define CyCOR1         (0x10)
-#define      CyPARITY_NONE     (0x00)
-#define      CyPARITY_E                (0x40)
-#define      CyPARITY_O                (0xC0)
-#define      Cy_5_BITS         (0x04)
-#define      Cy_6_BITS         (0x05)
-#define      Cy_7_BITS         (0x06)
-#define      Cy_8_BITS         (0x07)
-#define CyCOR2         (0x17)
-#define      CyETC             (0x20)
-#define      CyCtsAE           (0x02)
-#define CyCOR3         (0x16)
-#define      Cy_1_STOP         (0x02)
-#define      Cy_2_STOP         (0x04)
-#define CyCOR4         (0x15)
-#define      CyREC_FIFO                (0x0F)  /* Receive FIFO threshold */
-#define CyCOR5         (0x14)
-#define CyCOR6         (0x18)
-#define CyCOR7         (0x07)
-#define CyRBPR         (0xcb)
-#define CyRCOR         (0xc8)
-#define CyTBPR         (0xc3)
-#define CyTCOR         (0xc0)
-#define CySCHR1                (0x1f)
-#define CySCHR2        (0x1e)
-#define CyTPR          (0xda)
-#define CyPILR1                (0xe3)
-#define CyPILR2                (0xe0)
-#define CyPILR3                (0xe1)
-#define CyCMR          (0x1b)
-#define      CyASYNC           (0x02)
-#define CyLICR          (0x26)
-#define CyLIVR          (0x09)
-#define CySCRL         (0x23)
-#define CySCRH         (0x22)
-#define CyTFTC         (0x80)
-
-
-/* max number of chars in the FIFO */
-
-#define CyMAX_CHAR_FIFO        12
-
-/***************************************************************************/
index a416e92..c174c90 100644 (file)
@@ -65,11 +65,38 @@ enum {
  * platform device.  Using these will make your driver
  * dependent on the 8250 driver.
  */
-struct uart_port;
-struct uart_8250_port;
+
+struct uart_8250_port {
+       struct uart_port        port;
+       struct timer_list       timer;          /* "no irq" timer */
+       struct list_head        list;           /* ports on this IRQ */
+       unsigned short          capabilities;   /* port capabilities */
+       unsigned short          bugs;           /* port bugs */
+       unsigned int            tx_loadsz;      /* transmit fifo load size */
+       unsigned char           acr;
+       unsigned char           ier;
+       unsigned char           lcr;
+       unsigned char           mcr;
+       unsigned char           mcr_mask;       /* mask of user bits */
+       unsigned char           mcr_force;      /* mask of forced bits */
+       unsigned char           cur_iotype;     /* Running I/O type */
+
+       /*
+        * Some bits in registers are cleared on a read, so they must
+        * be saved whenever the register is read but the bits will not
+        * be immediately processed.
+        */
+#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
+       unsigned char           lsr_saved_flags;
+#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
+       unsigned char           msr_saved_flags;
+
+       /* 8250 specific callbacks */
+       int                     (*dl_read)(struct uart_8250_port *);
+       void                    (*dl_write)(struct uart_8250_port *, int);
+};
 
 int serial8250_register_8250_port(struct uart_8250_port *);
-int serial8250_register_port(struct uart_port *);
 void serial8250_unregister_port(int line);
 void serial8250_suspend_port(int line);
 void serial8250_resume_port(int line);
index 0253c20..7cf0b68 100644 (file)
 /* SH-SCI */
 #define PORT_SCIFB     93
 
-/* MAX3107 */
-#define PORT_MAX3107   94
+/* MAX310X */
+#define PORT_MAX310X   94
 
 /* High Speed UART for Medfield */
 #define PORT_MFD       95
index 8ce70d7..5ed325e 100644 (file)
 
 #define UART_IIR_BUSY          0x07 /* DesignWare APB Busy Detect */
 
+#define UART_IIR_RX_TIMEOUT    0x0c /* OMAP RX Timeout interrupt */
+#define UART_IIR_XOFF          0x10 /* OMAP XOFF/Special Character */
+#define UART_IIR_CTS_RTS_DSR   0x20 /* OMAP CTS/RTS/DSR Change */
+
 #define UART_FCR       2       /* Out: FIFO Control Register */
 #define UART_FCR_ENABLE_FIFO   0x01 /* Enable the FIFO */
 #define UART_FCR_CLEAR_RCVR    0x02 /* Clear the RCVR FIFO */
diff --git a/include/linux/stallion.h b/include/linux/stallion.h
deleted file mode 100644 (file)
index 336af33..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*****************************************************************************/
-
-/*
- *     stallion.h  -- stallion multiport serial driver.
- *
- *     Copyright (C) 1996-1998  Stallion Technologies
- *     Copyright (C) 1994-1996  Greg Ungerer.
- *
- *     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        _STALLION_H
-#define        _STALLION_H
-/*****************************************************************************/
-
-/*
- *     Define important driver constants here.
- */
-#define        STL_MAXBRDS             4
-#define        STL_MAXPANELS           4
-#define        STL_MAXBANKS            8
-#define        STL_PORTSPERPANEL       16
-#define        STL_MAXPORTS            64
-#define        STL_MAXDEVS             (STL_MAXBRDS * STL_MAXPORTS)
-
-
-/*
- *     Define a set of structures to hold all the board/panel/port info
- *     for our ports. These will be dynamically allocated as required.
- */
-
-/*
- *     Define a ring queue structure for each port. This will hold the
- *     TX data waiting to be output. Characters are fed into this buffer
- *     from the line discipline (or even direct from user space!) and
- *     then fed into the UARTs during interrupts. Will use a classic ring
- *     queue here for this. The good thing about this type of ring queue
- *     is that the head and tail pointers can be updated without interrupt
- *     protection - since "write" code only needs to change the head, and
- *     interrupt code only needs to change the tail.
- */
-struct stlrq {
-       char    *buf;
-       char    *head;
-       char    *tail;
-};
-
-/*
- *     Port, panel and board structures to hold status info about each.
- *     The board structure contains pointers to structures for each panel
- *     connected to it, and in turn each panel structure contains pointers
- *     for each port structure for each port on that panel. Note that
- *     the port structure also contains the board and panel number that it
- *     is associated with, this makes it (fairly) easy to get back to the
- *     board/panel info for a port.
- */
-struct stlport {
-       unsigned long           magic;
-       struct tty_port         port;
-       unsigned int            portnr;
-       unsigned int            panelnr;
-       unsigned int            brdnr;
-       int                     ioaddr;
-       int                     uartaddr;
-       unsigned int            pagenr;
-       unsigned long           istate;
-       int                     baud_base;
-       int                     custom_divisor;
-       int                     close_delay;
-       int                     closing_wait;
-       int                     openwaitcnt;
-       int                     brklen;
-       unsigned int            sigs;
-       unsigned int            rxignoremsk;
-       unsigned int            rxmarkmsk;
-       unsigned int            imr;
-       unsigned int            crenable;
-       unsigned long           clk;
-       unsigned long           hwid;
-       void                    *uartp;
-       comstats_t              stats;
-       struct stlrq            tx;
-};
-
-struct stlpanel {
-       unsigned long   magic;
-       unsigned int    panelnr;
-       unsigned int    brdnr;
-       unsigned int    pagenr;
-       unsigned int    nrports;
-       int             iobase;
-       void            *uartp;
-       void            (*isr)(struct stlpanel *panelp, unsigned int iobase);
-       unsigned int    hwid;
-       unsigned int    ackmask;
-       struct stlport  *ports[STL_PORTSPERPANEL];
-};
-
-struct stlbrd {
-       unsigned long   magic;
-       unsigned int    brdnr;
-       unsigned int    brdtype;
-       unsigned int    state;
-       unsigned int    nrpanels;
-       unsigned int    nrports;
-       unsigned int    nrbnks;
-       int             irq;
-       int             irqtype;
-       int             (*isr)(struct stlbrd *brdp);
-       unsigned int    ioaddr1;
-       unsigned int    ioaddr2;
-       unsigned int    iosize1;
-       unsigned int    iosize2;
-       unsigned int    iostatus;
-       unsigned int    ioctrl;
-       unsigned int    ioctrlval;
-       unsigned int    hwid;
-       unsigned long   clk;
-       unsigned int    bnkpageaddr[STL_MAXBANKS];
-       unsigned int    bnkstataddr[STL_MAXBANKS];
-       struct stlpanel *bnk2panel[STL_MAXBANKS];
-       struct stlpanel *panels[STL_MAXPANELS];
-};
-
-
-/*
- *     Define MAGIC numbers used for above structures.
- */
-#define        STL_PORTMAGIC   0x5a7182c9
-#define        STL_PANELMAGIC  0x7ef621a1
-#define        STL_BOARDMAGIC  0xa2267f52
-
-/*****************************************************************************/
-#endif
index cff40aa..bf8c49f 100644 (file)
@@ -114,6 +114,7 @@ struct rpc_xprt_ops {
        void            (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize);
        int             (*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
        void            (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
+       void            (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task);
        void            (*rpcbind)(struct rpc_task *task);
        void            (*set_port)(struct rpc_xprt *xprt, unsigned short port);
        void            (*connect)(struct rpc_task *task);
@@ -281,6 +282,8 @@ void                        xprt_connect(struct rpc_task *task);
 void                   xprt_reserve(struct rpc_task *task);
 int                    xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
 int                    xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
+void                   xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
+void                   xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
 int                    xprt_prepare_transmit(struct rpc_task *task);
 void                   xprt_transmit(struct rpc_task *task);
 void                   xprt_end_transmit(struct rpc_task *task);
index 9f47ab5..1509b86 100644 (file)
@@ -43,6 +43,7 @@
 #include <linux/tty_driver.h>
 #include <linux/tty_ldisc.h>
 #include <linux/mutex.h>
+#include <linux/tty_flags.h>
 
 
 
@@ -103,28 +104,28 @@ struct tty_bufhead {
 #define TTY_PARITY     3
 #define TTY_OVERRUN    4
 
-#define INTR_CHAR(tty) ((tty)->termios->c_cc[VINTR])
-#define QUIT_CHAR(tty) ((tty)->termios->c_cc[VQUIT])
-#define ERASE_CHAR(tty) ((tty)->termios->c_cc[VERASE])
-#define KILL_CHAR(tty) ((tty)->termios->c_cc[VKILL])
-#define EOF_CHAR(tty) ((tty)->termios->c_cc[VEOF])
-#define TIME_CHAR(tty) ((tty)->termios->c_cc[VTIME])
-#define MIN_CHAR(tty) ((tty)->termios->c_cc[VMIN])
-#define SWTC_CHAR(tty) ((tty)->termios->c_cc[VSWTC])
-#define START_CHAR(tty) ((tty)->termios->c_cc[VSTART])
-#define STOP_CHAR(tty) ((tty)->termios->c_cc[VSTOP])
-#define SUSP_CHAR(tty) ((tty)->termios->c_cc[VSUSP])
-#define EOL_CHAR(tty) ((tty)->termios->c_cc[VEOL])
-#define REPRINT_CHAR(tty) ((tty)->termios->c_cc[VREPRINT])
-#define DISCARD_CHAR(tty) ((tty)->termios->c_cc[VDISCARD])
-#define WERASE_CHAR(tty) ((tty)->termios->c_cc[VWERASE])
-#define LNEXT_CHAR(tty)        ((tty)->termios->c_cc[VLNEXT])
-#define EOL2_CHAR(tty) ((tty)->termios->c_cc[VEOL2])
-
-#define _I_FLAG(tty, f)        ((tty)->termios->c_iflag & (f))
-#define _O_FLAG(tty, f)        ((tty)->termios->c_oflag & (f))
-#define _C_FLAG(tty, f)        ((tty)->termios->c_cflag & (f))
-#define _L_FLAG(tty, f)        ((tty)->termios->c_lflag & (f))
+#define INTR_CHAR(tty) ((tty)->termios.c_cc[VINTR])
+#define QUIT_CHAR(tty) ((tty)->termios.c_cc[VQUIT])
+#define ERASE_CHAR(tty) ((tty)->termios.c_cc[VERASE])
+#define KILL_CHAR(tty) ((tty)->termios.c_cc[VKILL])
+#define EOF_CHAR(tty) ((tty)->termios.c_cc[VEOF])
+#define TIME_CHAR(tty) ((tty)->termios.c_cc[VTIME])
+#define MIN_CHAR(tty) ((tty)->termios.c_cc[VMIN])
+#define SWTC_CHAR(tty) ((tty)->termios.c_cc[VSWTC])
+#define START_CHAR(tty) ((tty)->termios.c_cc[VSTART])
+#define STOP_CHAR(tty) ((tty)->termios.c_cc[VSTOP])
+#define SUSP_CHAR(tty) ((tty)->termios.c_cc[VSUSP])
+#define EOL_CHAR(tty) ((tty)->termios.c_cc[VEOL])
+#define REPRINT_CHAR(tty) ((tty)->termios.c_cc[VREPRINT])
+#define DISCARD_CHAR(tty) ((tty)->termios.c_cc[VDISCARD])
+#define WERASE_CHAR(tty) ((tty)->termios.c_cc[VWERASE])
+#define LNEXT_CHAR(tty)        ((tty)->termios.c_cc[VLNEXT])
+#define EOL2_CHAR(tty) ((tty)->termios.c_cc[VEOL2])
+
+#define _I_FLAG(tty, f)        ((tty)->termios.c_iflag & (f))
+#define _O_FLAG(tty, f)        ((tty)->termios.c_oflag & (f))
+#define _C_FLAG(tty, f)        ((tty)->termios.c_cflag & (f))
+#define _L_FLAG(tty, f)        ((tty)->termios.c_lflag & (f))
 
 #define I_IGNBRK(tty)  _I_FLAG((tty), IGNBRK)
 #define I_BRKINT(tty)  _I_FLAG((tty), BRKINT)
@@ -268,10 +269,11 @@ struct tty_struct {
        struct mutex ldisc_mutex;
        struct tty_ldisc *ldisc;
 
+       struct mutex legacy_mutex;
        struct mutex termios_mutex;
        spinlock_t ctrl_lock;
        /* Termios values are protected by the termios mutex */
-       struct ktermios *termios, *termios_locked;
+       struct ktermios termios, termios_locked;
        struct termiox *termiox;        /* May be NULL for unsupported */
        char name[64];
        struct pid *pgrp;               /* Protected by ctrl lock */
@@ -410,6 +412,10 @@ extern int tty_register_driver(struct tty_driver *driver);
 extern int tty_unregister_driver(struct tty_driver *driver);
 extern struct device *tty_register_device(struct tty_driver *driver,
                                          unsigned index, struct device *dev);
+extern struct device *tty_register_device_attr(struct tty_driver *driver,
+                               unsigned index, struct device *device,
+                               void *drvdata,
+                               const struct attribute_group **attr_grp);
 extern void tty_unregister_device(struct tty_driver *driver, unsigned index);
 extern int tty_read_raw_data(struct tty_struct *tty, unsigned char *bufp,
                             int buflen);
@@ -423,7 +429,6 @@ extern void tty_unthrottle(struct tty_struct *tty);
 extern int tty_do_resize(struct tty_struct *tty, struct winsize *ws);
 extern void tty_driver_remove_tty(struct tty_driver *driver,
                                  struct tty_struct *tty);
-extern void tty_shutdown(struct tty_struct *tty);
 extern void tty_free_termios(struct tty_struct *tty);
 extern int is_current_pgrp_orphaned(void);
 extern struct pid *tty_get_pgrp(struct tty_struct *tty);
@@ -497,6 +502,15 @@ extern int tty_write_lock(struct tty_struct *tty, int ndelay);
 #define tty_is_writelocked(tty)  (mutex_is_locked(&tty->atomic_write_lock))
 
 extern void tty_port_init(struct tty_port *port);
+extern void tty_port_link_device(struct tty_port *port,
+               struct tty_driver *driver, unsigned index);
+extern struct device *tty_port_register_device(struct tty_port *port,
+               struct tty_driver *driver, unsigned index,
+               struct device *device);
+extern struct device *tty_port_register_device_attr(struct tty_port *port,
+               struct tty_driver *driver, unsigned index,
+               struct device *device, void *drvdata,
+               const struct attribute_group **attr_grp);
 extern int tty_port_alloc_xmit_buf(struct tty_port *port);
 extern void tty_port_free_xmit_buf(struct tty_port *port);
 extern void tty_port_put(struct tty_port *port);
@@ -508,6 +522,12 @@ static inline struct tty_port *tty_port_get(struct tty_port *port)
        return port;
 }
 
+/* If the cts flow control is enabled, return true. */
+static inline bool tty_port_cts_enabled(struct tty_port *port)
+{
+       return port->flags & ASYNC_CTS_FLOW;
+}
+
 extern struct tty_struct *tty_port_tty_get(struct tty_port *port);
 extern void tty_port_tty_set(struct tty_port *port, struct tty_struct *tty);
 extern int tty_port_carrier_raised(struct tty_port *port);
@@ -521,6 +541,8 @@ extern int tty_port_close_start(struct tty_port *port,
 extern void tty_port_close_end(struct tty_port *port, struct tty_struct *tty);
 extern void tty_port_close(struct tty_port *port,
                                struct tty_struct *tty, struct file *filp);
+extern int tty_port_install(struct tty_port *port, struct tty_driver *driver,
+                               struct tty_struct *tty);
 extern int tty_port_open(struct tty_port *port,
                                struct tty_struct *tty, struct file *filp);
 static inline int tty_port_users(struct tty_port *port)
@@ -605,8 +627,12 @@ extern long vt_compat_ioctl(struct tty_struct *tty,
 
 /* tty_mutex.c */
 /* functions for preparation of BKL removal */
-extern void __lockfunc tty_lock(void) __acquires(tty_lock);
-extern void __lockfunc tty_unlock(void) __releases(tty_lock);
+extern void __lockfunc tty_lock(struct tty_struct *tty);
+extern void __lockfunc tty_unlock(struct tty_struct *tty);
+extern void __lockfunc tty_lock_pair(struct tty_struct *tty,
+                               struct tty_struct *tty2);
+extern void __lockfunc tty_unlock_pair(struct tty_struct *tty,
+                               struct tty_struct *tty2);
 
 /*
  * this shall be called only from where BTM is held (like close)
@@ -621,9 +647,9 @@ extern void __lockfunc tty_unlock(void) __releases(tty_lock);
 static inline void tty_wait_until_sent_from_close(struct tty_struct *tty,
                long timeout)
 {
-       tty_unlock(); /* tty->ops->close holds the BTM, drop it while waiting */
+       tty_unlock(tty); /* tty->ops->close holds the BTM, drop it while waiting */
        tty_wait_until_sent(tty, timeout);
-       tty_lock();
+       tty_lock(tty);
 }
 
 /*
@@ -638,16 +664,16 @@ static inline void tty_wait_until_sent_from_close(struct tty_struct *tty,
  *
  * Do not use in new code.
  */
-#define wait_event_interruptible_tty(wq, condition)                    \
+#define wait_event_interruptible_tty(tty, wq, condition)               \
 ({                                                                     \
        int __ret = 0;                                                  \
        if (!(condition)) {                                             \
-               __wait_event_interruptible_tty(wq, condition, __ret);   \
+               __wait_event_interruptible_tty(tty, wq, condition, __ret);      \
        }                                                               \
        __ret;                                                          \
 })
 
-#define __wait_event_interruptible_tty(wq, condition, ret)             \
+#define __wait_event_interruptible_tty(tty, wq, condition, ret)                \
 do {                                                                   \
        DEFINE_WAIT(__wait);                                            \
                                                                        \
@@ -656,9 +682,9 @@ do {                                                                        \
                if (condition)                                          \
                        break;                                          \
                if (!signal_pending(current)) {                         \
-                       tty_unlock();                                   \
+                       tty_unlock(tty);                                        \
                        schedule();                                     \
-                       tty_lock();                                     \
+                       tty_lock(tty);                                  \
                        continue;                                       \
                }                                                       \
                ret = -ERESTARTSYS;                                     \
index 6e6dbb7..dd976cf 100644 (file)
  *
  * void (*shutdown)(struct tty_struct * tty);
  *
- *     This routine is called synchronously when a particular tty device
- *     is closed for the last time freeing up the resources.
- *     Note that tty_shutdown() is not called if ops->shutdown is defined.
- *     This means one is responsible to take care of calling ops->remove (e.g.
- *     via tty_driver_remove_tty) and releasing tty->termios.
- *     Note that this hook may be called from *all* the contexts where one
- *     uses tty refcounting (e.g. tty_port_tty_get).
- *
+ *     This routine is called under the tty lock when a particular tty device
+ *     is closed for the last time. It executes before the tty resources
+ *     are freed so may execute while another function holds a tty kref.
  *
  * void (*cleanup)(struct tty_struct * tty);
  *
@@ -294,18 +289,18 @@ struct tty_operations {
 struct tty_driver {
        int     magic;          /* magic number for this structure */
        struct kref kref;       /* Reference management */
-       struct cdev cdev;
+       struct cdev *cdevs;
        struct module   *owner;
        const char      *driver_name;
        const char      *name;
        int     name_base;      /* offset of printed name */
        int     major;          /* major device number */
        int     minor_start;    /* start of minor device number */
-       int     num;            /* number of devices allocated */
+       unsigned int    num;    /* number of devices allocated */
        short   type;           /* type of tty driver */
        short   subtype;        /* subtype of tty driver */
        struct ktermios init_termios; /* Initial termios */
-       int     flags;          /* tty driver flags */
+       unsigned long   flags;          /* tty driver flags */
        struct proc_dir_entry *proc_entry; /* /proc fs entry */
        struct tty_driver *other; /* only used for the PTY driver */
 
@@ -313,6 +308,7 @@ struct tty_driver {
         * Pointer to the tty data structures
         */
        struct tty_struct **ttys;
+       struct tty_port **ports;
        struct ktermios **termios;
        void *driver_state;
 
@@ -326,7 +322,8 @@ struct tty_driver {
 
 extern struct list_head tty_drivers;
 
-extern struct tty_driver *__alloc_tty_driver(int lines, struct module *owner);
+extern struct tty_driver *__tty_alloc_driver(unsigned int lines,
+               struct module *owner, unsigned long flags);
 extern void put_tty_driver(struct tty_driver *driver);
 extern void tty_set_operations(struct tty_driver *driver,
                        const struct tty_operations *op);
@@ -334,7 +331,21 @@ extern struct tty_driver *tty_find_polling_driver(char *name, int *line);
 
 extern void tty_driver_kref_put(struct tty_driver *driver);
 
-#define alloc_tty_driver(lines) __alloc_tty_driver(lines, THIS_MODULE)
+/* Use TTY_DRIVER_* flags below */
+#define tty_alloc_driver(lines, flags) \
+               __tty_alloc_driver(lines, THIS_MODULE, flags)
+
+/*
+ * DEPRECATED Do not use this in new code, use tty_alloc_driver instead.
+ * (And change the return value checks.)
+ */
+static inline struct tty_driver *alloc_tty_driver(unsigned int lines)
+{
+       struct tty_driver *ret = tty_alloc_driver(lines, 0);
+       if (IS_ERR(ret))
+               return NULL;
+       return ret;
+}
 
 static inline struct tty_driver *tty_driver_kref_get(struct tty_driver *d)
 {
@@ -380,6 +391,14 @@ static inline struct tty_driver *tty_driver_kref_get(struct tty_driver *d)
  *     the requested timeout to the caller instead of using a simple
  *     on/off interface.
  *
+ * TTY_DRIVER_DYNAMIC_ALLOC -- do not allocate structures which are
+ *     needed per line for this driver as it would waste memory.
+ *     The driver will take care.
+ *
+ * TTY_DRIVER_UNNUMBERED_NODE -- do not create numbered /dev nodes. In
+ *     other words create /dev/ttyprintk and not /dev/ttyprintk0.
+ *     Applicable only when a driver for a single tty device is
+ *     being allocated.
  */
 #define TTY_DRIVER_INSTALLED           0x0001
 #define TTY_DRIVER_RESET_TERMIOS       0x0002
@@ -387,6 +406,8 @@ static inline struct tty_driver *tty_driver_kref_get(struct tty_driver *d)
 #define TTY_DRIVER_DYNAMIC_DEV         0x0008
 #define TTY_DRIVER_DEVPTS_MEM          0x0010
 #define TTY_DRIVER_HARDWARE_BREAK      0x0020
+#define TTY_DRIVER_DYNAMIC_ALLOC       0x0040
+#define TTY_DRIVER_UNNUMBERED_NODE     0x0080
 
 /* tty driver types */
 #define TTY_DRIVER_TYPE_SYSTEM         0x0001
diff --git a/include/linux/tty_flags.h b/include/linux/tty_flags.h
new file mode 100644 (file)
index 0000000..eefcb48
--- /dev/null
@@ -0,0 +1,78 @@
+#ifndef _LINUX_TTY_FLAGS_H
+#define _LINUX_TTY_FLAGS_H
+
+/*
+ * Definitions for async_struct (and serial_struct) flags field also
+ * shared by the tty_port flags structures.
+ *
+ * Define ASYNCB_* for convenient use with {test,set,clear}_bit.
+ */
+#define ASYNCB_HUP_NOTIFY       0 /* Notify getty on hangups and closes
+                                   * on the callout port */
+#define ASYNCB_FOURPORT                 1 /* Set OU1, OUT2 per AST Fourport settings */
+#define ASYNCB_SAK              2 /* Secure Attention Key (Orange book) */
+#define ASYNCB_SPLIT_TERMIOS    3 /* Separate termios for dialin/callout */
+#define ASYNCB_SPD_HI           4 /* Use 56000 instead of 38400 bps */
+#define ASYNCB_SPD_VHI          5 /* Use 115200 instead of 38400 bps */
+#define ASYNCB_SKIP_TEST        6 /* Skip UART test during autoconfiguration */
+#define ASYNCB_AUTO_IRQ                 7 /* Do automatic IRQ during
+                                   * autoconfiguration */
+#define ASYNCB_SESSION_LOCKOUT  8 /* Lock out cua opens based on session */
+#define ASYNCB_PGRP_LOCKOUT     9 /* Lock out cua opens based on pgrp */
+#define ASYNCB_CALLOUT_NOHUP   10 /* Don't do hangups for cua device */
+#define ASYNCB_HARDPPS_CD      11 /* Call hardpps when CD goes high  */
+#define ASYNCB_SPD_SHI         12 /* Use 230400 instead of 38400 bps */
+#define ASYNCB_LOW_LATENCY     13 /* Request low latency behaviour */
+#define ASYNCB_BUGGY_UART      14 /* This is a buggy UART, skip some safety
+                                   * checks.  Note: can be dangerous! */
+#define ASYNCB_AUTOPROBE       15 /* Port was autoprobed by PCI or PNP code */
+#define ASYNCB_LAST_USER       15
+
+/* Internal flags used only by kernel */
+#define ASYNCB_INITIALIZED     31 /* Serial port was initialized */
+#define ASYNCB_SUSPENDED       30 /* Serial port is suspended */
+#define ASYNCB_NORMAL_ACTIVE   29 /* Normal device is active */
+#define ASYNCB_BOOT_AUTOCONF   28 /* Autoconfigure port on bootup */
+#define ASYNCB_CLOSING         27 /* Serial port is closing */
+#define ASYNCB_CTS_FLOW                26 /* Do CTS flow control */
+#define ASYNCB_CHECK_CD                25 /* i.e., CLOCAL */
+#define ASYNCB_SHARE_IRQ       24 /* for multifunction cards, no longer used */
+#define ASYNCB_CONS_FLOW       23 /* flow control for console  */
+#define ASYNCB_FIRST_KERNEL    22
+
+#define ASYNC_HUP_NOTIFY       (1U << ASYNCB_HUP_NOTIFY)
+#define ASYNC_SUSPENDED                (1U << ASYNCB_SUSPENDED)
+#define ASYNC_FOURPORT         (1U << ASYNCB_FOURPORT)
+#define ASYNC_SAK              (1U << ASYNCB_SAK)
+#define ASYNC_SPLIT_TERMIOS    (1U << ASYNCB_SPLIT_TERMIOS)
+#define ASYNC_SPD_HI           (1U << ASYNCB_SPD_HI)
+#define ASYNC_SPD_VHI          (1U << ASYNCB_SPD_VHI)
+#define ASYNC_SKIP_TEST                (1U << ASYNCB_SKIP_TEST)
+#define ASYNC_AUTO_IRQ         (1U << ASYNCB_AUTO_IRQ)
+#define ASYNC_SESSION_LOCKOUT  (1U << ASYNCB_SESSION_LOCKOUT)
+#define ASYNC_PGRP_LOCKOUT     (1U << ASYNCB_PGRP_LOCKOUT)
+#define ASYNC_CALLOUT_NOHUP    (1U << ASYNCB_CALLOUT_NOHUP)
+#define ASYNC_HARDPPS_CD       (1U << ASYNCB_HARDPPS_CD)
+#define ASYNC_SPD_SHI          (1U << ASYNCB_SPD_SHI)
+#define ASYNC_LOW_LATENCY      (1U << ASYNCB_LOW_LATENCY)
+#define ASYNC_BUGGY_UART       (1U << ASYNCB_BUGGY_UART)
+#define ASYNC_AUTOPROBE                (1U << ASYNCB_AUTOPROBE)
+
+#define ASYNC_FLAGS            ((1U << (ASYNCB_LAST_USER + 1)) - 1)
+#define ASYNC_USR_MASK         (ASYNC_SPD_MASK|ASYNC_CALLOUT_NOHUP| \
+               ASYNC_LOW_LATENCY)
+#define ASYNC_SPD_CUST         (ASYNC_SPD_HI|ASYNC_SPD_VHI)
+#define ASYNC_SPD_WARP         (ASYNC_SPD_HI|ASYNC_SPD_SHI)
+#define ASYNC_SPD_MASK         (ASYNC_SPD_HI|ASYNC_SPD_VHI|ASYNC_SPD_SHI)
+
+#define ASYNC_INITIALIZED      (1U << ASYNCB_INITIALIZED)
+#define ASYNC_NORMAL_ACTIVE    (1U << ASYNCB_NORMAL_ACTIVE)
+#define ASYNC_BOOT_AUTOCONF    (1U << ASYNCB_BOOT_AUTOCONF)
+#define ASYNC_CLOSING          (1U << ASYNCB_CLOSING)
+#define ASYNC_CTS_FLOW         (1U << ASYNCB_CTS_FLOW)
+#define ASYNC_CHECK_CD         (1U << ASYNCB_CHECK_CD)
+#define ASYNC_SHARE_IRQ                (1U << ASYNCB_SHARE_IRQ)
+#define ASYNC_CONS_FLOW                (1U << ASYNCB_CONS_FLOW)
+#define ASYNC_INTERNAL_FLAGS   (~((1U << ASYNCB_FIRST_KERNEL) - 1))
+
+#endif
index ca356a7..8b27927 100644 (file)
@@ -136,7 +136,7 @@ struct smp_chan {
 };
 
 /* SMP Commands */
-int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level);
+int smp_conn_security(struct hci_conn *hcon, __u8 sec_level);
 int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb);
 int smp_distribute_keys(struct l2cap_conn *conn, __u8 force);
 int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey);
index 59ba38b..80ffde3 100644 (file)
 /* Same for payload size. See qos.c for the smallest max data size */
 #define IRCOMM_TTY_DATA_UNINITIALISED  (64 - IRCOMM_TTY_HDR_UNINITIALISED)
 
-/* Those are really defined in include/linux/serial.h - Jean II */
-#define ASYNC_B_INITIALIZED    31      /* Serial port was initialized */
-#define ASYNC_B_NORMAL_ACTIVE  29      /* Normal device is active */
-#define ASYNC_B_CLOSING                27      /* Serial port is closing */
-
 /*
  * IrCOMM TTY driver state
  */
 struct ircomm_tty_cb {
        irda_queue_t queue;            /* Must be first */
+       struct tty_port port;
        magic_t magic;
 
        int state;                /* Connect state */
 
-       struct tty_struct *tty;
        struct ircomm_cb *ircomm; /* IrCOMM layer instance */
 
        struct sk_buff *tx_skb;   /* Transmit buffer */
@@ -80,7 +75,6 @@ struct ircomm_tty_cb {
        LOCAL_FLOW flow;          /* IrTTP flow status */
 
        int line;
-       unsigned long flags;
 
        __u8 dlsap_sel;
        __u8 slsap_sel;
@@ -97,19 +91,10 @@ struct ircomm_tty_cb {
        void *skey;
        void *ckey;
 
-       wait_queue_head_t open_wait;
-       wait_queue_head_t close_wait;
        struct timer_list watchdog_timer;
        struct work_struct  tqueue;
 
-        unsigned short    close_delay;
-        unsigned short    closing_wait; /* time to wait before closing */
-
-       int  open_count;
-       int  blocked_open;      /* # of blocked opens */
-
        /* Protect concurent access to :
-        *      o self->open_count
         *      o self->ctrl_skb
         *      o self->tx_skb
         * Maybe other things may gain to be protected as well...
index e1ce104..4a045cd 100644 (file)
@@ -18,6 +18,7 @@ struct nf_conntrack_ecache {
        u16 ctmask;             /* bitmask of ct events to be delivered */
        u16 expmask;            /* bitmask of expect events to be delivered */
        u32 pid;                /* netlink pid of destroyer */
+       struct timer_list timeout;
 };
 
 static inline struct nf_conntrack_ecache *
index 976a81a..639dd13 100644 (file)
@@ -273,6 +273,9 @@ struct xfrm_replay {
        int     (*check)(struct xfrm_state *x,
                         struct sk_buff *skb,
                         __be32 net_seq);
+       int     (*recheck)(struct xfrm_state *x,
+                          struct sk_buff *skb,
+                          __be32 net_seq);
        void    (*notify)(struct xfrm_state *x, int event);
        int     (*overflow)(struct xfrm_state *x, struct sk_buff *skb);
 };
index f1405d3..941c84b 100644 (file)
@@ -23,7 +23,9 @@ struct se_subsystem_api {
        struct se_device *(*create_virtdevice)(struct se_hba *,
                                struct se_subsystem_dev *, void *);
        void (*free_device)(void *);
-       int (*transport_complete)(struct se_cmd *cmd, struct scatterlist *);
+       void (*transport_complete)(struct se_cmd *cmd,
+                                  struct scatterlist *,
+                                  unsigned char *);
 
        int (*parse_cdb)(struct se_cmd *cmd);
        ssize_t (*check_configfs_dev_params)(struct se_hba *,
index 015cea0..5be8937 100644 (file)
 
 #define SE_INQUIRY_BUF                         512
 #define SE_MODE_PAGE_BUF                       512
+#define SE_SENSE_BUF                           96
 
 /* struct se_hba->hba_flags */
 enum hba_flags_table {
index b7935fc..7fee567 100644 (file)
@@ -1253,7 +1253,7 @@ retry:
 /*
  * Cross CPU call to disable a performance event
  */
-static int __perf_event_disable(void *info)
+int __perf_event_disable(void *info)
 {
        struct perf_event *event = info;
        struct perf_event_context *ctx = event->ctx;
@@ -2935,12 +2935,12 @@ EXPORT_SYMBOL_GPL(perf_event_release_kernel);
 /*
  * Called when the last reference to the file is gone.
  */
-static int perf_release(struct inode *inode, struct file *file)
+static void put_event(struct perf_event *event)
 {
-       struct perf_event *event = file->private_data;
        struct task_struct *owner;
 
-       file->private_data = NULL;
+       if (!atomic_long_dec_and_test(&event->refcount))
+               return;
 
        rcu_read_lock();
        owner = ACCESS_ONCE(event->owner);
@@ -2975,7 +2975,13 @@ static int perf_release(struct inode *inode, struct file *file)
                put_task_struct(owner);
        }
 
-       return perf_event_release_kernel(event);
+       perf_event_release_kernel(event);
+}
+
+static int perf_release(struct inode *inode, struct file *file)
+{
+       put_event(file->private_data);
+       return 0;
 }
 
 u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running)
@@ -3227,7 +3233,7 @@ unlock:
 
 static const struct file_operations perf_fops;
 
-static struct perf_event *perf_fget_light(int fd, int *fput_needed)
+static struct file *perf_fget_light(int fd, int *fput_needed)
 {
        struct file *file;
 
@@ -3241,7 +3247,7 @@ static struct perf_event *perf_fget_light(int fd, int *fput_needed)
                return ERR_PTR(-EBADF);
        }
 
-       return file->private_data;
+       return file;
 }
 
 static int perf_event_set_output(struct perf_event *event,
@@ -3273,19 +3279,21 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 
        case PERF_EVENT_IOC_SET_OUTPUT:
        {
+               struct file *output_file = NULL;
                struct perf_event *output_event = NULL;
                int fput_needed = 0;
                int ret;
 
                if (arg != -1) {
-                       output_event = perf_fget_light(arg, &fput_needed);
-                       if (IS_ERR(output_event))
-                               return PTR_ERR(output_event);
+                       output_file = perf_fget_light(arg, &fput_needed);
+                       if (IS_ERR(output_file))
+                               return PTR_ERR(output_file);
+                       output_event = output_file->private_data;
                }
 
                ret = perf_event_set_output(event, output_event);
                if (output_event)
-                       fput_light(output_event->filp, fput_needed);
+                       fput_light(output_file, fput_needed);
 
                return ret;
        }
@@ -5950,6 +5958,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu,
 
        mutex_init(&event->mmap_mutex);
 
+       atomic_long_set(&event->refcount, 1);
        event->cpu              = cpu;
        event->attr             = *attr;
        event->group_leader     = group_leader;
@@ -6260,12 +6269,12 @@ SYSCALL_DEFINE5(perf_event_open,
                return event_fd;
 
        if (group_fd != -1) {
-               group_leader = perf_fget_light(group_fd, &fput_needed);
-               if (IS_ERR(group_leader)) {
-                       err = PTR_ERR(group_leader);
+               group_file = perf_fget_light(group_fd, &fput_needed);
+               if (IS_ERR(group_file)) {
+                       err = PTR_ERR(group_file);
                        goto err_fd;
                }
-               group_file = group_leader->filp;
+               group_leader = group_file->private_data;
                if (flags & PERF_FLAG_FD_OUTPUT)
                        output_event = group_leader;
                if (flags & PERF_FLAG_FD_NO_GROUP)
@@ -6402,7 +6411,6 @@ SYSCALL_DEFINE5(perf_event_open,
                put_ctx(gctx);
        }
 
-       event->filp = event_file;
        WARN_ON_ONCE(ctx->parent_ctx);
        mutex_lock(&ctx->mutex);
 
@@ -6496,7 +6504,6 @@ perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu,
                goto err_free;
        }
 
-       event->filp = NULL;
        WARN_ON_ONCE(ctx->parent_ctx);
        mutex_lock(&ctx->mutex);
        perf_install_in_context(ctx, event, cpu);
@@ -6578,7 +6585,7 @@ static void sync_child_event(struct perf_event *child_event,
         * Release the parent event, if this was the last
         * reference to it.
         */
-       fput(parent_event->filp);
+       put_event(parent_event);
 }
 
 static void
@@ -6654,9 +6661,8 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn)
         *
         *   __perf_event_exit_task()
         *     sync_child_event()
-        *       fput(parent_event->filp)
-        *         perf_release()
-        *           mutex_lock(&ctx->mutex)
+        *       put_event()
+        *         mutex_lock(&ctx->mutex)
         *
         * But since its the parent context it won't be the same instance.
         */
@@ -6724,7 +6730,7 @@ static void perf_free_event(struct perf_event *event,
        list_del_init(&event->child_list);
        mutex_unlock(&parent->child_mutex);
 
-       fput(parent->filp);
+       put_event(parent);
 
        perf_group_detach(event);
        list_del_event(event, ctx);
@@ -6804,6 +6810,12 @@ inherit_event(struct perf_event *parent_event,
                                           NULL, NULL);
        if (IS_ERR(child_event))
                return child_event;
+
+       if (!atomic_long_inc_not_zero(&parent_event->refcount)) {
+               free_event(child_event);
+               return NULL;
+       }
+
        get_ctx(child_ctx);
 
        /*
@@ -6845,14 +6857,6 @@ inherit_event(struct perf_event *parent_event,
        raw_spin_unlock_irqrestore(&child_ctx->lock, flags);
 
        /*
-        * Get a reference to the parent filp - we will fput it
-        * when the child event exits. This is safe to do because
-        * we are in the parent and we know that the filp still
-        * exists and has a nonzero count:
-        */
-       atomic_long_inc(&parent_event->filp->f_count);
-
-       /*
         * Link this into the parent event's child list
         */
        WARN_ON_ONCE(parent_event->ctx->parent_ctx);
index bb38c4d..9a7b487 100644 (file)
@@ -453,7 +453,16 @@ int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *att
        int old_type = bp->attr.bp_type;
        int err = 0;
 
-       perf_event_disable(bp);
+       /*
+        * modify_user_hw_breakpoint can be invoked with IRQs disabled and hence it
+        * will not be possible to raise IPIs that invoke __perf_event_disable.
+        * So call the function directly after making sure we are targeting the
+        * current task.
+        */
+       if (irqs_disabled() && bp->ctx && bp->ctx->task == current)
+               __perf_event_disable(bp);
+       else
+               perf_event_disable(bp);
 
        bp->attr.bp_addr = attr->bp_addr;
        bp->attr.bp_type = attr->bp_type;
index fbf1fd0..649c9f8 100644 (file)
@@ -5304,27 +5304,17 @@ void idle_task_exit(void)
 }
 
 /*
- * While a dead CPU has no uninterruptible tasks queued at this point,
- * it might still have a nonzero ->nr_uninterruptible counter, because
- * for performance reasons the counter is not stricly tracking tasks to
- * their home CPUs. So we just add the counter to another CPU's counter,
- * to keep the global sum constant after CPU-down:
- */
-static void migrate_nr_uninterruptible(struct rq *rq_src)
-{
-       struct rq *rq_dest = cpu_rq(cpumask_any(cpu_active_mask));
-
-       rq_dest->nr_uninterruptible += rq_src->nr_uninterruptible;
-       rq_src->nr_uninterruptible = 0;
-}
-
-/*
- * remove the tasks which were accounted by rq from calc_load_tasks.
+ * Since this CPU is going 'away' for a while, fold any nr_active delta
+ * we might have. Assumes we're called after migrate_tasks() so that the
+ * nr_active count is stable.
+ *
+ * Also see the comment "Global load-average calculations".
  */
-static void calc_global_load_remove(struct rq *rq)
+static void calc_load_migrate(struct rq *rq)
 {
-       atomic_long_sub(rq->calc_load_active, &calc_load_tasks);
-       rq->calc_load_active = 0;
+       long delta = calc_load_fold_active(rq);
+       if (delta)
+               atomic_long_add(delta, &calc_load_tasks);
 }
 
 /*
@@ -5352,9 +5342,6 @@ static void migrate_tasks(unsigned int dead_cpu)
         */
        rq->stop = NULL;
 
-       /* Ensure any throttled groups are reachable by pick_next_task */
-       unthrottle_offline_cfs_rqs(rq);
-
        for ( ; ; ) {
                /*
                 * There's this thread running, bail when that's the only
@@ -5618,8 +5605,7 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
                BUG_ON(rq->nr_running != 1); /* the migration thread */
                raw_spin_unlock_irqrestore(&rq->lock, flags);
 
-               migrate_nr_uninterruptible(rq);
-               calc_global_load_remove(rq);
+               calc_load_migrate(rq);
                break;
 #endif
        }
@@ -6028,11 +6014,6 @@ static void destroy_sched_domains(struct sched_domain *sd, int cpu)
  * SD_SHARE_PKG_RESOURCE set (Last Level Cache Domain) for this
  * allows us to avoid some pointer chasing select_idle_sibling().
  *
- * Iterate domains and sched_groups downward, assigning CPUs to be
- * select_idle_sibling() hw buddy.  Cross-wiring hw makes bouncing
- * due to random perturbation self canceling, ie sw buddies pull
- * their counterpart to their CPU's hw counterpart.
- *
  * Also keep a unique ID per domain (we use the first cpu number in
  * the cpumask of the domain), this allows us to quickly tell if
  * two cpus are in the same cache domain, see cpus_share_cache().
@@ -6046,40 +6027,8 @@ static void update_top_cache_domain(int cpu)
        int id = cpu;
 
        sd = highest_flag_domain(cpu, SD_SHARE_PKG_RESOURCES);
-       if (sd) {
-               struct sched_domain *tmp = sd;
-               struct sched_group *sg, *prev;
-               bool right;
-
-               /*
-                * Traverse to first CPU in group, and count hops
-                * to cpu from there, switching direction on each
-                * hop, never ever pointing the last CPU rightward.
-                */
-               do {
-                       id = cpumask_first(sched_domain_span(tmp));
-                       prev = sg = tmp->groups;
-                       right = 1;
-
-                       while (cpumask_first(sched_group_cpus(sg)) != id)
-                               sg = sg->next;
-
-                       while (!cpumask_test_cpu(cpu, sched_group_cpus(sg))) {
-                               prev = sg;
-                               sg = sg->next;
-                               right = !right;
-                       }
-
-                       /* A CPU went down, never point back to domain start. */
-                       if (right && cpumask_first(sched_group_cpus(sg->next)) == id)
-                               right = false;
-
-                       sg = right ? sg->next : prev;
-                       tmp->idle_buddy = cpumask_first(sched_group_cpus(sg));
-               } while ((tmp = tmp->child));
-
+       if (sd)
                id = cpumask_first(sched_domain_span(sd));
-       }
 
        rcu_assign_pointer(per_cpu(sd_llc, cpu), sd);
        per_cpu(sd_llc_id, cpu) = id;
index c219bf8..96e2b18 100644 (file)
@@ -2052,7 +2052,7 @@ static void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b)
        hrtimer_cancel(&cfs_b->slack_timer);
 }
 
-void unthrottle_offline_cfs_rqs(struct rq *rq)
+static void unthrottle_offline_cfs_rqs(struct rq *rq)
 {
        struct cfs_rq *cfs_rq;
 
@@ -2106,7 +2106,7 @@ static inline struct cfs_bandwidth *tg_cfs_bandwidth(struct task_group *tg)
        return NULL;
 }
 static inline void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {}
-void unthrottle_offline_cfs_rqs(struct rq *rq) {}
+static inline void unthrottle_offline_cfs_rqs(struct rq *rq) {}
 
 #endif /* CONFIG_CFS_BANDWIDTH */
 
@@ -2637,6 +2637,8 @@ static int select_idle_sibling(struct task_struct *p, int target)
        int cpu = smp_processor_id();
        int prev_cpu = task_cpu(p);
        struct sched_domain *sd;
+       struct sched_group *sg;
+       int i;
 
        /*
         * If the task is going to be woken-up on this cpu and if it is
@@ -2653,17 +2655,29 @@ static int select_idle_sibling(struct task_struct *p, int target)
                return prev_cpu;
 
        /*
-        * Otherwise, check assigned siblings to find an elegible idle cpu.
+        * Otherwise, iterate the domains and find an elegible idle cpu.
         */
        sd = rcu_dereference(per_cpu(sd_llc, target));
-
        for_each_lower_domain(sd) {
-               if (!cpumask_test_cpu(sd->idle_buddy, tsk_cpus_allowed(p)))
-                       continue;
-               if (idle_cpu(sd->idle_buddy))
-                       return sd->idle_buddy;
-       }
+               sg = sd->groups;
+               do {
+                       if (!cpumask_intersects(sched_group_cpus(sg),
+                                               tsk_cpus_allowed(p)))
+                               goto next;
 
+                       for_each_cpu(i, sched_group_cpus(sg)) {
+                               if (!idle_cpu(i))
+                                       goto next;
+                       }
+
+                       target = cpumask_first_and(sched_group_cpus(sg),
+                                       tsk_cpus_allowed(p));
+                       goto done;
+next:
+                       sg = sg->next;
+               } while (sg != sd->groups);
+       }
+done:
        return target;
 }
 
@@ -3658,7 +3672,6 @@ fix_small_capacity(struct sched_domain *sd, struct sched_group *group)
  * @group: sched_group whose statistics are to be updated.
  * @load_idx: Load index of sched_domain of this_cpu for load calc.
  * @local_group: Does group contain this_cpu.
- * @cpus: Set of cpus considered for load balancing.
  * @balance: Should we balance.
  * @sgs: variable to hold the statistics for this group.
  */
@@ -3805,7 +3818,6 @@ static bool update_sd_pick_busiest(struct lb_env *env,
 /**
  * update_sd_lb_stats - Update sched_domain's statistics for load balancing.
  * @env: The load balancing environment.
- * @cpus: Set of cpus considered for load balancing.
  * @balance: Should we balance.
  * @sds: variable to hold the statistics for this sched_domain.
  */
@@ -4956,6 +4968,9 @@ static void rq_online_fair(struct rq *rq)
 static void rq_offline_fair(struct rq *rq)
 {
        update_sysctl();
+
+       /* Ensure any throttled groups are reachable by pick_next_task */
+       unthrottle_offline_cfs_rqs(rq);
 }
 
 #endif /* CONFIG_SMP */
index 944cb68..e0b7ba9 100644 (file)
@@ -691,6 +691,7 @@ balanced:
                 * runtime - in which case borrowing doesn't make sense.
                 */
                rt_rq->rt_runtime = RUNTIME_INF;
+               rt_rq->rt_throttled = 0;
                raw_spin_unlock(&rt_rq->rt_runtime_lock);
                raw_spin_unlock(&rt_b->rt_runtime_lock);
        }
index f6714d0..0848fa3 100644 (file)
@@ -1144,7 +1144,6 @@ extern void print_rt_stats(struct seq_file *m, int cpu);
 
 extern void init_cfs_rq(struct cfs_rq *cfs_rq);
 extern void init_rt_rq(struct rt_rq *rt_rq, struct rq *rq);
-extern void unthrottle_offline_cfs_rqs(struct rq *rq);
 
 extern void account_cfs_bandwidth_used(int enabled, int was_enabled);
 
index 024540f..3a9e5d5 100644 (file)
@@ -573,6 +573,7 @@ static void tick_nohz_restart_sched_tick(struct tick_sched *ts, ktime_t now)
        tick_do_update_jiffies64(now);
        update_cpu_load_nohz();
 
+       calc_load_exit_idle();
        touch_softlockup_watchdog();
        /*
         * Cancel the scheduled timer and restore the tick
index 692d976..1e1373b 100644 (file)
@@ -66,6 +66,7 @@ enum {
 
        /* pool flags */
        POOL_MANAGE_WORKERS     = 1 << 0,       /* need to manage workers */
+       POOL_MANAGING_WORKERS   = 1 << 1,       /* managing workers */
 
        /* worker flags */
        WORKER_STARTED          = 1 << 0,       /* started */
@@ -652,7 +653,7 @@ static bool need_to_manage_workers(struct worker_pool *pool)
 /* Do we have too many workers and should some go away? */
 static bool too_many_workers(struct worker_pool *pool)
 {
-       bool managing = mutex_is_locked(&pool->manager_mutex);
+       bool managing = pool->flags & POOL_MANAGING_WORKERS;
        int nr_idle = pool->nr_idle + managing; /* manager is considered idle */
        int nr_busy = pool->nr_workers - nr_idle;
 
@@ -1326,6 +1327,15 @@ static void idle_worker_rebind(struct worker *worker)
 
        /* we did our part, wait for rebind_workers() to finish up */
        wait_event(gcwq->rebind_hold, !(worker->flags & WORKER_REBIND));
+
+       /*
+        * rebind_workers() shouldn't finish until all workers passed the
+        * above WORKER_REBIND wait.  Tell it when done.
+        */
+       spin_lock_irq(&worker->pool->gcwq->lock);
+       if (!--worker->idle_rebind->cnt)
+               complete(&worker->idle_rebind->done);
+       spin_unlock_irq(&worker->pool->gcwq->lock);
 }
 
 /*
@@ -1396,12 +1406,15 @@ retry:
        /* set REBIND and kick idle ones, we'll wait for these later */
        for_each_worker_pool(pool, gcwq) {
                list_for_each_entry(worker, &pool->idle_list, entry) {
+                       unsigned long worker_flags = worker->flags;
+
                        if (worker->flags & WORKER_REBIND)
                                continue;
 
-                       /* morph UNBOUND to REBIND */
-                       worker->flags &= ~WORKER_UNBOUND;
-                       worker->flags |= WORKER_REBIND;
+                       /* morph UNBOUND to REBIND atomically */
+                       worker_flags &= ~WORKER_UNBOUND;
+                       worker_flags |= WORKER_REBIND;
+                       ACCESS_ONCE(worker->flags) = worker_flags;
 
                        idle_rebind.cnt++;
                        worker->idle_rebind = &idle_rebind;
@@ -1419,25 +1432,15 @@ retry:
                goto retry;
        }
 
-       /*
-        * All idle workers are rebound and waiting for %WORKER_REBIND to
-        * be cleared inside idle_worker_rebind().  Clear and release.
-        * Clearing %WORKER_REBIND from this foreign context is safe
-        * because these workers are still guaranteed to be idle.
-        */
-       for_each_worker_pool(pool, gcwq)
-               list_for_each_entry(worker, &pool->idle_list, entry)
-                       worker->flags &= ~WORKER_REBIND;
-
-       wake_up_all(&gcwq->rebind_hold);
-
-       /* rebind busy workers */
+       /* all idle workers are rebound, rebind busy workers */
        for_each_busy_worker(worker, i, pos, gcwq) {
                struct work_struct *rebind_work = &worker->rebind_work;
+               unsigned long worker_flags = worker->flags;
 
-               /* morph UNBOUND to REBIND */
-               worker->flags &= ~WORKER_UNBOUND;
-               worker->flags |= WORKER_REBIND;
+               /* morph UNBOUND to REBIND atomically */
+               worker_flags &= ~WORKER_UNBOUND;
+               worker_flags |= WORKER_REBIND;
+               ACCESS_ONCE(worker->flags) = worker_flags;
 
                if (test_and_set_bit(WORK_STRUCT_PENDING_BIT,
                                     work_data_bits(rebind_work)))
@@ -1449,6 +1452,34 @@ retry:
                            worker->scheduled.next,
                            work_color_to_flags(WORK_NO_COLOR));
        }
+
+       /*
+        * All idle workers are rebound and waiting for %WORKER_REBIND to
+        * be cleared inside idle_worker_rebind().  Clear and release.
+        * Clearing %WORKER_REBIND from this foreign context is safe
+        * because these workers are still guaranteed to be idle.
+        *
+        * We need to make sure all idle workers passed WORKER_REBIND wait
+        * in idle_worker_rebind() before returning; otherwise, workers can
+        * get stuck at the wait if hotplug cycle repeats.
+        */
+       idle_rebind.cnt = 1;
+       INIT_COMPLETION(idle_rebind.done);
+
+       for_each_worker_pool(pool, gcwq) {
+               list_for_each_entry(worker, &pool->idle_list, entry) {
+                       worker->flags &= ~WORKER_REBIND;
+                       idle_rebind.cnt++;
+               }
+       }
+
+       wake_up_all(&gcwq->rebind_hold);
+
+       if (--idle_rebind.cnt) {
+               spin_unlock_irq(&gcwq->lock);
+               wait_for_completion(&idle_rebind.done);
+               spin_lock_irq(&gcwq->lock);
+       }
 }
 
 static struct worker *alloc_worker(void)
@@ -1794,9 +1825,45 @@ static bool manage_workers(struct worker *worker)
        struct worker_pool *pool = worker->pool;
        bool ret = false;
 
-       if (!mutex_trylock(&pool->manager_mutex))
+       if (pool->flags & POOL_MANAGING_WORKERS)
                return ret;
 
+       pool->flags |= POOL_MANAGING_WORKERS;
+
+       /*
+        * To simplify both worker management and CPU hotplug, hold off
+        * management while hotplug is in progress.  CPU hotplug path can't
+        * grab %POOL_MANAGING_WORKERS to achieve this because that can
+        * lead to idle worker depletion (all become busy thinking someone
+        * else is managing) which in turn can result in deadlock under
+        * extreme circumstances.  Use @pool->manager_mutex to synchronize
+        * manager against CPU hotplug.
+        *
+        * manager_mutex would always be free unless CPU hotplug is in
+        * progress.  trylock first without dropping @gcwq->lock.
+        */
+       if (unlikely(!mutex_trylock(&pool->manager_mutex))) {
+               spin_unlock_irq(&pool->gcwq->lock);
+               mutex_lock(&pool->manager_mutex);
+               /*
+                * CPU hotplug could have happened while we were waiting
+                * for manager_mutex.  Hotplug itself can't handle us
+                * because manager isn't either on idle or busy list, and
+                * @gcwq's state and ours could have deviated.
+                *
+                * As hotplug is now excluded via manager_mutex, we can
+                * simply try to bind.  It will succeed or fail depending
+                * on @gcwq's current state.  Try it and adjust
+                * %WORKER_UNBOUND accordingly.
+                */
+               if (worker_maybe_bind_and_lock(worker))
+                       worker->flags &= ~WORKER_UNBOUND;
+               else
+                       worker->flags |= WORKER_UNBOUND;
+
+               ret = true;
+       }
+
        pool->flags &= ~POOL_MANAGE_WORKERS;
 
        /*
@@ -1806,6 +1873,7 @@ static bool manage_workers(struct worker *worker)
        ret |= maybe_destroy_workers(pool);
        ret |= maybe_create_worker(pool);
 
+       pool->flags &= ~POOL_MANAGING_WORKERS;
        mutex_unlock(&pool->manager_mutex);
        return ret;
 }
index 286d558..8c0e629 100644 (file)
@@ -163,9 +163,11 @@ static int digsig_verify_rsa(struct key *key,
        memcpy(out1 + head, p, l);
 
        err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len);
+       if (err)
+               goto err;
 
-       if (!err && len == hlen)
-               err = memcmp(out2, h, hlen);
+       if (len != hlen || memcmp(out2, h, hlen))
+               err = -EINVAL;
 
 err:
        mpi_free(in);
index 4d9393c..82aa349 100644 (file)
@@ -246,7 +246,7 @@ static int __init_memblock memblock_double_array(struct memblock_type *type,
                                min(new_area_start, memblock.current_limit),
                                new_alloc_size, PAGE_SIZE);
 
-               new_array = addr ? __va(addr) : 0;
+               new_array = addr ? __va(addr) : NULL;
        }
        if (!addr) {
                pr_err("memblock: Failed to double %s array from %ld to %ld entries !\n",
index bd92431..4ada3be 100644 (file)
@@ -2562,7 +2562,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context)
                break;
 
        default:
-               BUG();
+               return -EINVAL;
        }
 
        l = strlen(policy_modes[mode]);
index 5ad7da2..3c094e7 100644 (file)
@@ -29,6 +29,7 @@
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
 #include <net/bluetooth/a2mp.h>
+#include <net/bluetooth/smp.h>
 
 static void hci_le_connect(struct hci_conn *conn)
 {
@@ -619,6 +620,9 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
 {
        BT_DBG("hcon %p", conn);
 
+       if (conn->type == LE_LINK)
+               return smp_conn_security(conn, sec_level);
+
        /* For sdp we don't need the link key. */
        if (sec_level == BT_SECURITY_SDP)
                return 1;
index daa149b..4ea1710 100644 (file)
@@ -1199,14 +1199,15 @@ clean:
 static void l2cap_conn_ready(struct l2cap_conn *conn)
 {
        struct l2cap_chan *chan;
+       struct hci_conn *hcon = conn->hcon;
 
        BT_DBG("conn %p", conn);
 
-       if (!conn->hcon->out && conn->hcon->type == LE_LINK)
+       if (!hcon->out && hcon->type == LE_LINK)
                l2cap_le_conn_ready(conn);
 
-       if (conn->hcon->out && conn->hcon->type == LE_LINK)
-               smp_conn_security(conn, conn->hcon->pending_sec_level);
+       if (hcon->out && hcon->type == LE_LINK)
+               smp_conn_security(hcon, hcon->pending_sec_level);
 
        mutex_lock(&conn->chan_lock);
 
@@ -1219,8 +1220,8 @@ static void l2cap_conn_ready(struct l2cap_conn *conn)
                        continue;
                }
 
-               if (conn->hcon->type == LE_LINK) {
-                       if (smp_conn_security(conn, chan->sec_level))
+               if (hcon->type == LE_LINK) {
+                       if (smp_conn_security(hcon, chan->sec_level))
                                l2cap_chan_ready(chan);
 
                } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) {
index 1497edd..34bbe1c 100644 (file)
@@ -616,7 +616,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch
                                break;
                        }
 
-                       if (smp_conn_security(conn, sec.level))
+                       if (smp_conn_security(conn->hcon, sec.level))
                                break;
                        sk->sk_state = BT_CONFIG;
                        chan->state = BT_CONFIG;
index 56f1823..ccc2487 100644 (file)
@@ -278,8 +278,8 @@ out:
        if (err < 0)
                goto free;
 
-       dev->tty_dev = tty_register_device(rfcomm_tty_driver, dev->id, NULL);
-
+       dev->tty_dev = tty_port_register_device(&dev->port, rfcomm_tty_driver,
+                       dev->id, NULL);
        if (IS_ERR(dev->tty_dev)) {
                err = PTR_ERR(dev->tty_dev);
                list_del(&dev->list);
@@ -705,9 +705,9 @@ static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp)
                        break;
                }
 
-               tty_unlock();
+               tty_unlock(tty);
                schedule();
-               tty_lock();
+               tty_lock(tty);
        }
        set_current_state(TASK_RUNNING);
        remove_wait_queue(&dev->wait, &wait);
@@ -861,7 +861,7 @@ static int rfcomm_tty_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned l
 
 static void rfcomm_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
 {
-       struct ktermios *new = tty->termios;
+       struct ktermios *new = &tty->termios;
        int old_baud_rate = tty_termios_baud_rate(old);
        int new_baud_rate = tty_termios_baud_rate(new);
 
index 901a616..8c225ef 100644 (file)
@@ -267,10 +267,10 @@ static void smp_failure(struct l2cap_conn *conn, u8 reason, u8 send)
        mgmt_auth_failed(conn->hcon->hdev, conn->dst, hcon->type,
                         hcon->dst_type, reason);
 
-       if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) {
-               cancel_delayed_work_sync(&conn->security_timer);
+       cancel_delayed_work_sync(&conn->security_timer);
+
+       if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags))
                smp_chan_destroy(conn);
-       }
 }
 
 #define JUST_WORKS     0x00
@@ -760,9 +760,9 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb)
        return 0;
 }
 
-int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level)
+int smp_conn_security(struct hci_conn *hcon, __u8 sec_level)
 {
-       struct hci_conn *hcon = conn->hcon;
+       struct l2cap_conn *conn = hcon->l2cap_data;
        struct smp_chan *smp = conn->smp_chan;
        __u8 authreq;
 
index f88ee53..92de5e5 100644 (file)
@@ -80,7 +80,7 @@ ebt_log_packet(u_int8_t pf, unsigned int hooknum,
        unsigned int bitmask;
 
        spin_lock_bh(&ebt_log_lock);
-       printk("<%c>%s IN=%s OUT=%s MAC source = %pM MAC dest = %pM proto = 0x%04x",
+       printk(KERN_SOH "%c%s IN=%s OUT=%s MAC source = %pM MAC dest = %pM proto = 0x%04x",
               '0' + loginfo->u.log.level, prefix,
               in ? in->name : "", out ? out->name : "",
               eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest,
index dd485f6..ba217e9 100644 (file)
@@ -211,9 +211,10 @@ void caif_client_register_refcnt(struct cflayer *adapt_layer,
                                        void (*put)(struct cflayer *lyr))
 {
        struct cfsrvl *service;
-       service = container_of(adapt_layer->dn, struct cfsrvl, layer);
 
-       WARN_ON(adapt_layer == NULL || adapt_layer->dn == NULL);
+       if (WARN_ON(adapt_layer == NULL || adapt_layer->dn == NULL))
+               return;
+       service = container_of(adapt_layer->dn, struct cfsrvl, layer);
        service->hold = hold;
        service->put = put;
 }
index 8398836..d7fe32c 100644 (file)
@@ -2647,15 +2647,16 @@ void __skb_get_rxhash(struct sk_buff *skb)
        if (!skb_flow_dissect(skb, &keys))
                return;
 
-       if (keys.ports) {
-               if ((__force u16)keys.port16[1] < (__force u16)keys.port16[0])
-                       swap(keys.port16[0], keys.port16[1]);
+       if (keys.ports)
                skb->l4_rxhash = 1;
-       }
 
        /* get a consistent hash (same value on both flow directions) */
-       if ((__force u32)keys.dst < (__force u32)keys.src)
+       if (((__force u32)keys.dst < (__force u32)keys.src) ||
+           (((__force u32)keys.dst == (__force u32)keys.src) &&
+            ((__force u16)keys.port16[1] < (__force u16)keys.port16[0]))) {
                swap(keys.dst, keys.src);
+               swap(keys.port16[0], keys.port16[1]);
+       }
 
        hash = jhash_3words((__force u32)keys.dst,
                            (__force u32)keys.src,
index 346b1eb..e4ba3e7 100644 (file)
@@ -168,24 +168,16 @@ static void poll_napi(struct net_device *dev)
        struct napi_struct *napi;
        int budget = 16;
 
-       WARN_ON_ONCE(!irqs_disabled());
-
        list_for_each_entry(napi, &dev->napi_list, dev_list) {
-               local_irq_enable();
                if (napi->poll_owner != smp_processor_id() &&
                    spin_trylock(&napi->poll_lock)) {
-                       rcu_read_lock_bh();
                        budget = poll_one_napi(rcu_dereference_bh(dev->npinfo),
                                               napi, budget);
-                       rcu_read_unlock_bh();
                        spin_unlock(&napi->poll_lock);
 
-                       if (!budget) {
-                               local_irq_disable();
+                       if (!budget)
                                break;
-                       }
                }
-               local_irq_disable();
        }
 }
 
index cce9e53..148e73d 100644 (file)
@@ -2721,7 +2721,7 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev,
        /* Eth + IPh + UDPh + mpls */
        datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8 -
                  pkt_dev->pkt_overhead;
-       if (datalen < sizeof(struct pktgen_hdr))
+       if (datalen < 0 || datalen < sizeof(struct pktgen_hdr))
                datalen = sizeof(struct pktgen_hdr);
 
        udph->source = htons(pkt_dev->cur_udp_src);
index 8f67ced..3057920 100644 (file)
@@ -1523,7 +1523,14 @@ EXPORT_SYMBOL(sock_rfree);
 
 void sock_edemux(struct sk_buff *skb)
 {
-       sock_put(skb->sk);
+       struct sock *sk = skb->sk;
+
+#ifdef CONFIG_INET
+       if (sk->sk_state == TCP_TIME_WAIT)
+               inet_twsk_put(inet_twsk(sk));
+       else
+#endif
+               sock_put(sk);
 }
 EXPORT_SYMBOL(sock_edemux);
 
index 8eec8f4..ebdf06f 100644 (file)
@@ -124,6 +124,8 @@ static DEFINE_SPINLOCK(mfc_unres_lock);
 static struct kmem_cache *mrt_cachep __read_mostly;
 
 static struct mr_table *ipmr_new_table(struct net *net, u32 id);
+static void ipmr_free_table(struct mr_table *mrt);
+
 static int ip_mr_forward(struct net *net, struct mr_table *mrt,
                         struct sk_buff *skb, struct mfc_cache *cache,
                         int local);
@@ -131,6 +133,7 @@ static int ipmr_cache_report(struct mr_table *mrt,
                             struct sk_buff *pkt, vifi_t vifi, int assert);
 static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb,
                              struct mfc_cache *c, struct rtmsg *rtm);
+static void mroute_clean_tables(struct mr_table *mrt);
 static void ipmr_expire_process(unsigned long arg);
 
 #ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES
@@ -271,7 +274,7 @@ static void __net_exit ipmr_rules_exit(struct net *net)
 
        list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) {
                list_del(&mrt->list);
-               kfree(mrt);
+               ipmr_free_table(mrt);
        }
        fib_rules_unregister(net->ipv4.mr_rules_ops);
 }
@@ -299,7 +302,7 @@ static int __net_init ipmr_rules_init(struct net *net)
 
 static void __net_exit ipmr_rules_exit(struct net *net)
 {
-       kfree(net->ipv4.mrt);
+       ipmr_free_table(net->ipv4.mrt);
 }
 #endif
 
@@ -336,6 +339,13 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id)
        return mrt;
 }
 
+static void ipmr_free_table(struct mr_table *mrt)
+{
+       del_timer_sync(&mrt->ipmr_expire_timer);
+       mroute_clean_tables(mrt);
+       kfree(mrt);
+}
+
 /* Service routines creating virtual interfaces: DVMRP tunnels and PIMREG */
 
 static void ipmr_del_tunnel(struct net_device *dev, struct vifctl *v)
index 4ad9cf1..9c87cde 100644 (file)
@@ -502,7 +502,10 @@ static unsigned int ip_nat_sdp_media(struct sk_buff *skb, unsigned int dataoff,
                ret = nf_ct_expect_related(rtcp_exp);
                if (ret == 0)
                        break;
-               else if (ret != -EBUSY) {
+               else if (ret == -EBUSY) {
+                       nf_ct_unexpect_related(rtp_exp);
+                       continue;
+               } else if (ret < 0) {
                        nf_ct_unexpect_related(rtp_exp);
                        port = 0;
                        break;
index fd9ecb5..82cf2a7 100644 (file)
@@ -934,12 +934,14 @@ static u32 __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)
        if (mtu < ip_rt_min_pmtu)
                mtu = ip_rt_min_pmtu;
 
+       rcu_read_lock();
        if (fib_lookup(dev_net(rt->dst.dev), fl4, &res) == 0) {
                struct fib_nh *nh = &FIB_RES_NH(res);
 
                update_or_create_fnhe(nh, fl4->daddr, 0, mtu,
                                      jiffies + ip_rt_mtu_expires);
        }
+       rcu_read_unlock();
        return mtu;
 }
 
@@ -956,7 +958,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
                dst->obsolete = DST_OBSOLETE_KILL;
        } else {
                rt->rt_pmtu = mtu;
-               dst_set_expires(&rt->dst, ip_rt_mtu_expires);
+               rt->dst.expires = max(1UL, jiffies + ip_rt_mtu_expires);
        }
 }
 
@@ -1263,7 +1265,7 @@ static void ipv4_dst_destroy(struct dst_entry *dst)
 {
        struct rtable *rt = (struct rtable *) dst;
 
-       if (dst->flags & DST_NOCACHE) {
+       if (!list_empty(&rt->rt_uncached)) {
                spin_lock_bh(&rt_uncached_lock);
                list_del(&rt->rt_uncached);
                spin_unlock_bh(&rt_uncached_lock);
index 85308b9..6e38c6c 100644 (file)
@@ -2926,13 +2926,14 @@ static void tcp_enter_recovery(struct sock *sk, bool ece_ack)
  * tcp_xmit_retransmit_queue().
  */
 static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked,
-                                 int newly_acked_sacked, bool is_dupack,
+                                 int prior_sacked, bool is_dupack,
                                  int flag)
 {
        struct inet_connection_sock *icsk = inet_csk(sk);
        struct tcp_sock *tp = tcp_sk(sk);
        int do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) &&
                                    (tcp_fackets_out(tp) > tp->reordering));
+       int newly_acked_sacked = 0;
        int fast_rexmit = 0;
 
        if (WARN_ON(!tp->packets_out && tp->sacked_out))
@@ -2992,6 +2993,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked,
                                tcp_add_reno_sack(sk);
                } else
                        do_lost = tcp_try_undo_partial(sk, pkts_acked);
+               newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked;
                break;
        case TCP_CA_Loss:
                if (flag & FLAG_DATA_ACKED)
@@ -3013,6 +3015,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked,
                        if (is_dupack)
                                tcp_add_reno_sack(sk);
                }
+               newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked;
 
                if (icsk->icsk_ca_state <= TCP_CA_Disorder)
                        tcp_try_undo_dsack(sk);
@@ -3590,7 +3593,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
        int prior_packets;
        int prior_sacked = tp->sacked_out;
        int pkts_acked = 0;
-       int newly_acked_sacked = 0;
        bool frto_cwnd = false;
 
        /* If the ack is older than previous acks
@@ -3666,8 +3668,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
        flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una);
 
        pkts_acked = prior_packets - tp->packets_out;
-       newly_acked_sacked = (prior_packets - prior_sacked) -
-                            (tp->packets_out - tp->sacked_out);
 
        if (tp->frto_counter)
                frto_cwnd = tcp_process_frto(sk, flag);
@@ -3681,7 +3681,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
                    tcp_may_raise_cwnd(sk, flag))
                        tcp_cong_avoid(sk, ack, prior_in_flight);
                is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP));
-               tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked,
+               tcp_fastretrans_alert(sk, pkts_acked, prior_sacked,
                                      is_dupack, flag);
        } else {
                if ((flag & FLAG_DATA_ACKED) && !frto_cwnd)
@@ -3698,7 +3698,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
 no_queue:
        /* If data was DSACKed, see if we can undo a cwnd reduction. */
        if (flag & FLAG_DSACKING_ACK)
-               tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked,
+               tcp_fastretrans_alert(sk, pkts_acked, prior_sacked,
                                      is_dupack, flag);
        /* If this ack opens up a zero window, clear backoff.  It was
         * being used to time the probes, and is probably far higher than
@@ -3718,8 +3718,7 @@ old_ack:
         */
        if (TCP_SKB_CB(skb)->sacked) {
                flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una);
-               newly_acked_sacked = tp->sacked_out - prior_sacked;
-               tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked,
+               tcp_fastretrans_alert(sk, pkts_acked, prior_sacked,
                                      is_dupack, flag);
        }
 
index 6f6d1ac..2814f66 100644 (file)
@@ -1226,6 +1226,11 @@ try_again:
 
        if (unlikely(err)) {
                trace_kfree_skb(skb, udp_recvmsg);
+               if (!peeked) {
+                       atomic_inc(&sk->sk_drops);
+                       UDP_INC_STATS_USER(sock_net(sk),
+                                          UDP_MIB_INERRORS, is_udplite);
+               }
                goto out_free;
        }
 
index 6dc7fd3..282f372 100644 (file)
@@ -167,8 +167,6 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
        struct esp_data *esp = x->data;
 
        /* skb is pure payload to encrypt */
-       err = -ENOMEM;
-
        aead = esp->aead;
        alen = crypto_aead_authsize(aead);
 
@@ -203,8 +201,10 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
        }
 
        tmp = esp_alloc_tmp(aead, nfrags + sglists, seqhilen);
-       if (!tmp)
+       if (!tmp) {
+               err = -ENOMEM;
                goto error;
+       }
 
        seqhi = esp_tmp_seqhi(tmp);
        iv = esp_tmp_iv(aead, tmp, seqhilen);
index a3e60cc..acd32e3 100644 (file)
@@ -403,8 +403,9 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
                tp->mtu_info = ntohl(info);
                if (!sock_owned_by_user(sk))
                        tcp_v6_mtu_reduced(sk);
-               else
-                       set_bit(TCP_MTU_REDUCED_DEFERRED, &tp->tsq_flags);
+               else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
+                                          &tp->tsq_flags))
+                       sock_hold(sk);
                goto out;
        }
 
index 99d0077..07e2bfe 100644 (file)
@@ -394,6 +394,17 @@ try_again:
        }
        if (unlikely(err)) {
                trace_kfree_skb(skb, udpv6_recvmsg);
+               if (!peeked) {
+                       atomic_inc(&sk->sk_drops);
+                       if (is_udp4)
+                               UDP_INC_STATS_USER(sock_net(sk),
+                                                  UDP_MIB_INERRORS,
+                                                  is_udplite);
+                       else
+                               UDP6_INC_STATS_USER(sock_net(sk),
+                                                   UDP_MIB_INERRORS,
+                                                   is_udplite);
+               }
                goto out_free;
        }
        if (!peeked) {
index 8b915f3..3089391 100644 (file)
@@ -99,7 +99,6 @@ pi_param_info_t ircomm_param_info = { pi_major_call_table, 3, 0x0f, 4 };
  */
 int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush)
 {
-       struct tty_struct *tty;
        unsigned long flags;
        struct sk_buff *skb;
        int count;
@@ -109,10 +108,6 @@ int ircomm_param_request(struct ircomm_tty_cb *self, __u8 pi, int flush)
        IRDA_ASSERT(self != NULL, return -1;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
 
-       tty = self->tty;
-       if (!tty)
-               return 0;
-
        /* Make sure we don't send parameters for raw mode */
        if (self->service_type == IRCOMM_3_WIRE_RAW)
                return 0;
index 6b9d5a0..95a3a7a 100644 (file)
@@ -52,6 +52,8 @@
 #include <net/irda/ircomm_tty_attach.h>
 #include <net/irda/ircomm_tty.h>
 
+static int ircomm_tty_install(struct tty_driver *driver,
+               struct tty_struct *tty);
 static int  ircomm_tty_open(struct tty_struct *tty, struct file *filp);
 static void ircomm_tty_close(struct tty_struct * tty, struct file *filp);
 static int  ircomm_tty_write(struct tty_struct * tty,
@@ -82,6 +84,7 @@ static struct tty_driver *driver;
 static hashbin_t *ircomm_tty = NULL;
 
 static const struct tty_operations ops = {
+       .install         = ircomm_tty_install,
        .open            = ircomm_tty_open,
        .close           = ircomm_tty_close,
        .write           = ircomm_tty_write,
@@ -104,6 +107,35 @@ static const struct tty_operations ops = {
 #endif /* CONFIG_PROC_FS */
 };
 
+static void ircomm_port_raise_dtr_rts(struct tty_port *port, int raise)
+{
+       struct ircomm_tty_cb *self = container_of(port, struct ircomm_tty_cb,
+                       port);
+       /*
+        * Here, we use to lock those two guys, but as ircomm_param_request()
+        * does it itself, I don't see the point (and I see the deadlock).
+        * Jean II
+        */
+       if (raise)
+               self->settings.dte |= IRCOMM_RTS | IRCOMM_DTR;
+       else
+               self->settings.dte &= ~(IRCOMM_RTS | IRCOMM_DTR);
+
+       ircomm_param_request(self, IRCOMM_DTE, TRUE);
+}
+
+static int ircomm_port_carrier_raised(struct tty_port *port)
+{
+       struct ircomm_tty_cb *self = container_of(port, struct ircomm_tty_cb,
+                       port);
+       return self->settings.dce & IRCOMM_CD;
+}
+
+static const struct tty_port_operations ircomm_port_ops = {
+       .dtr_rts = ircomm_port_raise_dtr_rts,
+       .carrier_raised = ircomm_port_carrier_raised,
+};
+
 /*
  * Function ircomm_tty_init()
  *
@@ -194,7 +226,7 @@ static int ircomm_tty_startup(struct ircomm_tty_cb *self)
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
 
        /* Check if already open */
-       if (test_and_set_bit(ASYNC_B_INITIALIZED, &self->flags)) {
+       if (test_and_set_bit(ASYNCB_INITIALIZED, &self->port.flags)) {
                IRDA_DEBUG(2, "%s(), already open so break out!\n", __func__ );
                return 0;
        }
@@ -231,7 +263,7 @@ static int ircomm_tty_startup(struct ircomm_tty_cb *self)
 
        return 0;
 err:
-       clear_bit(ASYNC_B_INITIALIZED, &self->flags);
+       clear_bit(ASYNCB_INITIALIZED, &self->port.flags);
        return ret;
 }
 
@@ -242,72 +274,62 @@ err:
  *
  */
 static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
-                                     struct file *filp)
+               struct tty_struct *tty, struct file *filp)
 {
+       struct tty_port *port = &self->port;
        DECLARE_WAITQUEUE(wait, current);
        int             retval;
        int             do_clocal = 0, extra_count = 0;
        unsigned long   flags;
-       struct tty_struct *tty;
 
        IRDA_DEBUG(2, "%s()\n", __func__ );
 
-       tty = self->tty;
-
        /*
         * If non-blocking mode is set, or the port is not enabled,
         * then make the check up front and then exit.
         */
        if (filp->f_flags & O_NONBLOCK || tty->flags & (1 << TTY_IO_ERROR)){
                /* nonblock mode is set or port is not enabled */
-               self->flags |= ASYNC_NORMAL_ACTIVE;
+               port->flags |= ASYNC_NORMAL_ACTIVE;
                IRDA_DEBUG(1, "%s(), O_NONBLOCK requested!\n", __func__ );
                return 0;
        }
 
-       if (tty->termios->c_cflag & CLOCAL) {
+       if (tty->termios.c_cflag & CLOCAL) {
                IRDA_DEBUG(1, "%s(), doing CLOCAL!\n", __func__ );
                do_clocal = 1;
        }
 
        /* Wait for carrier detect and the line to become
         * free (i.e., not in use by the callout).  While we are in
-        * this loop, self->open_count is dropped by one, so that
+        * this loop, port->count is dropped by one, so that
         * mgsl_close() knows when to free things.  We restore it upon
         * exit, either normal or abnormal.
         */
 
        retval = 0;
-       add_wait_queue(&self->open_wait, &wait);
+       add_wait_queue(&port->open_wait, &wait);
 
        IRDA_DEBUG(2, "%s(%d):block_til_ready before block on %s open_count=%d\n",
-             __FILE__,__LINE__, tty->driver->name, self->open_count );
+             __FILE__, __LINE__, tty->driver->name, port->count);
 
-       /* As far as I can see, we protect open_count - Jean II */
-       spin_lock_irqsave(&self->spinlock, flags);
+       spin_lock_irqsave(&port->lock, flags);
        if (!tty_hung_up_p(filp)) {
                extra_count = 1;
-               self->open_count--;
+               port->count--;
        }
-       spin_unlock_irqrestore(&self->spinlock, flags);
-       self->blocked_open++;
+       spin_unlock_irqrestore(&port->lock, flags);
+       port->blocked_open++;
 
        while (1) {
-               if (tty->termios->c_cflag & CBAUD) {
-                       /* Here, we use to lock those two guys, but
-                        * as ircomm_param_request() does it itself,
-                        * I don't see the point (and I see the deadlock).
-                        * Jean II */
-                       self->settings.dte |= IRCOMM_RTS + IRCOMM_DTR;
-
-                       ircomm_param_request(self, IRCOMM_DTE, TRUE);
-               }
+               if (tty->termios.c_cflag & CBAUD)
+                       tty_port_raise_dtr_rts(port);
 
                current->state = TASK_INTERRUPTIBLE;
 
                if (tty_hung_up_p(filp) ||
-                   !test_bit(ASYNC_B_INITIALIZED, &self->flags)) {
-                       retval = (self->flags & ASYNC_HUP_NOTIFY) ?
+                   !test_bit(ASYNCB_INITIALIZED, &port->flags)) {
+                       retval = (port->flags & ASYNC_HUP_NOTIFY) ?
                                        -EAGAIN : -ERESTARTSYS;
                        break;
                }
@@ -317,8 +339,8 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
                 * specified, we cannot return before the IrCOMM link is
                 * ready
                 */
-               if (!test_bit(ASYNC_B_CLOSING, &self->flags) &&
-                   (do_clocal || (self->settings.dce & IRCOMM_CD)) &&
+               if (!test_bit(ASYNCB_CLOSING, &port->flags) &&
+                   (do_clocal || tty_port_carrier_raised(port)) &&
                    self->state == IRCOMM_TTY_READY)
                {
                        break;
@@ -330,46 +352,36 @@ static int ircomm_tty_block_til_ready(struct ircomm_tty_cb *self,
                }
 
                IRDA_DEBUG(1, "%s(%d):block_til_ready blocking on %s open_count=%d\n",
-                     __FILE__,__LINE__, tty->driver->name, self->open_count );
+                     __FILE__, __LINE__, tty->driver->name, port->count);
 
                schedule();
        }
 
        __set_current_state(TASK_RUNNING);
-       remove_wait_queue(&self->open_wait, &wait);
+       remove_wait_queue(&port->open_wait, &wait);
 
        if (extra_count) {
                /* ++ is not atomic, so this should be protected - Jean II */
-               spin_lock_irqsave(&self->spinlock, flags);
-               self->open_count++;
-               spin_unlock_irqrestore(&self->spinlock, flags);
+               spin_lock_irqsave(&port->lock, flags);
+               port->count++;
+               spin_unlock_irqrestore(&port->lock, flags);
        }
-       self->blocked_open--;
+       port->blocked_open--;
 
        IRDA_DEBUG(1, "%s(%d):block_til_ready after blocking on %s open_count=%d\n",
-             __FILE__,__LINE__, tty->driver->name, self->open_count);
+             __FILE__, __LINE__, tty->driver->name, port->count);
 
        if (!retval)
-               self->flags |= ASYNC_NORMAL_ACTIVE;
+               port->flags |= ASYNC_NORMAL_ACTIVE;
 
        return retval;
 }
 
-/*
- * Function ircomm_tty_open (tty, filp)
- *
- *    This routine is called when a particular tty device is opened. This
- *    routine is mandatory; if this routine is not filled in, the attempted
- *    open will fail with ENODEV.
- */
-static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
+
+static int ircomm_tty_install(struct tty_driver *driver, struct tty_struct *tty)
 {
        struct ircomm_tty_cb *self;
        unsigned int line = tty->index;
-       unsigned long   flags;
-       int ret;
-
-       IRDA_DEBUG(2, "%s()\n", __func__ );
 
        /* Check if instance already exists */
        self = hashbin_lock_find(ircomm_tty, line, NULL);
@@ -381,6 +393,8 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
                        return -ENOMEM;
                }
 
+               tty_port_init(&self->port);
+               self->port.ops = &ircomm_port_ops;
                self->magic = IRCOMM_TTY_MAGIC;
                self->flow = FLOW_STOP;
 
@@ -388,13 +402,9 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
                INIT_WORK(&self->tqueue, ircomm_tty_do_softint);
                self->max_header_size = IRCOMM_TTY_HDR_UNINITIALISED;
                self->max_data_size = IRCOMM_TTY_DATA_UNINITIALISED;
-               self->close_delay = 5*HZ/10;
-               self->closing_wait = 30*HZ;
 
                /* Init some important stuff */
                init_timer(&self->watchdog_timer);
-               init_waitqueue_head(&self->open_wait);
-               init_waitqueue_head(&self->close_wait);
                spin_lock_init(&self->spinlock);
 
                /*
@@ -404,31 +414,48 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
                 *
                 * Note this is completely usafe and doesn't work properly
                 */
-               tty->termios->c_iflag = 0;
-               tty->termios->c_oflag = 0;
+               tty->termios.c_iflag = 0;
+               tty->termios.c_oflag = 0;
 
                /* Insert into hash */
                hashbin_insert(ircomm_tty, (irda_queue_t *) self, line, NULL);
        }
-       /* ++ is not atomic, so this should be protected - Jean II */
-       spin_lock_irqsave(&self->spinlock, flags);
-       self->open_count++;
 
-       tty->driver_data = self;
-       self->tty = tty;
-       spin_unlock_irqrestore(&self->spinlock, flags);
+       return tty_port_install(&self->port, driver, tty);
+}
+
+/*
+ * Function ircomm_tty_open (tty, filp)
+ *
+ *    This routine is called when a particular tty device is opened. This
+ *    routine is mandatory; if this routine is not filled in, the attempted
+ *    open will fail with ENODEV.
+ */
+static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
+{
+       struct ircomm_tty_cb *self = tty->driver_data;
+       unsigned long   flags;
+       int ret;
+
+       IRDA_DEBUG(2, "%s()\n", __func__ );
+
+       /* ++ is not atomic, so this should be protected - Jean II */
+       spin_lock_irqsave(&self->port.lock, flags);
+       self->port.count++;
+       spin_unlock_irqrestore(&self->port.lock, flags);
+       tty_port_tty_set(&self->port, tty);
 
        IRDA_DEBUG(1, "%s(), %s%d, count = %d\n", __func__ , tty->driver->name,
-                  self->line, self->open_count);
+                  self->line, self->port.count);
 
        /* Not really used by us, but lets do it anyway */
-       self->tty->low_latency = (self->flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       tty->low_latency = (self->port.flags & ASYNC_LOW_LATENCY) ? 1 : 0;
 
        /*
         * If the port is the middle of closing, bail out now
         */
        if (tty_hung_up_p(filp) ||
-           test_bit(ASYNC_B_CLOSING, &self->flags)) {
+           test_bit(ASYNCB_CLOSING, &self->port.flags)) {
 
                /* Hm, why are we blocking on ASYNC_CLOSING if we
                 * do return -EAGAIN/-ERESTARTSYS below anyway?
@@ -438,14 +465,15 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
                 * probably better sleep uninterruptible?
                 */
 
-               if (wait_event_interruptible(self->close_wait, !test_bit(ASYNC_B_CLOSING, &self->flags))) {
+               if (wait_event_interruptible(self->port.close_wait,
+                               !test_bit(ASYNCB_CLOSING, &self->port.flags))) {
                        IRDA_WARNING("%s - got signal while blocking on ASYNC_CLOSING!\n",
                                     __func__);
                        return -ERESTARTSYS;
                }
 
 #ifdef SERIAL_DO_RESTART
-               return (self->flags & ASYNC_HUP_NOTIFY) ?
+               return (self->port.flags & ASYNC_HUP_NOTIFY) ?
                        -EAGAIN : -ERESTARTSYS;
 #else
                return -EAGAIN;
@@ -453,7 +481,7 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
        }
 
        /* Check if this is a "normal" ircomm device, or an irlpt device */
-       if (line < 0x10) {
+       if (self->line < 0x10) {
                self->service_type = IRCOMM_3_WIRE | IRCOMM_9_WIRE;
                self->settings.service_type = IRCOMM_9_WIRE; /* 9 wire as default */
                /* Jan Kiszka -> add DSR/RI -> Conform to IrCOMM spec */
@@ -469,7 +497,7 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
        if (ret)
                return ret;
 
-       ret = ircomm_tty_block_til_ready(self, filp);
+       ret = ircomm_tty_block_til_ready(self, tty, filp);
        if (ret) {
                IRDA_DEBUG(2,
                      "%s(), returning after block_til_ready with %d\n", __func__ ,
@@ -489,81 +517,22 @@ static int ircomm_tty_open(struct tty_struct *tty, struct file *filp)
 static void ircomm_tty_close(struct tty_struct *tty, struct file *filp)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
-       unsigned long flags;
+       struct tty_port *port = &self->port;
 
        IRDA_DEBUG(0, "%s()\n", __func__ );
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
 
-       spin_lock_irqsave(&self->spinlock, flags);
-
-       if (tty_hung_up_p(filp)) {
-               spin_unlock_irqrestore(&self->spinlock, flags);
-
-               IRDA_DEBUG(0, "%s(), returning 1\n", __func__ );
-               return;
-       }
-
-       if ((tty->count == 1) && (self->open_count != 1)) {
-               /*
-                * Uh, oh.  tty->count is 1, which means that the tty
-                * structure will be freed.  state->count should always
-                * be one in these conditions.  If it's greater than
-                * one, we've got real problems, since it means the
-                * serial port won't be shutdown.
-                */
-               IRDA_DEBUG(0, "%s(), bad serial port count; "
-                          "tty->count is 1, state->count is %d\n", __func__ ,
-                          self->open_count);
-               self->open_count = 1;
-       }
-
-       if (--self->open_count < 0) {
-               IRDA_ERROR("%s(), bad serial port count for ttys%d: %d\n",
-                          __func__, self->line, self->open_count);
-               self->open_count = 0;
-       }
-       if (self->open_count) {
-               spin_unlock_irqrestore(&self->spinlock, flags);
-
-               IRDA_DEBUG(0, "%s(), open count > 0\n", __func__ );
+       if (tty_port_close_start(port, tty, filp) == 0)
                return;
-       }
-
-       /* Hum... Should be test_and_set_bit ??? - Jean II */
-       set_bit(ASYNC_B_CLOSING, &self->flags);
-
-       /* We need to unlock here (we were unlocking at the end of this
-        * function), because tty_wait_until_sent() may schedule.
-        * I don't know if the rest should be protected somehow,
-        * so someone should check. - Jean II */
-       spin_unlock_irqrestore(&self->spinlock, flags);
-
-       /*
-        * Now we wait for the transmit buffer to clear; and we notify
-        * the line discipline to only process XON/XOFF characters.
-        */
-       tty->closing = 1;
-       if (self->closing_wait != ASYNC_CLOSING_WAIT_NONE)
-               tty_wait_until_sent_from_close(tty, self->closing_wait);
 
        ircomm_tty_shutdown(self);
 
        tty_driver_flush_buffer(tty);
-       tty_ldisc_flush(tty);
-
-       tty->closing = 0;
-       self->tty = NULL;
 
-       if (self->blocked_open) {
-               if (self->close_delay)
-                       schedule_timeout_interruptible(self->close_delay);
-               wake_up_interruptible(&self->open_wait);
-       }
-
-       self->flags &= ~(ASYNC_NORMAL_ACTIVE|ASYNC_CLOSING);
-       wake_up_interruptible(&self->close_wait);
+       tty_port_close_end(port, tty);
+       tty_port_tty_set(port, NULL);
 }
 
 /*
@@ -606,7 +575,7 @@ static void ircomm_tty_do_softint(struct work_struct *work)
        if (!self || self->magic != IRCOMM_TTY_MAGIC)
                return;
 
-       tty = self->tty;
+       tty = tty_port_tty_get(&self->port);
        if (!tty)
                return;
 
@@ -627,7 +596,7 @@ static void ircomm_tty_do_softint(struct work_struct *work)
        }
 
        if (tty->hw_stopped)
-               return;
+               goto put;
 
        /* Unlink transmit buffer */
        spin_lock_irqsave(&self->spinlock, flags);
@@ -646,6 +615,8 @@ static void ircomm_tty_do_softint(struct work_struct *work)
 
        /* Check if user (still) wants to be waken up */
        tty_wakeup(tty);
+put:
+       tty_kref_put(tty);
 }
 
 /*
@@ -880,7 +851,7 @@ static void ircomm_tty_throttle(struct tty_struct *tty)
                ircomm_tty_send_xchar(tty, STOP_CHAR(tty));
 
        /* Hardware flow control? */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                self->settings.dte &= ~IRCOMM_RTS;
                self->settings.dte |= IRCOMM_DELTA_RTS;
 
@@ -912,7 +883,7 @@ static void ircomm_tty_unthrottle(struct tty_struct *tty)
        }
 
        /* Using hardware flow control? */
-       if (tty->termios->c_cflag & CRTSCTS) {
+       if (tty->termios.c_cflag & CRTSCTS) {
                self->settings.dte |= (IRCOMM_RTS|IRCOMM_DELTA_RTS);
 
                ircomm_param_request(self, IRCOMM_DTE, TRUE);
@@ -955,7 +926,7 @@ static void ircomm_tty_shutdown(struct ircomm_tty_cb *self)
 
        IRDA_DEBUG(0, "%s()\n", __func__ );
 
-       if (!test_and_clear_bit(ASYNC_B_INITIALIZED, &self->flags))
+       if (!test_and_clear_bit(ASYNCB_INITIALIZED, &self->port.flags))
                return;
 
        ircomm_tty_detach_cable(self);
@@ -994,6 +965,7 @@ static void ircomm_tty_shutdown(struct ircomm_tty_cb *self)
 static void ircomm_tty_hangup(struct tty_struct *tty)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
+       struct tty_port *port = &self->port;
        unsigned long   flags;
 
        IRDA_DEBUG(0, "%s()\n", __func__ );
@@ -1004,14 +976,17 @@ static void ircomm_tty_hangup(struct tty_struct *tty)
        /* ircomm_tty_flush_buffer(tty); */
        ircomm_tty_shutdown(self);
 
-       /* I guess we need to lock here - Jean II */
-       spin_lock_irqsave(&self->spinlock, flags);
-       self->flags &= ~ASYNC_NORMAL_ACTIVE;
-       self->tty = NULL;
-       self->open_count = 0;
-       spin_unlock_irqrestore(&self->spinlock, flags);
+       spin_lock_irqsave(&port->lock, flags);
+       port->flags &= ~ASYNC_NORMAL_ACTIVE;
+       if (port->tty) {
+               set_bit(TTY_IO_ERROR, &port->tty->flags);
+               tty_kref_put(port->tty);
+       }
+       port->tty = NULL;
+       port->count = 0;
+       spin_unlock_irqrestore(&port->lock, flags);
 
-       wake_up_interruptible(&self->open_wait);
+       wake_up_interruptible(&port->open_wait);
 }
 
 /*
@@ -1071,20 +1046,20 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
 
-       tty = self->tty;
+       tty = tty_port_tty_get(&self->port);
 
        status = self->settings.dce;
 
        if (status & IRCOMM_DCE_DELTA_ANY) {
                /*wake_up_interruptible(&self->delta_msr_wait);*/
        }
-       if ((self->flags & ASYNC_CHECK_CD) && (status & IRCOMM_DELTA_CD)) {
+       if ((self->port.flags & ASYNC_CHECK_CD) && (status & IRCOMM_DELTA_CD)) {
                IRDA_DEBUG(2,
                           "%s(), ircomm%d CD now %s...\n", __func__ , self->line,
                           (status & IRCOMM_CD) ? "on" : "off");
 
                if (status & IRCOMM_CD) {
-                       wake_up_interruptible(&self->open_wait);
+                       wake_up_interruptible(&self->port.open_wait);
                } else {
                        IRDA_DEBUG(2,
                                   "%s(), Doing serial hangup..\n", __func__ );
@@ -1092,10 +1067,10 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
                                tty_hangup(tty);
 
                        /* Hangup will remote the tty, so better break out */
-                       return;
+                       goto put;
                }
        }
-       if (self->flags & ASYNC_CTS_FLOW) {
+       if (tty && tty_port_cts_enabled(&self->port)) {
                if (tty->hw_stopped) {
                        if (status & IRCOMM_CTS) {
                                IRDA_DEBUG(2,
@@ -1103,10 +1078,10 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
                                tty->hw_stopped = 0;
 
                                /* Wake up processes blocked on open */
-                               wake_up_interruptible(&self->open_wait);
+                               wake_up_interruptible(&self->port.open_wait);
 
                                schedule_work(&self->tqueue);
-                               return;
+                               goto put;
                        }
                } else {
                        if (!(status & IRCOMM_CTS)) {
@@ -1116,6 +1091,8 @@ void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self)
                        }
                }
        }
+put:
+       tty_kref_put(tty);
 }
 
 /*
@@ -1128,6 +1105,7 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
                                      struct sk_buff *skb)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
+       struct tty_struct *tty;
 
        IRDA_DEBUG(2, "%s()\n", __func__ );
 
@@ -1135,7 +1113,8 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);
        IRDA_ASSERT(skb != NULL, return -1;);
 
-       if (!self->tty) {
+       tty = tty_port_tty_get(&self->port);
+       if (!tty) {
                IRDA_DEBUG(0, "%s(), no tty!\n", __func__ );
                return 0;
        }
@@ -1146,7 +1125,7 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
         * Devices like WinCE can do this, and since they don't send any
         * params, we can just as well declare the hardware for running.
         */
-       if (self->tty->hw_stopped && (self->flow == FLOW_START)) {
+       if (tty->hw_stopped && (self->flow == FLOW_START)) {
                IRDA_DEBUG(0, "%s(), polling for line settings!\n", __func__ );
                ircomm_param_request(self, IRCOMM_POLL, TRUE);
 
@@ -1159,8 +1138,9 @@ static int ircomm_tty_data_indication(void *instance, void *sap,
         * Use flip buffer functions since the code may be called from interrupt
         * context
         */
-       tty_insert_flip_string(self->tty, skb->data, skb->len);
-       tty_flip_buffer_push(self->tty);
+       tty_insert_flip_string(tty, skb->data, skb->len);
+       tty_flip_buffer_push(tty);
+       tty_kref_put(tty);
 
        /* No need to kfree_skb - see ircomm_ttp_data_indication() */
 
@@ -1211,12 +1191,13 @@ static void ircomm_tty_flow_indication(void *instance, void *sap,
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
 
-       tty = self->tty;
+       tty = tty_port_tty_get(&self->port);
 
        switch (cmd) {
        case FLOW_START:
                IRDA_DEBUG(2, "%s(), hw start!\n", __func__ );
-               tty->hw_stopped = 0;
+               if (tty)
+                       tty->hw_stopped = 0;
 
                /* ircomm_tty_do_softint will take care of the rest */
                schedule_work(&self->tqueue);
@@ -1224,15 +1205,19 @@ static void ircomm_tty_flow_indication(void *instance, void *sap,
        default:  /* If we get here, something is very wrong, better stop */
        case FLOW_STOP:
                IRDA_DEBUG(2, "%s(), hw stopped!\n", __func__ );
-               tty->hw_stopped = 1;
+               if (tty)
+                       tty->hw_stopped = 1;
                break;
        }
+
+       tty_kref_put(tty);
        self->flow = cmd;
 }
 
 #ifdef CONFIG_PROC_FS
 static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m)
 {
+       struct tty_struct *tty;
        char sep;
 
        seq_printf(m, "State: %s\n", ircomm_tty_state[self->state]);
@@ -1328,40 +1313,43 @@ static void ircomm_tty_line_info(struct ircomm_tty_cb *self, struct seq_file *m)
 
        seq_puts(m, "Flags:");
        sep = ' ';
-       if (self->flags & ASYNC_CTS_FLOW) {
+       if (tty_port_cts_enabled(&self->port)) {
                seq_printf(m, "%cASYNC_CTS_FLOW", sep);
                sep = '|';
        }
-       if (self->flags & ASYNC_CHECK_CD) {
+       if (self->port.flags & ASYNC_CHECK_CD) {
                seq_printf(m, "%cASYNC_CHECK_CD", sep);
                sep = '|';
        }
-       if (self->flags & ASYNC_INITIALIZED) {
+       if (self->port.flags & ASYNC_INITIALIZED) {
                seq_printf(m, "%cASYNC_INITIALIZED", sep);
                sep = '|';
        }
-       if (self->flags & ASYNC_LOW_LATENCY) {
+       if (self->port.flags & ASYNC_LOW_LATENCY) {
                seq_printf(m, "%cASYNC_LOW_LATENCY", sep);
                sep = '|';
        }
-       if (self->flags & ASYNC_CLOSING) {
+       if (self->port.flags & ASYNC_CLOSING) {
                seq_printf(m, "%cASYNC_CLOSING", sep);
                sep = '|';
        }
-       if (self->flags & ASYNC_NORMAL_ACTIVE) {
+       if (self->port.flags & ASYNC_NORMAL_ACTIVE) {
                seq_printf(m, "%cASYNC_NORMAL_ACTIVE", sep);
                sep = '|';
        }
        seq_putc(m, '\n');
 
        seq_printf(m, "Role: %s\n", self->client ? "client" : "server");
-       seq_printf(m, "Open count: %d\n", self->open_count);
+       seq_printf(m, "Open count: %d\n", self->port.count);
        seq_printf(m, "Max data size: %d\n", self->max_data_size);
        seq_printf(m, "Max header size: %d\n", self->max_header_size);
 
-       if (self->tty)
+       tty = tty_port_tty_get(&self->port);
+       if (tty) {
                seq_printf(m, "Hardware: %s\n",
-                              self->tty->hw_stopped ? "Stopped" : "Running");
+                              tty->hw_stopped ? "Stopped" : "Running");
+               tty_kref_put(tty);
+       }
 }
 
 static int ircomm_tty_proc_show(struct seq_file *m, void *v)
index b65d66e..edab393 100644 (file)
@@ -130,6 +130,8 @@ static int (*state[])(struct ircomm_tty_cb *self, IRCOMM_TTY_EVENT event,
  */
 int ircomm_tty_attach_cable(struct ircomm_tty_cb *self)
 {
+       struct tty_struct *tty;
+
        IRDA_DEBUG(0, "%s()\n", __func__ );
 
        IRDA_ASSERT(self != NULL, return -1;);
@@ -142,7 +144,11 @@ int ircomm_tty_attach_cable(struct ircomm_tty_cb *self)
        }
 
        /* Make sure nobody tries to write before the link is up */
-       self->tty->hw_stopped = 1;
+       tty = tty_port_tty_get(&self->port);
+       if (tty) {
+               tty->hw_stopped = 1;
+               tty_kref_put(tty);
+       }
 
        ircomm_tty_ias_register(self);
 
@@ -398,23 +404,26 @@ void ircomm_tty_disconnect_indication(void *instance, void *sap,
                                      struct sk_buff *skb)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;
+       struct tty_struct *tty;
 
        IRDA_DEBUG(2, "%s()\n", __func__ );
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
 
-       if (!self->tty)
+       tty = tty_port_tty_get(&self->port);
+       if (!tty)
                return;
 
        /* This will stop control data transfers */
        self->flow = FLOW_STOP;
 
        /* Stop data transfers */
-       self->tty->hw_stopped = 1;
+       tty->hw_stopped = 1;
 
        ircomm_tty_do_event(self, IRCOMM_TTY_DISCONNECT_INDICATION, NULL,
                            NULL);
+       tty_kref_put(tty);
 }
 
 /*
@@ -550,12 +559,15 @@ void ircomm_tty_connect_indication(void *instance, void *sap,
  */
 void ircomm_tty_link_established(struct ircomm_tty_cb *self)
 {
+       struct tty_struct *tty;
+
        IRDA_DEBUG(2, "%s()\n", __func__ );
 
        IRDA_ASSERT(self != NULL, return;);
        IRDA_ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);
 
-       if (!self->tty)
+       tty = tty_port_tty_get(&self->port);
+       if (!tty)
                return;
 
        del_timer(&self->watchdog_timer);
@@ -566,19 +578,22 @@ void ircomm_tty_link_established(struct ircomm_tty_cb *self)
         * will have to wait for the peer device (DCE) to raise the CTS
         * line.
         */
-       if ((self->flags & ASYNC_CTS_FLOW) && ((self->settings.dce & IRCOMM_CTS) == 0)) {
+       if (tty_port_cts_enabled(&self->port) &&
+                       ((self->settings.dce & IRCOMM_CTS) == 0)) {
                IRDA_DEBUG(0, "%s(), waiting for CTS ...\n", __func__ );
-               return;
+               goto put;
        } else {
                IRDA_DEBUG(1, "%s(), starting hardware!\n", __func__ );
 
-               self->tty->hw_stopped = 0;
+               tty->hw_stopped = 0;
 
                /* Wake up processes blocked on open */
-               wake_up_interruptible(&self->open_wait);
+               wake_up_interruptible(&self->port.open_wait);
        }
 
        schedule_work(&self->tqueue);
+put:
+       tty_kref_put(tty);
 }
 
 /*
@@ -977,14 +992,17 @@ static int ircomm_tty_state_ready(struct ircomm_tty_cb *self,
                ircomm_tty_next_state(self, IRCOMM_TTY_SEARCH);
                ircomm_tty_start_watchdog_timer(self, 3*HZ);
 
-               if (self->flags & ASYNC_CHECK_CD) {
+               if (self->port.flags & ASYNC_CHECK_CD) {
                        /* Drop carrier */
                        self->settings.dce = IRCOMM_DELTA_CD;
                        ircomm_tty_check_modem_status(self);
                } else {
+                       struct tty_struct *tty = tty_port_tty_get(&self->port);
                        IRDA_DEBUG(0, "%s(), hanging up!\n", __func__ );
-                       if (self->tty)
-                               tty_hangup(self->tty);
+                       if (tty) {
+                               tty_hangup(tty);
+                               tty_kref_put(tty);
+                       }
                }
                break;
        default:
index d0667d6..b343f50 100644 (file)
  *    Change speed of the driver. If the remote device is a DCE, then this
  *    should make it change the speed of its serial port
  */
-static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
+static void ircomm_tty_change_speed(struct ircomm_tty_cb *self,
+               struct tty_struct *tty)
 {
        unsigned int cflag, cval;
        int baud;
 
        IRDA_DEBUG(2, "%s()\n", __func__ );
 
-       if (!self->tty || !self->tty->termios || !self->ircomm)
+       if (!self->ircomm)
                return;
 
-       cflag = self->tty->termios->c_cflag;
+       cflag = tty->termios.c_cflag;
 
        /*  byte size and parity */
        switch (cflag & CSIZE) {
@@ -81,7 +82,7 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
                cval |= IRCOMM_PARITY_EVEN;
 
        /* Determine divisor based on baud rate */
-       baud = tty_get_baud_rate(self->tty);
+       baud = tty_get_baud_rate(tty);
        if (!baud)
                baud = 9600;    /* B0 transition handled in rs_set_termios */
 
@@ -90,19 +91,19 @@ static void ircomm_tty_change_speed(struct ircomm_tty_cb *self)
 
        /* CTS flow control flag and modem status interrupts */
        if (cflag & CRTSCTS) {
-               self->flags |= ASYNC_CTS_FLOW;
+               self->port.flags |= ASYNC_CTS_FLOW;
                self->settings.flow_control |= IRCOMM_RTS_CTS_IN;
                /* This got me. Bummer. Jean II */
                if (self->service_type == IRCOMM_3_WIRE_RAW)
                        IRDA_WARNING("%s(), enabling RTS/CTS on link that doesn't support it (3-wire-raw)\n", __func__);
        } else {
-               self->flags &= ~ASYNC_CTS_FLOW;
+               self->port.flags &= ~ASYNC_CTS_FLOW;
                self->settings.flow_control &= ~IRCOMM_RTS_CTS_IN;
        }
        if (cflag & CLOCAL)
-               self->flags &= ~ASYNC_CHECK_CD;
+               self->port.flags &= ~ASYNC_CHECK_CD;
        else
-               self->flags |= ASYNC_CHECK_CD;
+               self->port.flags |= ASYNC_CHECK_CD;
 #if 0
        /*
         * Set up parity check flag
@@ -148,18 +149,18 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
                            struct ktermios *old_termios)
 {
        struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;
-       unsigned int cflag = tty->termios->c_cflag;
+       unsigned int cflag = tty->termios.c_cflag;
 
        IRDA_DEBUG(2, "%s()\n", __func__ );
 
        if ((cflag == old_termios->c_cflag) &&
-           (RELEVANT_IFLAG(tty->termios->c_iflag) ==
+           (RELEVANT_IFLAG(tty->termios.c_iflag) ==
             RELEVANT_IFLAG(old_termios->c_iflag)))
        {
                return;
        }
 
-       ircomm_tty_change_speed(self);
+       ircomm_tty_change_speed(self, tty);
 
        /* Handle transition to B0 status */
        if ((old_termios->c_cflag & CBAUD) &&
@@ -172,7 +173,7 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
        if (!(old_termios->c_cflag & CBAUD) &&
            (cflag & CBAUD)) {
                self->settings.dte |= IRCOMM_DTR;
-               if (!(tty->termios->c_cflag & CRTSCTS) ||
+               if (!(tty->termios.c_cflag & CRTSCTS) ||
                    !test_bit(TTY_THROTTLED, &tty->flags)) {
                        self->settings.dte |= IRCOMM_RTS;
                }
@@ -181,7 +182,7 @@ void ircomm_tty_set_termios(struct tty_struct *tty,
 
        /* Handle turning off CRTSCTS */
        if ((old_termios->c_cflag & CRTSCTS) &&
-           !(tty->termios->c_cflag & CRTSCTS))
+           !(tty->termios.c_cflag & CRTSCTS))
        {
                tty->hw_stopped = 0;
                ircomm_tty_start(tty);
@@ -270,10 +271,10 @@ static int ircomm_tty_get_serial_info(struct ircomm_tty_cb *self,
 
        memset(&info, 0, sizeof(info));
        info.line = self->line;
-       info.flags = self->flags;
+       info.flags = self->port.flags;
        info.baud_base = self->settings.data_rate;
-       info.close_delay = self->close_delay;
-       info.closing_wait = self->closing_wait;
+       info.close_delay = self->port.close_delay;
+       info.closing_wait = self->port.closing_wait;
 
        /* For compatibility  */
        info.type = PORT_16550A;
index 393355d..1a9f372 100644 (file)
@@ -1347,11 +1347,10 @@ static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel)
        /* Remove from tunnel list */
        spin_lock_bh(&pn->l2tp_tunnel_list_lock);
        list_del_rcu(&tunnel->list);
+       kfree_rcu(tunnel, rcu);
        spin_unlock_bh(&pn->l2tp_tunnel_list_lock);
-       synchronize_rcu();
 
        atomic_dec(&l2tp_tunnel_count);
-       kfree(tunnel);
 }
 
 /* Create a socket for the tunnel, if one isn't set up by
@@ -1502,6 +1501,8 @@ out:
        return err;
 }
 
+static struct lock_class_key l2tp_socket_class;
+
 int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg, struct l2tp_tunnel **tunnelp)
 {
        struct l2tp_tunnel *tunnel = NULL;
@@ -1606,6 +1607,8 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32
        tunnel->old_sk_destruct = sk->sk_destruct;
        sk->sk_destruct = &l2tp_tunnel_destruct;
        tunnel->sock = sk;
+       lockdep_set_class_and_name(&sk->sk_lock.slock, &l2tp_socket_class, "l2tp_sock");
+
        sk->sk_allocation = GFP_ATOMIC;
 
        /* Add tunnel to our list */
index a38ec6c..56d583e 100644 (file)
@@ -163,6 +163,7 @@ struct l2tp_tunnel_cfg {
 
 struct l2tp_tunnel {
        int                     magic;          /* Should be L2TP_TUNNEL_MAGIC */
+       struct rcu_head rcu;
        rwlock_t                hlist_lock;     /* protect session_hlist */
        struct hlist_head       session_hlist[L2TP_HASH_SIZE];
                                                /* hashed list of sessions,
index f9ee74d..3bfb34a 100644 (file)
@@ -153,7 +153,7 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb,
                print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, skb->data, length);
        }
 
-       if (!pskb_may_pull(skb, sizeof(ETH_HLEN)))
+       if (!pskb_may_pull(skb, ETH_HLEN))
                goto error;
 
        secpath_reset(skb);
index d41974a..a58c0b6 100644 (file)
@@ -1378,6 +1378,8 @@ static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
        else
                memset(next_hop, 0, ETH_ALEN);
 
+       memset(pinfo, 0, sizeof(*pinfo));
+
        pinfo->generation = mesh_paths_generation;
 
        pinfo->filled = MPATH_INFO_FRAME_QLEN |
@@ -1396,7 +1398,6 @@ static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
        pinfo->discovery_timeout =
                        jiffies_to_msecs(mpath->discovery_timeout);
        pinfo->discovery_retries = mpath->discovery_retries;
-       pinfo->flags = 0;
        if (mpath->flags & MESH_PATH_ACTIVE)
                pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE;
        if (mpath->flags & MESH_PATH_RESOLVING)
@@ -1405,10 +1406,8 @@ static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop,
                pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID;
        if (mpath->flags & MESH_PATH_FIXED)
                pinfo->flags |= NL80211_MPATH_FLAG_FIXED;
-       if (mpath->flags & MESH_PATH_RESOLVING)
-               pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING;
-
-       pinfo->flags = mpath->flags;
+       if (mpath->flags & MESH_PATH_RESOLVED)
+               pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED;
 }
 
 static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev,
index a4a5acd..f76b833 100644 (file)
@@ -3248,6 +3248,8 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
        goto out_unlock;
 
  err_clear:
+       memset(ifmgd->bssid, 0, ETH_ALEN);
+       ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
        ifmgd->auth_data = NULL;
  err_free:
        kfree(auth_data);
@@ -3439,6 +3441,8 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
        err = 0;
        goto out;
  err_clear:
+       memset(ifmgd->bssid, 0, ETH_ALEN);
+       ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
        ifmgd->assoc_data = NULL;
  err_free:
        kfree(assoc_data);
index acf712f..c5e8c9c 100644 (file)
@@ -1811,37 +1811,31 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
                        meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr,
                                        sdata, NULL, NULL);
                } else {
-                       int is_mesh_mcast = 1;
-                       const u8 *mesh_da;
+                       /* DS -> MBSS (802.11-2012 13.11.3.3).
+                        * For unicast with unknown forwarding information,
+                        * destination might be in the MBSS or if that fails
+                        * forwarded to another mesh gate. In either case
+                        * resolution will be handled in ieee80211_xmit(), so
+                        * leave the original DA. This also works for mcast */
+                       const u8 *mesh_da = skb->data;
+
+                       if (mppath)
+                               mesh_da = mppath->mpp;
+                       else if (mpath)
+                               mesh_da = mpath->dst;
+                       rcu_read_unlock();
 
-                       if (is_multicast_ether_addr(skb->data))
-                               /* DA TA mSA AE:SA */
-                               mesh_da = skb->data;
-                       else {
-                               static const u8 bcast[ETH_ALEN] =
-                                       { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
-                               if (mppath) {
-                                       /* RA TA mDA mSA AE:DA SA */
-                                       mesh_da = mppath->mpp;
-                                       is_mesh_mcast = 0;
-                               } else if (mpath) {
-                                       mesh_da = mpath->dst;
-                                       is_mesh_mcast = 0;
-                               } else {
-                                       /* DA TA mSA AE:SA */
-                                       mesh_da = bcast;
-                               }
-                       }
                        hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc,
                                        mesh_da, sdata->vif.addr);
-                       rcu_read_unlock();
-                       if (is_mesh_mcast)
+                       if (is_multicast_ether_addr(mesh_da))
+                               /* DA TA mSA AE:SA */
                                meshhdrlen =
                                        ieee80211_new_mesh_header(&mesh_hdr,
                                                        sdata,
                                                        skb->data + ETH_ALEN,
                                                        NULL);
                        else
+                               /* RA TA mDA mSA AE:DA SA */
                                meshhdrlen =
                                        ieee80211_new_mesh_header(&mesh_hdr,
                                                        sdata,
index 72bf32a..f51013c 100644 (file)
@@ -1171,8 +1171,10 @@ ip_vs_add_service(struct net *net, struct ip_vs_service_user_kern *u,
                goto out_err;
        }
        svc->stats.cpustats = alloc_percpu(struct ip_vs_cpu_stats);
-       if (!svc->stats.cpustats)
+       if (!svc->stats.cpustats) {
+               ret = -ENOMEM;
                goto out_err;
+       }
 
        /* I'm the first user of the service */
        atomic_set(&svc->usecnt, 0);
index cf48755..2ceec64 100644 (file)
@@ -249,12 +249,15 @@ static void death_by_event(unsigned long ul_conntrack)
 {
        struct nf_conn *ct = (void *)ul_conntrack;
        struct net *net = nf_ct_net(ct);
+       struct nf_conntrack_ecache *ecache = nf_ct_ecache_find(ct);
+
+       BUG_ON(ecache == NULL);
 
        if (nf_conntrack_event(IPCT_DESTROY, ct) < 0) {
                /* bad luck, let's retry again */
-               ct->timeout.expires = jiffies +
+               ecache->timeout.expires = jiffies +
                        (random32() % net->ct.sysctl_events_retry_timeout);
-               add_timer(&ct->timeout);
+               add_timer(&ecache->timeout);
                return;
        }
        /* we've got the event delivered, now it's dying */
@@ -268,6 +271,9 @@ static void death_by_event(unsigned long ul_conntrack)
 void nf_ct_insert_dying_list(struct nf_conn *ct)
 {
        struct net *net = nf_ct_net(ct);
+       struct nf_conntrack_ecache *ecache = nf_ct_ecache_find(ct);
+
+       BUG_ON(ecache == NULL);
 
        /* add this conntrack to the dying list */
        spin_lock_bh(&nf_conntrack_lock);
@@ -275,10 +281,10 @@ void nf_ct_insert_dying_list(struct nf_conn *ct)
                             &net->ct.dying);
        spin_unlock_bh(&nf_conntrack_lock);
        /* set a new timer to retry event delivery */
-       setup_timer(&ct->timeout, death_by_event, (unsigned long)ct);
-       ct->timeout.expires = jiffies +
+       setup_timer(&ecache->timeout, death_by_event, (unsigned long)ct);
+       ecache->timeout.expires = jiffies +
                (random32() % net->ct.sysctl_events_retry_timeout);
-       add_timer(&ct->timeout);
+       add_timer(&ecache->timeout);
 }
 EXPORT_SYMBOL_GPL(nf_ct_insert_dying_list);
 
index da4fc37..9807f32 100644 (file)
@@ -2790,7 +2790,8 @@ static int __init ctnetlink_init(void)
                goto err_unreg_subsys;
        }
 
-       if (register_pernet_subsys(&ctnetlink_net_ops)) {
+       ret = register_pernet_subsys(&ctnetlink_net_ops);
+       if (ret < 0) {
                pr_err("ctnetlink_init: cannot register pernet operations\n");
                goto err_unreg_exp_subsys;
        }
index a5ac11e..e046b37 100644 (file)
@@ -158,21 +158,18 @@ static const u8 tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = {
  *     sCL -> sSS
  */
 /*          sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sS2   */
-/*synack*/ { sIV, sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG, sSR },
+/*synack*/ { sIV, sIV, sSR, sIV, sIV, sIV, sIV, sIV, sIV, sSR },
 /*
  *     sNO -> sIV      Too late and no reason to do anything
  *     sSS -> sIV      Client can't send SYN and then SYN/ACK
  *     sS2 -> sSR      SYN/ACK sent to SYN2 in simultaneous open
- *     sSR -> sIG
- *     sES -> sIG      Error: SYNs in window outside the SYN_SENT state
- *                     are errors. Receiver will reply with RST
- *                     and close the connection.
- *                     Or we are not in sync and hold a dead connection.
- *     sFW -> sIG
- *     sCW -> sIG
- *     sLA -> sIG
- *     sTW -> sIG
- *     sCL -> sIG
+ *     sSR -> sSR      Late retransmitted SYN/ACK in simultaneous open
+ *     sES -> sIV      Invalid SYN/ACK packets sent by the client
+ *     sFW -> sIV
+ *     sCW -> sIV
+ *     sLA -> sIV
+ *     sTW -> sIV
+ *     sCL -> sIV
  */
 /*          sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sS2   */
 /*fin*/    { sIV, sIV, sFW, sFW, sLA, sLA, sLA, sTW, sCL, sIV },
@@ -633,15 +630,9 @@ static bool tcp_in_window(const struct nf_conn *ct,
                ack = sack = receiver->td_end;
        }
 
-       if (seq == end
-           && (!tcph->rst
-               || (seq == 0 && state->state == TCP_CONNTRACK_SYN_SENT)))
+       if (tcph->rst && seq == 0 && state->state == TCP_CONNTRACK_SYN_SENT)
                /*
-                * Packets contains no data: we assume it is valid
-                * and check the ack value only.
-                * However RST segments are always validated by their
-                * SEQ number, except when seq == 0 (reset sent answering
-                * SYN.
+                * RST sent answering SYN.
                 */
                seq = end = sender->td_end;
 
index 169ab59..5cfb5be 100644 (file)
@@ -381,6 +381,7 @@ __build_packet_message(struct nfulnl_instance *inst,
        struct nlmsghdr *nlh;
        struct nfgenmsg *nfmsg;
        sk_buff_data_t old_tail = inst->skb->tail;
+       struct sock *sk;
 
        nlh = nlmsg_put(inst->skb, 0, 0,
                        NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET,
@@ -480,7 +481,7 @@ __build_packet_message(struct nfulnl_instance *inst,
        }
 
        if (indev && skb_mac_header_was_set(skb)) {
-               if (nla_put_be32(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) ||
+               if (nla_put_be16(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) ||
                    nla_put_be16(inst->skb, NFULA_HWLEN,
                                 htons(skb->dev->hard_header_len)) ||
                    nla_put(inst->skb, NFULA_HWHEADER, skb->dev->hard_header_len,
@@ -499,18 +500,19 @@ __build_packet_message(struct nfulnl_instance *inst,
        }
 
        /* UID */
-       if (skb->sk) {
-               read_lock_bh(&skb->sk->sk_callback_lock);
-               if (skb->sk->sk_socket && skb->sk->sk_socket->file) {
-                       struct file *file = skb->sk->sk_socket->file;
+       sk = skb->sk;
+       if (sk && sk->sk_state != TCP_TIME_WAIT) {
+               read_lock_bh(&sk->sk_callback_lock);
+               if (sk->sk_socket && sk->sk_socket->file) {
+                       struct file *file = sk->sk_socket->file;
                        __be32 uid = htonl(file->f_cred->fsuid);
                        __be32 gid = htonl(file->f_cred->fsgid);
-                       read_unlock_bh(&skb->sk->sk_callback_lock);
+                       read_unlock_bh(&sk->sk_callback_lock);
                        if (nla_put_be32(inst->skb, NFULA_UID, uid) ||
                            nla_put_be32(inst->skb, NFULA_GID, gid))
                                goto nla_put_failure;
                } else
-                       read_unlock_bh(&skb->sk->sk_callback_lock);
+                       read_unlock_bh(&sk->sk_callback_lock);
        }
 
        /* local sequence number */
@@ -996,8 +998,10 @@ static int __init nfnetlink_log_init(void)
 
 #ifdef CONFIG_PROC_FS
        if (!proc_create("nfnetlink_log", 0440,
-                        proc_net_netfilter, &nful_file_ops))
+                        proc_net_netfilter, &nful_file_ops)) {
+               status = -ENOMEM;
                goto cleanup_logger;
+       }
 #endif
        return status;
 
index ff5f75f..91e9af4 100644 (file)
@@ -145,6 +145,19 @@ static int dump_tcp_header(struct sbuff *m, const struct sk_buff *skb,
        return 0;
 }
 
+static void dump_sk_uid_gid(struct sbuff *m, struct sock *sk)
+{
+       if (!sk || sk->sk_state == TCP_TIME_WAIT)
+               return;
+
+       read_lock_bh(&sk->sk_callback_lock);
+       if (sk->sk_socket && sk->sk_socket->file)
+               sb_add(m, "UID=%u GID=%u ",
+                       sk->sk_socket->file->f_cred->fsuid,
+                       sk->sk_socket->file->f_cred->fsgid);
+       read_unlock_bh(&sk->sk_callback_lock);
+}
+
 /* One level of recursion won't kill us */
 static void dump_ipv4_packet(struct sbuff *m,
                        const struct nf_loginfo *info,
@@ -361,14 +374,8 @@ static void dump_ipv4_packet(struct sbuff *m,
        }
 
        /* Max length: 15 "UID=4294967295 " */
-       if ((logflags & XT_LOG_UID) && !iphoff && skb->sk) {
-               read_lock_bh(&skb->sk->sk_callback_lock);
-               if (skb->sk->sk_socket && skb->sk->sk_socket->file)
-                       sb_add(m, "UID=%u GID=%u ",
-                               skb->sk->sk_socket->file->f_cred->fsuid,
-                               skb->sk->sk_socket->file->f_cred->fsgid);
-               read_unlock_bh(&skb->sk->sk_callback_lock);
-       }
+       if ((logflags & XT_LOG_UID) && !iphoff)
+               dump_sk_uid_gid(m, skb->sk);
 
        /* Max length: 16 "MARK=0xFFFFFFFF " */
        if (!iphoff && skb->mark)
@@ -436,8 +443,8 @@ log_packet_common(struct sbuff *m,
                  const struct nf_loginfo *loginfo,
                  const char *prefix)
 {
-       sb_add(m, "<%d>%sIN=%s OUT=%s ", loginfo->u.log.level,
-              prefix,
+       sb_add(m, KERN_SOH "%c%sIN=%s OUT=%s ",
+              '0' + loginfo->u.log.level, prefix,
               in ? in->name : "",
               out ? out->name : "");
 #ifdef CONFIG_BRIDGE_NETFILTER
@@ -717,14 +724,8 @@ static void dump_ipv6_packet(struct sbuff *m,
        }
 
        /* Max length: 15 "UID=4294967295 " */
-       if ((logflags & XT_LOG_UID) && recurse && skb->sk) {
-               read_lock_bh(&skb->sk->sk_callback_lock);
-               if (skb->sk->sk_socket && skb->sk->sk_socket->file)
-                       sb_add(m, "UID=%u GID=%u ",
-                               skb->sk->sk_socket->file->f_cred->fsuid,
-                               skb->sk->sk_socket->file->f_cred->fsgid);
-               read_unlock_bh(&skb->sk->sk_callback_lock);
-       }
+       if ((logflags & XT_LOG_UID) && recurse)
+               dump_sk_uid_gid(m, skb->sk);
 
        /* Max length: 16 "MARK=0xFFFFFFFF " */
        if (!recurse && skb->mark)
index 1445d73..5270238 100644 (file)
@@ -1373,7 +1373,8 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
                dst_pid = addr->nl_pid;
                dst_group = ffs(addr->nl_groups);
                err =  -EPERM;
-               if (dst_group && !netlink_capable(sock, NL_NONROOT_SEND))
+               if ((dst_group || dst_pid) &&
+                   !netlink_capable(sock, NL_NONROOT_SEND))
                        goto out;
        } else {
                dst_pid = nlk->dst_pid;
@@ -2147,6 +2148,7 @@ static void __init netlink_add_usersock_entry(void)
        rcu_assign_pointer(nl_table[NETLINK_USERSOCK].listeners, listeners);
        nl_table[NETLINK_USERSOCK].module = THIS_MODULE;
        nl_table[NETLINK_USERSOCK].registered = 1;
+       nl_table[NETLINK_USERSOCK].nl_nonroot = NL_NONROOT_SEND;
 
        netlink_table_ungrab();
 }
index 06592d8..1b9024e 100644 (file)
@@ -1169,7 +1169,12 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock,
                msg->msg_flags |= MSG_TRUNC;
        }
 
-       skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
+       er = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
+       if (er < 0) {
+               skb_free_datagram(sk, skb);
+               release_sock(sk);
+               return er;
+       }
 
        if (sax != NULL) {
                sax->sax25_family = AF_NETROM;
index f3f96ba..954405c 100644 (file)
@@ -45,7 +45,7 @@ static int make_writable(struct sk_buff *skb, int write_len)
        return pskb_expand_head(skb, 0, 0, GFP_ATOMIC);
 }
 
-/* remove VLAN header from packet and update csum accrodingly. */
+/* remove VLAN header from packet and update csum accordingly. */
 static int __pop_vlan_tci(struct sk_buff *skb, __be16 *current_tci)
 {
        struct vlan_hdr *vhdr;
index d8277d2..cf58ced 100644 (file)
@@ -425,10 +425,10 @@ static int validate_sample(const struct nlattr *attr,
 static int validate_tp_port(const struct sw_flow_key *flow_key)
 {
        if (flow_key->eth.type == htons(ETH_P_IP)) {
-               if (flow_key->ipv4.tp.src && flow_key->ipv4.tp.dst)
+               if (flow_key->ipv4.tp.src || flow_key->ipv4.tp.dst)
                        return 0;
        } else if (flow_key->eth.type == htons(ETH_P_IPV6)) {
-               if (flow_key->ipv6.tp.src && flow_key->ipv6.tp.dst)
+               if (flow_key->ipv6.tp.src || flow_key->ipv6.tp.dst)
                        return 0;
        }
 
@@ -460,7 +460,7 @@ static int validate_set(const struct nlattr *a,
                if (flow_key->eth.type != htons(ETH_P_IP))
                        return -EINVAL;
 
-               if (!flow_key->ipv4.addr.src || !flow_key->ipv4.addr.dst)
+               if (!flow_key->ip.proto)
                        return -EINVAL;
 
                ipv4_key = nla_data(ovs_key);
index 9b75617..c30df1a 100644 (file)
@@ -145,15 +145,17 @@ u64 ovs_flow_used_time(unsigned long flow_jiffies);
  *  OVS_KEY_ATTR_PRIORITY      4    --     4      8
  *  OVS_KEY_ATTR_IN_PORT       4    --     4      8
  *  OVS_KEY_ATTR_ETHERNET     12    --     4     16
+ *  OVS_KEY_ATTR_ETHERTYPE     2     2     4      8  (outer VLAN ethertype)
  *  OVS_KEY_ATTR_8021Q         4    --     4      8
- *  OVS_KEY_ATTR_ETHERTYPE     2     2     4      8
+ *  OVS_KEY_ATTR_ENCAP         0    --     4      4  (VLAN encapsulation)
+ *  OVS_KEY_ATTR_ETHERTYPE     2     2     4      8  (inner VLAN ethertype)
  *  OVS_KEY_ATTR_IPV6         40    --     4     44
  *  OVS_KEY_ATTR_ICMPV6        2     2     4      8
  *  OVS_KEY_ATTR_ND           28    --     4     32
  *  -------------------------------------------------
- *  total                                       132
+ *  total                                       144
  */
-#define FLOW_BUFSIZE 132
+#define FLOW_BUFSIZE 144
 
 int ovs_flow_to_nlattrs(const struct sw_flow_key *, struct sk_buff *);
 int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp,
index aee7196..c5c9e2a 100644 (file)
@@ -1273,7 +1273,7 @@ static void __fanout_unlink(struct sock *sk, struct packet_sock *po)
        spin_unlock(&f->lock);
 }
 
-bool match_fanout_group(struct packet_type *ptype, struct sock * sk)
+static bool match_fanout_group(struct packet_type *ptype, struct sock * sk)
 {
        if (ptype->af_packet_priv == (void*)((struct packet_sock *)sk)->fanout)
                return true;
index 6aabd77..564b9fc 100644 (file)
@@ -250,10 +250,11 @@ cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
                        else if ((cl = defmap[res.classid & TC_PRIO_MAX]) == NULL)
                                cl = defmap[TC_PRIO_BESTEFFORT];
 
-                       if (cl == NULL || cl->level >= head->level)
+                       if (cl == NULL)
                                goto fallback;
                }
-
+               if (cl->level >= head->level)
+                       goto fallback;
 #ifdef CONFIG_NET_CLS_ACT
                switch (result) {
                case TC_ACT_QUEUED:
index 9fc1c62..4e606fc 100644 (file)
@@ -191,7 +191,6 @@ static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch)
 
        if (list_empty(&flow->flowchain)) {
                list_add_tail(&flow->flowchain, &q->new_flows);
-               codel_vars_init(&flow->cvars);
                q->new_flow_count++;
                flow->deficit = q->quantum;
                flow->dropped = 0;
@@ -418,6 +417,7 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt)
                        struct fq_codel_flow *flow = q->flows + i;
 
                        INIT_LIST_HEAD(&flow->flowchain);
+                       codel_vars_init(&flow->cvars);
                }
        }
        if (sch->limit >= 1)
index e901583..d42234c 100644 (file)
@@ -102,9 +102,8 @@ static inline int gred_wred_mode_check(struct Qdisc *sch)
                if (q == NULL)
                        continue;
 
-               for (n = 0; n < table->DPs; n++)
-                       if (table->tab[n] && table->tab[n] != q &&
-                           table->tab[n]->prio == q->prio)
+               for (n = i + 1; n < table->DPs; n++)
+                       if (table->tab[n] && table->tab[n]->prio == q->prio)
                                return 1;
        }
 
@@ -137,6 +136,7 @@ static inline void gred_store_wred_set(struct gred_sched *table,
                                       struct gred_sched_data *q)
 {
        table->wred_set.qavg = q->vars.qavg;
+       table->wred_set.qidlestart = q->vars.qidlestart;
 }
 
 static inline int gred_use_ecn(struct gred_sched *t)
@@ -176,7 +176,7 @@ static int gred_enqueue(struct sk_buff *skb, struct Qdisc *sch)
                skb->tc_index = (skb->tc_index & ~GRED_VQ_MASK) | dp;
        }
 
-       /* sum up all the qaves of prios <= to ours to get the new qave */
+       /* sum up all the qaves of prios < ours to get the new qave */
        if (!gred_wred_mode(t) && gred_rio_mode(t)) {
                int i;
 
@@ -260,16 +260,18 @@ static struct sk_buff *gred_dequeue(struct Qdisc *sch)
                } else {
                        q->backlog -= qdisc_pkt_len(skb);
 
-                       if (!q->backlog && !gred_wred_mode(t))
-                               red_start_of_idle_period(&q->vars);
+                       if (gred_wred_mode(t)) {
+                               if (!sch->qstats.backlog)
+                                       red_start_of_idle_period(&t->wred_set);
+                       } else {
+                               if (!q->backlog)
+                                       red_start_of_idle_period(&q->vars);
+                       }
                }
 
                return skb;
        }
 
-       if (gred_wred_mode(t) && !red_is_idling(&t->wred_set))
-               red_start_of_idle_period(&t->wred_set);
-
        return NULL;
 }
 
@@ -291,19 +293,20 @@ static unsigned int gred_drop(struct Qdisc *sch)
                        q->backlog -= len;
                        q->stats.other++;
 
-                       if (!q->backlog && !gred_wred_mode(t))
-                               red_start_of_idle_period(&q->vars);
+                       if (gred_wred_mode(t)) {
+                               if (!sch->qstats.backlog)
+                                       red_start_of_idle_period(&t->wred_set);
+                       } else {
+                               if (!q->backlog)
+                                       red_start_of_idle_period(&q->vars);
+                       }
                }
 
                qdisc_drop(skb, sch);
                return len;
        }
 
-       if (gred_wred_mode(t) && !red_is_idling(&t->wred_set))
-               red_start_of_idle_period(&t->wred_set);
-
        return 0;
-
 }
 
 static void gred_reset(struct Qdisc *sch)
@@ -535,6 +538,7 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb)
        for (i = 0; i < MAX_DPs; i++) {
                struct gred_sched_data *q = table->tab[i];
                struct tc_gred_qopt opt;
+               unsigned long qavg;
 
                memset(&opt, 0, sizeof(opt));
 
@@ -566,7 +570,9 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb)
                if (gred_wred_mode(table))
                        gred_load_wred_set(table, q);
 
-               opt.qave = red_calc_qavg(&q->parms, &q->vars, q->vars.qavg);
+               qavg = red_calc_qavg(&q->parms, &q->vars,
+                                    q->vars.qavg >> q->parms.Wlog);
+               opt.qave = qavg >> q->parms.Wlog;
 
 append_opt:
                if (nla_append(skb, sizeof(opt), &opt) < 0)
index 838e18b..be50aa2 100644 (file)
@@ -364,6 +364,25 @@ finish:
        return retval;
 }
 
+static void sctp_packet_release_owner(struct sk_buff *skb)
+{
+       sk_free(skb->sk);
+}
+
+static void sctp_packet_set_owner_w(struct sk_buff *skb, struct sock *sk)
+{
+       skb_orphan(skb);
+       skb->sk = sk;
+       skb->destructor = sctp_packet_release_owner;
+
+       /*
+        * The data chunks have already been accounted for in sctp_sendmsg(),
+        * therefore only reserve a single byte to keep socket around until
+        * the packet has been transmitted.
+        */
+       atomic_inc(&sk->sk_wmem_alloc);
+}
+
 /* All packets are sent to the network through this function from
  * sctp_outq_tail().
  *
@@ -405,7 +424,7 @@ int sctp_packet_transmit(struct sctp_packet *packet)
        /* Set the owning socket so that we know where to get the
         * destination IP address.
         */
-       skb_set_owner_w(nskb, sk);
+       sctp_packet_set_owner_w(nskb, sk);
 
        if (!sctp_transport_dst_check(tp)) {
                sctp_transport_route(tp, NULL, sctp_sk(sk));
index a5471f8..edc3c4a 100644 (file)
@@ -2604,7 +2604,7 @@ static int do_siocgstamp(struct net *net, struct socket *sock,
        err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv);
        set_fs(old_fs);
        if (!err)
-               err = compat_put_timeval(up, &ktv);
+               err = compat_put_timeval(&ktv, up);
 
        return err;
 }
@@ -2620,7 +2620,7 @@ static int do_siocgstampns(struct net *net, struct socket *sock,
        err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts);
        set_fs(old_fs);
        if (!err)
-               err = compat_put_timespec(up, &kts);
+               err = compat_put_timespec(&kts, up);
 
        return err;
 }
index a5a402a..5d7f61d 100644 (file)
@@ -969,11 +969,11 @@ static bool xprt_dynamic_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req)
        return false;
 }
 
-static void xprt_alloc_slot(struct rpc_task *task)
+void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task)
 {
-       struct rpc_xprt *xprt = task->tk_xprt;
        struct rpc_rqst *req;
 
+       spin_lock(&xprt->reserve_lock);
        if (!list_empty(&xprt->free)) {
                req = list_entry(xprt->free.next, struct rpc_rqst, rq_list);
                list_del(&req->rq_list);
@@ -994,12 +994,29 @@ static void xprt_alloc_slot(struct rpc_task *task)
        default:
                task->tk_status = -EAGAIN;
        }
+       spin_unlock(&xprt->reserve_lock);
        return;
 out_init_req:
        task->tk_status = 0;
        task->tk_rqstp = req;
        xprt_request_init(task, xprt);
+       spin_unlock(&xprt->reserve_lock);
+}
+EXPORT_SYMBOL_GPL(xprt_alloc_slot);
+
+void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task)
+{
+       /* Note: grabbing the xprt_lock_write() ensures that we throttle
+        * new slot allocation if the transport is congested (i.e. when
+        * reconnecting a stream transport or when out of socket write
+        * buffer space).
+        */
+       if (xprt_lock_write(xprt, task)) {
+               xprt_alloc_slot(xprt, task);
+               xprt_release_write(xprt, task);
+       }
 }
+EXPORT_SYMBOL_GPL(xprt_lock_and_alloc_slot);
 
 static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req)
 {
@@ -1083,20 +1100,9 @@ void xprt_reserve(struct rpc_task *task)
        if (task->tk_rqstp != NULL)
                return;
 
-       /* Note: grabbing the xprt_lock_write() here is not strictly needed,
-        * but ensures that we throttle new slot allocation if the transport
-        * is congested (e.g. if reconnecting or if we're out of socket
-        * write buffer space).
-        */
        task->tk_timeout = 0;
        task->tk_status = -EAGAIN;
-       if (!xprt_lock_write(xprt, task))
-               return;
-
-       spin_lock(&xprt->reserve_lock);
-       xprt_alloc_slot(task);
-       spin_unlock(&xprt->reserve_lock);
-       xprt_release_write(xprt, task);
+       xprt->ops->alloc_slot(xprt, task);
 }
 
 static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt)
index 06cdbff..5d9202d 100644 (file)
@@ -713,6 +713,7 @@ static void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq)
 static struct rpc_xprt_ops xprt_rdma_procs = {
        .reserve_xprt           = xprt_rdma_reserve_xprt,
        .release_xprt           = xprt_release_xprt_cong, /* sunrpc/xprt.c */
+       .alloc_slot             = xprt_alloc_slot,
        .release_request        = xprt_release_rqst_cong,       /* ditto */
        .set_retrans_timeout    = xprt_set_retrans_timeout_def, /* ditto */
        .rpcbind                = rpcb_getport_async,   /* sunrpc/rpcb_clnt.c */
index 4005672..a35b8e5 100644 (file)
@@ -2473,6 +2473,7 @@ static void bc_destroy(struct rpc_xprt *xprt)
 static struct rpc_xprt_ops xs_local_ops = {
        .reserve_xprt           = xprt_reserve_xprt,
        .release_xprt           = xs_tcp_release_xprt,
+       .alloc_slot             = xprt_alloc_slot,
        .rpcbind                = xs_local_rpcbind,
        .set_port               = xs_local_set_port,
        .connect                = xs_connect,
@@ -2489,6 +2490,7 @@ static struct rpc_xprt_ops xs_udp_ops = {
        .set_buffer_size        = xs_udp_set_buffer_size,
        .reserve_xprt           = xprt_reserve_xprt_cong,
        .release_xprt           = xprt_release_xprt_cong,
+       .alloc_slot             = xprt_alloc_slot,
        .rpcbind                = rpcb_getport_async,
        .set_port               = xs_set_port,
        .connect                = xs_connect,
@@ -2506,6 +2508,7 @@ static struct rpc_xprt_ops xs_udp_ops = {
 static struct rpc_xprt_ops xs_tcp_ops = {
        .reserve_xprt           = xprt_reserve_xprt,
        .release_xprt           = xs_tcp_release_xprt,
+       .alloc_slot             = xprt_lock_and_alloc_slot,
        .rpcbind                = rpcb_getport_async,
        .set_port               = xs_set_port,
        .connect                = xs_connect,
index 97026f3..1e37dbf 100644 (file)
@@ -5633,8 +5633,10 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
                       sizeof(connect.ht_capa_mask));
 
        if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
-               if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
+               if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
+                       kfree(connkeys);
                        return -EINVAL;
+               }
                memcpy(&connect.ht_capa,
                       nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
                       sizeof(connect.ht_capa));
index 54a0dc2..ab2bb42 100644 (file)
@@ -212,7 +212,7 @@ resume:
                /* only the first xfrm gets the encap type */
                encap_type = 0;
 
-               if (async && x->repl->check(x, skb, seq)) {
+               if (async && x->repl->recheck(x, skb, seq)) {
                        XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR);
                        goto drop_unlock;
                }
index 2f6d11d..3efb07d 100644 (file)
@@ -420,6 +420,18 @@ err:
        return -EINVAL;
 }
 
+static int xfrm_replay_recheck_esn(struct xfrm_state *x,
+                                  struct sk_buff *skb, __be32 net_seq)
+{
+       if (unlikely(XFRM_SKB_CB(skb)->seq.input.hi !=
+                    htonl(xfrm_replay_seqhi(x, net_seq)))) {
+                       x->stats.replay_window++;
+                       return -EINVAL;
+       }
+
+       return xfrm_replay_check_esn(x, skb, net_seq);
+}
+
 static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq)
 {
        unsigned int bitnr, nr, i;
@@ -479,6 +491,7 @@ static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq)
 static struct xfrm_replay xfrm_replay_legacy = {
        .advance        = xfrm_replay_advance,
        .check          = xfrm_replay_check,
+       .recheck        = xfrm_replay_check,
        .notify         = xfrm_replay_notify,
        .overflow       = xfrm_replay_overflow,
 };
@@ -486,6 +499,7 @@ static struct xfrm_replay xfrm_replay_legacy = {
 static struct xfrm_replay xfrm_replay_bmp = {
        .advance        = xfrm_replay_advance_bmp,
        .check          = xfrm_replay_check_bmp,
+       .recheck        = xfrm_replay_check_bmp,
        .notify         = xfrm_replay_notify_bmp,
        .overflow       = xfrm_replay_overflow_bmp,
 };
@@ -493,6 +507,7 @@ static struct xfrm_replay xfrm_replay_bmp = {
 static struct xfrm_replay xfrm_replay_esn = {
        .advance        = xfrm_replay_advance_esn,
        .check          = xfrm_replay_check_esn,
+       .recheck        = xfrm_replay_recheck_esn,
        .notify         = xfrm_replay_notify_bmp,
        .overflow       = xfrm_replay_overflow_esn,
 };
index 87cd0e4..210be48 100644 (file)
@@ -1994,8 +1994,10 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay)
                goto error;
 
        x->outer_mode = xfrm_get_mode(x->props.mode, family);
-       if (x->outer_mode == NULL)
+       if (x->outer_mode == NULL) {
+               err = -EPROTONOSUPPORT;
                goto error;
+       }
 
        if (init_replay) {
                err = xfrm_init_replay(x);
index 6bf8e87..c3f69ae 100644 (file)
@@ -42,7 +42,7 @@ quiet_cmd_install = INSTALL $(subst $(srctree)/,,$@)
 $(installed-fw-dirs):
        $(call cmd,mkdir)
 
-$(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/% | $(INSTALL_FW_PATH)/$$(dir %)
+$(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/% | $$(dir $(INSTALL_FW_PATH)/%)
        $(call cmd,install)
 
 PHONY +=  __fw_install __fw_modinst FORCE
index 4629038..b3d907e 100644 (file)
@@ -74,8 +74,13 @@ kallsyms()
        info KSYM ${2}
        local kallsymopt;
 
+       if [ -n "${CONFIG_SYMBOL_PREFIX}" ]; then
+               kallsymopt="${kallsymopt} \
+                           --symbol-prefix=${CONFIG_SYMBOL_PREFIX}"
+       fi
+
        if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then
-               kallsymopt=--all-symbols
+               kallsymopt="${kallsymopt} --all-symbols"
        fi
 
        local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL}               \
@@ -211,7 +216,7 @@ if [ -n "${CONFIG_KALLSYMS}" ]; then
 
        if ! cmp -s System.map .tmp_System.map; then
                echo >&2 Inconsistent kallsyms data
-               echo >&2 echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
+               echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
                cleanup
                exit 1
        fi
index ec2118d..eb60cb8 100644 (file)
@@ -80,14 +80,12 @@ static int snd_compr_open(struct inode *inode, struct file *f)
        int maj = imajor(inode);
        int ret;
 
-       if (f->f_flags & O_WRONLY)
+       if ((f->f_flags & O_ACCMODE) == O_WRONLY)
                dirn = SND_COMPRESS_PLAYBACK;
-       else if (f->f_flags & O_RDONLY)
+       else if ((f->f_flags & O_ACCMODE) == O_RDONLY)
                dirn = SND_COMPRESS_CAPTURE;
-       else {
-               pr_err("invalid direction\n");
+       else
                return -EINVAL;
-       }
 
        if (maj == snd_major)
                compr = snd_lookup_minor_data(iminor(inode),
index f560051..1c65cc5 100644 (file)
@@ -1209,6 +1209,9 @@ static void snd_hda_codec_free(struct hda_codec *codec)
        kfree(codec);
 }
 
+static bool snd_hda_codec_get_supported_ps(struct hda_codec *codec,
+                               hda_nid_t fg, unsigned int power_state);
+
 static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
                                unsigned int power_state);
 
@@ -1317,6 +1320,10 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus,
                                           AC_VERB_GET_SUBSYSTEM_ID, 0);
        }
 
+       codec->epss = snd_hda_codec_get_supported_ps(codec,
+                                       codec->afg ? codec->afg : codec->mfg,
+                                       AC_PWRST_EPSS);
+
        /* power-up all before initialization */
        hda_set_power_state(codec,
                            codec->afg ? codec->afg : codec->mfg,
@@ -2346,6 +2353,7 @@ int snd_hda_codec_reset(struct hda_codec *codec)
        }
        if (codec->patch_ops.free)
                codec->patch_ops.free(codec);
+       memset(&codec->patch_ops, 0, sizeof(codec->patch_ops));
        snd_hda_jack_tbl_clear(codec);
        codec->proc_widget_hook = NULL;
        codec->spec = NULL;
@@ -2361,7 +2369,6 @@ int snd_hda_codec_reset(struct hda_codec *codec)
        codec->num_pcms = 0;
        codec->pcm_info = NULL;
        codec->preset = NULL;
-       memset(&codec->patch_ops, 0, sizeof(codec->patch_ops));
        codec->slave_dig_outs = NULL;
        codec->spdif_status_reset = 0;
        module_put(codec->owner);
@@ -3543,8 +3550,7 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg,
        /* this delay seems necessary to avoid click noise at power-down */
        if (power_state == AC_PWRST_D3) {
                /* transition time less than 10ms for power down */
-               bool epss = snd_hda_codec_get_supported_ps(codec, fg, AC_PWRST_EPSS);
-               msleep(epss ? 10 : 100);
+               msleep(codec->epss ? 10 : 100);
        }
 
        /* repeat power states setting at most 10 times*/
index 7fbc1bc..e5a7e19 100644 (file)
@@ -862,6 +862,7 @@ struct hda_codec {
        unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */
        unsigned int no_jack_detect:1;  /* Machine has no jack-detection */
        unsigned int pcm_format_first:1; /* PCM format must be set first */
+       unsigned int epss:1;            /* supporting EPSS? */
 #ifdef CONFIG_SND_HDA_POWER_SAVE
        unsigned int power_on :1;       /* current (global) power-state */
        int power_transition;   /* power-state in transition */
index 60882c6..c4763c5 100644 (file)
@@ -2701,6 +2701,8 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = {
        SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
        SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
        SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
+       SND_PCI_QUIRK(0x1043, 0x1ac3, "ASUS X53S", POS_FIX_POSBUF),
+       SND_PCI_QUIRK(0x1043, 0x1b43, "ASUS K53E", POS_FIX_POSBUF),
        SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
        SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB),
        SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB),
index ea5775a..3d4722f 100644 (file)
@@ -1075,7 +1075,7 @@ static struct snd_kcontrol_new stac_smux_mixer = {
 
 static const char * const slave_pfxs[] = {
        "Front", "Surround", "Center", "LFE", "Side",
-       "Headphone", "Speaker", "IEC958",
+       "Headphone", "Speaker", "IEC958", "PCM",
        NULL
 };
 
@@ -4543,6 +4543,9 @@ static void stac92xx_line_out_detect(struct hda_codec *codec,
        struct auto_pin_cfg *cfg = &spec->autocfg;
        int i;
 
+       if (cfg->speaker_outs == 0)
+               return;
+
        for (i = 0; i < cfg->line_outs; i++) {
                if (presence)
                        break;
@@ -5531,6 +5534,7 @@ static int patch_stac92hd83xxx(struct hda_codec *codec)
                snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e);
        }
 
+       codec->epss = 0; /* longer delay needed for D3 */
        codec->no_trigger_sense = 1;
        codec->spec = spec;
 
index 764cc93..075d5aa 100644 (file)
@@ -297,6 +297,7 @@ static int ak4396_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem
 }
 
 static const DECLARE_TLV_DB_SCALE(db_scale_wm_dac, -12700, 100, 1);
+static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0);
 
 static struct snd_kcontrol_new prodigy_hd2_controls[] __devinitdata = {
     {
@@ -307,7 +308,7 @@ static struct snd_kcontrol_new prodigy_hd2_controls[] __devinitdata = {
        .info = ak4396_dac_vol_info,
        .get = ak4396_dac_vol_get,
        .put = ak4396_dac_vol_put,
-       .tlv = { .p = db_scale_wm_dac },
+       .tlv = { .p = ak4396_db_scale },
     },
 };
 
index 5c9caca..1cf7a32 100644 (file)
@@ -426,7 +426,7 @@ static const int arizona_44k1_bclk_rates[] = {
        940800,
        1411200,
        1881600,
-       2882400,
+       2822400,
        3763200,
        5644800,
        7526400,
index 8f726c0..115a403 100644 (file)
@@ -659,7 +659,7 @@ static struct snd_soc_dai_driver mc13783_dai_async[] = {
                .id = MC13783_ID_STEREO_DAC,
                .playback = {
                        .stream_name = "Playback",
-                       .channels_min = 1,
+                       .channels_min = 2,
                        .channels_max = 2,
                        .rates = SNDRV_PCM_RATE_8000_96000,
                        .formats = MC13783_FORMATS,
@@ -670,7 +670,7 @@ static struct snd_soc_dai_driver mc13783_dai_async[] = {
                .id = MC13783_ID_STEREO_CODEC,
                .capture = {
                        .stream_name = "Capture",
-                       .channels_min = 1,
+                       .channels_min = 2,
                        .channels_max = 2,
                        .rates = MC13783_RATES_RECORD,
                        .formats = MC13783_FORMATS,
@@ -692,14 +692,14 @@ static struct snd_soc_dai_driver mc13783_dai_sync[] = {
                .id = MC13783_ID_SYNC,
                .playback = {
                        .stream_name = "Playback",
-                       .channels_min = 1,
+                       .channels_min = 2,
                        .channels_max = 2,
                        .rates = SNDRV_PCM_RATE_8000_96000,
                        .formats = MC13783_FORMATS,
                },
                .capture = {
                        .stream_name = "Capture",
-                       .channels_min = 1,
+                       .channels_min = 2,
                        .channels_max = 2,
                        .rates = MC13783_RATES_RECORD,
                        .formats = MC13783_FORMATS,
index 0013afe..dc4262e 100644 (file)
@@ -100,7 +100,7 @@ static const struct reg_default wm8904_reg_defaults[] = {
        { 14,  0x0000 },     /* R14  - Power Management 2 */
        { 15,  0x0000 },     /* R15  - Power Management 3 */
        { 18,  0x0000 },     /* R18  - Power Management 6 */
-       { 19,  0x945E },     /* R20  - Clock Rates 0 */
+       { 20,  0x945E },     /* R20  - Clock Rates 0 */
        { 21,  0x0C05 },     /* R21  - Clock Rates 1 */
        { 22,  0x0006 },     /* R22  - Clock Rates 2 */
        { 24,  0x0050 },     /* R24  - Audio Interface 0 */
index fb21b17..199408e 100644 (file)
@@ -94,7 +94,7 @@ static int __devinit imx_sgtl5000_probe(struct platform_device *pdev)
                dev_err(&pdev->dev, "audmux internal port setup failed\n");
                return ret;
        }
-       imx_audmux_v2_configure_port(ext_port,
+       ret = imx_audmux_v2_configure_port(ext_port,
                        IMX_AUDMUX_V2_PTCR_SYN,
                        IMX_AUDMUX_V2_PDCR_RXDSEL(int_port));
        if (ret) {
index 009533a..a52e87d 100644 (file)
@@ -27,7 +27,7 @@
 #include <asm/mach-types.h>
 #include <mach/hardware.h>
 #include <mach/gpio.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
@@ -59,7 +59,7 @@ static int am3517evm_hw_params(struct snd_pcm_substream *substream,
                return ret;
        }
 
-       snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_FSR_SRC_FSX, 0,
+       ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_FSR_SRC_FSX, 0,
                                SND_SOC_CLOCK_IN);
        if (ret < 0) {
                printk(KERN_ERR "can't set CPU system clock OMAP_MCBSP_FSR_SRC_FSX\n");
index 7d4fa8e..dc0ee76 100644 (file)
@@ -32,8 +32,8 @@
 
 #include <asm/mach-types.h>
 
-#include <plat/board-ams-delta.h>
-#include <plat/mcbsp.h>
+#include <mach/board-ams-delta.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
index e835781..5ed8716 100644 (file)
@@ -29,7 +29,7 @@
 #include <asm/mach-types.h>
 #include <mach/hardware.h>
 #include <mach/gpio.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
index d33c48b..a681a9a 100644 (file)
@@ -25,7 +25,9 @@
 #include <linux/io.h>
 #include <linux/slab.h>
 
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
+
+#include <plat/cpu.h>
 
 #include "mcbsp.h"
 
index abac4b6..521bfc3 100644 (file)
@@ -32,7 +32,7 @@
 #include <mach/hardware.h>
 #include <linux/gpio.h>
 #include <linux/module.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
index 9d93793..45909ca 100644 (file)
 #include <sound/soc.h>
 #include <sound/jack.h>
 
-#include <asm/mach-types.h>
-#include <plat/hardware.h>
-#include <plat/mux.h>
-
 #include "omap-dmic.h"
 #include "omap-mcpdm.h"
 #include "omap-pcm.h"
index acdd3ef..1b18627 100644 (file)
@@ -32,8 +32,9 @@
 #include <sound/initval.h>
 #include <sound/soc.h>
 
+#include <plat/cpu.h>
 #include <plat/dma.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 #include "mcbsp.h"
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
index 2c66e24..ea053c3 100644 (file)
@@ -45,6 +45,8 @@
 #include "omap-mcpdm.h"
 #include "omap-pcm.h"
 
+#define OMAP44XX_MCPDM_L3_BASE         0x49032000
+
 struct omap_mcpdm {
        struct device *dev;
        unsigned long phys_base;
index f0feb06..b309941 100644 (file)
@@ -30,6 +30,7 @@
 #include <sound/pcm_params.h>
 #include <sound/soc.h>
 
+#include <plat/cpu.h>
 #include <plat/dma.h>
 #include "omap-pcm.h"
 
index 2830dfd..e263188 100644 (file)
@@ -29,7 +29,7 @@
 #include <asm/mach-types.h>
 #include <mach/hardware.h>
 #include <mach/gpio.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
index 3d468c9..d632bfb 100644 (file)
@@ -27,7 +27,7 @@
 #include <asm/mach-types.h>
 #include <mach/hardware.h>
 #include <mach/gpio.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
index 4c3a097..43d950a 100644 (file)
@@ -31,7 +31,7 @@
 #include <sound/soc.h>
 
 #include <asm/mach-types.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
index b1a9d64..3960e8d 100644 (file)
@@ -31,7 +31,7 @@
 #include <mach/hardware.h>
 #include <linux/gpio.h>
 #include <linux/module.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
index 6ac3e0c..502bce2 100644 (file)
@@ -29,7 +29,7 @@
 #include <asm/mach-types.h>
 #include <mach/hardware.h>
 #include <mach/gpio.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 #include "omap-mcbsp.h"
 #include "omap-pcm.h"
index 2712dd2..d921ddb 100644 (file)
@@ -31,7 +31,7 @@
 #include <sound/jack.h>
 #include <sound/pcm.h>
 #include <sound/soc.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 #include "../codecs/tpa6130a2.h"
 
 #include <asm/mach-types.h>
index 0e28322..597cae7 100644 (file)
@@ -33,7 +33,8 @@
 #include <asm/mach-types.h>
 #include <mach/hardware.h>
 #include <mach/gpio.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/gpio-omap.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 /* Register descriptions for twl4030 codec part */
 #include <linux/mfd/twl4030-audio.h>
index 920e0d9..23de2b2 100644 (file)
@@ -29,7 +29,7 @@
 #include <mach/hardware.h>
 #include <mach/gpio.h>
 #include <mach/board-zoom.h>
-#include <plat/mcbsp.h>
+#include <linux/platform_data/asoc-ti-mcbsp.h>
 
 /* Register descriptions for twl4030 codec part */
 #include <linux/mfd/twl4030-audio.h>
index f3ebc38..b70964e 100644 (file)
@@ -34,9 +34,7 @@ static const struct snd_pcm_hardware dma_hardware = {
        .info                   = SNDRV_PCM_INFO_INTERLEAVED |
                                    SNDRV_PCM_INFO_BLOCK_TRANSFER |
                                    SNDRV_PCM_INFO_MMAP |
-                                   SNDRV_PCM_INFO_MMAP_VALID |
-                                   SNDRV_PCM_INFO_PAUSE |
-                                   SNDRV_PCM_INFO_RESUME,
+                                   SNDRV_PCM_INFO_MMAP_VALID,
        .formats                = SNDRV_PCM_FMTBIT_S16_LE |
                                    SNDRV_PCM_FMTBIT_U16_LE |
                                    SNDRV_PCM_FMTBIT_U8 |
@@ -248,15 +246,11 @@ static int dma_trigger(struct snd_pcm_substream *substream, int cmd)
 
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
-       case SNDRV_PCM_TRIGGER_RESUME:
-       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
                prtd->state |= ST_RUNNING;
                prtd->params->ops->trigger(prtd->params->ch);
                break;
 
        case SNDRV_PCM_TRIGGER_STOP:
-       case SNDRV_PCM_TRIGGER_SUSPEND:
-       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
                prtd->state &= ~ST_RUNNING;
                prtd->params->ops->stop(prtd->params->ch);
                break;
index dd7c49f..f90139b 100644 (file)
@@ -291,8 +291,11 @@ static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm,
                if (dapm->codec->driver->set_bias_level)
                        ret = dapm->codec->driver->set_bias_level(dapm->codec,
                                                                  level);
-       } else
+               else
+                       dapm->bias_level = level;
+       } else if (!card || dapm != &card->dapm) {
                dapm->bias_level = level;
+       }
 
        if (ret != 0)
                goto out;
index 97c2cac..8c7f237 100644 (file)
@@ -138,7 +138,7 @@ static void spear_pcm_free(struct snd_pcm *pcm)
                        continue;
 
                buf = &substream->dma_buffer;
-               if (!buf && !buf->area)
+               if (!buf || !buf->area)
                        continue;
 
                dma_free_writecombine(pcm->card->dev, buf->bytes,
index 02bcd30..19e5fe7 100644 (file)
@@ -1,6 +1,6 @@
 config SND_SOC_TEGRA
        tristate "SoC Audio for the Tegra System-on-Chip"
-       depends on ARCH_TEGRA && (TEGRA_SYSTEM_DMA || TEGRA20_APB_DMA)
+       depends on ARCH_TEGRA && TEGRA20_APB_DMA
        select REGMAP_MMIO
        select SND_SOC_DMAENGINE_PCM if TEGRA20_APB_DMA
        help
index e463529..76cb1b3 100644 (file)
@@ -89,7 +89,6 @@ static struct snd_soc_jack_gpio tegra_alc5632_hp_jack_gpio = {
        .name = "Headset detection",
        .report = SND_JACK_HEADSET,
        .debounce_time = 150,
-       .invert = 1,
 };
 
 static const struct snd_soc_dapm_widget tegra_alc5632_dapm_widgets[] = {
index 5658bce..e187339 100644 (file)
@@ -57,237 +57,6 @@ static const struct snd_pcm_hardware tegra_pcm_hardware = {
        .fifo_size              = 4,
 };
 
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-static void tegra_pcm_queue_dma(struct tegra_runtime_data *prtd)
-{
-       struct snd_pcm_substream *substream = prtd->substream;
-       struct snd_dma_buffer *buf = &substream->dma_buffer;
-       struct tegra_dma_req *dma_req;
-       unsigned long addr;
-
-       dma_req = &prtd->dma_req[prtd->dma_req_idx];
-       prtd->dma_req_idx = 1 - prtd->dma_req_idx;
-
-       addr = buf->addr + prtd->dma_pos;
-       prtd->dma_pos += dma_req->size;
-       if (prtd->dma_pos >= prtd->dma_pos_end)
-               prtd->dma_pos = 0;
-
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-               dma_req->source_addr = addr;
-       else
-               dma_req->dest_addr = addr;
-
-       tegra_dma_enqueue_req(prtd->dma_chan, dma_req);
-}
-
-static void dma_complete_callback(struct tegra_dma_req *req)
-{
-       struct tegra_runtime_data *prtd = (struct tegra_runtime_data *)req->dev;
-       struct snd_pcm_substream *substream = prtd->substream;
-       struct snd_pcm_runtime *runtime = substream->runtime;
-
-       spin_lock(&prtd->lock);
-
-       if (!prtd->running) {
-               spin_unlock(&prtd->lock);
-               return;
-       }
-
-       if (++prtd->period_index >= runtime->periods)
-               prtd->period_index = 0;
-
-       tegra_pcm_queue_dma(prtd);
-
-       spin_unlock(&prtd->lock);
-
-       snd_pcm_period_elapsed(substream);
-}
-
-static void setup_dma_tx_request(struct tegra_dma_req *req,
-                                       struct tegra_pcm_dma_params * dmap)
-{
-       req->complete = dma_complete_callback;
-       req->to_memory = false;
-       req->dest_addr = dmap->addr;
-       req->dest_wrap = dmap->wrap;
-       req->source_bus_width = 32;
-       req->source_wrap = 0;
-       req->dest_bus_width = dmap->width;
-       req->req_sel = dmap->req_sel;
-}
-
-static void setup_dma_rx_request(struct tegra_dma_req *req,
-                                       struct tegra_pcm_dma_params * dmap)
-{
-       req->complete = dma_complete_callback;
-       req->to_memory = true;
-       req->source_addr = dmap->addr;
-       req->dest_wrap = 0;
-       req->source_bus_width = dmap->width;
-       req->source_wrap = dmap->wrap;
-       req->dest_bus_width = 32;
-       req->req_sel = dmap->req_sel;
-}
-
-static int tegra_pcm_open(struct snd_pcm_substream *substream)
-{
-       struct snd_pcm_runtime *runtime = substream->runtime;
-       struct tegra_runtime_data *prtd;
-       struct snd_soc_pcm_runtime *rtd = substream->private_data;
-       struct tegra_pcm_dma_params * dmap;
-       int ret = 0;
-
-       prtd = kzalloc(sizeof(struct tegra_runtime_data), GFP_KERNEL);
-       if (prtd == NULL)
-               return -ENOMEM;
-
-       runtime->private_data = prtd;
-       prtd->substream = substream;
-
-       spin_lock_init(&prtd->lock);
-
-       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
-               dmap = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
-               setup_dma_tx_request(&prtd->dma_req[0], dmap);
-               setup_dma_tx_request(&prtd->dma_req[1], dmap);
-       } else {
-               dmap = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
-               setup_dma_rx_request(&prtd->dma_req[0], dmap);
-               setup_dma_rx_request(&prtd->dma_req[1], dmap);
-       }
-
-       prtd->dma_req[0].dev = prtd;
-       prtd->dma_req[1].dev = prtd;
-
-       prtd->dma_chan = tegra_dma_allocate_channel(TEGRA_DMA_MODE_ONESHOT);
-       if (prtd->dma_chan == NULL) {
-               ret = -ENOMEM;
-               goto err;
-       }
-
-       /* Set HW params now that initialization is complete */
-       snd_soc_set_runtime_hwparams(substream, &tegra_pcm_hardware);
-
-       /* Ensure that buffer size is a multiple of period size */
-       ret = snd_pcm_hw_constraint_integer(runtime,
-                                               SNDRV_PCM_HW_PARAM_PERIODS);
-       if (ret < 0)
-               goto err;
-
-       return 0;
-
-err:
-       if (prtd->dma_chan) {
-               tegra_dma_free_channel(prtd->dma_chan);
-       }
-
-       kfree(prtd);
-
-       return ret;
-}
-
-static int tegra_pcm_close(struct snd_pcm_substream *substream)
-{
-       struct snd_pcm_runtime *runtime = substream->runtime;
-       struct tegra_runtime_data *prtd = runtime->private_data;
-
-       tegra_dma_free_channel(prtd->dma_chan);
-
-       kfree(prtd);
-
-       return 0;
-}
-
-static int tegra_pcm_hw_params(struct snd_pcm_substream *substream,
-                               struct snd_pcm_hw_params *params)
-{
-       struct snd_pcm_runtime *runtime = substream->runtime;
-       struct tegra_runtime_data *prtd = runtime->private_data;
-
-       snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer);
-
-       prtd->dma_req[0].size = params_period_bytes(params);
-       prtd->dma_req[1].size = prtd->dma_req[0].size;
-
-       return 0;
-}
-
-static int tegra_pcm_hw_free(struct snd_pcm_substream *substream)
-{
-       snd_pcm_set_runtime_buffer(substream, NULL);
-
-       return 0;
-}
-
-static int tegra_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
-{
-       struct snd_pcm_runtime *runtime = substream->runtime;
-       struct tegra_runtime_data *prtd = runtime->private_data;
-       unsigned long flags;
-
-       switch (cmd) {
-       case SNDRV_PCM_TRIGGER_START:
-               prtd->dma_pos = 0;
-               prtd->dma_pos_end = frames_to_bytes(runtime, runtime->periods * runtime->period_size);
-               prtd->period_index = 0;
-               prtd->dma_req_idx = 0;
-               /* Fall-through */
-       case SNDRV_PCM_TRIGGER_RESUME:
-       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
-               spin_lock_irqsave(&prtd->lock, flags);
-               prtd->running = 1;
-               spin_unlock_irqrestore(&prtd->lock, flags);
-               tegra_pcm_queue_dma(prtd);
-               tegra_pcm_queue_dma(prtd);
-               break;
-       case SNDRV_PCM_TRIGGER_STOP:
-       case SNDRV_PCM_TRIGGER_SUSPEND:
-       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
-               spin_lock_irqsave(&prtd->lock, flags);
-               prtd->running = 0;
-               spin_unlock_irqrestore(&prtd->lock, flags);
-               tegra_dma_dequeue_req(prtd->dma_chan, &prtd->dma_req[0]);
-               tegra_dma_dequeue_req(prtd->dma_chan, &prtd->dma_req[1]);
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static snd_pcm_uframes_t tegra_pcm_pointer(struct snd_pcm_substream *substream)
-{
-       struct snd_pcm_runtime *runtime = substream->runtime;
-       struct tegra_runtime_data *prtd = runtime->private_data;
-
-       return prtd->period_index * runtime->period_size;
-}
-
-
-static int tegra_pcm_mmap(struct snd_pcm_substream *substream,
-                               struct vm_area_struct *vma)
-{
-       struct snd_pcm_runtime *runtime = substream->runtime;
-
-       return dma_mmap_writecombine(substream->pcm->card->dev, vma,
-                                       runtime->dma_area,
-                                       runtime->dma_addr,
-                                       runtime->dma_bytes);
-}
-
-static struct snd_pcm_ops tegra_pcm_ops = {
-       .open           = tegra_pcm_open,
-       .close          = tegra_pcm_close,
-       .ioctl          = snd_pcm_lib_ioctl,
-       .hw_params      = tegra_pcm_hw_params,
-       .hw_free        = tegra_pcm_hw_free,
-       .trigger        = tegra_pcm_trigger,
-       .pointer        = tegra_pcm_pointer,
-       .mmap           = tegra_pcm_mmap,
-};
-#else
 static int tegra_pcm_open(struct snd_pcm_substream *substream)
 {
        struct snd_soc_pcm_runtime *rtd = substream->private_data;
@@ -334,11 +103,11 @@ static int tegra_pcm_hw_params(struct snd_pcm_substream *substream,
        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
                slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
                slave_config.dst_addr = dmap->addr;
-               slave_config.src_maxburst = 0;
+               slave_config.dst_maxburst = 4;
        } else {
                slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
                slave_config.src_addr = dmap->addr;
-               slave_config.dst_maxburst = 0;
+               slave_config.src_maxburst = 4;
        }
        slave_config.slave_id = dmap->req_sel;
 
@@ -399,7 +168,6 @@ static struct snd_pcm_ops tegra_pcm_ops = {
        .pointer        = snd_dmaengine_pcm_pointer,
        .mmap           = tegra_pcm_mmap,
 };
-#endif
 
 static int tegra_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, int stream)
 {
index a3a4503..b40279b 100644 (file)
@@ -40,20 +40,6 @@ struct tegra_pcm_dma_params {
        unsigned long req_sel;
 };
 
-#if defined(CONFIG_TEGRA_SYSTEM_DMA)
-struct tegra_runtime_data {
-       struct snd_pcm_substream *substream;
-       spinlock_t lock;
-       int running;
-       int dma_pos;
-       int dma_pos_end;
-       int period_index;
-       int dma_req_idx;
-       struct tegra_dma_req dma_req[2];
-       struct tegra_dma_channel *dma_chan;
-};
-#endif
-
 int tegra_pcm_platform_register(struct device *dev);
 void tegra_pcm_platform_unregister(struct device *dev);
 
index 5c472f3..eb85113 100644 (file)
@@ -663,7 +663,6 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev,
                        struct ux500_msp **msp_p,
                        struct msp_i2s_platform_data *platform_data)
 {
-       int ret = 0;
        struct resource *res = NULL;
        struct i2s_controller *i2s_cont;
        struct ux500_msp *msp;
@@ -685,15 +684,14 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev,
        if (res == NULL) {
                dev_err(&pdev->dev, "%s: ERROR: Unable to get resource!\n",
                        __func__);
-               ret = -ENOMEM;
-               goto err_res;
+               return -ENOMEM;
        }
 
-       msp->registers = ioremap(res->start, (res->end - res->start + 1));
+       msp->registers = devm_ioremap(&pdev->dev, res->start,
+                                     resource_size(res));
        if (msp->registers == NULL) {
                dev_err(&pdev->dev, "%s: ERROR: ioremap failed!\n", __func__);
-               ret = -ENOMEM;
-               goto err_res;
+               return -ENOMEM;
        }
 
        msp->msp_state = MSP_STATE_IDLE;
@@ -705,7 +703,7 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev,
                dev_err(&pdev->dev,
                        "%s: ERROR: Failed to allocate I2S-controller!\n",
                        __func__);
-               goto err_i2s_cont;
+               return -ENOMEM;
        }
        i2s_cont->dev.parent = &pdev->dev;
        i2s_cont->data = (void *)msp;
@@ -716,14 +714,6 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev,
        msp->i2s_cont = i2s_cont;
 
        return 0;
-
-err_i2s_cont:
-       iounmap(msp->registers);
-
-err_res:
-       devm_kfree(&pdev->dev, msp);
-
-       return ret;
 }
 
 void ux500_msp_i2s_cleanup_msp(struct platform_device *pdev,
@@ -732,11 +722,6 @@ void ux500_msp_i2s_cleanup_msp(struct platform_device *pdev,
        dev_dbg(msp->dev, "%s: Enter (id = %d).\n", __func__, msp->id);
 
        device_unregister(&msp->i2s_cont->dev);
-       devm_kfree(&pdev->dev, msp->i2s_cont);
-
-       iounmap(msp->registers);
-
-       devm_kfree(&pdev->dev, msp);
 }
 
 MODULE_LICENSE("GPL v2");
index d5b5c33..4a469f0 100644 (file)
@@ -553,7 +553,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
                                     struct snd_usb_audio *chip)
 {
        struct snd_card *card;
-       struct list_head *p;
+       struct list_head *p, *n;
 
        if (chip == (void *)-1L)
                return;
@@ -570,7 +570,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
                        snd_usb_stream_disconnect(p);
                }
                /* release the endpoint resources */
-               list_for_each(p, &chip->ep_list) {
+               list_for_each_safe(p, n, &chip->ep_list) {
                        snd_usb_endpoint_free(p);
                }
                /* release the midi resources */
index c411812..d6e2bb4 100644 (file)
@@ -141,7 +141,7 @@ int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep)
  *
  * For implicit feedback, next_packet_size() is unused.
  */
-static int next_packet_size(struct snd_usb_endpoint *ep)
+int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep)
 {
        unsigned long flags;
        int ret;
@@ -177,15 +177,6 @@ static void retire_inbound_urb(struct snd_usb_endpoint *ep,
                ep->retire_data_urb(ep->data_subs, urb);
 }
 
-static void prepare_outbound_urb_sizes(struct snd_usb_endpoint *ep,
-                                      struct snd_urb_ctx *ctx)
-{
-       int i;
-
-       for (i = 0; i < ctx->packets; ++i)
-               ctx->packet_size[i] = next_packet_size(ep);
-}
-
 /*
  * Prepare a PLAYBACK urb for submission to the bus.
  */
@@ -370,7 +361,6 @@ static void snd_complete_urb(struct urb *urb)
                        goto exit_clear;
                }
 
-               prepare_outbound_urb_sizes(ep, ctx);
                prepare_outbound_urb(ep, ctx);
        } else {
                retire_inbound_urb(ep, ctx);
@@ -799,7 +789,9 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
 /**
  * snd_usb_endpoint_start: start an snd_usb_endpoint
  *
- * @ep: the endpoint to start
+ * @ep:                the endpoint to start
+ * @can_sleep: flag indicating whether the operation is executed in
+ *             non-atomic context
  *
  * A call to this function will increment the use count of the endpoint.
  * In case it is not already running, the URBs for this endpoint will be
@@ -809,7 +801,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
  *
  * Returns an error if the URB submission failed, 0 in all other cases.
  */
-int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
+int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, int can_sleep)
 {
        int err;
        unsigned int i;
@@ -821,6 +813,11 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
        if (++ep->use_count != 1)
                return 0;
 
+       /* just to be sure */
+       deactivate_urbs(ep, 0, can_sleep);
+       if (can_sleep)
+               wait_clear_urbs(ep);
+
        ep->active_mask = 0;
        ep->unlink_mask = 0;
        ep->phase = 0;
@@ -850,7 +847,6 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep)
                        goto __error;
 
                if (usb_pipeout(ep->pipe)) {
-                       prepare_outbound_urb_sizes(ep, urb->context);
                        prepare_outbound_urb(ep, urb->context);
                } else {
                        prepare_inbound_urb(ep, urb->context);
index ee2723f..cbbbdf2 100644 (file)
@@ -13,7 +13,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
                                struct audioformat *fmt,
                                struct snd_usb_endpoint *sync_ep);
 
-int  snd_usb_endpoint_start(struct snd_usb_endpoint *ep);
+int  snd_usb_endpoint_start(struct snd_usb_endpoint *ep, int can_sleep);
 void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep,
                           int force, int can_sleep, int wait);
 int  snd_usb_endpoint_activate(struct snd_usb_endpoint *ep);
@@ -21,6 +21,7 @@ int  snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep);
 void snd_usb_endpoint_free(struct list_head *head);
 
 int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep);
+int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep);
 
 void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
                             struct snd_usb_endpoint *sender,
index 62ec808..f782ce1 100644 (file)
@@ -212,7 +212,7 @@ int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface,
        }
 }
 
-static int start_endpoints(struct snd_usb_substream *subs)
+static int start_endpoints(struct snd_usb_substream *subs, int can_sleep)
 {
        int err;
 
@@ -225,7 +225,7 @@ static int start_endpoints(struct snd_usb_substream *subs)
                snd_printdd(KERN_DEBUG "Starting data EP @%p\n", ep);
 
                ep->data_subs = subs;
-               err = snd_usb_endpoint_start(ep);
+               err = snd_usb_endpoint_start(ep, can_sleep);
                if (err < 0) {
                        clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags);
                        return err;
@@ -236,10 +236,25 @@ static int start_endpoints(struct snd_usb_substream *subs)
            !test_and_set_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) {
                struct snd_usb_endpoint *ep = subs->sync_endpoint;
 
+               if (subs->data_endpoint->iface != subs->sync_endpoint->iface ||
+                   subs->data_endpoint->alt_idx != subs->sync_endpoint->alt_idx) {
+                       err = usb_set_interface(subs->dev,
+                                               subs->sync_endpoint->iface,
+                                               subs->sync_endpoint->alt_idx);
+                       if (err < 0) {
+                               snd_printk(KERN_ERR
+                                          "%d:%d:%d: cannot set interface (%d)\n",
+                                          subs->dev->devnum,
+                                          subs->sync_endpoint->iface,
+                                          subs->sync_endpoint->alt_idx, err);
+                               return -EIO;
+                       }
+               }
+
                snd_printdd(KERN_DEBUG "Starting sync EP @%p\n", ep);
 
                ep->sync_slave = subs->data_endpoint;
-               err = snd_usb_endpoint_start(ep);
+               err = snd_usb_endpoint_start(ep, can_sleep);
                if (err < 0) {
                        clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags);
                        return err;
@@ -544,13 +559,10 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream)
        subs->last_frame_number = 0;
        runtime->delay = 0;
 
-       /* clear the pending deactivation on the target EPs */
-       deactivate_endpoints(subs);
-
        /* for playback, submit the URBs now; otherwise, the first hwptr_done
         * updates for all URBs would happen at the same time when starting */
        if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK)
-               return start_endpoints(subs);
+               return start_endpoints(subs, 1);
 
        return 0;
 }
@@ -1032,6 +1044,7 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
                                 struct urb *urb)
 {
        struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime;
+       struct snd_usb_endpoint *ep = subs->data_endpoint;
        struct snd_urb_ctx *ctx = urb->context;
        unsigned int counts, frames, bytes;
        int i, stride, period_elapsed = 0;
@@ -1043,7 +1056,11 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
        urb->number_of_packets = 0;
        spin_lock_irqsave(&subs->lock, flags);
        for (i = 0; i < ctx->packets; i++) {
-               counts = ctx->packet_size[i];
+               if (ctx->packet_size[i])
+                       counts = ctx->packet_size[i];
+               else
+                       counts = snd_usb_endpoint_next_packet_size(ep);
+
                /* set up descriptor */
                urb->iso_frame_desc[i].offset = frames * stride;
                urb->iso_frame_desc[i].length = counts * stride;
@@ -1094,7 +1111,16 @@ static void prepare_playback_urb(struct snd_usb_substream *subs,
        subs->hwptr_done += bytes;
        if (subs->hwptr_done >= runtime->buffer_size * stride)
                subs->hwptr_done -= runtime->buffer_size * stride;
+
+       /* update delay with exact number of samples queued */
+       runtime->delay = subs->last_delay;
        runtime->delay += frames;
+       subs->last_delay = runtime->delay;
+
+       /* realign last_frame_number */
+       subs->last_frame_number = usb_get_current_frame_number(subs->dev);
+       subs->last_frame_number &= 0xFF; /* keep 8 LSBs */
+
        spin_unlock_irqrestore(&subs->lock, flags);
        urb->transfer_buffer_length = bytes;
        if (period_elapsed)
@@ -1112,12 +1138,32 @@ static void retire_playback_urb(struct snd_usb_substream *subs,
        struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime;
        int stride = runtime->frame_bits >> 3;
        int processed = urb->transfer_buffer_length / stride;
+       int est_delay;
+
+       /* ignore the delay accounting when procssed=0 is given, i.e.
+        * silent payloads are procssed before handling the actual data
+        */
+       if (!processed)
+               return;
 
        spin_lock_irqsave(&subs->lock, flags);
-       if (processed > runtime->delay)
-               runtime->delay = 0;
+       est_delay = snd_usb_pcm_delay(subs, runtime->rate);
+       /* update delay with exact number of samples played */
+       if (processed > subs->last_delay)
+               subs->last_delay = 0;
        else
-               runtime->delay -= processed;
+               subs->last_delay -= processed;
+       runtime->delay = subs->last_delay;
+
+       /*
+        * Report when delay estimate is off by more than 2ms.
+        * The error should be lower than 2ms since the estimate relies
+        * on two reads of a counter updated every ms.
+        */
+       if (abs(est_delay - subs->last_delay) * 1000 > runtime->rate * 2)
+               snd_printk(KERN_DEBUG "delay: estimated %d, actual %d\n",
+                       est_delay, subs->last_delay);
+
        spin_unlock_irqrestore(&subs->lock, flags);
 }
 
@@ -1175,7 +1221,7 @@ static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream
 
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
-               err = start_endpoints(subs);
+               err = start_endpoints(subs, 0);
                if (err < 0)
                        return err;