Merge tag 'omap-devel-am33xx-for-v3.7' of git://git.kernel.org/pub/scm/linux/kernel...
authorOlof Johansson <olof@lixom.net>
Mon, 17 Sep 2012 03:12:26 +0000 (20:12 -0700)
committerOlof Johansson <olof@lixom.net>
Mon, 17 Sep 2012 03:13:04 +0000 (20:13 -0700)
From Tony Lindgren:
From Paul Walmsley <paul@pwsan.com>:

AM33xx hwmod data and miscellaneous clock and hwmod fixes.  AM33xx
should now boot on mainline after this is applied, according to
Vaibhav.

(The shortlog makes no sense here since it contains mostly the dependent
cleanups that are part of the preceding branches).

Signed-off-by: Olof Johansson <olof@lixom.net>
387 files changed:
Documentation/ABI/testing/sysfs-tty
Documentation/devicetree/bindings/tty/serial/nxp-lpc32xx-hsuart.txt [new file with mode: 0644]
Documentation/devicetree/bindings/tty/serial/of-serial.txt
Documentation/serial/00-INDEX
Documentation/serial/computone.txt [deleted file]
arch/alpha/kernel/srmcons.c
arch/arm/mach-omap1/ams-delta-fiq-handler.S
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-htcherald.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.c
arch/arm/mach-omap1/board-voiceblue.c
arch/arm/mach-omap1/clock_data.c
arch/arm/mach-omap1/devices.c
arch/arm/mach-omap1/dma.c
arch/arm/mach-omap1/gpio15xx.c
arch/arm/mach-omap1/gpio16xx.c
arch/arm/mach-omap1/gpio7xx.c
arch/arm/mach-omap1/include/mach/ams-delta-fiq.h
arch/arm/mach-omap1/include/mach/gpio.h
arch/arm/mach-omap1/include/mach/hardware.h
arch/arm/mach-omap1/include/mach/irqs.h
arch/arm/mach-omap1/include/mach/omap1510.h [new file with mode: 0644]
arch/arm/mach-omap1/include/mach/omap16xx.h [new file with mode: 0644]
arch/arm/mach-omap1/include/mach/omap7xx.h [new file with mode: 0644]
arch/arm/mach-omap1/leds-h2p2-debug.c
arch/arm/mach-omap1/leds.c
arch/arm/mach-omap1/serial.c
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/am33xx.h [new file with mode: 0644]
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.c
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/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/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/devices.c
arch/arm/mach-omap2/dpll3xxx.c
arch/arm/mach-omap2/dpll44xx.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-smsc911x.c
arch/arm/mach-omap2/gpmc.c
arch/arm/mach-omap2/hsmmc.c
arch/arm/mach-omap2/i2c.c
arch/arm/mach-omap2/id.c
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/io.c
arch/arm/mach-omap2/irq.c
arch/arm/mach-omap2/mailbox.c
arch/arm/mach-omap2/mcbsp.c
arch/arm/mach-omap2/msdi.c
arch/arm/mach-omap2/omap-iommu.c
arch/arm/mach-omap2/omap-mpuss-lowpower.c
arch/arm/mach-omap2/omap-smp.c
arch/arm/mach-omap2/omap-wakeupgen.c
arch/arm/mach-omap2/omap24xx.h [new file with mode: 0644]
arch/arm/mach-omap2/omap34xx.h [new file with mode: 0644]
arch/arm/mach-omap2/omap4-common.c
arch/arm/mach-omap2/omap44xx.h [new file with mode: 0644]
arch/arm/mach-omap2/omap54xx.h [new file with mode: 0644]
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_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/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/pm24xx.c
arch/arm/mach-omap2/pm34xx.c
arch/arm/mach-omap2/powerdomain.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/sram242x.S
arch/arm/mach-omap2/sram243x.S
arch/arm/mach-omap2/sram34xx.S
arch/arm/mach-omap2/ti81xx.h [new file with mode: 0644]
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/voltagedomains3xxx_data.c
arch/arm/mach-ux500/board-mop500.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/am33xx.h [deleted file]
arch/arm/plat-omap/include/plat/board.h [deleted file]
arch/arm/plat-omap/include/plat/cpu.h
arch/arm/plat-omap/include/plat/debug-devices.h [new file with mode: 0644]
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/gpio.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/nand.h
arch/arm/plat-omap/include/plat/omap-serial.h
arch/arm/plat-omap/include/plat/omap1510.h [deleted file]
arch/arm/plat-omap/include/plat/omap16xx.h [deleted file]
arch/arm/plat-omap/include/plat/omap24xx.h [deleted file]
arch/arm/plat-omap/include/plat/omap34xx.h [deleted file]
arch/arm/plat-omap/include/plat/omap4-keypad.h
arch/arm/plat-omap/include/plat/omap44xx.h [deleted file]
arch/arm/plat-omap/include/plat/omap54xx.h [deleted file]
arch/arm/plat-omap/include/plat/omap7xx.h [deleted file]
arch/arm/plat-omap/include/plat/omap_hwmod.h
arch/arm/plat-omap/include/plat/ti81xx.h [deleted file]
arch/arm/plat-omap/include/plat/usb.h
arch/arm/plat-omap/sram.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/um/drivers/line.c
arch/xtensa/platforms/iss/console.c
drivers/bluetooth/hci_ath.c
drivers/char/mwave/mwavedd.c
drivers/char/pcmcia/synclink_cs.c
drivers/char/ttyprintk.c
drivers/dma/omap-dma.c
drivers/gpio/gpio-omap.c
drivers/gpio/gpio-twl4030.c
drivers/input/keyboard/Kconfig
drivers/input/keyboard/omap-keypad.c
drivers/isdn/capi/capi.c
drivers/isdn/gigaset/interface.c
drivers/isdn/i4l/isdn_tty.c
drivers/media/video/omap/omap_vout.c
drivers/media/video/omap3isp/isp.c
drivers/mfd/twl-core.c
drivers/misc/ibmasm/uart.c
drivers/misc/pti.c
drivers/mmc/card/sdio_uart.c
drivers/mmc/host/omap.c
drivers/mmc/host/omap_hsmmc.c
drivers/mtd/nand/ams-delta.c
drivers/mtd/nand/omap2.c
drivers/mtd/onenand/omap2.c
drivers/net/ethernet/sgi/ioc3-eth.c
drivers/net/irda/irtty-sir.c
drivers/net/usb/hso.c
drivers/parport/parport_gsc.c
drivers/parport/parport_serial.c
drivers/power/avs/smartreflex.c
drivers/s390/char/con3215.c
drivers/s390/char/sclp_tty.c
drivers/s390/char/sclp_vt220.c
drivers/s390/char/tty3270.c
drivers/spi/spi-omap-uwire.c
drivers/staging/ipack/devices/ipoctal.c
drivers/staging/serqt_usb2/serqt_usb2.c
drivers/staging/speakup/serialio.h
drivers/staging/tidspbridge/core/wdt.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/class/cdc-acm.c
drivers/usb/gadget/u_serial.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/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/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/backlight/omap1_bl.c
drivers/video/omap2/dss/dispc.c
drivers/video/omap2/omapfb/omapfb-main.c
drivers/w1/masters/omap_hdq.c
drivers/watchdog/omap_wdt.c
firmware/Makefile
firmware/intelliport2.bin.ihex [deleted file]
include/linux/Kbuild
include/linux/amba/serial.h
include/linux/cd1400.h [deleted file]
include/linux/cdk.h [deleted file]
include/linux/comstats.h [deleted file]
include/linux/generic_serial.h [deleted file]
include/linux/i2c/twl.h
include/linux/istallion.h [deleted file]
include/linux/kbd_kern.h
include/linux/mfd/twl6040.h
include/linux/omapfb.h
include/linux/platform_data/gpio-omap.h [new file with mode: 0644]
include/linux/platform_data/max310x.h [new file with mode: 0644]
include/linux/platform_data/omap1_bl.h [new file with mode: 0644]
include/linux/platform_data/sccnxp.h [new file with mode: 0644]
include/linux/sc26198.h [deleted file]
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/tty.h
include/linux/tty_driver.h
include/linux/tty_flags.h [new file with mode: 0644]
include/net/irda/ircomm_tty.h
net/bluetooth/rfcomm/tty.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
sound/soc/omap/mcbsp.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/sdp3430.c

index b138b663bf54cf545dabb88e4a158874c5d8a785..0c430150d92976260c5b40a4b4c9fedd1600fa9d 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
+
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 0847fdeee11a5b2961731b97c017df5bf4f4f9ca..ba385f2e0ddc5777daf3f7e9d667e6727ec4c26d 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 e09468ad3cb16f97f4ef3075b5f743dd258fb01b..f7b0c7dc25ef283cc3fe689a4c6f4124c1114e70 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 3ea809430eda0f3ea018df2b540a75614846ce05..5d5865204a1d4739b0836bed605b5220192ad1b7 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 a051cb8ae57fc2a67e943479150d7d11af260fc7..d2b6acce8fc1d09e50236fed7cf4522aada7663b 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <plat/board-ams-delta.h>
 
+#include <mach/irqs.h>
 #include <mach/ams-delta-fiq.h>
 
 #include "iomap.h"
index c53469802c03cf0e79640e5b7af53ee7df83abbe..6f192c4900b13e9a7937fa4e3d5656cdcd0b0439 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>
 
@@ -37,7 +38,6 @@
 #include <plat/board-ams-delta.h>
 #include <plat/keypad.h>
 #include <plat/mux.h>
-#include <plat/board.h>
 
 #include <mach/hardware.h>
 #include <mach/ams-delta-fiq.h>
index 6872f3fd400ffd242029b67f8688fda2853b6899..6d985521a39e7c4c77ad4b2c7f5bc6191717e70e 100644 (file)
@@ -32,7 +32,6 @@
 #include <plat/flash.h>
 #include <plat/fpga.h>
 #include <plat/keypad.h>
-#include <plat/board.h>
 
 #include <mach/hardware.h>
 
index 6ec385e2b98e93553de87814452eacb95de775fb..04b5fdaff8318d50822e9d6da639ca4d25fc4a45 100644 (file)
@@ -23,7 +23,6 @@
 #include <asm/mach/map.h>
 
 #include <plat/mux.h>
-#include <plat/board.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 b3f6e943e6616ca8f82874e56fbe408c49de086f..a5ac352d68d378cc91146e32e83879576e443731 100644 (file)
@@ -41,8 +41,7 @@
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 
-#include <plat/omap7xx.h>
-#include <plat/board.h>
+#include <mach/omap7xx.h>
 #include <plat/keypad.h>
 #include <plat/mmc.h>
 
index 2c0ca8fc3380092380b6e2e683dfa9a17460fadf..ec01f03d0446572359fa6fae33c261107f1f0c22 100644 (file)
@@ -26,7 +26,6 @@
 #include <asm/mach/map.h>
 
 #include <plat/mux.h>
-#include <plat/board.h>
 #include <plat/keypad.h>
 #include <plat/lcd_mipid.h>
 #include <plat/mmc.h>
index 8784705edb60135aac86a8bc660b02a8e1f284f5..3b2d9071022a02d057391bef03312c3fb9cf67a7 100644 (file)
@@ -39,6 +39,8 @@
 #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>
index 26bcb9defcdc830ff7ae97d8667cef70b956b598..49f8d745ea1fcae2b4cc0c4cb22191a8666e02b6 100644 (file)
@@ -28,6 +28,7 @@
 #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>
@@ -37,7 +38,6 @@
 #include <plat/mux.h>
 #include <plat/tc.h>
 #include <plat/dma.h>
-#include <plat/board.h>
 #include <plat/irda.h>
 #include <plat/keypad.h>
 
index 4d099446dfa888e1898227d35eb260e9ee8b203f..01523cd78e5876ebcc2d8ac2a06aaf473abc1d46 100644 (file)
@@ -27,6 +27,7 @@
 #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>
@@ -37,7 +38,6 @@
 #include <plat/mux.h>
 #include <plat/dma.h>
 #include <plat/tc.h>
-#include <plat/board.h>
 #include <plat/irda.h>
 #include <plat/keypad.h>
 
index 355980321c2d19f91ecb55c2dd5b7b1a9c7f67dd..a7abce69043aa077e50262002c83ed93718cd371 100644 (file)
@@ -30,6 +30,7 @@
 #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>
@@ -39,7 +40,6 @@
 #include <plat/mux.h>
 #include <plat/dma.h>
 #include <plat/tc.h>
-#include <plat/board.h>
 #include <plat/irda.h>
 #include <plat/keypad.h>
 
index 703d55ecffe2b2411c77af5d262a3372e5431a86..277e0bc60a4384bb3bf28e1a998b98bbe6b325c3 100644 (file)
@@ -32,7 +32,6 @@
 #include <plat/fpga.h>
 #include <plat/flash.h>
 #include <plat/keypad.h>
-#include <plat/board.h>
 
 #include <mach/hardware.h>
 
index 8c665bd16ac20b38195fa126ae4e21a7595d31d1..2e1fff26a2f30984c39a5c21718ba756a45d2e15 100644 (file)
@@ -38,7 +38,6 @@
 #include <plat/dma.h>
 #include <plat/irda.h>
 #include <plat/tc.h>
-#include <plat/board.h>
 #include <plat/keypad.h>
 #include <plat/board-sx1.h>
 
index 3497769eb353965adc1aa435c599b0bab252fb12..1668af3017de73316d81df71fd6aec7287f01cc9 100644 (file)
@@ -35,7 +35,6 @@
 #include <plat/flash.h>
 #include <plat/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 c007d80dfb6244396606dfd38281b7d8b6c1bfbf..6a32b9b0dc30af46eede0b14ae76b6d4acd0d514 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>
@@ -788,7 +787,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,12 +835,6 @@ 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)
index fa1fa4deb6aa4ae65c523d7e84686ffb9cba1406..05fdbd992c778eb044c6ec50911badcde887b35a 100644 (file)
 #include <asm/mach/map.h>
 
 #include <plat/tc.h>
-#include <plat/board.h>
 #include <plat/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 3ef7d52316b49a959bce42fd142a3b8a61d9fd01..b0b0f0f27450fc31d9bb8e964280fcfadcb153cd 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
index ebef15e5e7b7f70ddc94bcf45083fd8173ba7fef..98e6f39224a4ee42449b847f997889b0842cb4c6 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 2a48cd2e1754329bb0698729178e9adc381715d0..33f419236b1725e4f277837754ce353336cc6384 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 acf12b73eace0a07c5567d199c96d73e506fcb7a..958ce9acee954c871fd67bcef67763c5a8021cce 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 23eed0035ed847345207a805fe7d50307d3ad6cd..adb5e764965991e6b9f15a7570104379b314bac9 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 e737706a8fe1105932f85433d8ac0e97e12d1b37..ebf86c0f4f463f578c249bca9012a07590afccef 100644 (file)
@@ -1,5 +1,3 @@
 /*
  * arch/arm/mach-omap1/include/mach/gpio.h
  */
-
-#include <plat/gpio.h>
index 01e35fa106b82c9a68c9c09304facdd65855810c..84248d250adb8eeda35da1093eb7a19f70cfb6f0 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 9292fdc1cb0b47c430940e8b1ed630b9bf2702b1..729992d7d26a871cf237d08378d13ff383f102c2 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
diff --git a/arch/arm/mach-omap1/include/mach/omap1510.h b/arch/arm/mach-omap1/include/mach/omap1510.h
new file mode 100644 (file)
index 0000000..8fe05d6
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Hardware definitions for TI OMAP1510 processor.
+ *
+ * Cleanup for Linux-2.6 by 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_OMAP15XX_H
+#define __ASM_ARCH_OMAP15XX_H
+
+/*
+ * ----------------------------------------------------------------------------
+ * Base addresses
+ * ----------------------------------------------------------------------------
+ */
+
+/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
+
+#define OMAP1510_DSP_BASE      0xE0000000
+#define OMAP1510_DSP_SIZE      0x28000
+#define OMAP1510_DSP_START     0xE0000000
+
+#define OMAP1510_DSPREG_BASE   0xE1000000
+#define OMAP1510_DSPREG_SIZE   SZ_128K
+#define OMAP1510_DSPREG_START  0xE1000000
+
+#define OMAP1510_DSP_MMU_BASE  (0xfffed200)
+
+#endif /*  __ASM_ARCH_OMAP15XX_H */
+
diff --git a/arch/arm/mach-omap1/include/mach/omap16xx.h b/arch/arm/mach-omap1/include/mach/omap16xx.h
new file mode 100644 (file)
index 0000000..cd1c724
--- /dev/null
@@ -0,0 +1,201 @@
+/*
+ * Hardware definitions for TI OMAP1610/5912/1710 processors.
+ *
+ * Cleanup for Linux-2.6 by 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_OMAP16XX_H
+#define __ASM_ARCH_OMAP16XX_H
+
+/*
+ * ----------------------------------------------------------------------------
+ * Base addresses
+ * ----------------------------------------------------------------------------
+ */
+
+/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
+
+#define OMAP16XX_DSP_BASE      0xE0000000
+#define OMAP16XX_DSP_SIZE      0x28000
+#define OMAP16XX_DSP_START     0xE0000000
+
+#define OMAP16XX_DSPREG_BASE   0xE1000000
+#define OMAP16XX_DSPREG_SIZE   SZ_128K
+#define OMAP16XX_DSPREG_START  0xE1000000
+
+#define OMAP16XX_SEC_BASE      0xFFFE4000
+#define OMAP16XX_SEC_DES       (OMAP16XX_SEC_BASE + 0x0000)
+#define OMAP16XX_SEC_SHA1MD5   (OMAP16XX_SEC_BASE + 0x0800)
+#define OMAP16XX_SEC_RNG       (OMAP16XX_SEC_BASE + 0x1000)
+
+/*
+ * ---------------------------------------------------------------------------
+ * Interrupts
+ * ---------------------------------------------------------------------------
+ */
+#define OMAP_IH2_0_BASE                (0xfffe0000)
+#define OMAP_IH2_1_BASE                (0xfffe0100)
+#define OMAP_IH2_2_BASE                (0xfffe0200)
+#define OMAP_IH2_3_BASE                (0xfffe0300)
+
+#define OMAP_IH2_0_ITR         (OMAP_IH2_0_BASE + 0x00)
+#define OMAP_IH2_0_MIR         (OMAP_IH2_0_BASE + 0x04)
+#define OMAP_IH2_0_SIR_IRQ     (OMAP_IH2_0_BASE + 0x10)
+#define OMAP_IH2_0_SIR_FIQ     (OMAP_IH2_0_BASE + 0x14)
+#define OMAP_IH2_0_CONTROL     (OMAP_IH2_0_BASE + 0x18)
+#define OMAP_IH2_0_ILR0                (OMAP_IH2_0_BASE + 0x1c)
+#define OMAP_IH2_0_ISR         (OMAP_IH2_0_BASE + 0x9c)
+
+#define OMAP_IH2_1_ITR         (OMAP_IH2_1_BASE + 0x00)
+#define OMAP_IH2_1_MIR         (OMAP_IH2_1_BASE + 0x04)
+#define OMAP_IH2_1_SIR_IRQ     (OMAP_IH2_1_BASE + 0x10)
+#define OMAP_IH2_1_SIR_FIQ     (OMAP_IH2_1_BASE + 0x14)
+#define OMAP_IH2_1_CONTROL     (OMAP_IH2_1_BASE + 0x18)
+#define OMAP_IH2_1_ILR1                (OMAP_IH2_1_BASE + 0x1c)
+#define OMAP_IH2_1_ISR         (OMAP_IH2_1_BASE + 0x9c)
+
+#define OMAP_IH2_2_ITR         (OMAP_IH2_2_BASE + 0x00)
+#define OMAP_IH2_2_MIR         (OMAP_IH2_2_BASE + 0x04)
+#define OMAP_IH2_2_SIR_IRQ     (OMAP_IH2_2_BASE + 0x10)
+#define OMAP_IH2_2_SIR_FIQ     (OMAP_IH2_2_BASE + 0x14)
+#define OMAP_IH2_2_CONTROL     (OMAP_IH2_2_BASE + 0x18)
+#define OMAP_IH2_2_ILR2                (OMAP_IH2_2_BASE + 0x1c)
+#define OMAP_IH2_2_ISR         (OMAP_IH2_2_BASE + 0x9c)
+
+#define OMAP_IH2_3_ITR         (OMAP_IH2_3_BASE + 0x00)
+#define OMAP_IH2_3_MIR         (OMAP_IH2_3_BASE + 0x04)
+#define OMAP_IH2_3_SIR_IRQ     (OMAP_IH2_3_BASE + 0x10)
+#define OMAP_IH2_3_SIR_FIQ     (OMAP_IH2_3_BASE + 0x14)
+#define OMAP_IH2_3_CONTROL     (OMAP_IH2_3_BASE + 0x18)
+#define OMAP_IH2_3_ILR3                (OMAP_IH2_3_BASE + 0x1c)
+#define OMAP_IH2_3_ISR         (OMAP_IH2_3_BASE + 0x9c)
+
+/*
+ * ----------------------------------------------------------------------------
+ * Clocks
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP16XX_ARM_IDLECT3   (CLKGEN_REG_BASE + 0x24)
+
+/*
+ * ----------------------------------------------------------------------------
+ * Pin configuration registers
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP16XX_CONF_VOLTAGE_VDDSHV6  (1 << 8)
+#define OMAP16XX_CONF_VOLTAGE_VDDSHV7  (1 << 9)
+#define OMAP16XX_CONF_VOLTAGE_VDDSHV8  (1 << 10)
+#define OMAP16XX_CONF_VOLTAGE_VDDSHV9  (1 << 11)
+#define OMAP16XX_SUBLVDS_CONF_VALID    (1 << 13)
+
+/*
+ * ----------------------------------------------------------------------------
+ * System control registers
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP1610_RESET_CONTROL  0xfffe1140
+
+/*
+ * ---------------------------------------------------------------------------
+ * TIPB bus interface
+ * ---------------------------------------------------------------------------
+ */
+#define TIPB_SWITCH_BASE                (0xfffbc800)
+#define OMAP16XX_MMCSD2_SSW_MPU_CONF   (TIPB_SWITCH_BASE + 0x160)
+
+/* UART3 Registers Mapping through MPU bus */
+#define UART3_RHR               (OMAP1_UART3_BASE + 0)
+#define UART3_THR               (OMAP1_UART3_BASE + 0)
+#define UART3_DLL               (OMAP1_UART3_BASE + 0)
+#define UART3_IER               (OMAP1_UART3_BASE + 4)
+#define UART3_DLH               (OMAP1_UART3_BASE + 4)
+#define UART3_IIR               (OMAP1_UART3_BASE + 8)
+#define UART3_FCR               (OMAP1_UART3_BASE + 8)
+#define UART3_EFR               (OMAP1_UART3_BASE + 8)
+#define UART3_LCR               (OMAP1_UART3_BASE + 0x0C)
+#define UART3_MCR               (OMAP1_UART3_BASE + 0x10)
+#define UART3_XON1_ADDR1        (OMAP1_UART3_BASE + 0x10)
+#define UART3_XON2_ADDR2        (OMAP1_UART3_BASE + 0x14)
+#define UART3_LSR               (OMAP1_UART3_BASE + 0x14)
+#define UART3_TCR               (OMAP1_UART3_BASE + 0x18)
+#define UART3_MSR               (OMAP1_UART3_BASE + 0x18)
+#define UART3_XOFF1             (OMAP1_UART3_BASE + 0x18)
+#define UART3_XOFF2             (OMAP1_UART3_BASE + 0x1C)
+#define UART3_SPR               (OMAP1_UART3_BASE + 0x1C)
+#define UART3_TLR               (OMAP1_UART3_BASE + 0x1C)
+#define UART3_MDR1              (OMAP1_UART3_BASE + 0x20)
+#define UART3_MDR2              (OMAP1_UART3_BASE + 0x24)
+#define UART3_SFLSR             (OMAP1_UART3_BASE + 0x28)
+#define UART3_TXFLL             (OMAP1_UART3_BASE + 0x28)
+#define UART3_RESUME            (OMAP1_UART3_BASE + 0x2C)
+#define UART3_TXFLH             (OMAP1_UART3_BASE + 0x2C)
+#define UART3_SFREGL            (OMAP1_UART3_BASE + 0x30)
+#define UART3_RXFLL             (OMAP1_UART3_BASE + 0x30)
+#define UART3_SFREGH            (OMAP1_UART3_BASE + 0x34)
+#define UART3_RXFLH             (OMAP1_UART3_BASE + 0x34)
+#define UART3_BLR               (OMAP1_UART3_BASE + 0x38)
+#define UART3_ACREG             (OMAP1_UART3_BASE + 0x3C)
+#define UART3_DIV16             (OMAP1_UART3_BASE + 0x3C)
+#define UART3_SCR               (OMAP1_UART3_BASE + 0x40)
+#define UART3_SSR               (OMAP1_UART3_BASE + 0x44)
+#define UART3_EBLR              (OMAP1_UART3_BASE + 0x48)
+#define UART3_OSC_12M_SEL       (OMAP1_UART3_BASE + 0x4C)
+#define UART3_MVR               (OMAP1_UART3_BASE + 0x50)
+
+/*
+ * ---------------------------------------------------------------------------
+ * Watchdog timer
+ * ---------------------------------------------------------------------------
+ */
+
+/* 32-bit Watchdog timer in OMAP 16XX */
+#define OMAP_16XX_WATCHDOG_BASE        (0xfffeb000)
+#define OMAP_16XX_WIDR         (OMAP_16XX_WATCHDOG_BASE + 0x00)
+#define OMAP_16XX_WD_SYSCONFIG (OMAP_16XX_WATCHDOG_BASE + 0x10)
+#define OMAP_16XX_WD_SYSSTATUS (OMAP_16XX_WATCHDOG_BASE + 0x14)
+#define OMAP_16XX_WCLR         (OMAP_16XX_WATCHDOG_BASE + 0x24)
+#define OMAP_16XX_WCRR         (OMAP_16XX_WATCHDOG_BASE + 0x28)
+#define OMAP_16XX_WLDR         (OMAP_16XX_WATCHDOG_BASE + 0x2c)
+#define OMAP_16XX_WTGR         (OMAP_16XX_WATCHDOG_BASE + 0x30)
+#define OMAP_16XX_WWPS         (OMAP_16XX_WATCHDOG_BASE + 0x34)
+#define OMAP_16XX_WSPR         (OMAP_16XX_WATCHDOG_BASE + 0x48)
+
+#define WCLR_PRE_SHIFT         5
+#define WCLR_PTV_SHIFT         2
+
+#define WWPS_W_PEND_WSPR       (1 << 4)
+#define WWPS_W_PEND_WTGR       (1 << 3)
+#define WWPS_W_PEND_WLDR       (1 << 2)
+#define WWPS_W_PEND_WCRR       (1 << 1)
+#define WWPS_W_PEND_WCLR       (1 << 0)
+
+#define WSPR_ENABLE_0          (0x0000bbbb)
+#define WSPR_ENABLE_1          (0x00004444)
+#define WSPR_DISABLE_0         (0x0000aaaa)
+#define WSPR_DISABLE_1         (0x00005555)
+
+#define OMAP16XX_DSP_MMU_BASE  (0xfffed200)
+#define OMAP16XX_MAILBOX_BASE  (0xfffcf000)
+
+#endif /*  __ASM_ARCH_OMAP16XX_H */
+
diff --git a/arch/arm/mach-omap1/include/mach/omap7xx.h b/arch/arm/mach-omap1/include/mach/omap7xx.h
new file mode 100644 (file)
index 0000000..63da994
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Hardware definitions for TI OMAP7XX processor.
+ *
+ * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
+ * Adapted for omap850 by Zebediah C. McClure <zmc@lurian.net>
+ * Adapted for omap7xx by Alistair Buxton <a.j.buxton@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * THIS 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_OMAP7XX_H
+#define __ASM_ARCH_OMAP7XX_H
+
+/*
+ * ----------------------------------------------------------------------------
+ * Base addresses
+ * ----------------------------------------------------------------------------
+ */
+
+/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
+
+#define OMAP7XX_DSP_BASE       0xE0000000
+#define OMAP7XX_DSP_SIZE       0x50000
+#define OMAP7XX_DSP_START      0xE0000000
+
+#define OMAP7XX_DSPREG_BASE    0xE1000000
+#define OMAP7XX_DSPREG_SIZE    SZ_128K
+#define OMAP7XX_DSPREG_START   0xE1000000
+
+#define OMAP7XX_SPI1_BASE      0xfffc0800
+#define OMAP7XX_SPI2_BASE      0xfffc1000
+
+/*
+ * ----------------------------------------------------------------------------
+ * OMAP7XX specific configuration registers
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP7XX_CONFIG_BASE    0xfffe1000
+#define OMAP7XX_IO_CONF_0      0xfffe1070
+#define OMAP7XX_IO_CONF_1      0xfffe1074
+#define OMAP7XX_IO_CONF_2      0xfffe1078
+#define OMAP7XX_IO_CONF_3      0xfffe107c
+#define OMAP7XX_IO_CONF_4      0xfffe1080
+#define OMAP7XX_IO_CONF_5      0xfffe1084
+#define OMAP7XX_IO_CONF_6      0xfffe1088
+#define OMAP7XX_IO_CONF_7      0xfffe108c
+#define OMAP7XX_IO_CONF_8      0xfffe1090
+#define OMAP7XX_IO_CONF_9      0xfffe1094
+#define OMAP7XX_IO_CONF_10     0xfffe1098
+#define OMAP7XX_IO_CONF_11     0xfffe109c
+#define OMAP7XX_IO_CONF_12     0xfffe10a0
+#define OMAP7XX_IO_CONF_13     0xfffe10a4
+
+#define OMAP7XX_MODE_1         0xfffe1010
+#define OMAP7XX_MODE_2         0xfffe1014
+
+/* CSMI specials: in terms of base + offset */
+#define OMAP7XX_MODE2_OFFSET   0x14
+
+/*
+ * ----------------------------------------------------------------------------
+ * OMAP7XX traffic controller configuration registers
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP7XX_FLASH_CFG_0    0xfffecc10
+#define OMAP7XX_FLASH_ACFG_0   0xfffecc50
+#define OMAP7XX_FLASH_CFG_1    0xfffecc14
+#define OMAP7XX_FLASH_ACFG_1   0xfffecc54
+
+/*
+ * ----------------------------------------------------------------------------
+ * OMAP7XX DSP control registers
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP7XX_ICR_BASE       0xfffbb800
+#define OMAP7XX_DSP_M_CTL      0xfffbb804
+#define OMAP7XX_DSP_MMU_BASE   0xfffed200
+
+/*
+ * ----------------------------------------------------------------------------
+ * OMAP7XX PCC_UPLD configuration registers
+ * ----------------------------------------------------------------------------
+ */
+#define OMAP7XX_PCC_UPLD_CTRL_BASE     (0xfffe0900)
+#define OMAP7XX_PCC_UPLD_CTRL          (OMAP7XX_PCC_UPLD_CTRL_BASE + 0x00)
+
+#endif /*  __ASM_ARCH_OMAP7XX_H */
+
index f6b14a14a95727c92dd697a7f7c63c9a8e4fda9a..7f4bba9fa02edac0f86f8b335c85fd67edb73f99 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>
index ae6dd93b8ddce87e755e954695092555c4514083..7b1a3833165de05a7de5929cf2b96ad58c7c8e93 100644 (file)
@@ -6,6 +6,7 @@
 #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>
index 6809c9e56c9317dfdbaf8eff92e79d651d164237..0d1709b1a6fe10fa1de0a8f62c05ea4007a92f4e 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <asm/mach-types.h>
 
-#include <plat/board.h>
 #include <plat/mux.h>
 #include <plat/fpga.h>
 
index f6a24b3f9c4f7b4dd3e381eb3ff7823444d99e70..b3603282d75fc498de1d313508b28205d8a25a52 100644 (file)
@@ -194,6 +194,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
diff --git a/arch/arm/mach-omap2/am33xx.h b/arch/arm/mach-omap2/am33xx.h
new file mode 100644 (file)
index 0000000..06c19bb
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * This file contains the address info for various AM33XX modules.
+ *
+ * Copyright (C) 2011 Texas Instruments, Inc. - 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 as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __ASM_ARCH_AM33XX_H
+#define __ASM_ARCH_AM33XX_H
+
+#define L4_SLOW_AM33XX_BASE    0x48000000
+
+#define AM33XX_SCM_BASE                0x44E10000
+#define AM33XX_CTRL_BASE       AM33XX_SCM_BASE
+#define AM33XX_PRCM_BASE       0x44E00000
+
+#endif /* __ASM_ARCH_AM33XX_H */
index 9511584fdc4fd75bccd809e33ed354aedc8b791a..0900eac57d5688f36a18786847a16eac1edd9b25 100644 (file)
@@ -33,7 +33,6 @@
 #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>
@@ -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 a98c688058a92e8cb9251e289567515631b6443e..5453173ff57b276fae6849157c8757d3be659082 100644 (file)
 #include <linux/gpio.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 <plat/mcspi.h>
-#include <plat/board.h>
 #include <plat/usb.h>
 #include "common.h"
 #include <plat/dma.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 2dc9ba523c7a1fcfd8dc8226180328430fb87685..8518b13459880ebf158413dabff53adcd4935f4f 100644 (file)
@@ -17,7 +17,6 @@
 #include <asm/mach/arch.h>
 
 #include "common.h"
-#include <plat/board.h>
 #include <plat/gpmc-smc91x.h>
 #include <plat/usb.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 ad8a7d94afcd4b5c43f09ed3ad6e4cc02c08ea01..db43e22526c0f341c727774e45725bac15726db2 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>
@@ -45,6 +43,7 @@
 #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 92432c28673dfe9a17971bcc8f86b477c4f7cb03..318feadb1d6e7ed4f6df2f6a9b152969a2d0f286 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 18f601096ce1807aaf9ba2fa8712f707a7c3bba3..403d048a00ee31e75fd8ff91e401f05629a87206 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 <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 e5fa46bfde2f3992b62d3ef1ddc339163cfd10d2..3e2d76f05af4e4328ba9eb970ca8c118eff9e491 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 97d719047af382ca3aa5b5484310a427c1748b0d..34cb90471d960dd9cce251b0531fbb622283005e 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>
@@ -37,7 +38,6 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/nand.h>
 #include <plat/gpmc.h>
@@ -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 a33ad4641d9ad5b1a2a440bca1c1dc65fa09b963..27a5450751edba3a34401bc6e2a2b6c9834b1507 100644 (file)
@@ -38,7 +38,6 @@
 #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>
@@ -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 6567c1cd55729ce167cf90a48ab18d700ebe545f..18b63ad562745246f966f8d63f598d657237d656 100644 (file)
 
 #include <linux/regulator/machine.h>
 #include <linux/i2c/twl.h>
-
-#include <mach/hardware.h>
 #include <mach/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>
@@ -56,7 +53,6 @@
 #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 53c39d239d6e202c896ff9390eedfc0c24e60647..9017813f9abc0f99857b19e2339cf88a953671d8 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 <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 6f93a20536eaabe60fba031726422685f2624331..2ea7c577b295880810c446d8e5d505bd5596d0ca 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 ace20482e3e1901eb4fedb311fa9e0ae55fa34b5..12569cb0eddd8ce24a59ad3cf46315cf39a001dc 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 <plat/debug-devices.h>
 
 #include <video/omapdss.h>
 #include <video/omap-panel-generic-dpi.h>
 
+#include "common.h"
 #include "mux.h"
 #include "control.h"
 
index 28214483aaba24420e96fde47cf5ce91482a0d29..8408bb2748a68912cdec416b78f3cfea43c751e9 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>
@@ -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 ef9e82977499678dabccf463c48ec3396eba84fe..3f3a552b103625b4f258c0060cb1fec850c40639 100644 (file)
 #include <linux/smsc911x.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 <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>
 
@@ -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 677357ff61aca74d0c399ae889c7496cbc7e9ffa..d8deaea37dcadcf538f77c038c657ed245747a16 100644 (file)
 #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"
 
@@ -600,7 +597,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 6202fc76e490f108e9ae238ae8499eab6cf1126a..801bcb4c5e22786bed67e077f98a3497436a76e5 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>
@@ -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 0d362e9f9cb9a9854c32b378c5dd058f2f785327..b94873d0c6b6bc45823a35111d6f47af5e96e2e9 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 "common.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)
@@ -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 fca93d1afd43536a5ffca0d62248ac85f8f804c7..b5e56fa83c19b6338b291239dacc9f5f8fb194c4 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 "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>
 
+#include "common.h"
+#include "mux.h"
+#include "hsmmc.h"
+#include "control.h"
+#include "common-board-devices.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 57aebee44fd0311a0c115aa1a408227dd8b698d7..e700a98feba6228e58daf95f427fa502b89fa92f 100644 (file)
@@ -40,9 +40,7 @@
 #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>
@@ -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 b318f5602e36ed15ee51f0a0f94d74ea3802dab6..b8756f0d2a08c9da7ebeb78115408c7c457598dc 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>
@@ -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 485d14d6a8cd0683b0b74bb6ef63194292f6b4ab..0e2f838e400998ecb66f290c97d9a44ed4703934 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 <asm/system_info.h>
 
-#include <plat/board.h>
 #include "common.h"
 #include <plat/gpmc.h>
 #include <plat/nand.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 70f6d1d25463d9b237a44c507d62cc5674d10780..45fe2d3f59b1312a7b7652664029fda5b9f03cf5 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 779734d8ba37304417350cd246c52044a0238897..7a62d1322b7ae29d40caa86cc131ee3e71920eb4 100644 (file)
 #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"
@@ -399,9 +396,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,
 };
index 0ad1bb3bdb98dfdde02d9ffdb83f25e151ec5d70..00773a32524a8c95ac6f313c8cc0609df3121f00 100644 (file)
@@ -27,6 +27,7 @@
 #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 df2534de3361d5b9c2317db5cec7222e5993d2fb..456049055daa376b691a38d50c4fd045ff8dbea1 100644 (file)
@@ -28,7 +28,6 @@
 #include <asm/system_info.h>
 
 #include <plat/mcspi.h>
-#include <plat/board.h>
 #include "common.h"
 #include <plat/dma.h>
 #include <plat/gpmc.h>
@@ -774,9 +773,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 +1047,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 345dd931f76fe86bb7ecf6550412a1acf3afb6f0..93b466150002ce8dfc912b15b804b2cacd7511a1 100644 (file)
 #include <linux/gpio.h>
 #include <linux/leds.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 d4c8392cadb67f6fb0e70697965fb4a141e404a7..c4f8833b4c3c66a7eaa433622be930e7f5833f97 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 f64f441730612adc5c095cfab972bbc8064837da..5ec069e529e7647a5f3cb847aee51c101240bea6 100644 (file)
@@ -22,6 +22,9 @@
 
 #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
index 28187f134fffdc319c9f662a4d198f9284b5f23c..ea79bc299bafbb915fee98d3a22c46168c12cb20 100644 (file)
@@ -18,6 +18,8 @@
 #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 b797cb279618c59428e0a443c5c962c1655fbc5c..6bcc107b9fc37facbafeac687e31f281f2a1bb57 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 4e7e56142e6fef6c972196ec2eac8b96f186b4ae..4994438e1f46cbdee5fee1f26d74afb2a596e7fb 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 3d9d746b221ae0669fc01b1020ce0716c4f73a97..cabcfdba524659b470a7b674a6ca4bea9cc703d4 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 cd7fd0f911495103bb066faa35eb1f68456f59ba..0bf0ec3e352c2fc26fd7805766ce1f818423b65d 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"
@@ -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 ea3f565ba1a44863926492611d493fdc6f081da6..1a1f97f3ca6955917cd3e346f173cef298f32131 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"
index 002745181ad6e334bdbe961b8257f63b0f7c75b0..12c178dbc9f579c5658d46e884ee160587fbd7df 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 dfda9a3f2cb2885a6a4664577ee6036e7f360ffd..a8e326177466dbf9bb7a23a44c2082ad4c37c081 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 cacabb070e22b546126e82c61ce7824505755c19..02fe1f28affc067e51eff2e4542d27f142617da8 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"
index 12500097378dcd64fd90c784aaa2c46977607522..e92be1fc1a00f7ccfeb2c7d11f83f22085de2b24 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 25bbcc7ca4dce9794676001167a23f36474fbd86..be177c19010adbf091d8d88fa1376d4551e5e943 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),
index 794d82702c85902fdd4d71a999b09be3abd73704..fc2765bcdd404aed3127391501757d8d24aa1318 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"
index 83bed9ad30175ac7409dc648cf5871981c78cead..10a2398e17366cc99c321702cd9bf16642e00ed5 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"
index d7f55e43b76189537ee84e32d5c0965f9e79f487..500682c051c1fee927af4329671a0df3f9e7ff3c 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 389f9f8b570c751dcdbf94d50e8e09521588dec7..a911e76b4ecf6262641f3d8fc1f207fb564c24e7 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 c1875862679fc7092044644bf83e6948ecdbe4c8..013fedc9e131cbd8462ca9dd3bde9dba972a17d6 100644 (file)
@@ -27,6 +27,7 @@
 #include <plat/mcspi.h>
 #include <plat/nand.h>
 
+#include "common.h"
 #include "common-board-devices.h"
 
 #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
index 069f9725b1c3edd879bbc689af17ed70542deaae..8e43c4d885d55e8963a7810c61fd53d668b9e4bf 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 1f65b1871c231eb35abd289b1b1e4457367dad42..da0f5c187353193a572dbef74398dae55e01f895 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 3223b81e75327afb3af4ca47f88e69a744ac372e..d1ff8399a2223103a67d6ad2ff46210200c9097c 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 b8cdc8531b607dabd6a755b7ed21fba201f248bc..c1a5cab0f23636454336bc8bd8db64a73ff57b49 100644 (file)
@@ -21,7 +21,7 @@
 #include <mach/ctrl_module_pad_core_44xx.h>
 #include <mach/ctrl_module_pad_wkup_44xx.h>
 
-#include <plat/am33xx.h>
+#include "am33xx.h"
 
 #ifndef __ASSEMBLY__
 #define OMAP242X_CTRL_REGADDR(reg)                                     \
index f2a49a48ef5992bada3566f8e2ab00581a3e6b4d..bc2756959be5dc5815bcfd462cbd95586caa035c 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"
 
index 02b9478b786f0b1e42c886a7196b3b3e5fd441cb..6f6893e38ffc5a4730d79a783b9d975d248cc1eb 100644 (file)
 #include <linux/of.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 "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 "soc.h"
+#include "common.h"
 #include "mux.h"
 #include "control.h"
 #include "devices.h"
@@ -111,7 +110,7 @@ static struct resource omap2cam_resources[] = {
                .flags          = IORESOURCE_MEM,
        },
        {
-               .start          = INT_24XX_CAM_IRQ,
+               .start          = 24 + OMAP_INTC_START,
                .flags          = IORESOURCE_IRQ,
        }
 };
@@ -200,7 +199,7 @@ static struct resource omap3isp_resources[] = {
                .flags          = IORESOURCE_MEM,
        },
        {
-               .start          = INT_34XX_CAM_IRQ,
+               .start          = 24 + OMAP_INTC_START,
                .flags          = IORESOURCE_IRQ,
        }
 };
@@ -434,14 +433,12 @@ 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,
 };
 
@@ -474,7 +471,7 @@ static struct resource omap2_sham_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        {
-               .start  = INT_24XX_SHA1MD5,
+               .start  = 51 + OMAP_INTC_START,
                .flags  = IORESOURCE_IRQ,
        }
 };
@@ -492,7 +489,7 @@ static struct resource omap3_sham_resources[] = {
                .flags  = IORESOURCE_MEM,
        },
        {
-               .start  = INT_34XX_SHA1MD52_IRQ,
+               .start  = 49 + OMAP_INTC_START,
                .flags  = IORESOURCE_IRQ,
        },
        {
index b9c8d2f6a81fb166c8fa9822a6e01f81317cdc0b..f48043dbac8a9cfd38b18a1463861f3917654521 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)
index 9c6a296b3dc3a0dd6856580b9ddbf5e54ea79e0e..09d0ccccb86196650f2ff220b1134320f7c3fb8a 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 e28e761b7ab9ef8fc3366a28736b26eb40c62f1d..b3566f68a559fdff07705a637079f51182f09497 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 9ad7d489b0deb8d2166b0288450fdba087dc450b..7b52bdfc59c9b29b4d9936ecb6b7cd6e4f7b3ff4 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>
index 386dec8d2351635c2004e9ff082048c2a09264de..9e9f47ad618761667aaf2587cc2a930919dd5731 100644 (file)
 
 #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 a0fa9bb2bda5bed7e952cd7639374c040d858fbc..b66fb8e5faaae3ade327aea618ca39bb073b158b 100644 (file)
 
 #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 ba10c24f3d8dcef3378490a9f615c74b471e22a2..245839dfc722f12b0ff97d2febefe4ddb30c9c30 100644 (file)
 #include <linux/io.h>
 #include <linux/smc91x.h>
 
-#include <plat/board.h>
 #include <plat/gpmc.h>
 #include <plat/gpmc-smc91x.h>
 
+#include "soc.h"
+
 static struct omap_smc91x_platform_data *gpmc_cfg;
 
 static struct resource gpmc_smc91x_resources[] = {
index b6c77be3e8f762a144fd993553d88aa4ebe7f101..a3a28878f0c9e034cfa7e7d2e7efde2c14993e70 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/io.h>
 #include <linux/smsc911x.h>
 
-#include <plat/board.h>
 #include <plat/gpmc.h>
 #include <plat/gpmc-smsc911x.h>
 
index b2b5759ab0fec1ce1cb2641752ac14294ff25bf6..055ae8bd943faee478134e4e783a5a878f3a345f 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);
@@ -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 a9675d8d182254744327415ecf42e45a88fbdcb2..80399d7409526b3680c6e044d527deef05845fb8 100644 (file)
@@ -15,6 +15,8 @@
 #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>
index a12e224eb97daae7795f407b97e6748bbbe60f7b..fc57e67b321f3900b38f95df939f796eac8ef33b 100644 (file)
@@ -19,7 +19,6 @@
  *
  */
 
-#include <plat/cpu.h>
 #include <plat/i2c.h>
 #include "common.h"
 #include <plat/omap_hwmod.h>
index 40373db649aa3e8fc16fcb57b0002777e9e277c3..7219df0e831ac9aaaf0d1671872e3bb6d19e5a82 100644 (file)
 #include <asm/cputype.h>
 
 #include "common.h"
-#include <plat/cpu.h>
 
 #include <mach/id.h>
 
+#include "soc.h"
 #include "control.h"
 
 static unsigned int omap_revision;
index be4d290d57ee4534ca43d19f68523e28f3e5870d..5621cc59c9f4e9731b15d69504b13e6cf1004fd7 100644 (file)
@@ -1,5 +1,3 @@
 /*
  * arch/arm/mach-omap2/include/mach/gpio.h
  */
-
-#include <plat/gpio.h>
index 78edf9d33f717191d6cc2c831c7ccca0bde3e253..54492dbf69735aba0798f1a70f57531be4f57ca7 100644 (file)
@@ -1,5 +1,3 @@
 /*
  * arch/arm/mach-omap2/include/mach/hardware.h
  */
-
-#include <plat/hardware.h>
index 44dab7725696b5348bd36c7d7fc77417434c0794..ba5282cafa420131d423c0f31368d729cc420fd5 100644 (file)
@@ -1,5 +1,3 @@
 /*
  * arch/arm/mach-omap2/include/mach/irqs.h
  */
-
-#include <plat/irqs.h>
index 4d2d981ff5c50839d35714ea7e94cb48d6001ad7..4234d28dc17177ffbf31d598328a4e8a75c18451 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 bcd83db41bbce706062a9116d5aa1fb25472089e..efed4f540adbd5b012177dddf161f45cd5dd5118 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
index 6875be837d9f9632cb3ffbd0c3fcbd64b5dcfddc..0d974565f8ca7ec6fae5d6f1fe081c398e2b243b 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 577cb77db26c0adc207284321407b1b1a1a2c36a..d493727632e97f0067d38f833ac0dc3d224f845e 100644 (file)
@@ -18,9 +18,7 @@
 #include <linux/platform_device.h>
 #include <linux/slab.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 fb5bc6cf3773a531417d6f8da1293c5d351f543e..9e57b4aadb0694bedc233599ddeb30c8d45a2567 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 1be8bcb52e9307cdacffea26857db68a762927cd..df298d46707c78f38ccaa6051fded40dbc533fbf 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 637a1bdf2ac45d63a63c7d8419b5b2179d2a2022..ff4e6a0e9c7c7ef367ddffe6d92735a7e7e3389c 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 9a35adf91232030f0ed5a7a6e890a8d2381343d5..19cc5f504f7effe1ff0c6df41aa5832a6ee31adb 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 <asm/cputype.h>
 
+#include "soc.h"
 #include "iomap.h"
 #include "common.h"
 #include "clockdomain.h"
index 05fdebfaa195b0e5fc87e33217f24ce1b5c09822..b54427dec2a39309496de11e15ee546736a39208 100644 (file)
@@ -30,6 +30,7 @@
 #include <mach/omap-wakeupgen.h>
 #include <mach/omap-secure.h>
 
+#include "soc.h"
 #include "omap4-sar-layout.h"
 #include "common.h"
 
diff --git a/arch/arm/mach-omap2/omap24xx.h b/arch/arm/mach-omap2/omap24xx.h
new file mode 100644 (file)
index 0000000..641a2c8
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * This file contains the processor specific definitions
+ * of the TI OMAP24XX.
+ *
+ * Copyright (C) 2007 Texas Instruments.
+ * Copyright (C) 2007 Nokia 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifndef __ASM_ARCH_OMAP2_H
+#define __ASM_ARCH_OMAP2_H
+
+/*
+ * Please place only base defines here and put the rest in device
+ * specific headers. Note also that some of these defines are needed
+ * for omap1 to compile without adding ifdefs.
+ */
+
+#define L4_24XX_BASE           0x48000000
+#define L4_WK_243X_BASE                0x49000000
+#define L3_24XX_BASE           0x68000000
+
+/* interrupt controller */
+#define OMAP24XX_IC_BASE       (L4_24XX_BASE + 0xfe000)
+#define OMAP24XX_IVA_INTC_BASE 0x40000000
+
+#define OMAP242X_CTRL_BASE     L4_24XX_BASE
+#define OMAP2420_32KSYNCT_BASE (L4_24XX_BASE + 0x4000)
+#define OMAP2420_PRCM_BASE     (L4_24XX_BASE + 0x8000)
+#define OMAP2420_CM_BASE       (L4_24XX_BASE + 0x8000)
+#define OMAP2420_PRM_BASE      OMAP2420_CM_BASE
+#define OMAP2420_SDRC_BASE     (L3_24XX_BASE + 0x9000)
+#define OMAP2420_SMS_BASE      0x68008000
+#define OMAP2420_GPMC_BASE     0x6800a000
+
+#define OMAP2430_32KSYNCT_BASE (L4_WK_243X_BASE + 0x20000)
+#define OMAP2430_PRCM_BASE     (L4_WK_243X_BASE + 0x6000)
+#define OMAP2430_CM_BASE       (L4_WK_243X_BASE + 0x6000)
+#define OMAP2430_PRM_BASE      OMAP2430_CM_BASE
+
+#define OMAP243X_SMS_BASE      0x6C000000
+#define OMAP243X_SDRC_BASE     0x6D000000
+#define OMAP243X_GPMC_BASE     0x6E000000
+#define OMAP243X_SCM_BASE      (L4_WK_243X_BASE + 0x2000)
+#define OMAP243X_CTRL_BASE     OMAP243X_SCM_BASE
+#define OMAP243X_HS_BASE       (L4_24XX_BASE + 0x000ac000)
+
+/* DSP SS */
+#define OMAP2420_DSP_BASE      0x58000000
+#define OMAP2420_DSP_MEM_BASE  (OMAP2420_DSP_BASE + 0x0)
+#define OMAP2420_DSP_IPI_BASE  (OMAP2420_DSP_BASE + 0x1000000)
+#define OMAP2420_DSP_MMU_BASE  (OMAP2420_DSP_BASE + 0x2000000)
+
+#define OMAP243X_DSP_BASE      0x5C000000
+#define OMAP243X_DSP_MEM_BASE  (OMAP243X_DSP_BASE + 0x0)
+#define OMAP243X_DSP_MMU_BASE  (OMAP243X_DSP_BASE + 0x1000000)
+
+/* Mailbox */
+#define OMAP24XX_MAILBOX_BASE  (L4_24XX_BASE + 0x94000)
+
+/* Camera */
+#define OMAP24XX_CAMERA_BASE   (L4_24XX_BASE + 0x52000)
+
+/* Security */
+#define OMAP24XX_SEC_BASE      (L4_24XX_BASE + 0xA0000)
+#define OMAP24XX_SEC_RNG_BASE  (OMAP24XX_SEC_BASE + 0x0000)
+#define OMAP24XX_SEC_DES_BASE  (OMAP24XX_SEC_BASE + 0x2000)
+#define OMAP24XX_SEC_SHA1MD5_BASE (OMAP24XX_SEC_BASE + 0x4000)
+#define OMAP24XX_SEC_AES_BASE  (OMAP24XX_SEC_BASE + 0x6000)
+#define OMAP24XX_SEC_PKA_BASE  (OMAP24XX_SEC_BASE + 0x8000)
+
+#endif /* __ASM_ARCH_OMAP2_H */
+
diff --git a/arch/arm/mach-omap2/omap34xx.h b/arch/arm/mach-omap2/omap34xx.h
new file mode 100644 (file)
index 0000000..c0d1b4b
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * This file contains the processor specific definitions of the TI OMAP34XX.
+ *
+ * Copyright (C) 2007 Texas Instruments.
+ * Copyright (C) 2007 Nokia 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __ASM_ARCH_OMAP3_H
+#define __ASM_ARCH_OMAP3_H
+
+/*
+ * Please place only base defines here and put the rest in device
+ * specific headers.
+ */
+
+#define L4_34XX_BASE           0x48000000
+#define L4_WK_34XX_BASE                0x48300000
+#define L4_PER_34XX_BASE       0x49000000
+#define L4_EMU_34XX_BASE       0x54000000
+#define L3_34XX_BASE           0x68000000
+
+#define L4_WK_AM33XX_BASE      0x44C00000
+
+#define OMAP3430_32KSYNCT_BASE 0x48320000
+#define OMAP3430_CM_BASE       0x48004800
+#define OMAP3430_PRM_BASE      0x48306800
+#define OMAP343X_SMS_BASE      0x6C000000
+#define OMAP343X_SDRC_BASE     0x6D000000
+#define OMAP34XX_GPMC_BASE     0x6E000000
+#define OMAP343X_SCM_BASE      0x48002000
+#define OMAP343X_CTRL_BASE     OMAP343X_SCM_BASE
+
+#define OMAP34XX_IC_BASE       0x48200000
+
+#define OMAP3430_ISP_BASE              (L4_34XX_BASE + 0xBC000)
+#define OMAP3430_ISP_CBUFF_BASE                (OMAP3430_ISP_BASE + 0x0100)
+#define OMAP3430_ISP_CCP2_BASE         (OMAP3430_ISP_BASE + 0x0400)
+#define OMAP3430_ISP_CCDC_BASE         (OMAP3430_ISP_BASE + 0x0600)
+#define OMAP3430_ISP_HIST_BASE         (OMAP3430_ISP_BASE + 0x0A00)
+#define OMAP3430_ISP_H3A_BASE          (OMAP3430_ISP_BASE + 0x0C00)
+#define OMAP3430_ISP_PREV_BASE         (OMAP3430_ISP_BASE + 0x0E00)
+#define OMAP3430_ISP_RESZ_BASE         (OMAP3430_ISP_BASE + 0x1000)
+#define OMAP3430_ISP_SBL_BASE          (OMAP3430_ISP_BASE + 0x1200)
+#define OMAP3430_ISP_MMU_BASE          (OMAP3430_ISP_BASE + 0x1400)
+#define OMAP3430_ISP_CSI2A_REGS1_BASE  (OMAP3430_ISP_BASE + 0x1800)
+#define OMAP3430_ISP_CSIPHY2_BASE      (OMAP3430_ISP_BASE + 0x1970)
+#define OMAP3630_ISP_CSI2A_REGS2_BASE  (OMAP3430_ISP_BASE + 0x19C0)
+#define OMAP3630_ISP_CSI2C_REGS1_BASE  (OMAP3430_ISP_BASE + 0x1C00)
+#define OMAP3630_ISP_CSIPHY1_BASE      (OMAP3430_ISP_BASE + 0x1D70)
+#define OMAP3630_ISP_CSI2C_REGS2_BASE  (OMAP3430_ISP_BASE + 0x1DC0)
+
+#define OMAP3430_ISP_END               (OMAP3430_ISP_BASE         + 0x06F)
+#define OMAP3430_ISP_CBUFF_END         (OMAP3430_ISP_CBUFF_BASE   + 0x077)
+#define OMAP3430_ISP_CCP2_END          (OMAP3430_ISP_CCP2_BASE    + 0x1EF)
+#define OMAP3430_ISP_CCDC_END          (OMAP3430_ISP_CCDC_BASE    + 0x0A7)
+#define OMAP3430_ISP_HIST_END          (OMAP3430_ISP_HIST_BASE    + 0x047)
+#define OMAP3430_ISP_H3A_END           (OMAP3430_ISP_H3A_BASE     + 0x05F)
+#define OMAP3430_ISP_PREV_END          (OMAP3430_ISP_PREV_BASE    + 0x09F)
+#define OMAP3430_ISP_RESZ_END          (OMAP3430_ISP_RESZ_BASE    + 0x0AB)
+#define OMAP3430_ISP_SBL_END           (OMAP3430_ISP_SBL_BASE     + 0x0FB)
+#define OMAP3430_ISP_MMU_END           (OMAP3430_ISP_MMU_BASE     + 0x06F)
+#define OMAP3430_ISP_CSI2A_REGS1_END   (OMAP3430_ISP_CSI2A_REGS1_BASE + 0x16F)
+#define OMAP3430_ISP_CSIPHY2_END       (OMAP3430_ISP_CSIPHY2_BASE + 0x00B)
+#define OMAP3630_ISP_CSI2A_REGS2_END   (OMAP3630_ISP_CSI2A_REGS2_BASE + 0x3F)
+#define OMAP3630_ISP_CSI2C_REGS1_END   (OMAP3630_ISP_CSI2C_REGS1_BASE + 0x16F)
+#define OMAP3630_ISP_CSIPHY1_END       (OMAP3630_ISP_CSIPHY1_BASE + 0x00B)
+#define OMAP3630_ISP_CSI2C_REGS2_END   (OMAP3630_ISP_CSI2C_REGS2_BASE + 0x3F)
+
+#define OMAP34XX_HSUSB_OTG_BASE        (L4_34XX_BASE + 0xAB000)
+#define OMAP34XX_USBTLL_BASE   (L4_34XX_BASE + 0x62000)
+#define OMAP34XX_UHH_CONFIG_BASE       (L4_34XX_BASE + 0x64000)
+#define OMAP34XX_OHCI_BASE     (L4_34XX_BASE + 0x64400)
+#define OMAP34XX_EHCI_BASE     (L4_34XX_BASE + 0x64800)
+#define OMAP34XX_SR1_BASE      0x480C9000
+#define OMAP34XX_SR2_BASE      0x480CB000
+
+#define OMAP34XX_MAILBOX_BASE          (L4_34XX_BASE + 0x94000)
+
+/* Security */
+#define OMAP34XX_SEC_BASE      (L4_34XX_BASE + 0xA0000)
+#define OMAP34XX_SEC_SHA1MD5_BASE      (OMAP34XX_SEC_BASE + 0x23000)
+#define OMAP34XX_SEC_AES_BASE  (OMAP34XX_SEC_BASE + 0x25000)
+
+#endif /* __ASM_ARCH_OMAP3_H */
+
index c29dee998a798e08cb8ffbef85a556c835fc6174..73c1440a82532680b148eaa534328328d2430a64 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 "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;
diff --git a/arch/arm/mach-omap2/omap44xx.h b/arch/arm/mach-omap2/omap44xx.h
new file mode 100644 (file)
index 0000000..43b927b
--- /dev/null
@@ -0,0 +1,62 @@
+/*:
+ * Address mappings and base address for OMAP4 interconnects
+ * and peripherals.
+ *
+ * Copyright (C) 2009 Texas Instruments
+ *
+ * Author: 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 version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef __ASM_ARCH_OMAP44XX_H
+#define __ASM_ARCH_OMAP44XX_H
+
+/*
+ * Please place only base defines here and put the rest in device
+ * specific headers.
+ */
+#define L4_44XX_BASE                   0x4a000000
+#define L4_WK_44XX_BASE                        0x4a300000
+#define L4_PER_44XX_BASE               0x48000000
+#define L4_EMU_44XX_BASE               0x54000000
+#define L3_44XX_BASE                   0x44000000
+#define OMAP44XX_EMIF1_BASE            0x4c000000
+#define OMAP44XX_EMIF2_BASE            0x4d000000
+#define OMAP44XX_DMM_BASE              0x4e000000
+#define OMAP4430_32KSYNCT_BASE         0x4a304000
+#define OMAP4430_CM1_BASE              0x4a004000
+#define OMAP4430_CM_BASE               OMAP4430_CM1_BASE
+#define OMAP4430_CM2_BASE              0x4a008000
+#define OMAP4430_PRM_BASE              0x4a306000
+#define OMAP4430_PRCM_MPU_BASE         0x48243000
+#define OMAP44XX_GPMC_BASE             0x50000000
+#define OMAP443X_SCM_BASE              0x4a002000
+#define OMAP443X_CTRL_BASE             0x4a100000
+#define OMAP44XX_IC_BASE               0x48200000
+#define OMAP44XX_IVA_INTC_BASE         0x40000000
+#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_SAR_RAM_BASE          0x4a326000
+
+#define OMAP44XX_MAILBOX_BASE          (L4_44XX_BASE + 0xF4000)
+#define OMAP44XX_HSUSB_OTG_BASE                (L4_44XX_BASE + 0xAB000)
+
+#define OMAP4_MMU1_BASE                        0x55082000
+#define OMAP4_MMU2_BASE                        0x4A066000
+
+#define OMAP44XX_USBTLL_BASE           (L4_44XX_BASE + 0x62000)
+#define OMAP44XX_UHH_CONFIG_BASE       (L4_44XX_BASE + 0x64000)
+#define OMAP44XX_HSUSB_OHCI_BASE       (L4_44XX_BASE + 0x64800)
+#define OMAP44XX_HSUSB_EHCI_BASE       (L4_44XX_BASE + 0x64C00)
+
+#endif /* __ASM_ARCH_OMAP44XX_H */
+
diff --git a/arch/arm/mach-omap2/omap54xx.h b/arch/arm/mach-omap2/omap54xx.h
new file mode 100644 (file)
index 0000000..a2582bb
--- /dev/null
@@ -0,0 +1,32 @@
+/*:
+ * Address mappings and base address for OMAP5 interconnects
+ * and peripherals.
+ *
+ * Copyright (C) 2012 Texas Instruments
+ *     Santosh Shilimkar <santosh.shilimkar@ti.com>
+ *     Sricharan <r.sricharan@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.
+ */
+#ifndef __ASM_SOC_OMAP54XX_H
+#define __ASM_SOC_OMAP54XX_H
+
+/*
+ * Please place only base defines here and put the rest in device
+ * specific headers.
+ */
+#define L4_54XX_BASE                   0x4a000000
+#define L4_WK_54XX_BASE                        0x4ae00000
+#define L4_PER_54XX_BASE               0x48000000
+#define L3_54XX_BASE                   0x44000000
+#define OMAP54XX_32KSYNCT_BASE         0x4ae04000
+#define OMAP54XX_CM_CORE_AON_BASE      0x4a004000
+#define OMAP54XX_CM_CORE_BASE          0x4a008000
+#define OMAP54XX_PRM_BASE              0x4ae06000
+#define OMAP54XX_PRCM_MPU_BASE         0x48243000
+#define OMAP54XX_SCM_BASE              0x4a002000
+#define OMAP54XX_CTRL_BASE             0x4a002800
+
+#endif /* __ASM_SOC_OMAP555554XX_H */
index 6ca8e519968d0c4e82e94fb384ab84da90a892b1..22b1c18ef5c37a7a9631605dda36088915474b53 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"
@@ -867,6 +869,26 @@ static void _omap4_enable_module(struct omap_hwmod *oh)
                                   oh->prcm.omap4.clkctrl_offs);
 }
 
+/**
+ * _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 *
@@ -893,6 +915,31 @@ static int _omap4_wait_target_disable(struct omap_hwmod *oh)
                                             oh->prcm.omap4.clkctrl_offs);
 }
 
+/**
+ * _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
@@ -1613,6 +1660,36 @@ static int _omap4_disable_module(struct omap_hwmod *oh)
        return 0;
 }
 
+/**
+ * _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 *
@@ -2547,6 +2624,33 @@ static int _omap4_wait_target_ready(struct omap_hwmod *oh)
                                              oh->prcm.omap4.clkctrl_offs);
 }
 
+/**
+ * _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
@@ -2678,6 +2782,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)
@@ -3677,6 +3847,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 50cfab61b0e21bb6fc3ff00e769bd38570c3761b..4e81637640e9b554f8b927070eedb0d74836976b 100644 (file)
  * XXX these should be marked initdata for multi-OMAP kernels
  */
 #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>
@@ -162,9 +159,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 +196,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 +222,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 +262,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 58b5bc196d32c4de29054ead6137321d921c1b5a..ceb23c3fa89ddb5975b06f709986f2e05f612d30 100644 (file)
  * XXX these should be marked initdata for multi-OMAP kernels
  */
 #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 "soc.h"
 #include "omap_hwmod_common_data.h"
-
 #include "prm-regbits-24xx.h"
 #include "cm-regbits-24xx.h"
 #include "wd_timer.h"
@@ -133,8 +130,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 +170,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 +192,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 +247,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 +300,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 +328,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 +355,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 +382,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 +415,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 +465,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 +506,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 102d76e9e9ea5634546050d4fd9c861cd358c44c..bea700e928e7461b54429605626ce9b9df8d2f4a 100644 (file)
@@ -15,8 +15,6 @@
 #include <plat/common.h>
 #include <plat/hdq1w.h>
 
-#include <mach/irqs.h>
-
 #include "omap_hwmod_common_data.h"
 
 /* UART */
@@ -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 afad69c6ba6e92f80817189bd5e53dcaf70293db..ceb30524234001673907f202a0f08da29039fcaa 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 "omap_hwmod_common_data.h"
 #include "cm-regbits-24xx.h"
 #include "prm-regbits-24xx.h"
 #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..22433cb
--- /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 <plat/dma.h>
+#include <plat/mmc.h>
+#include <plat/mcspi.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 c9e38200216b2985cb3ef997e530891b8e3b19dd..75fbbac13921166d0c21784ad2b57cdd5c25d0f4 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 <plat/i2c.h>
-#include <plat/gpio.h>
 #include <plat/mmc.h>
 #include <plat/mcbsp.h>
 #include <plat/mcspi.h>
 #include <plat/dmtimer.h>
 
+#include <mach/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 = {
@@ -355,8 +355,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 +490,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 +518,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 +674,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 +804,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 +963,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 +993,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 +1098,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 +1125,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 +1157,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 +1189,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 +1222,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 +1267,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 +1289,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 +1352,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 +1397,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 +1458,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 +1549,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 +1585,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 +1638,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 +1670,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 +1706,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 +1773,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 +1834,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 +1893,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 +1987,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 +3214,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 242aee498ceb21466e33ee04035ed63147e4a615..b95244b76a15e156140be5b3456ce0ffcff803c0 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>
index e7e8eeae95e5d08ac9ea6d58c377e0505920a1ec..dddb677fed688c16b0198df03a646330da003968 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <plat/omap_hwmod.h>
 
+#include "common.h"
 #include "display.h"
 
 /* Common address space across OMAP2xxx */
index d15225ff5c4969b3ddde9cc79ece7caf725001eb..f447e02102bb38b204849bf2424b82415ea9dc4e 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 d52651a05daa6ce0686ec32a4915e17c8fdc9919..593eaea35cecc66effd7559e11fdcf3f0f1d2413 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 5037e76e4e23ebe10a0915f099530c7ac1460388..a9e8cf21705d8da54bc18a891f1a050e977c1e37 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 750805c528d8c256f2d9cfe5fe9e186a7f5e0aab..0e75ec3e114b0e812a3016ca340010b5321789d7 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 d95f3f945d4a6cebbbce97ea583039308a873084..75cef5f67a8a6bbc9b39840d7e1339d7bbc16a2d 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 c95415da23c275b184d2817372a990a371ddaf0c..a9fd6d5fe79ef0dcb8484117e3e1c47cd324a04d 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 814bcd90159686a18a914e82de7a93ca6cda1e79..3e1345fc07139777a967c61dc8112fc9a5e69331 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 2edeffc923a641d3a996e56e7575ba3543b2af55..8af6cd6ac331ffd2cfdf32c53782a9fdafad952f 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 05bd8f02723f2966bfc559ae30b9c33feee9feb3..90480f7599749e3913ce7bd9fcb95f6eea2249c1 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>
index 69b36e185e9b7cc019e664f17c53cf96f282eee1..ca5be83d5019405f1e244db2563e8c0fac37ad30 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)
index bb883e463078b264869594d150dc5a2bb49d0caf..8b23d234fb554cc4f34663f7f3741643cb45ba46 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 053e24ed3c48275b56dff00645a40602b1d8fb0d..9c9d23c10205cac4d6aade9f031fe917445a3a29 100644 (file)
@@ -27,7 +27,6 @@
 
 #include "common.h"
 #include <plat/prcm.h>
-#include <plat/irqs.h>
 
 #include "clock.h"
 #include "clock2xxx.h"
index a0309dea67945eb218ff622e3a4826fad252c083..9529984d8d2b10f6f40c5eecd720b01aba118525 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 bb727c2d9337b73358c6e6509fdd1bef14425ffe..f0c4d5f4a17498306afacfa3beb9968d8ca759e0 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 03b126d9ad9427bbb5027b3c740e52ca89daba57..6b4d332be2f63d46d8bc3d1cd25ce08a8af4f7b4 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 1133bb2f632b8316d9bf12011569df3cad982070..73e55e4853294cdd4c1fb1f443cd24b700378356 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 c1b93c752d7013307b982422f0d871472a3d3eb0..7ca266e987f6ea6f9b333dd1e144e6aa0412c6c8 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
@@ -304,6 +307,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);
index d4bf904d84abbfb2bead1f2188da266f9a00e592..ce0ccd26efbd4dfa992e507fda3385a35ea6503c 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 1f62f23673fbab18b6676a56e3c5ea11273755f8..506987979c1cd4e882f846968e550aa1b5ecfcc2 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 91e71d8f46f0aa731c9678e88423490aa1192cf9..b7d8ead4b86ad4cf7e970ac40b9ad706c2aca31b 100644 (file)
 #include <asm/memory.h>
 #include <asm/hardware/cache-l2x0.h>
 
-#include <plat/omap44xx.h>
 #include <mach/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 ee0bfcc1410f89a38f449f35338b381b6773cd4c..8f7326cd435b9bfb0d7b07aab70bfcd36bef8a5b 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 d4d39ef04769c806716c14eee04e73ac4bc8ce0f..b140d6578529dceb0dd4efc33e9ee2a3e4014d0b 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 df5a21322b0ac1b68d8446c9da3b331a5c5957cd..2d0ceaa23fb8e8f7f1803dc4480a590805769f7e 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"
diff --git a/arch/arm/mach-omap2/ti81xx.h b/arch/arm/mach-omap2/ti81xx.h
new file mode 100644 (file)
index 0000000..8f9843f
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * This file contains the address data for various TI81XX modules.
+ *
+ * Copyright (C) 2010 Texas Instruments, Inc. - 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 as
+ * published by the Free Software Foundation version 2.
+ *
+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
+ * kind, whether express or implied; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef __ASM_ARCH_TI81XX_H
+#define __ASM_ARCH_TI81XX_H
+
+#define L4_SLOW_TI81XX_BASE    0x48000000
+
+#define TI81XX_SCM_BASE                0x48140000
+#define TI81XX_CTRL_BASE       TI81XX_SCM_BASE
+#define TI81XX_PRCM_BASE       0x48180000
+
+#define TI81XX_ARM_INTC_BASE   0x48200000
+
+#endif /* __ASM_ARCH_TI81XX_H */
index 2ff6d41ec6c6c004ace041b525ec1821d6389653..25cbe73b0cd7d06e97e0c8f578b91581337303be 100644 (file)
 #include <linux/slab.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 */
@@ -373,8 +375,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)
index db5ff664237517562766ffdbc34887c6416c272f..99be94e94547ea119aa400b03456f4aaeeeeb4f0 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 8fe71cfd002c96bf168106bb4b12d2e2b0ad4502..d109c09ef34bf7b5ccf5880614d07782fe0bc8dd 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 dde8a11f47d5ab9621dd3f6f0e87d1920351c9a2..ac95daaa4702dc6cd2f734e19e35c716d8c2e69c 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 c4a576856661014ea3bec9acc70f80e32d62c33b..89150b2435e5a4c2e95fdad2e928d2fe990ac8ef 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 <mach/am35xx.h>
+
 #include "mux.h"
 
 static struct musb_hdrc_config musb_config = {
index 84da34f9a7cff598ab059a604fb3bf14ec5ddea4..b451f3c132923eb5738d0a29e6a30abc27633039 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"
index d0103c80d04085376a41d77d97995d4c558831c6..63afbfed3cbc2dba4f8c7ef0f9d9661b646b5e97 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 a534d8880de12e2a92b0c7a35ec1ebdc3034c44e..1d2e3c6f8b5911a0cc2d6c59602559bca823c75f 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 dd36eba9506c85877d91e57d2d95894343199d7d..d15a4a6d614698291a058a5a72710fb4f7184d21 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 961bf859bc0cd7f90040c33de25fc9573056730c..a017e994e00613f4d98bc153516f7f7c8e74bd2d 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 mux.o fb.o counter_32k.o
 obj-m :=
 obj-n :=
 obj-  :=
index 89a3723b353889805841dfc0ca9a4804e48d6377..e5778ed689d8b656f454b98343119414640b4b1d 100644 (file)
 #include <linux/dma-mapping.h>
 
 #include <plat/common.h>
-#include <plat/board.h>
 #include <plat/vram.h>
 #include <plat/dsp.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 dbf1e03029a5707c36ac8e16978cd756649e6ab4..2e826f1faf7b39dd425116f6d202a9853b6674d1 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 caa1f7b6cc2145995bedeaa321a77078869c3bf7..c7a4c0902b386f90e8e6d37a21fc7ead498b6ea5 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 39407cbe34c65ab0308a5b1585ad896d5c5f3c2f..195aaae658726bf6903f9df739cb90878ede1462 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 7fe626761e53bc87a2aaec3add8c7f7854635875..6dcad5873d57d6d5822491ab7c844aff5be71adb 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>
 
 /*
index dd6f92c99e565f2ac82ea8e9c382e1c879b521d3..bcbb9d5dc293e4066264dc6aba714af8aa6594f4 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 db071bc71c4d61d8e5bd5938eb3e438a06f2b449..40bc06a7ac43685a5ae91b253fe649d7444993f1 100644 (file)
@@ -39,6 +39,7 @@
 
 #define OMAP_I2C_SIZE          0x3f
 #define OMAP1_I2C_BASE         0xfffb3800
+#define OMAP1_INT_I2C          (32 + 4)
 
 static const char name[] = "omap_i2c";
 
@@ -105,7 +106,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/am33xx.h b/arch/arm/plat-omap/include/plat/am33xx.h
deleted file mode 100644 (file)
index 06c19bb..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * This file contains the address info for various AM33XX modules.
- *
- * Copyright (C) 2011 Texas Instruments, Inc. - 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 as
- * published by the Free Software Foundation version 2.
- *
- * This program is distributed "as is" WITHOUT ANY WARRANTY of any
- * kind, whether express or implied; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#ifndef __ASM_ARCH_AM33XX_H
-#define __ASM_ARCH_AM33XX_H
-
-#define L4_SLOW_AM33XX_BASE    0x48000000
-
-#define AM33XX_SCM_BASE                0x44E10000
-#define AM33XX_CTRL_BASE       AM33XX_SCM_BASE
-#define AM33XX_PRCM_BASE       0x44E00000
-
-#endif /* __ASM_ARCH_AM33XX_H */
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 bb5d08a70dbc64ac961945669655e2c47d380750..67da857783ce6e7155cf3b5424cac1fe693a52d3 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
diff --git a/arch/arm/plat-omap/include/plat/debug-devices.h b/arch/arm/plat-omap/include/plat/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 c5811d4409b0438ab5c37c3338b6822d88a1228c..0a87b052f8f7e6f6db561dc7347a0f28f13b9a24 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
diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h
deleted file mode 100644 (file)
index 50fb7cc..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * arch/arm/plat-omap/include/mach/gpio.h
- *
- * OMAP GPIO handling defines and functions
- *
- * Copyright (C) 2003-2005 Nokia Corporation
- *
- * Written by Juha Yrjölä <juha.yrjola@nokia.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_OMAP_GPIO_H
-#define __ASM_ARCH_OMAP_GPIO_H
-
-#include <linux/io.h>
-#include <linux/platform_device.h>
-#include <mach/irqs.h>
-
-#define OMAP1_MPUIO_BASE                       0xfffb5000
-
-/*
- * These are the omap15xx/16xx offsets. The omap7xx offset are
- * OMAP_MPUIO_ / 2 offsets below.
- */
-#define OMAP_MPUIO_INPUT_LATCH         0x00
-#define OMAP_MPUIO_OUTPUT              0x04
-#define OMAP_MPUIO_IO_CNTL             0x08
-#define OMAP_MPUIO_KBR_LATCH           0x10
-#define OMAP_MPUIO_KBC                 0x14
-#define OMAP_MPUIO_GPIO_EVENT_MODE     0x18
-#define OMAP_MPUIO_GPIO_INT_EDGE       0x1c
-#define OMAP_MPUIO_KBD_INT             0x20
-#define OMAP_MPUIO_GPIO_INT            0x24
-#define OMAP_MPUIO_KBD_MASKIT          0x28
-#define OMAP_MPUIO_GPIO_MASKIT         0x2c
-#define OMAP_MPUIO_GPIO_DEBOUNCING     0x30
-#define OMAP_MPUIO_LATCH               0x34
-
-#define OMAP34XX_NR_GPIOS              6
-
-/*
- * OMAP1510 GPIO registers
- */
-#define OMAP1510_GPIO_DATA_INPUT       0x00
-#define OMAP1510_GPIO_DATA_OUTPUT      0x04
-#define OMAP1510_GPIO_DIR_CONTROL      0x08
-#define OMAP1510_GPIO_INT_CONTROL      0x0c
-#define OMAP1510_GPIO_INT_MASK         0x10
-#define OMAP1510_GPIO_INT_STATUS       0x14
-#define OMAP1510_GPIO_PIN_CONTROL      0x18
-
-#define OMAP1510_IH_GPIO_BASE          64
-
-/*
- * OMAP1610 specific GPIO registers
- */
-#define OMAP1610_GPIO_REVISION         0x0000
-#define OMAP1610_GPIO_SYSCONFIG                0x0010
-#define OMAP1610_GPIO_SYSSTATUS                0x0014
-#define OMAP1610_GPIO_IRQSTATUS1       0x0018
-#define OMAP1610_GPIO_IRQENABLE1       0x001c
-#define OMAP1610_GPIO_WAKEUPENABLE     0x0028
-#define OMAP1610_GPIO_DATAIN           0x002c
-#define OMAP1610_GPIO_DATAOUT          0x0030
-#define OMAP1610_GPIO_DIRECTION                0x0034
-#define OMAP1610_GPIO_EDGE_CTRL1       0x0038
-#define OMAP1610_GPIO_EDGE_CTRL2       0x003c
-#define OMAP1610_GPIO_CLEAR_IRQENABLE1 0x009c
-#define OMAP1610_GPIO_CLEAR_WAKEUPENA  0x00a8
-#define OMAP1610_GPIO_CLEAR_DATAOUT    0x00b0
-#define OMAP1610_GPIO_SET_IRQENABLE1   0x00dc
-#define OMAP1610_GPIO_SET_WAKEUPENA    0x00e8
-#define OMAP1610_GPIO_SET_DATAOUT      0x00f0
-
-/*
- * OMAP7XX specific GPIO registers
- */
-#define OMAP7XX_GPIO_DATA_INPUT                0x00
-#define OMAP7XX_GPIO_DATA_OUTPUT       0x04
-#define OMAP7XX_GPIO_DIR_CONTROL       0x08
-#define OMAP7XX_GPIO_INT_CONTROL       0x0c
-#define OMAP7XX_GPIO_INT_MASK          0x10
-#define OMAP7XX_GPIO_INT_STATUS                0x14
-
-/*
- * omap2+ specific GPIO registers
- */
-#define OMAP24XX_GPIO_REVISION         0x0000
-#define OMAP24XX_GPIO_IRQSTATUS1       0x0018
-#define OMAP24XX_GPIO_IRQSTATUS2       0x0028
-#define OMAP24XX_GPIO_IRQENABLE2       0x002c
-#define OMAP24XX_GPIO_IRQENABLE1       0x001c
-#define OMAP24XX_GPIO_WAKE_EN          0x0020
-#define OMAP24XX_GPIO_CTRL             0x0030
-#define OMAP24XX_GPIO_OE               0x0034
-#define OMAP24XX_GPIO_DATAIN           0x0038
-#define OMAP24XX_GPIO_DATAOUT          0x003c
-#define OMAP24XX_GPIO_LEVELDETECT0     0x0040
-#define OMAP24XX_GPIO_LEVELDETECT1     0x0044
-#define OMAP24XX_GPIO_RISINGDETECT     0x0048
-#define OMAP24XX_GPIO_FALLINGDETECT    0x004c
-#define OMAP24XX_GPIO_DEBOUNCE_EN      0x0050
-#define OMAP24XX_GPIO_DEBOUNCE_VAL     0x0054
-#define OMAP24XX_GPIO_CLEARIRQENABLE1  0x0060
-#define OMAP24XX_GPIO_SETIRQENABLE1    0x0064
-#define OMAP24XX_GPIO_CLEARWKUENA      0x0080
-#define OMAP24XX_GPIO_SETWKUENA                0x0084
-#define OMAP24XX_GPIO_CLEARDATAOUT     0x0090
-#define OMAP24XX_GPIO_SETDATAOUT       0x0094
-
-#define OMAP4_GPIO_REVISION            0x0000
-#define OMAP4_GPIO_EOI                 0x0020
-#define OMAP4_GPIO_IRQSTATUSRAW0       0x0024
-#define OMAP4_GPIO_IRQSTATUSRAW1       0x0028
-#define OMAP4_GPIO_IRQSTATUS0          0x002c
-#define OMAP4_GPIO_IRQSTATUS1          0x0030
-#define OMAP4_GPIO_IRQSTATUSSET0       0x0034
-#define OMAP4_GPIO_IRQSTATUSSET1       0x0038
-#define OMAP4_GPIO_IRQSTATUSCLR0       0x003c
-#define OMAP4_GPIO_IRQSTATUSCLR1       0x0040
-#define OMAP4_GPIO_IRQWAKEN0           0x0044
-#define OMAP4_GPIO_IRQWAKEN1           0x0048
-#define OMAP4_GPIO_IRQENABLE1          0x011c
-#define OMAP4_GPIO_WAKE_EN             0x0120
-#define OMAP4_GPIO_IRQSTATUS2          0x0128
-#define OMAP4_GPIO_IRQENABLE2          0x012c
-#define OMAP4_GPIO_CTRL                        0x0130
-#define OMAP4_GPIO_OE                  0x0134
-#define OMAP4_GPIO_DATAIN              0x0138
-#define OMAP4_GPIO_DATAOUT             0x013c
-#define OMAP4_GPIO_LEVELDETECT0                0x0140
-#define OMAP4_GPIO_LEVELDETECT1                0x0144
-#define OMAP4_GPIO_RISINGDETECT                0x0148
-#define OMAP4_GPIO_FALLINGDETECT       0x014c
-#define OMAP4_GPIO_DEBOUNCENABLE       0x0150
-#define OMAP4_GPIO_DEBOUNCINGTIME      0x0154
-#define OMAP4_GPIO_CLEARIRQENABLE1     0x0160
-#define OMAP4_GPIO_SETIRQENABLE1       0x0164
-#define OMAP4_GPIO_CLEARWKUENA         0x0180
-#define OMAP4_GPIO_SETWKUENA           0x0184
-#define OMAP4_GPIO_CLEARDATAOUT                0x0190
-#define OMAP4_GPIO_SETDATAOUT          0x0194
-
-#define OMAP_MPUIO(nr)         (OMAP_MAX_GPIO_LINES + (nr))
-#define OMAP_GPIO_IS_MPUIO(nr) ((nr) >= OMAP_MAX_GPIO_LINES)
-
-struct omap_gpio_dev_attr {
-       int bank_width;         /* GPIO bank width */
-       bool dbck_flag;         /* dbck required or not - True for OMAP3&4 */
-};
-
-struct omap_gpio_reg_offs {
-       u16 revision;
-       u16 direction;
-       u16 datain;
-       u16 dataout;
-       u16 set_dataout;
-       u16 clr_dataout;
-       u16 irqstatus;
-       u16 irqstatus2;
-       u16 irqstatus_raw0;
-       u16 irqstatus_raw1;
-       u16 irqenable;
-       u16 irqenable2;
-       u16 set_irqenable;
-       u16 clr_irqenable;
-       u16 debounce;
-       u16 debounce_en;
-       u16 ctrl;
-       u16 wkup_en;
-       u16 leveldetect0;
-       u16 leveldetect1;
-       u16 risingdetect;
-       u16 fallingdetect;
-       u16 irqctrl;
-       u16 edgectrl1;
-       u16 edgectrl2;
-       u16 pinctrl;
-
-       bool irqenable_inv;
-};
-
-struct omap_gpio_platform_data {
-       int bank_type;
-       int bank_width;         /* GPIO bank width */
-       int bank_stride;        /* Only needed for omap1 MPUIO */
-       bool dbck_flag;         /* dbck required or not - True for OMAP3&4 */
-       bool loses_context;     /* whether the bank would ever lose context */
-       bool is_mpuio;          /* whether the bank is of type MPUIO */
-       u32 non_wakeup_gpios;
-
-       struct omap_gpio_reg_offs *regs;
-
-       /* Return context loss count due to PM states changing */
-       int (*get_context_loss_count)(struct device *dev);
-};
-
-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
index f37764a36072e4b5cbdd632e0cc6369f9de5e6fc..2e6e2597178c56cf59fd2d710e952db65252ff3a 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 eb3e4d555343bb921e71f0598ca53a37fe1a26f1..8b4e4f2da2f5456c1d05321a641e5e473214fd62 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 67fc5060183ea28f137f20862863e62cb99ccf74..1a68c1e5fe537a0b0b52c70521ef8672ad66a4ff 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 */
index 1a52725ffcf25ca682f80c9d4004a0ce5411cfa4..a531149823bbef3ff608606f45b544c5f633726e 100644 (file)
@@ -18,7 +18,7 @@
 #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 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 +69,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 +105,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__ */
diff --git a/arch/arm/plat-omap/include/plat/omap1510.h b/arch/arm/plat-omap/include/plat/omap1510.h
deleted file mode 100644 (file)
index d240046..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/* 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>
- *
- * 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_OMAP15XX_H
-#define __ASM_ARCH_OMAP15XX_H
-
-/*
- * ----------------------------------------------------------------------------
- * Base addresses
- * ----------------------------------------------------------------------------
- */
-
-/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
-
-#define OMAP1510_DSP_BASE      0xE0000000
-#define OMAP1510_DSP_SIZE      0x28000
-#define OMAP1510_DSP_START     0xE0000000
-
-#define OMAP1510_DSPREG_BASE   0xE1000000
-#define OMAP1510_DSPREG_SIZE   SZ_128K
-#define OMAP1510_DSPREG_START  0xE1000000
-
-#define OMAP1510_DSP_MMU_BASE  (0xfffed200)
-
-#endif /*  __ASM_ARCH_OMAP15XX_H */
-
diff --git a/arch/arm/plat-omap/include/plat/omap16xx.h b/arch/arm/plat-omap/include/plat/omap16xx.h
deleted file mode 100644 (file)
index e69e1d8..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-/* 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>
- *
- * 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_OMAP16XX_H
-#define __ASM_ARCH_OMAP16XX_H
-
-/*
- * ----------------------------------------------------------------------------
- * Base addresses
- * ----------------------------------------------------------------------------
- */
-
-/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
-
-#define OMAP16XX_DSP_BASE      0xE0000000
-#define OMAP16XX_DSP_SIZE      0x28000
-#define OMAP16XX_DSP_START     0xE0000000
-
-#define OMAP16XX_DSPREG_BASE   0xE1000000
-#define OMAP16XX_DSPREG_SIZE   SZ_128K
-#define OMAP16XX_DSPREG_START  0xE1000000
-
-#define OMAP16XX_SEC_BASE      0xFFFE4000
-#define OMAP16XX_SEC_DES       (OMAP16XX_SEC_BASE + 0x0000)
-#define OMAP16XX_SEC_SHA1MD5   (OMAP16XX_SEC_BASE + 0x0800)
-#define OMAP16XX_SEC_RNG       (OMAP16XX_SEC_BASE + 0x1000)
-
-/*
- * ---------------------------------------------------------------------------
- * Interrupts
- * ---------------------------------------------------------------------------
- */
-#define OMAP_IH2_0_BASE                (0xfffe0000)
-#define OMAP_IH2_1_BASE                (0xfffe0100)
-#define OMAP_IH2_2_BASE                (0xfffe0200)
-#define OMAP_IH2_3_BASE                (0xfffe0300)
-
-#define OMAP_IH2_0_ITR         (OMAP_IH2_0_BASE + 0x00)
-#define OMAP_IH2_0_MIR         (OMAP_IH2_0_BASE + 0x04)
-#define OMAP_IH2_0_SIR_IRQ     (OMAP_IH2_0_BASE + 0x10)
-#define OMAP_IH2_0_SIR_FIQ     (OMAP_IH2_0_BASE + 0x14)
-#define OMAP_IH2_0_CONTROL     (OMAP_IH2_0_BASE + 0x18)
-#define OMAP_IH2_0_ILR0                (OMAP_IH2_0_BASE + 0x1c)
-#define OMAP_IH2_0_ISR         (OMAP_IH2_0_BASE + 0x9c)
-
-#define OMAP_IH2_1_ITR         (OMAP_IH2_1_BASE + 0x00)
-#define OMAP_IH2_1_MIR         (OMAP_IH2_1_BASE + 0x04)
-#define OMAP_IH2_1_SIR_IRQ     (OMAP_IH2_1_BASE + 0x10)
-#define OMAP_IH2_1_SIR_FIQ     (OMAP_IH2_1_BASE + 0x14)
-#define OMAP_IH2_1_CONTROL     (OMAP_IH2_1_BASE + 0x18)
-#define OMAP_IH2_1_ILR1                (OMAP_IH2_1_BASE + 0x1c)
-#define OMAP_IH2_1_ISR         (OMAP_IH2_1_BASE + 0x9c)
-
-#define OMAP_IH2_2_ITR         (OMAP_IH2_2_BASE + 0x00)
-#define OMAP_IH2_2_MIR         (OMAP_IH2_2_BASE + 0x04)
-#define OMAP_IH2_2_SIR_IRQ     (OMAP_IH2_2_BASE + 0x10)
-#define OMAP_IH2_2_SIR_FIQ     (OMAP_IH2_2_BASE + 0x14)
-#define OMAP_IH2_2_CONTROL     (OMAP_IH2_2_BASE + 0x18)
-#define OMAP_IH2_2_ILR2                (OMAP_IH2_2_BASE + 0x1c)
-#define OMAP_IH2_2_ISR         (OMAP_IH2_2_BASE + 0x9c)
-
-#define OMAP_IH2_3_ITR         (OMAP_IH2_3_BASE + 0x00)
-#define OMAP_IH2_3_MIR         (OMAP_IH2_3_BASE + 0x04)
-#define OMAP_IH2_3_SIR_IRQ     (OMAP_IH2_3_BASE + 0x10)
-#define OMAP_IH2_3_SIR_FIQ     (OMAP_IH2_3_BASE + 0x14)
-#define OMAP_IH2_3_CONTROL     (OMAP_IH2_3_BASE + 0x18)
-#define OMAP_IH2_3_ILR3                (OMAP_IH2_3_BASE + 0x1c)
-#define OMAP_IH2_3_ISR         (OMAP_IH2_3_BASE + 0x9c)
-
-/*
- * ----------------------------------------------------------------------------
- * Clocks
- * ----------------------------------------------------------------------------
- */
-#define OMAP16XX_ARM_IDLECT3   (CLKGEN_REG_BASE + 0x24)
-
-/*
- * ----------------------------------------------------------------------------
- * Pin configuration registers
- * ----------------------------------------------------------------------------
- */
-#define OMAP16XX_CONF_VOLTAGE_VDDSHV6  (1 << 8)
-#define OMAP16XX_CONF_VOLTAGE_VDDSHV7  (1 << 9)
-#define OMAP16XX_CONF_VOLTAGE_VDDSHV8  (1 << 10)
-#define OMAP16XX_CONF_VOLTAGE_VDDSHV9  (1 << 11)
-#define OMAP16XX_SUBLVDS_CONF_VALID    (1 << 13)
-
-/*
- * ----------------------------------------------------------------------------
- * System control registers
- * ----------------------------------------------------------------------------
- */
-#define OMAP1610_RESET_CONTROL  0xfffe1140
-
-/*
- * ---------------------------------------------------------------------------
- * TIPB bus interface
- * ---------------------------------------------------------------------------
- */
-#define TIPB_SWITCH_BASE                (0xfffbc800)
-#define OMAP16XX_MMCSD2_SSW_MPU_CONF   (TIPB_SWITCH_BASE + 0x160)
-
-/* UART3 Registers Mapping through MPU bus */
-#define UART3_RHR               (OMAP1_UART3_BASE + 0)
-#define UART3_THR               (OMAP1_UART3_BASE + 0)
-#define UART3_DLL               (OMAP1_UART3_BASE + 0)
-#define UART3_IER               (OMAP1_UART3_BASE + 4)
-#define UART3_DLH               (OMAP1_UART3_BASE + 4)
-#define UART3_IIR               (OMAP1_UART3_BASE + 8)
-#define UART3_FCR               (OMAP1_UART3_BASE + 8)
-#define UART3_EFR               (OMAP1_UART3_BASE + 8)
-#define UART3_LCR               (OMAP1_UART3_BASE + 0x0C)
-#define UART3_MCR               (OMAP1_UART3_BASE + 0x10)
-#define UART3_XON1_ADDR1        (OMAP1_UART3_BASE + 0x10)
-#define UART3_XON2_ADDR2        (OMAP1_UART3_BASE + 0x14)
-#define UART3_LSR               (OMAP1_UART3_BASE + 0x14)
-#define UART3_TCR               (OMAP1_UART3_BASE + 0x18)
-#define UART3_MSR               (OMAP1_UART3_BASE + 0x18)
-#define UART3_XOFF1             (OMAP1_UART3_BASE + 0x18)
-#define UART3_XOFF2             (OMAP1_UART3_BASE + 0x1C)
-#define UART3_SPR               (OMAP1_UART3_BASE + 0x1C)
-#define UART3_TLR               (OMAP1_UART3_BASE + 0x1C)
-#define UART3_MDR1              (OMAP1_UART3_BASE + 0x20)
-#define UART3_MDR2              (OMAP1_UART3_BASE + 0x24)
-#define UART3_SFLSR             (OMAP1_UART3_BASE + 0x28)
-#define UART3_TXFLL             (OMAP1_UART3_BASE + 0x28)
-#define UART3_RESUME            (OMAP1_UART3_BASE + 0x2C)
-#define UART3_TXFLH             (OMAP1_UART3_BASE + 0x2C)
-#define UART3_SFREGL            (OMAP1_UART3_BASE + 0x30)
-#define UART3_RXFLL             (OMAP1_UART3_BASE + 0x30)
-#define UART3_SFREGH            (OMAP1_UART3_BASE + 0x34)
-#define UART3_RXFLH             (OMAP1_UART3_BASE + 0x34)
-#define UART3_BLR               (OMAP1_UART3_BASE + 0x38)
-#define UART3_ACREG             (OMAP1_UART3_BASE + 0x3C)
-#define UART3_DIV16             (OMAP1_UART3_BASE + 0x3C)
-#define UART3_SCR               (OMAP1_UART3_BASE + 0x40)
-#define UART3_SSR               (OMAP1_UART3_BASE + 0x44)
-#define UART3_EBLR              (OMAP1_UART3_BASE + 0x48)
-#define UART3_OSC_12M_SEL       (OMAP1_UART3_BASE + 0x4C)
-#define UART3_MVR               (OMAP1_UART3_BASE + 0x50)
-
-/*
- * ---------------------------------------------------------------------------
- * Watchdog timer
- * ---------------------------------------------------------------------------
- */
-
-/* 32-bit Watchdog timer in OMAP 16XX */
-#define OMAP_16XX_WATCHDOG_BASE        (0xfffeb000)
-#define OMAP_16XX_WIDR         (OMAP_16XX_WATCHDOG_BASE + 0x00)
-#define OMAP_16XX_WD_SYSCONFIG (OMAP_16XX_WATCHDOG_BASE + 0x10)
-#define OMAP_16XX_WD_SYSSTATUS (OMAP_16XX_WATCHDOG_BASE + 0x14)
-#define OMAP_16XX_WCLR         (OMAP_16XX_WATCHDOG_BASE + 0x24)
-#define OMAP_16XX_WCRR         (OMAP_16XX_WATCHDOG_BASE + 0x28)
-#define OMAP_16XX_WLDR         (OMAP_16XX_WATCHDOG_BASE + 0x2c)
-#define OMAP_16XX_WTGR         (OMAP_16XX_WATCHDOG_BASE + 0x30)
-#define OMAP_16XX_WWPS         (OMAP_16XX_WATCHDOG_BASE + 0x34)
-#define OMAP_16XX_WSPR         (OMAP_16XX_WATCHDOG_BASE + 0x48)
-
-#define WCLR_PRE_SHIFT         5
-#define WCLR_PTV_SHIFT         2
-
-#define WWPS_W_PEND_WSPR       (1 << 4)
-#define WWPS_W_PEND_WTGR       (1 << 3)
-#define WWPS_W_PEND_WLDR       (1 << 2)
-#define WWPS_W_PEND_WCRR       (1 << 1)
-#define WWPS_W_PEND_WCLR       (1 << 0)
-
-#define WSPR_ENABLE_0          (0x0000bbbb)
-#define WSPR_ENABLE_1          (0x00004444)
-#define WSPR_DISABLE_0         (0x0000aaaa)
-#define WSPR_DISABLE_1         (0x00005555)
-
-#define OMAP16XX_DSP_MMU_BASE  (0xfffed200)
-#define OMAP16XX_MAILBOX_BASE  (0xfffcf000)
-
-#endif /*  __ASM_ARCH_OMAP16XX_H */
-
diff --git a/arch/arm/plat-omap/include/plat/omap24xx.h b/arch/arm/plat-omap/include/plat/omap24xx.h
deleted file mode 100644 (file)
index 92df9e2..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * arch/arm/plat-omap/include/mach/omap24xx.h
- *
- * This file contains the processor specific definitions
- * of the TI OMAP24XX.
- *
- * Copyright (C) 2007 Texas Instruments.
- * Copyright (C) 2007 Nokia 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-
-#ifndef __ASM_ARCH_OMAP2_H
-#define __ASM_ARCH_OMAP2_H
-
-/*
- * Please place only base defines here and put the rest in device
- * specific headers. Note also that some of these defines are needed
- * for omap1 to compile without adding ifdefs.
- */
-
-#define L4_24XX_BASE           0x48000000
-#define L4_WK_243X_BASE                0x49000000
-#define L3_24XX_BASE           0x68000000
-
-/* interrupt controller */
-#define OMAP24XX_IC_BASE       (L4_24XX_BASE + 0xfe000)
-#define OMAP24XX_IVA_INTC_BASE 0x40000000
-
-#define OMAP242X_CTRL_BASE     L4_24XX_BASE
-#define OMAP2420_32KSYNCT_BASE (L4_24XX_BASE + 0x4000)
-#define OMAP2420_PRCM_BASE     (L4_24XX_BASE + 0x8000)
-#define OMAP2420_CM_BASE       (L4_24XX_BASE + 0x8000)
-#define OMAP2420_PRM_BASE      OMAP2420_CM_BASE
-#define OMAP2420_SDRC_BASE     (L3_24XX_BASE + 0x9000)
-#define OMAP2420_SMS_BASE      0x68008000
-#define OMAP2420_GPMC_BASE     0x6800a000
-
-#define OMAP2430_32KSYNCT_BASE (L4_WK_243X_BASE + 0x20000)
-#define OMAP2430_PRCM_BASE     (L4_WK_243X_BASE + 0x6000)
-#define OMAP2430_CM_BASE       (L4_WK_243X_BASE + 0x6000)
-#define OMAP2430_PRM_BASE      OMAP2430_CM_BASE
-
-#define OMAP243X_SMS_BASE      0x6C000000
-#define OMAP243X_SDRC_BASE     0x6D000000
-#define OMAP243X_GPMC_BASE     0x6E000000
-#define OMAP243X_SCM_BASE      (L4_WK_243X_BASE + 0x2000)
-#define OMAP243X_CTRL_BASE     OMAP243X_SCM_BASE
-#define OMAP243X_HS_BASE       (L4_24XX_BASE + 0x000ac000)
-
-/* DSP SS */
-#define OMAP2420_DSP_BASE      0x58000000
-#define OMAP2420_DSP_MEM_BASE  (OMAP2420_DSP_BASE + 0x0)
-#define OMAP2420_DSP_IPI_BASE  (OMAP2420_DSP_BASE + 0x1000000)
-#define OMAP2420_DSP_MMU_BASE  (OMAP2420_DSP_BASE + 0x2000000)
-
-#define OMAP243X_DSP_BASE      0x5C000000
-#define OMAP243X_DSP_MEM_BASE  (OMAP243X_DSP_BASE + 0x0)
-#define OMAP243X_DSP_MMU_BASE  (OMAP243X_DSP_BASE + 0x1000000)
-
-/* Mailbox */
-#define OMAP24XX_MAILBOX_BASE  (L4_24XX_BASE + 0x94000)
-
-/* Camera */
-#define OMAP24XX_CAMERA_BASE   (L4_24XX_BASE + 0x52000)
-
-/* Security */
-#define OMAP24XX_SEC_BASE      (L4_24XX_BASE + 0xA0000)
-#define OMAP24XX_SEC_RNG_BASE  (OMAP24XX_SEC_BASE + 0x0000)
-#define OMAP24XX_SEC_DES_BASE  (OMAP24XX_SEC_BASE + 0x2000)
-#define OMAP24XX_SEC_SHA1MD5_BASE (OMAP24XX_SEC_BASE + 0x4000)
-#define OMAP24XX_SEC_AES_BASE  (OMAP24XX_SEC_BASE + 0x6000)
-#define OMAP24XX_SEC_PKA_BASE  (OMAP24XX_SEC_BASE + 0x8000)
-
-#endif /* __ASM_ARCH_OMAP2_H */
-
diff --git a/arch/arm/plat-omap/include/plat/omap34xx.h b/arch/arm/plat-omap/include/plat/omap34xx.h
deleted file mode 100644 (file)
index 0d818ac..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * arch/arm/plat-omap/include/mach/omap34xx.h
- *
- * This file contains the processor specific definitions of the TI OMAP34XX.
- *
- * Copyright (C) 2007 Texas Instruments.
- * Copyright (C) 2007 Nokia 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __ASM_ARCH_OMAP3_H
-#define __ASM_ARCH_OMAP3_H
-
-/*
- * Please place only base defines here and put the rest in device
- * specific headers.
- */
-
-#define L4_34XX_BASE           0x48000000
-#define L4_WK_34XX_BASE                0x48300000
-#define L4_PER_34XX_BASE       0x49000000
-#define L4_EMU_34XX_BASE       0x54000000
-#define L3_34XX_BASE           0x68000000
-
-#define L4_WK_AM33XX_BASE      0x44C00000
-
-#define OMAP3430_32KSYNCT_BASE 0x48320000
-#define OMAP3430_CM_BASE       0x48004800
-#define OMAP3430_PRM_BASE      0x48306800
-#define OMAP343X_SMS_BASE      0x6C000000
-#define OMAP343X_SDRC_BASE     0x6D000000
-#define OMAP34XX_GPMC_BASE     0x6E000000
-#define OMAP343X_SCM_BASE      0x48002000
-#define OMAP343X_CTRL_BASE     OMAP343X_SCM_BASE
-
-#define OMAP34XX_IC_BASE       0x48200000
-
-#define OMAP3430_ISP_BASE              (L4_34XX_BASE + 0xBC000)
-#define OMAP3430_ISP_CBUFF_BASE                (OMAP3430_ISP_BASE + 0x0100)
-#define OMAP3430_ISP_CCP2_BASE         (OMAP3430_ISP_BASE + 0x0400)
-#define OMAP3430_ISP_CCDC_BASE         (OMAP3430_ISP_BASE + 0x0600)
-#define OMAP3430_ISP_HIST_BASE         (OMAP3430_ISP_BASE + 0x0A00)
-#define OMAP3430_ISP_H3A_BASE          (OMAP3430_ISP_BASE + 0x0C00)
-#define OMAP3430_ISP_PREV_BASE         (OMAP3430_ISP_BASE + 0x0E00)
-#define OMAP3430_ISP_RESZ_BASE         (OMAP3430_ISP_BASE + 0x1000)
-#define OMAP3430_ISP_SBL_BASE          (OMAP3430_ISP_BASE + 0x1200)
-#define OMAP3430_ISP_MMU_BASE          (OMAP3430_ISP_BASE + 0x1400)
-#define OMAP3430_ISP_CSI2A_REGS1_BASE  (OMAP3430_ISP_BASE + 0x1800)
-#define OMAP3430_ISP_CSIPHY2_BASE      (OMAP3430_ISP_BASE + 0x1970)
-#define OMAP3630_ISP_CSI2A_REGS2_BASE  (OMAP3430_ISP_BASE + 0x19C0)
-#define OMAP3630_ISP_CSI2C_REGS1_BASE  (OMAP3430_ISP_BASE + 0x1C00)
-#define OMAP3630_ISP_CSIPHY1_BASE      (OMAP3430_ISP_BASE + 0x1D70)
-#define OMAP3630_ISP_CSI2C_REGS2_BASE  (OMAP3430_ISP_BASE + 0x1DC0)
-
-#define OMAP3430_ISP_END               (OMAP3430_ISP_BASE         + 0x06F)
-#define OMAP3430_ISP_CBUFF_END         (OMAP3430_ISP_CBUFF_BASE   + 0x077)
-#define OMAP3430_ISP_CCP2_END          (OMAP3430_ISP_CCP2_BASE    + 0x1EF)
-#define OMAP3430_ISP_CCDC_END          (OMAP3430_ISP_CCDC_BASE    + 0x0A7)
-#define OMAP3430_ISP_HIST_END          (OMAP3430_ISP_HIST_BASE    + 0x047)
-#define OMAP3430_ISP_H3A_END           (OMAP3430_ISP_H3A_BASE     + 0x05F)
-#define OMAP3430_ISP_PREV_END          (OMAP3430_ISP_PREV_BASE    + 0x09F)
-#define OMAP3430_ISP_RESZ_END          (OMAP3430_ISP_RESZ_BASE    + 0x0AB)
-#define OMAP3430_ISP_SBL_END           (OMAP3430_ISP_SBL_BASE     + 0x0FB)
-#define OMAP3430_ISP_MMU_END           (OMAP3430_ISP_MMU_BASE     + 0x06F)
-#define OMAP3430_ISP_CSI2A_REGS1_END   (OMAP3430_ISP_CSI2A_REGS1_BASE + 0x16F)
-#define OMAP3430_ISP_CSIPHY2_END       (OMAP3430_ISP_CSIPHY2_BASE + 0x00B)
-#define OMAP3630_ISP_CSI2A_REGS2_END   (OMAP3630_ISP_CSI2A_REGS2_BASE + 0x3F)
-#define OMAP3630_ISP_CSI2C_REGS1_END   (OMAP3630_ISP_CSI2C_REGS1_BASE + 0x16F)
-#define OMAP3630_ISP_CSIPHY1_END       (OMAP3630_ISP_CSIPHY1_BASE + 0x00B)
-#define OMAP3630_ISP_CSI2C_REGS2_END   (OMAP3630_ISP_CSI2C_REGS2_BASE + 0x3F)
-
-#define OMAP34XX_HSUSB_OTG_BASE        (L4_34XX_BASE + 0xAB000)
-#define OMAP34XX_USBTLL_BASE   (L4_34XX_BASE + 0x62000)
-#define OMAP34XX_UHH_CONFIG_BASE       (L4_34XX_BASE + 0x64000)
-#define OMAP34XX_OHCI_BASE     (L4_34XX_BASE + 0x64400)
-#define OMAP34XX_EHCI_BASE     (L4_34XX_BASE + 0x64800)
-#define OMAP34XX_SR1_BASE      0x480C9000
-#define OMAP34XX_SR2_BASE      0x480CB000
-
-#define OMAP34XX_MAILBOX_BASE          (L4_34XX_BASE + 0x94000)
-
-/* Security */
-#define OMAP34XX_SEC_BASE      (L4_34XX_BASE + 0xA0000)
-#define OMAP34XX_SEC_SHA1MD5_BASE      (OMAP34XX_SEC_BASE + 0x23000)
-#define OMAP34XX_SEC_AES_BASE  (OMAP34XX_SEC_BASE + 0x25000)
-
-#endif /* __ASM_ARCH_OMAP3_H */
-
index 8ad0a377a54b5c97a5bcff7653812f84c24755b9..20de0d5a7e77f42a5c967993e8fa68ca0e874455 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
diff --git a/arch/arm/plat-omap/include/plat/omap44xx.h b/arch/arm/plat-omap/include/plat/omap44xx.h
deleted file mode 100644 (file)
index c0d478e..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*:
- * Address mappings and base address for OMAP4 interconnects
- * and peripherals.
- *
- * Copyright (C) 2009 Texas Instruments
- *
- * Author: 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 version 2 as
- * published by the Free Software Foundation.
- */
-#ifndef __ASM_ARCH_OMAP44XX_H
-#define __ASM_ARCH_OMAP44XX_H
-
-/*
- * Please place only base defines here and put the rest in device
- * specific headers.
- */
-#define L4_44XX_BASE                   0x4a000000
-#define L4_WK_44XX_BASE                        0x4a300000
-#define L4_PER_44XX_BASE               0x48000000
-#define L4_EMU_44XX_BASE               0x54000000
-#define L3_44XX_BASE                   0x44000000
-#define OMAP44XX_EMIF1_BASE            0x4c000000
-#define OMAP44XX_EMIF2_BASE            0x4d000000
-#define OMAP44XX_DMM_BASE              0x4e000000
-#define OMAP4430_32KSYNCT_BASE         0x4a304000
-#define OMAP4430_CM1_BASE              0x4a004000
-#define OMAP4430_CM_BASE               OMAP4430_CM1_BASE
-#define OMAP4430_CM2_BASE              0x4a008000
-#define OMAP4430_PRM_BASE              0x4a306000
-#define OMAP4430_PRCM_MPU_BASE         0x48243000
-#define OMAP44XX_GPMC_BASE             0x50000000
-#define OMAP443X_SCM_BASE              0x4a002000
-#define OMAP443X_CTRL_BASE             0x4a100000
-#define OMAP44XX_IC_BASE               0x48200000
-#define OMAP44XX_IVA_INTC_BASE         0x40000000
-#define IRQ_SIR_IRQ                    0x0040
-#define OMAP44XX_GIC_DIST_BASE         0x48241000
-#define OMAP44XX_GIC_CPU_BASE          0x48240100
-#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)
-#define OMAP44XX_HSUSB_OTG_BASE                (L4_44XX_BASE + 0xAB000)
-
-#define OMAP4_MMU1_BASE                        0x55082000
-#define OMAP4_MMU2_BASE                        0x4A066000
-
-#define OMAP44XX_USBTLL_BASE           (L4_44XX_BASE + 0x62000)
-#define OMAP44XX_UHH_CONFIG_BASE       (L4_44XX_BASE + 0x64000)
-#define OMAP44XX_HSUSB_OHCI_BASE       (L4_44XX_BASE + 0x64800)
-#define OMAP44XX_HSUSB_EHCI_BASE       (L4_44XX_BASE + 0x64C00)
-
-#endif /* __ASM_ARCH_OMAP44XX_H */
-
diff --git a/arch/arm/plat-omap/include/plat/omap54xx.h b/arch/arm/plat-omap/include/plat/omap54xx.h
deleted file mode 100644 (file)
index a2582bb..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*:
- * Address mappings and base address for OMAP5 interconnects
- * and peripherals.
- *
- * Copyright (C) 2012 Texas Instruments
- *     Santosh Shilimkar <santosh.shilimkar@ti.com>
- *     Sricharan <r.sricharan@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.
- */
-#ifndef __ASM_SOC_OMAP54XX_H
-#define __ASM_SOC_OMAP54XX_H
-
-/*
- * Please place only base defines here and put the rest in device
- * specific headers.
- */
-#define L4_54XX_BASE                   0x4a000000
-#define L4_WK_54XX_BASE                        0x4ae00000
-#define L4_PER_54XX_BASE               0x48000000
-#define L3_54XX_BASE                   0x44000000
-#define OMAP54XX_32KSYNCT_BASE         0x4ae04000
-#define OMAP54XX_CM_CORE_AON_BASE      0x4a004000
-#define OMAP54XX_CM_CORE_BASE          0x4a008000
-#define OMAP54XX_PRM_BASE              0x4ae06000
-#define OMAP54XX_PRCM_MPU_BASE         0x48243000
-#define OMAP54XX_SCM_BASE              0x4a002000
-#define OMAP54XX_CTRL_BASE             0x4a002800
-
-#endif /* __ASM_SOC_OMAP555554XX_H */
diff --git a/arch/arm/plat-omap/include/plat/omap7xx.h b/arch/arm/plat-omap/include/plat/omap7xx.h
deleted file mode 100644 (file)
index 48e4757..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-/* 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>
- * Adapted for omap850 by Zebediah C. McClure <zmc@lurian.net>
- * Adapted for omap7xx by Alistair Buxton <a.j.buxton@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * THIS 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_OMAP7XX_H
-#define __ASM_ARCH_OMAP7XX_H
-
-/*
- * ----------------------------------------------------------------------------
- * Base addresses
- * ----------------------------------------------------------------------------
- */
-
-/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
-
-#define OMAP7XX_DSP_BASE       0xE0000000
-#define OMAP7XX_DSP_SIZE       0x50000
-#define OMAP7XX_DSP_START      0xE0000000
-
-#define OMAP7XX_DSPREG_BASE    0xE1000000
-#define OMAP7XX_DSPREG_SIZE    SZ_128K
-#define OMAP7XX_DSPREG_START   0xE1000000
-
-#define OMAP7XX_SPI1_BASE      0xfffc0800
-#define OMAP7XX_SPI2_BASE      0xfffc1000
-
-/*
- * ----------------------------------------------------------------------------
- * OMAP7XX specific configuration registers
- * ----------------------------------------------------------------------------
- */
-#define OMAP7XX_CONFIG_BASE    0xfffe1000
-#define OMAP7XX_IO_CONF_0      0xfffe1070
-#define OMAP7XX_IO_CONF_1      0xfffe1074
-#define OMAP7XX_IO_CONF_2      0xfffe1078
-#define OMAP7XX_IO_CONF_3      0xfffe107c
-#define OMAP7XX_IO_CONF_4      0xfffe1080
-#define OMAP7XX_IO_CONF_5      0xfffe1084
-#define OMAP7XX_IO_CONF_6      0xfffe1088
-#define OMAP7XX_IO_CONF_7      0xfffe108c
-#define OMAP7XX_IO_CONF_8      0xfffe1090
-#define OMAP7XX_IO_CONF_9      0xfffe1094
-#define OMAP7XX_IO_CONF_10     0xfffe1098
-#define OMAP7XX_IO_CONF_11     0xfffe109c
-#define OMAP7XX_IO_CONF_12     0xfffe10a0
-#define OMAP7XX_IO_CONF_13     0xfffe10a4
-
-#define OMAP7XX_MODE_1         0xfffe1010
-#define OMAP7XX_MODE_2         0xfffe1014
-
-/* CSMI specials: in terms of base + offset */
-#define OMAP7XX_MODE2_OFFSET   0x14
-
-/*
- * ----------------------------------------------------------------------------
- * OMAP7XX traffic controller configuration registers
- * ----------------------------------------------------------------------------
- */
-#define OMAP7XX_FLASH_CFG_0    0xfffecc10
-#define OMAP7XX_FLASH_ACFG_0   0xfffecc50
-#define OMAP7XX_FLASH_CFG_1    0xfffecc14
-#define OMAP7XX_FLASH_ACFG_1   0xfffecc54
-
-/*
- * ----------------------------------------------------------------------------
- * OMAP7XX DSP control registers
- * ----------------------------------------------------------------------------
- */
-#define OMAP7XX_ICR_BASE       0xfffbb800
-#define OMAP7XX_DSP_M_CTL      0xfffbb804
-#define OMAP7XX_DSP_MMU_BASE   0xfffed200
-
-/*
- * ----------------------------------------------------------------------------
- * OMAP7XX PCC_UPLD configuration registers
- * ----------------------------------------------------------------------------
- */
-#define OMAP7XX_PCC_UPLD_CTRL_BASE     (0xfffe0900)
-#define OMAP7XX_PCC_UPLD_CTRL          (OMAP7XX_PCC_UPLD_CTRL_BASE + 0x00)
-
-#endif /*  __ASM_ARCH_OMAP7XX_H */
-
index 6132972aff372e399f1595f9e8e398f06a5b5fa8..9b9646c3673d8edcc9b93dffa318a2bf57180876 100644 (file)
@@ -658,6 +658,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/ti81xx.h b/arch/arm/plat-omap/include/plat/ti81xx.h
deleted file mode 100644 (file)
index 8f9843f..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * This file contains the address data for various TI81XX modules.
- *
- * Copyright (C) 2010 Texas Instruments, Inc. - 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 as
- * published by the Free Software Foundation version 2.
- *
- * This program is distributed "as is" WITHOUT ANY WARRANTY of any
- * kind, whether express or implied; without even the implied warranty
- * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- */
-
-#ifndef __ASM_ARCH_TI81XX_H
-#define __ASM_ARCH_TI81XX_H
-
-#define L4_SLOW_TI81XX_BASE    0x48000000
-
-#define TI81XX_SCM_BASE                0x48140000
-#define TI81XX_CTRL_BASE       TI81XX_SCM_BASE
-#define TI81XX_PRCM_BASE       0x48180000
-
-#define TI81XX_ARM_INTC_BASE   0x48200000
-
-#endif /* __ASM_ARCH_TI81XX_H */
index 548a4c8d63df4b5d072ee560d901d39137941d47..bd20588c356b47703cc18aa0a78f29094126813b 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
 
index 766181cb5c95c277b8495966835571059a36dda5..d861aa73299db99e2adf9ed0d4ff8fe817ae75bc 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"
index c34785dca92b8c7ce590c2460f6c9ddab4b65f30..ec536e4e36c9fcbd71646c34c7cd5914f654f695 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 8db25e8069471f03f07335153bf8137c05ef41b4..16d170f53bfd0d521a15281b4565d3fae9f1ad44 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 138b2216b4f8ba396be6ae788e9a9b3215a13630..569f41bdcc466529501b4cbeb8ad4133e86e8205 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 c48194c3073b95a2ccdcee6b1b0947913d996587..b2d4f492d782fc1cfee3e1d9cf7a5c53a86ba9c5 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 47341aa208f2b417ac2c31aabc292fadcbf008ab..88238638aee67a7c6bf84cdc23756806c16a5d77 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 bbaf2c59830ac3561c432d8ac23d6f64bf62dd79..457475f98414392ece09be3dcfbf0578c31f1215 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 f9726f6afdf1f00432ca627820f61ab56f6c109c..2cd3d3a3400b483290075843d8e538da17c51986 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 12172a6a95c440467666d1599f13bab4fe45253f..0bc8a6a6a14850744d27788b9850ddf9bacac99f 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 1d82d5838f0c38c416947d7f95b17d204d0a93b1..164544afd6809b1c1287c5d3fb02c99a29de7ab6 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 0a484b4a1b02bdabfd231a2ed21b5446ccd95642..3f57d5de395723e03cf6b6c4148760d3ca043240 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 46b77ede84c01cb2b103b3256e2fab39bf16d889..af98f6d6509bfa29dece7ca9b853ef3e22cc3c2c 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 ae05618261373226d758192a03cda490581939a6..2e1662777661ca59ec652860ca2a2fccb5596266 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 e6efd77668f0fb5ccab3a917629b07134885ee73..64fbce30c50299f66fa98293611a01d042b0b0a9 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 94256fe7bf36de35556421d2a1d04ace98b3e59c..f030880bc9bb40bdf64574fcd14de5a62d2a9736 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 */
@@ -428,8 +429,6 @@ no_irqs:
        twl_gpiochip.dev = &pdev->dev;
 
        if (pdata) {
-               twl_gpiochip.base = pdata->gpio_base;
-
                /*
                 * NOTE:  boards may waste power if they don't set pullups
                 * and pulldowns correctly ... default for non-ULPI pins is
@@ -461,15 +460,21 @@ no_irqs:
                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 +486,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 c50fa75416f81a966ae81e36c8f1f2ba25a8f161..b4b65af8612a3f03a79ea19422873cd777f39b76 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 a0222db4dc86953f94e2cd938bf142121e1567c5..2bda5f0b9c6ec8cd6e3b281dbc0fc1ccaf2bdf4d 100644 (file)
 #include <linux/mutex.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
-#include <asm/gpio.h>
+#include <linux/gpio.h>
+#include <linux/platform_data/gpio-omap.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>
 
 #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 38c4bd87b2c98a2b0bfc45692823e8d62c8ca1b3..c679867c2ccd3f37682ef75def8481588dfbec9a 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 a6d9fd2858f74d2b6690cfcf9c6edc832f641bb2..67abf3ff45e812eec6ce416a917cacec5a650b39 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 7bc50670d7d9fd3cb5c3d4decbf0e32ca86296ea..b817809f763cc4867a52f849418919f0783228c0 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 88cf9d952631719293b48093459f9e74ac7cd762..409da0f8e5cfdb92fa0347bd3b4a6f4cee56cfa3 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 1c347633e663b65b1acb561ad6c2e00a868920c2..43e61fe5df50f9b07150c1dcd2442f8607afe882 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 1c32afed28aad0ade45943e6b20a6b7c22531e93..f462ff226c8d2df8bf8908223935b1151c1e09eb 100644 (file)
@@ -46,6 +46,8 @@
 #include <linux/i2c.h>
 #include <linux/i2c/twl.h>
 
+#include <plat/cpu.h>
+
 #include "twl-core.h"
 
 /*
index 1dcb9ae1905a0853d45795082561f61a0fb56a15..01e2b0d7e59043cfcf652090b5c328a789dd9383 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 b7eb545394b1c0c2e3d01aa50d29829af90619e6..4999b34b7a6015c7f7cd66347a26037812100553 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 5a2cbfac66d23b3197ea548df65b59c8b5f2bbcf..d2339ea378152070ce8496e25f1dc15f0cbe9f14 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 a5999a74496af218c540959ee757b7c1ad3f1365..87c0293a1eef9370f822c348c7131f24f791bfc0 100644 (file)
@@ -33,7 +33,6 @@
 #include <asm/io.h>
 #include <asm/irq.h>
 
-#include <plat/board.h>
 #include <plat/mmc.h>
 #include <asm/gpio.h>
 #include <plat/dma.h>
index 3a09f93cc3b6f846a2b4cd327a7fd2a4524e31bc..f871b31ece5a2604c0c2031f543b12cadb7153f0 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 861ca8f7e47d2d62ff0b3929100117f0f7036543..78a524b49357ba81214702645d3c29f0941c4b47 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/hardware.h>
+
 /*
  * MTD structure for E3 (Delta)
  */
index ac4fd756eda375ab40f873b9f29bcaad0a5aeea0..27293e328517b22d04eb8edff06a24f60f3ccfa6 100644 (file)
 #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;
@@ -140,6 +153,63 @@ struct omap_nand_info {
 #endif
 };
 
+/**
+ * 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
@@ -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 398a827838480a41b4dbd71d4df4ed4b2a9d6e93..9d49b1f4ff53d2ada6eca04227bfb5f86f08028b 100644 (file)
 #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 b5ba3084c7fc056db06cc07f1e19b1aae1f71c7a..3e5519a0acc7ebcccb897ed3719b8506a3b585ba 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 3352b2443e58eb1ca0a45856c628850c08092be6..30087ca23a0fc7e6c33c75fcb80f020aae42186c 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 62f30b46fa42d26544f20e3158e964eccaa05da4..605a4baa9b7b89083e27c5a5d8b76ef938959dd4 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 5d6de380e42ba87526cdfa2b87f658431223be86..352f96180bc71f848464b6f9a9a5ad914d92004d 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 e9c32274df3fd5fcd679f67db9d67a5b4b61dc2b..1631eeaf440e5bf29b33463ba5c65cb2d6da49de 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 44efc6e202afdfeb2f9cd98d6305cb517ad78dd8..d4957b4edb62850d8414c449eed8c31a62969355 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 6c0116d48c74e386ff2de99d9cc86076c69b6bff..9ffb6d5f17aa0523473215db57edeccda1391a70 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 0792c85baafebdefcad5888423ff5b0bc19bee35..30ec09e3d037c7c25cfb382fd89d7c1c742f038a 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 edfc0fd73dc682753ab3b1ac09c43fc8b0509de8..7e60f3d2f3f9cf27de4e5c4c4ae9d743503a68ce 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 1928f3458d10f197bb15b7a75da7d685b33da4e1..482ee028f842032337186c33775471103e61b969 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 9b0d716960394a21c69f22ea74a1ed33958de62e..a3996a1c63459a67d66e0d4d2fb63f6b14f0ad13 100644 (file)
@@ -53,7 +53,8 @@
 #include <asm/mach-types.h>
 
 #include <plat/mux.h>
-#include <plat/omap7xx.h>      /* OMAP7XX_IO_CONF registers */
+
+#include <mach/omap7xx.h>      /* OMAP7XX_IO_CONF registers */
 
 
 /* FIXME address is now a platform device resource,
index fd0e30132ca247565dc05993ed79749100cd9d6a..a68d981c259fe6eb517d85df0667f7d9cad7c96a 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 8a362f7af379b4a2cfc6935f50d5a0a5db082fe3..c90de969be8fc167d1677c95457db20b3d230c9a 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 614271f9b99f8a86d3b927445ed6eb9b79919904..55d68b5ad1650d18fa3cf2fb2a5fe60f2f3536e4 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 870f934f4f3bee4002e0400ba77afc96e155cc23..453ef748bf45c3460162245eeecdcd05da832520 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 6cc4358f68c12ad2c779c7837207ce875968cf40..42d0a2581a87d9fae2968965f51d488330264c96 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 61fc74fe17473d56e2f2fe18bca2dee83dd27bac..02b7d3a09696cc6683c51fb9d02866d1ce75999b 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 e61cabdd69df36d56ea0c0cd27fcaeadc488f8de..0a6a0bc1b598caab2ca0019af8035428d5726cfd 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 4813684cb634ed2c7cf5fae1f0dc4b946426a099..4ab936b7aac66d342f726b37d58844462fbc142d 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 2d691eb7c40aa28f30602834902cc48fc1c52dad..7f80f15681cd3fa6fe743c01def27bb63ec59bff 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 d56788c83974e840f7e2aa469da2b993806fb99d..cab5c7adf8e84314e9ee515465a0db07bb1687e5 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 6f5bc49c441fa5c806d316c851f376c20914ad4f..0083bc1f63f43a37c8cc5f531da88f6a24729952 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 59c135dd5d2069ecee49e21480e47e52359fec46..3396eb9d57a374770f22dd956d06fa3382196f66 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 f8b5fa0093a3bf3a9f74c3f4b7662a05d89ee547..160f0ad9589d2a17071b9de8f3e6739a022b843f 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 e1235accab740b4bca4eb01c28b0ed76e170ea93..d7492e18360768c683c86b4359c6173d8ae1310f 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 324467d28a5497bcca18b2f52d31943d2747f795..56e616b9109a4963eb2d78bcfdb7eed91b973f8e 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 90cc680c4f0e7e330f9daa201cb0b30fd2be8aab..cfda47dabd281a9704eb182f1b19cbe65eed15c1 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 c43b683b6eb811babdb7cbc1a1c6bc75eb7ae413..3e210a430fb38585875a500f971887c4ee7759df 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 5c6c31459a2f6618cb7cf9d83c7100cf1a6d86ea..1e6405070ce649e356b24d272a824e9eda737159 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 ee1c268f5f9d6582da5b0eeb5121ada945fcd800..8c0b7b42319c44d7038892d0026582797acad95a 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 e7592f9037daca81455e9b94d7c31d62fdc5c934..b917c942495474dd91c3f600979537a396e6897b 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 5505ffc91da4b5780b33af2cac624ea8f696f5e4..2bace847eb3973010f45848b48c8d28da351fd6b 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 777d5f9cf6cc13e4d91c3ec175621aa4c16d2456..9700d34b20a3182794d5f6a4ab5eef8ed050321d 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 3ed20e435e59bad6a5f150a1c3e32bcca83fc7b3..66c38a3f74cebdbaaefc192e2a923827c050d63e 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 8123f784bcdacf3bf653fc7c2c1c57ba0540609f..d4e0b07cb130fe541f9f98a9206a80a328a10566 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)
@@ -3197,29 +3202,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 f9719d167c8d74f3159d995b09899bc52eab8294..0c5e908df0b55cbc8fa535b5efc77bf496b12ad7 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 b0ce8c56f1a4dcdb8ac077888ed3973756b8f2e6..857498312a9a84146b6c4c3493c224491fc1213d 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 f574eef3075f987b41784c635400f970947e9480..c3b2ec0c8c0b7f3a6749f41feedb38fe0af58ac2 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 d8c0ffbfa6e39b53bafaef22f2d090e2739613e9..097dff9c08ad9e4ebec835f20800e6d118931bd0 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 c13438c930129a0b4e736fd67630a1ef9338345b..8f1dd2cc00a8de79ac9538248271d2be376336aa 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 28e7c7cce8935acc8257fafaff86121fa55bf6dd..fdab80a4e063f3c9e356b145b9d861dc700e0d2b 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)
@@ -4178,6 +4232,25 @@ static struct pci_device_id serial_pci_tbl[] = {
                PCI_ANY_ID, PCI_ANY_ID, 0, 0,
                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 a2f236510ff1cd3f7fc92524f6096dc8678946f0..fde5aa60d51e92391dfdb996a7065d25d4f12c00 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 29b695d041ecd45cdfe18914b8c02d10ff7f79a5..b7d48b346393f08e2a44c88fa0e2c99e3a9c652b 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 4720b4ba096a5d7b2efc6cca8aca82dd75c127e2..26907cf25744f1b5295716bf792cc42cdb9fb069 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 7257c5d898ae2d36da427c3f6a9e225f1a0741ae..ce88667cfd179ddbfb8cabcf4749112decafe316 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 1f0330915d5a014dc9fb0cae1e66a631a703d0df..15d80b9fb30346e53e123c3739fb7ee185a0b623 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 0d91a540bf11c7aa9c76187fae0769e1f6e4c5a4..22317dd16474b05b04a5afe9200b455180a6b5af 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 d3553b5d3fcabd851d6cce4b6eab6eb6bca80cbc..cede938766492ab220e28bfdf4491844439f723d 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 bd97db23985bbc4ae6db1b666ff1900f09afb97d..9242d56ba2670d4aebc21749d9003c4d42986a35 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 80b6b1b1f7257d3b1da80f1b58523e7465bdb36b..35ee6a2c6877ef45a599351ff5fd74c8c142fe99 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 3ad079ffd049cbce0441d730e28f27bbfe4aeb4b..5b9bc19ed134b2a4d50eb793b5d88717871df3a5 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 d5c689d6217e3a2eb46223fa1ffd01b77e15e0df..72ec56e6d42f571d8b5e117033cfa87c9d66d397 100644 (file)
@@ -206,7 +206,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 {
@@ -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 758ff310f7f8e044e97ac1e310f18302635f0a5f..5ac52898a0bb68a3ce07ec5d1bfdc61382af318d 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 e16894fb2ca3532067bbfe90cffa321ca64d869b..3e7da10cebba3525c43f5f63e383e4bca61deeee 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 434bd881fcae84dd26386502c4817eaf87dd2c21..71397961773c232413600dd68a69ea7e43d72ec6 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 a0703624d5e56c4015cda9f1c3e16e1956d16333..b13949ad34089e01b58af1b597f2d3dc6baa42f4 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 b4902b99cfd2301793785a527561ca2caf8d8b99..46043c2521ce5de42cb182fdb1e342442553175c 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 bedac0d4c9cecf8b13c0e16dc1c69215dc843ecb..f19d04ed858629de3ebc6f64df63c375087cc8bb 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 8131e2c28015432ea3be3fc41b6206f3102fd98b..033e0bc9ebabccb30e33ea0d4d24947dcff48661 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 b25e6ee7144374e258b646608a41978f1d2f1a3b..925d1fa153db328a3d75a45583cfe6415a11f0af 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 3a667eed63d6086c017c8abcc83a597850ec4966..68984136bfb18a11a38a342a78938f4edf880875 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 34e71874a89266db9ebd47cb9a156e89192af7a1..df443b908ca305694c43d9665859c9cca11f3dde 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 d3cda0cb2df0a9e2d7c4536c0d8638a9461abff7..f175385bb30469fad148769bad0c07edea4790d9 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 558ce8509a9add9dac313e4c74704c824445e080..4cd6c2381528c53127959872a295077849625cba 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 5847a4b855f74804d327cca6490cade872f673d2..9033fc6e0e4eb31a4fea337eca73634c8eec5109 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 02d07bfcfa8add3f46f0eb9b36a6b821305e8493..bdaa06f3ab696859f3ef3b2a12ffe7929af982ee 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 e0b4b0a30a5a7b7c145de9682f18859032354497..9d664242b3128889639335a8fb2a4e2c338ebf87 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 a21dc8e3b7c0cf56ed808e006499abf4b661a217..046279ce3e8d8802c6bac92bd17bb384e8310cdf 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 5b3eda2024fec8ca28375075cd6e5df875ceef0c..a9e2bd1ab534287fe356a1eff37aba7985f4e698 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 675303b8ed84688327d67905be2d4fe671f15fa2..b97913dcdbffbc701ae8c2f7acae84b8a3dbc6b8 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 593d40ad0a6be9b0de161803aa69c9011e2fdab8..70e3a525bc82c4a438d9359a6cb45f07feb9572f 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 aa1debf97cc741e3f5914cb5396c8397bd37f362..b38e954eedd346130b388e2496d57b9d8995ccab 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 a3dddc12d2fedc3ec261c2c8f2b3da215f564a20..f17d9f3d84a2e80c512fbfac0e8cd634485b5fa4 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 b425c79675ad96adc187c601e36d65c2bebc3581..8a5a8b064616a05eb0eefe517c86b2cc9b43f2f6 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
@@ -3012,9 +3040,47 @@ 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 a1b9a2f68567e2755871280c555f8a4f52168eb6..12b1fa0f4f867ed014d7a96eac79ccae76053c6d 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 6f99c9959f0c8f5db9c950810a8196e0907415b2..4d7b56268c79408a35b2a3990990778b9359f071 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 9ff986c32a21ef702edf515a79c19440a504b747..67feac9e6ebbef7e224c47672bff95f7f511c5a2 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 bf6e238146ae40acd4ac8ea2f517574870366590..d7bdd8d0c23f0faa832aee87447af772958ceb13 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 48cc6f25cfd39c319cea40e5d70232ca39c3c964..681765baef69345f568ce29bce068601b812db56 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 84cbf298c0947c192b98ead8d71c4362458da459..999ca63afdeffc2c03a0d5a057d57653f3b85490 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 f763ed7ba91ea08a4c0dd0166558ccb6683447d5..ff7b5a8d501ccc8558920686db22f7188dd9ab4a 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 5b3f5fffea92d241b50587b885c24bf69f83e878..2b5534c2ab8446bbb69b92ffe36c0c80b32ee77c 100644 (file)
@@ -1129,7 +1129,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 f8ce97d8b0ad3c5beb79868a35b0dbfe8495368c..3b98fb733362d21ad994f6f5a7950312d78e2f1b 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 6b7365632951c6c8735c25fcec0c69aa9a8026c8..a46df73ee96e34310f9a1640d6c88cd89c3be09c 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 b9cca6dcde07a8f341f198ef694bf76adce24f32..9a564286bfd75db516d117f30921e2730eab4529 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 1e71079ce33b7128c116f602d865428297804da7..ba5e07e188a0aa585aee873a7377e73e5b15385e 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 b78c34eb5d3f6f976aac101eb15094e8f99370e4..be34f153e56616462aa686611e284e492d1bc60b 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 b5cd838093ef58be7129ff9f78bcb814fc697da0..afd9d2ec577ba02f32afbe4e396252643e29ec0d 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 cdf61dd0731837fb0acf62fc6cd44f0a199ef38f..34e86383090a846e2f843a716ff047bde9c59390 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 499b15fd82f162e788afefba9ec50271f9cf94d0..79451ee12ca08c451e4c2ad75f25823126ffce69 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 5620db6469e586f85ea8eacfa79798b1b4a676d8..24e3e19849a2af68153006b860338eeaf34ca95a 100644 (file)
@@ -2082,7 +2082,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 e1f5ccd1e8f8c64a49e12d9ff3463d60e4f9fb01..f435575c4e6e256382d29e6eff05c5c0c00293d6 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 3936904c641969cd4566ba88ee5dc39d8912e6b9..765978ae752ec6b7991154b6fe193029278f8bd9 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 fc09414c960f045767446ee4a36f4001235700fd..5a96692b12a21235915dd7ba91a8071ff0711f04 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 22b1eb5040b7648815be691e215bcfe306cb2d78..bf3864045c1842291d38dc42bd7f536c4413f214 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 af0b70eaf032f6617c36b596ce70776842a20d9f..7bcbb47e1449a83b210f9d280d5f60c965607641 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 a4ac3cfeffc4b84d6fa8ac41236bad5f2bf6e724..dcada8615fcf851eab023134ee7d5215d17f4c0b 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 5bed59cd5776d097e210944ed51339c53564faeb..def9ad2587157ebc7c0cb856da5a23f96d314f9f 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 fafeabb64c553152946618f6f65d37d46131f2fd..bf5c74965d3467603066511d8259600559a6a043 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 a71fa0aa04066dd38758fe35c87cf007a3b55f4a..df98cffdba65532927997ab8536a2618d1befbc3 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 d47eb06fe463b51463cb899659a5f2428d5bd24b..2b0627b5fe2c357bdd8f82601001b23a04d56d97 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 a07dd3c8cfef3e408fbaa4bba593267621ccec71..012f67b2e4cc2eb50145c3b7b2f9ff1f4fcf5e82 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 2f6da1e89bfa5606772103ce70f70087a9bfab42..402c32d7accb8bfa089e5a179b981e462767eb0a 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 5976b65ab6ee6851cfb10ca2f5dd956c71c8a284..9f555560bfbf0355e6fb8e981168b30daedb4f2b 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 13b8dd6481f565bd421a0a504b15d449ecbc3d72..2b9108a8ea6470bb32eb9adceaabe150a959cffc 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 151670b6b72a9871bcf88fd5e611b3247bae9904..7df9cdb053ed757dc119c5b3a0b22dc69b0c4dec 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 0274710cced5ce432504ca02c98de0cab2add0ee..b14ebbd735676d564fc992511d0efa5d5e1d6a61 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 cad608984710321903ccef7ef0ce8d53a4e88ebf..ab68a4d74d61b5a5a2e8bc67479e4f7750098946 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 3fee23bf0c141718228d6b3a5ae04bc42a58a96d..cf2d30cf7588c09ca1e502471990d4c2a92cc456 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 a4404f5ad68ec5e782c68f9b261e52b4224ac497..f502a16aac215db11f5ce53a4492422495768340 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 27483f91a4a38a41bfdd3f2a5c9583be33ac8027..aa4b0d7759924af8d7a728396c9acb26926ae617 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 6855d5ed033115473cf02e3a6f3ee73d1d5bace8..72b678d90831464a5e099a7efad4c4654efd04cd 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 473635e7f5dbdf8bb4c28c20102f12b438b31d77..b36077de72b96e17fe9eb1c830ec73c0d6e3f0eb 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 bfdc5fbeaa116aa7e919c191eac4dcac2f3985bc..92257ef194036c2344b30c581cb5d534d9a49ce0 100644 (file)
@@ -27,9 +27,9 @@
 #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>
 
 #define OMAPBL_MAX_INTENSITY           0xff
index 5b289c5f695bdd7f9cb888a70dbdf7da909b1df2..ee9e29639dcc4323c5d1d87b31390da0a1ad5373 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 fc671d3d8004899ba36064954fc1343ddefb85e2..3c39aa8de9285d65676f284343530b5516d019f7 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>
 
index 4b0fcf3c2d035f8aba0d0e0ba938f34df6621ef2..fee195a769413b81830cadf568edb936c2f05192 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 fceec4f4eb7eec3dd6c3f1443b9e8df1bb7cb334..f5db18dbc0f9e5e9092462142aa805a87239d696 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 344713b1166953376b60ea1ae3cb062578342139..fdc9ff045ef8c3073519115b0e383bd65e97c333 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 fa217607c582e7feb5cf1ef301b1659f7b9db1ff..c57e064666e4c5b6ead64191063b0ab36dc922a9 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 d117b29d106227b1036520f870b25b9df316c4f3..f612c783170f58d2d7913d55c8d804d4c60c568b 100644 (file)
@@ -205,7 +205,6 @@ struct amba_pl011_data {
        void *dma_tx_param;
         void (*init) (void);
        void (*exit) (void);
-       void (*reset) (void);
 };
 #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
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 7ea898c55a601e04d11231a9425d9b29460089b0..a12a38107c1aa3157d8ddb622c3f613aed28f850 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;
 
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 daf4a3a40ee0e4ed7d5e29be6b6a342f11ed487b..b7c8cdc1d4223b4565d7c1ede7e10229621cca97 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 eaad49f7c130f0d148b0a7679bd4a6195194e422..ba43d4806b833e48fe7d67df559e6849c1253817 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 4ff57e81051ddfd43ec696947a1bb9ecfa1eee89..85af8184691a39d4b6c9dd2d0fdd32decb213ad8 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;
diff --git a/include/linux/platform_data/gpio-omap.h b/include/linux/platform_data/gpio-omap.h
new file mode 100644 (file)
index 0000000..e8741c2
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * OMAP GPIO handling defines and functions
+ *
+ * Copyright (C) 2003-2005 Nokia Corporation
+ *
+ * Written by Juha Yrjölä <juha.yrjola@nokia.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_OMAP_GPIO_H
+#define __ASM_ARCH_OMAP_GPIO_H
+
+#include <linux/io.h>
+#include <linux/platform_device.h>
+#include <mach/irqs.h>
+
+#define OMAP1_MPUIO_BASE                       0xfffb5000
+
+/*
+ * These are the omap15xx/16xx offsets. The omap7xx offset are
+ * OMAP_MPUIO_ / 2 offsets below.
+ */
+#define OMAP_MPUIO_INPUT_LATCH         0x00
+#define OMAP_MPUIO_OUTPUT              0x04
+#define OMAP_MPUIO_IO_CNTL             0x08
+#define OMAP_MPUIO_KBR_LATCH           0x10
+#define OMAP_MPUIO_KBC                 0x14
+#define OMAP_MPUIO_GPIO_EVENT_MODE     0x18
+#define OMAP_MPUIO_GPIO_INT_EDGE       0x1c
+#define OMAP_MPUIO_KBD_INT             0x20
+#define OMAP_MPUIO_GPIO_INT            0x24
+#define OMAP_MPUIO_KBD_MASKIT          0x28
+#define OMAP_MPUIO_GPIO_MASKIT         0x2c
+#define OMAP_MPUIO_GPIO_DEBOUNCING     0x30
+#define OMAP_MPUIO_LATCH               0x34
+
+#define OMAP34XX_NR_GPIOS              6
+
+/*
+ * OMAP1510 GPIO registers
+ */
+#define OMAP1510_GPIO_DATA_INPUT       0x00
+#define OMAP1510_GPIO_DATA_OUTPUT      0x04
+#define OMAP1510_GPIO_DIR_CONTROL      0x08
+#define OMAP1510_GPIO_INT_CONTROL      0x0c
+#define OMAP1510_GPIO_INT_MASK         0x10
+#define OMAP1510_GPIO_INT_STATUS       0x14
+#define OMAP1510_GPIO_PIN_CONTROL      0x18
+
+#define OMAP1510_IH_GPIO_BASE          64
+
+/*
+ * OMAP1610 specific GPIO registers
+ */
+#define OMAP1610_GPIO_REVISION         0x0000
+#define OMAP1610_GPIO_SYSCONFIG                0x0010
+#define OMAP1610_GPIO_SYSSTATUS                0x0014
+#define OMAP1610_GPIO_IRQSTATUS1       0x0018
+#define OMAP1610_GPIO_IRQENABLE1       0x001c
+#define OMAP1610_GPIO_WAKEUPENABLE     0x0028
+#define OMAP1610_GPIO_DATAIN           0x002c
+#define OMAP1610_GPIO_DATAOUT          0x0030
+#define OMAP1610_GPIO_DIRECTION                0x0034
+#define OMAP1610_GPIO_EDGE_CTRL1       0x0038
+#define OMAP1610_GPIO_EDGE_CTRL2       0x003c
+#define OMAP1610_GPIO_CLEAR_IRQENABLE1 0x009c
+#define OMAP1610_GPIO_CLEAR_WAKEUPENA  0x00a8
+#define OMAP1610_GPIO_CLEAR_DATAOUT    0x00b0
+#define OMAP1610_GPIO_SET_IRQENABLE1   0x00dc
+#define OMAP1610_GPIO_SET_WAKEUPENA    0x00e8
+#define OMAP1610_GPIO_SET_DATAOUT      0x00f0
+
+/*
+ * OMAP7XX specific GPIO registers
+ */
+#define OMAP7XX_GPIO_DATA_INPUT                0x00
+#define OMAP7XX_GPIO_DATA_OUTPUT       0x04
+#define OMAP7XX_GPIO_DIR_CONTROL       0x08
+#define OMAP7XX_GPIO_INT_CONTROL       0x0c
+#define OMAP7XX_GPIO_INT_MASK          0x10
+#define OMAP7XX_GPIO_INT_STATUS                0x14
+
+/*
+ * omap2+ specific GPIO registers
+ */
+#define OMAP24XX_GPIO_REVISION         0x0000
+#define OMAP24XX_GPIO_IRQSTATUS1       0x0018
+#define OMAP24XX_GPIO_IRQSTATUS2       0x0028
+#define OMAP24XX_GPIO_IRQENABLE2       0x002c
+#define OMAP24XX_GPIO_IRQENABLE1       0x001c
+#define OMAP24XX_GPIO_WAKE_EN          0x0020
+#define OMAP24XX_GPIO_CTRL             0x0030
+#define OMAP24XX_GPIO_OE               0x0034
+#define OMAP24XX_GPIO_DATAIN           0x0038
+#define OMAP24XX_GPIO_DATAOUT          0x003c
+#define OMAP24XX_GPIO_LEVELDETECT0     0x0040
+#define OMAP24XX_GPIO_LEVELDETECT1     0x0044
+#define OMAP24XX_GPIO_RISINGDETECT     0x0048
+#define OMAP24XX_GPIO_FALLINGDETECT    0x004c
+#define OMAP24XX_GPIO_DEBOUNCE_EN      0x0050
+#define OMAP24XX_GPIO_DEBOUNCE_VAL     0x0054
+#define OMAP24XX_GPIO_CLEARIRQENABLE1  0x0060
+#define OMAP24XX_GPIO_SETIRQENABLE1    0x0064
+#define OMAP24XX_GPIO_CLEARWKUENA      0x0080
+#define OMAP24XX_GPIO_SETWKUENA                0x0084
+#define OMAP24XX_GPIO_CLEARDATAOUT     0x0090
+#define OMAP24XX_GPIO_SETDATAOUT       0x0094
+
+#define OMAP4_GPIO_REVISION            0x0000
+#define OMAP4_GPIO_EOI                 0x0020
+#define OMAP4_GPIO_IRQSTATUSRAW0       0x0024
+#define OMAP4_GPIO_IRQSTATUSRAW1       0x0028
+#define OMAP4_GPIO_IRQSTATUS0          0x002c
+#define OMAP4_GPIO_IRQSTATUS1          0x0030
+#define OMAP4_GPIO_IRQSTATUSSET0       0x0034
+#define OMAP4_GPIO_IRQSTATUSSET1       0x0038
+#define OMAP4_GPIO_IRQSTATUSCLR0       0x003c
+#define OMAP4_GPIO_IRQSTATUSCLR1       0x0040
+#define OMAP4_GPIO_IRQWAKEN0           0x0044
+#define OMAP4_GPIO_IRQWAKEN1           0x0048
+#define OMAP4_GPIO_IRQENABLE1          0x011c
+#define OMAP4_GPIO_WAKE_EN             0x0120
+#define OMAP4_GPIO_IRQSTATUS2          0x0128
+#define OMAP4_GPIO_IRQENABLE2          0x012c
+#define OMAP4_GPIO_CTRL                        0x0130
+#define OMAP4_GPIO_OE                  0x0134
+#define OMAP4_GPIO_DATAIN              0x0138
+#define OMAP4_GPIO_DATAOUT             0x013c
+#define OMAP4_GPIO_LEVELDETECT0                0x0140
+#define OMAP4_GPIO_LEVELDETECT1                0x0144
+#define OMAP4_GPIO_RISINGDETECT                0x0148
+#define OMAP4_GPIO_FALLINGDETECT       0x014c
+#define OMAP4_GPIO_DEBOUNCENABLE       0x0150
+#define OMAP4_GPIO_DEBOUNCINGTIME      0x0154
+#define OMAP4_GPIO_CLEARIRQENABLE1     0x0160
+#define OMAP4_GPIO_SETIRQENABLE1       0x0164
+#define OMAP4_GPIO_CLEARWKUENA         0x0180
+#define OMAP4_GPIO_SETWKUENA           0x0184
+#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)
+
+struct omap_gpio_dev_attr {
+       int bank_width;         /* GPIO bank width */
+       bool dbck_flag;         /* dbck required or not - True for OMAP3&4 */
+};
+
+struct omap_gpio_reg_offs {
+       u16 revision;
+       u16 direction;
+       u16 datain;
+       u16 dataout;
+       u16 set_dataout;
+       u16 clr_dataout;
+       u16 irqstatus;
+       u16 irqstatus2;
+       u16 irqstatus_raw0;
+       u16 irqstatus_raw1;
+       u16 irqenable;
+       u16 irqenable2;
+       u16 set_irqenable;
+       u16 clr_irqenable;
+       u16 debounce;
+       u16 debounce_en;
+       u16 ctrl;
+       u16 wkup_en;
+       u16 leveldetect0;
+       u16 leveldetect1;
+       u16 risingdetect;
+       u16 fallingdetect;
+       u16 irqctrl;
+       u16 edgectrl1;
+       u16 edgectrl2;
+       u16 pinctrl;
+
+       bool irqenable_inv;
+};
+
+struct omap_gpio_platform_data {
+       int bank_type;
+       int bank_width;         /* GPIO bank width */
+       int bank_stride;        /* Only needed for omap1 MPUIO */
+       bool dbck_flag;         /* dbck required or not - True for OMAP3&4 */
+       bool loses_context;     /* whether the bank would ever lose context */
+       bool is_mpuio;          /* whether the bank is of type MPUIO */
+       u32 non_wakeup_gpios;
+
+       struct omap_gpio_reg_offs *regs;
+
+       /* Return context loss count due to PM states changing */
+       int (*get_context_loss_count)(struct device *dev);
+};
+
+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);
+
+#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
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
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
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 90e9f981358a90ec25e844a4e3376b1d9c70bf1f..861e51de476bf8e55399f5796cfa68e89ba3718f 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 a416e92012ef72db74f1d9ffe2c54bbe2c98b217..c174c90fb3fbcbb56abb5096f40ee559a75aeb94 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 0253c2022e53ebef9950a428b559f8a598167c7a..7cf0b68bbe9e2b531ef44760ea4fd94c2aac23ea 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 8ce70d76f836e341ec06d711bec39dd97b110193..5ed325e88a81feb7961cd84e0c82ca982df4520d 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 9f47ab540f65e997b79b0a16c52332c564354234..1509b86825d8ec710713405b47d9931f465ddb89 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 6e6dbb7447b6e76beec4a4115d049e6dd00c4735..dd976cfb61312d66d53d6a9e009e70d3eb4d347d 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 59ba38bc400f43d3e87c1502395cef9a54e5811c..80ffde3bb164e2a3a856838f0c8c4c2906bfeaf6 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 56f182393c4c7d278a391c1cbf0cccc7ed4424e3..ccc248791d50239c24fce5c0635245f33f654fa3 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 8b915f3ac3b91a6b2471149799117d8bdd5b8b00..30893912835926a2bbc83ce716a1fdbf242c81a4 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 6b9d5a0e42f9fb3753e32c0b167e202657b372b3..95a3a7a336ba86a0b8b3790a7ce8e722f17db1a2 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 b65d66e0d8174bd49d6301ea1d8444c1f072b7d1..edab393e0c82ec96bfd66dd662a888963761bab0 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 d0667d68351dfc8944c2d694de054232cffefc75..b343f50dc8d72a07b321d9e70eb33e3ed8f62443 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 d33c48baaf711054da6e1c3f08f5a2e57d394057..f18e48847323fa2dabc2c6ed664e50a2d3db7df4 100644 (file)
@@ -27,6 +27,8 @@
 
 #include <plat/mcbsp.h>
 
+#include <plat/cpu.h>
+
 #include "mcbsp.h"
 
 static void omap_mcbsp_write(struct omap_mcbsp *mcbsp, u16 reg, u32 val)
index 9d93793d3077c61d8819760d4bd12b75e3896557..45909ca889fa17c56ecf9493cc5a3a31a4986a75 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 acdd3ef14e08c59821d2ae18f7795c0b590e3df0..d0ee71d6cc2314a04d8e7d8b8a9dc5610f6ae6f3 100644 (file)
@@ -32,6 +32,7 @@
 #include <sound/initval.h>
 #include <sound/soc.h>
 
+#include <plat/cpu.h>
 #include <plat/dma.h>
 #include <plat/mcbsp.h>
 #include "mcbsp.h"
index 2c66e2498a453b3c6fcf29c2ea008429f47138ca..ea053c3d2ab1f8455a9d9e238895c390a0e0fe99 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 f0feb06615f8ea355711239b4ffbd74516221a3e..b309941798850d1143aaf5c4bfdf8c67a5967e09 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 0e283226e2bf8deecf215b54ef22c700c72fff0d..78e14198aa1140a6a790c1d5da1f34f685a67664 100644 (file)
@@ -34,6 +34,7 @@
 #include <mach/hardware.h>
 #include <mach/gpio.h>
 #include <plat/mcbsp.h>
+#include <linux/platform_data/gpio-omap.h>
 
 /* Register descriptions for twl4030 codec part */
 #include <linux/mfd/twl4030-audio.h>
This page took 0.525739 seconds and 5 git commands to generate.