Merge tag 'for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/kishon/linux...
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 May 2014 00:56:05 +0000 (09:56 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 May 2014 00:56:05 +0000 (09:56 +0900)
Kishon writes:

for 3.16 merge window

Bunch of fixes and a new driver for Exynos5 USB 3.0 PHY.

145 files changed:
Documentation/ABI/testing/sysfs-platform-chipidea-usb-otg [new file with mode: 0644]
Documentation/input/elantech.txt
Documentation/usb/chipidea.txt [new file with mode: 0644]
Makefile
arch/arm/mach-pxa/zeus.c
arch/x86/Makefile
arch/x86/boot/Makefile
arch/x86/boot/compressed/misc.c
arch/x86/include/asm/hpet.h
arch/x86/include/uapi/asm/msr-index.h
arch/x86/kernel/acpi/sleep.c
arch/x86/kernel/apic/io_apic.c
arch/x86/kernel/cpu/mcheck/therm_throt.c
arch/x86/kernel/cpu/mcheck/threshold.c
arch/x86/kernel/early-quirks.c
arch/x86/kernel/head32.c
arch/x86/kernel/head64.c
arch/x86/kernel/hpet.c
arch/x86/kernel/process_64.c
arch/x86/kernel/reboot.c
arch/x86/kernel/smp.c
arch/x86/kernel/traps.c
arch/x86/kernel/vsmp_64.c
arch/x86/kernel/vsyscall_gtod.c
arch/x86/kvm/x86.c
arch/x86/lguest/boot.c
arch/x86/lib/msr.c
arch/x86/math-emu/errors.c
arch/x86/platform/efi/early_printk.c
arch/x86/platform/olpc/olpc-xo1-pm.c
arch/x86/power/hibernate_64.c
arch/x86/xen/enlighten.c
arch/x86/xen/irq.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxgm107.c
drivers/gpu/drm/nouveau/core/subdev/bios/base.c
drivers/gpu/drm/nouveau/nouveau_acpi.c
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/radeon/atombios_crtc.c
drivers/gpu/drm/radeon/atombios_dp.c
drivers/gpu/drm/radeon/cik.c
drivers/gpu/drm/radeon/cik_sdma.c
drivers/gpu/drm/radeon/cikd.h
drivers/gpu/drm/radeon/evergreen.c
drivers/gpu/drm/radeon/evergreen_dma.c
drivers/gpu/drm/radeon/kv_dpm.c
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/r600_dma.c
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_asic.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_display.c
drivers/gpu/drm/radeon/radeon_family.h
drivers/gpu/drm/radeon/radeon_pm.c
drivers/gpu/drm/radeon/radeon_ucode.h
drivers/gpu/drm/radeon/radeon_uvd.c
drivers/gpu/drm/radeon/radeon_vce.c
drivers/gpu/drm/radeon/rv770_dma.c
drivers/gpu/drm/radeon/si.c
drivers/gpu/drm/radeon/si_dma.c
drivers/gpu/drm/radeon/uvd_v1_0.c
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hid-multitouch.c
drivers/hid/hid-sensor-hub.c
drivers/hid/usbhid/hid-quirks.c
drivers/input/keyboard/atkbd.c
drivers/input/keyboard/tca8418_keypad.c
drivers/input/misc/bma150.c
drivers/input/mouse/elantech.c
drivers/input/mouse/elantech.h
drivers/input/mouse/synaptics.c
drivers/mfd/rtsx_pcr.c
drivers/mmc/host/rtsx_pci_sdmmc.c
drivers/mtd/nand/davinci_nand.c
drivers/pnp/pnpbios/bioscalls.c
drivers/usb/chipidea/Makefile
drivers/usb/chipidea/bits.h
drivers/usb/chipidea/ci.h
drivers/usb/chipidea/core.c
drivers/usb/chipidea/debug.c
drivers/usb/chipidea/host.c
drivers/usb/chipidea/otg.c
drivers/usb/chipidea/otg.h
drivers/usb/chipidea/otg_fsm.c [new file with mode: 0644]
drivers/usb/chipidea/otg_fsm.h [new file with mode: 0644]
drivers/usb/chipidea/udc.c
drivers/usb/chipidea/usbmisc_imx.c
drivers/usb/dwc2/Kconfig
drivers/usb/dwc2/Makefile
drivers/usb/dwc2/core.h
drivers/usb/dwc2/gadget.c [moved from drivers/usb/gadget/s3c-hsotg.c with 85% similarity]
drivers/usb/dwc2/hw.h
drivers/usb/gadget/Kconfig
drivers/usb/gadget/Makefile
drivers/usb/gadget/s3c-hsotg.h [deleted file]
drivers/usb/host/ehci-hub.c
drivers/usb/host/ehci-tegra.c
drivers/usb/host/ehci.h
drivers/usb/host/ohci-at91.c
drivers/usb/host/ohci-exynos.c
drivers/usb/host/ohci-hub.c
drivers/usb/host/ohci-pxa27x.c
drivers/usb/host/ohci-s3c2410.c
drivers/usb/host/ohci.h
drivers/usb/misc/ftdi-elan.c
drivers/usb/phy/Kconfig
drivers/usb/phy/Makefile
drivers/usb/phy/phy-fsm-usb.c
drivers/usb/phy/phy-mv-u3d-usb.c [deleted file]
drivers/usb/phy/phy-mv-u3d-usb.h [deleted file]
fs/xfs/xfs_attr.c
fs/xfs/xfs_attr_leaf.c
fs/xfs/xfs_attr_list.c
fs/xfs/xfs_attr_remote.c
fs/xfs/xfs_da_btree.h
fs/xfs/xfs_iops.c
fs/xfs/xfs_log.c
fs/xfs/xfs_mount.c
fs/xfs/xfs_sb.c
include/drm/drm_pciids.h
include/drm/i915_pciids.h
include/linux/linkage.h
include/linux/mfd/rtsx_common.h
include/linux/mfd/rtsx_pci.h
include/trace/events/module.h
init/main.c
kernel/context_tracking.c
kernel/locking/lockdep.c
kernel/power/snapshot.c
kernel/printk/printk.c
kernel/sched/core.c
kernel/softirq.c
kernel/tracepoint.c
lib/dump_stack.c
sound/pci/hda/patch_hdmi.c
sound/pci/hda/patch_realtek.c
sound/usb/card.c
sound/usb/card.h
sound/usb/endpoint.c
sound/usb/pcm.c
sound/usb/usbaudio.h

diff --git a/Documentation/ABI/testing/sysfs-platform-chipidea-usb-otg b/Documentation/ABI/testing/sysfs-platform-chipidea-usb-otg
new file mode 100644 (file)
index 0000000..151c595
--- /dev/null
@@ -0,0 +1,56 @@
+What:          /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req
+Date:          Feb 2014
+Contact:       Li Jun <b47624@freescale.com>
+Description:
+               Can be set and read.
+               Set a_bus_req(A-device bus request) input to be 1 if
+               the application running on the A-device wants to use the bus,
+               and to be 0 when the application no longer wants to use
+               the bus(or wants to work as peripheral). a_bus_req can also
+               be set to 1 by kernel in response to remote wakeup signaling
+               from the B-device, the A-device should decide to resume the bus.
+
+               Valid values are "1" and "0".
+
+               Reading: returns 1 if the application running on the A-device
+               is using the bus as host role, otherwise 0.
+
+What:          /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_drop
+Date:          Feb 2014
+Contact:       Li Jun <b47624@freescale.com>
+Description:
+               Can be set and read
+               The a_bus_drop(A-device bus drop) input is 1 when the
+               application running on the A-device wants to power down
+               the bus, and is 0 otherwise, When a_bus_drop is 1, then
+               the a_bus_req shall be 0.
+
+               Valid values are "1" and "0".
+
+               Reading: returns 1 if the bus is off(vbus is turned off) by
+                        A-device, otherwise 0.
+
+What:          /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
+Date:          Feb 2014
+Contact:       Li Jun <b47624@freescale.com>
+Description:
+               Can be set and read.
+               The b_bus_req(B-device bus request) input is 1 during the time
+               that the application running on the B-device wants to use the
+               bus as host, and is 0 when the application no longer wants to
+               work as host and decides to switch back to be peripheral.
+
+               Valid values are "1" and "0".
+
+               Reading: returns if the application running on the B device
+               is using the bus as host role, otherwise 0.
+
+What:          /sys/bus/platform/devices/ci_hdrc.0/inputs/a_clr_err
+Date:          Feb 2014
+Contact:       Li Jun <b47624@freescale.com>
+Description:
+               Only can be set.
+               The a_clr_err(A-device Vbus error clear) input is used to clear
+               vbus error, then A-device will power down the bus.
+
+               Valid value is "1"
index 5602eb7..e1ae127 100644 (file)
@@ -504,9 +504,12 @@ byte 5:
 * reg_10
 
    bit   7   6   5   4   3   2   1   0
-         0   0   0   0   0   0   0   A
+         0   0   0   0   R   F   T   A
 
          A: 1 = enable absolute tracking
+         T: 1 = enable two finger mode auto correct
+         F: 1 = disable ABS Position Filter
+         R: 1 = enable real hardware resolution
 
 6.2 Native absolute mode 6 byte packet format
     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/Documentation/usb/chipidea.txt b/Documentation/usb/chipidea.txt
new file mode 100644 (file)
index 0000000..4c0e2ea
--- /dev/null
@@ -0,0 +1,71 @@
+1. How to test OTG FSM(HNP and SRP)
+-----------------------------------
+To show how to demo OTG HNP and SRP functions via sys input files
+with 2 Freescale i.MX6Q sabre SD boards.
+
+1.1 How to enable OTG FSM in menuconfig
+---------------------------------------
+Select CONFIG_USB_OTG_FSM.
+If you want to check some internal variables for otg fsm,
+select CONFIG_USB_CHIPIDEA_DEBUG, there are 2 files which
+can show otg fsm variables and some controller registers value:
+cat /sys/kernel/debug/ci_hdrc.0/otg
+cat /sys/kernel/debug/ci_hdrc.0/registers
+
+1.2 Test operations
+-------------------
+1) Power up 2 Freescale i.MX6Q sabre SD boards with gadget class driver loaded
+   (e.g. g_mass_storage).
+
+2) Connect 2 boards with usb cable with one end is micro A plug, the other end
+   is micro B plug.
+
+   The A-device(with micro A plug inserted) should enumrate B-device.
+
+3) Role switch
+   On B-device:
+   echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
+
+   if HNP polling is not supported, also need:
+   On A-device:
+   echo 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req
+
+   B-device should take host role and enumrate A-device.
+
+4) A-device switch back to host.
+   On B-device:
+   echo 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
+
+   A-device should switch back to host and enumrate B-device.
+
+5) Remove B-device(unplug micro B plug) and insert again in 10 seconds,
+   A-device should enumrate B-device again.
+
+6) Remove B-device(unplug micro B plug) and insert again after 10 seconds,
+   A-device should NOT enumrate B-device.
+
+   if A-device wants to use bus:
+   On A-device:
+   echo 0 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_drop
+   echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_req
+
+   if B-device wants to use bus:
+   On B-device:
+   echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
+
+7) A-device power down the bus.
+   On A-device:
+   echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/a_bus_drop
+
+   A-device should disconnect with B-device and power down the bus.
+
+8) B-device does data pulse for SRP.
+   On B-device:
+   echo 1 > /sys/bus/platform/devices/ci_hdrc.0/inputs/b_bus_req
+
+   A-device should resume usb bus and enumrate B-device.
+
+1.3 Reference document
+----------------------
+"On-The-Go and Embedded Host Supplement to the USB Revision 2.0 Specification
+July 27, 2012 Revision 2.0 version 1.1a"
index 28a7259..8a8440a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 3
 PATCHLEVEL = 15
 SUBLEVEL = 0
-EXTRAVERSION = -rc4
+EXTRAVERSION = -rc5
 NAME = Shuffling Zombie Juror
 
 # *DOCUMENTATION*
index b19d1c3..205f9bf 100644 (file)
@@ -413,7 +413,7 @@ static struct fixed_voltage_config can_regulator_pdata = {
 
 static struct platform_device can_regulator_device = {
        .name   = "reg-fixed-volage",
-       .id     = -1,
+       .id     = 0,
        .dev    = {
                .platform_data  = &can_regulator_pdata,
        },
@@ -510,18 +510,6 @@ struct platform_device zeus_max6369_device = {
        .num_resources  = 1,
 };
 
-static struct platform_device *zeus_devices[] __initdata = {
-       &zeus_serial_device,
-       &zeus_mtd_devices[0],
-       &zeus_dm9k0_device,
-       &zeus_dm9k1_device,
-       &zeus_sram_device,
-       &zeus_leds_device,
-       &zeus_pcmcia_device,
-       &zeus_max6369_device,
-       &can_regulator_device,
-};
-
 /* AC'97 */
 static pxa2xx_audio_ops_t zeus_ac97_info = {
        .reset_gpio = 95,
@@ -532,44 +520,50 @@ static pxa2xx_audio_ops_t zeus_ac97_info = {
  * USB host
  */
 
-static int zeus_ohci_init(struct device *dev)
-{
-       int err;
-
-       /* Switch on port 2. */
-       if ((err = gpio_request(ZEUS_USB2_PWREN_GPIO, "USB2_PWREN"))) {
-               dev_err(dev, "Can't request USB2_PWREN\n");
-               return err;
-       }
-
-       if ((err = gpio_direction_output(ZEUS_USB2_PWREN_GPIO, 1))) {
-               gpio_free(ZEUS_USB2_PWREN_GPIO);
-               dev_err(dev, "Can't enable USB2_PWREN\n");
-               return err;
-       }
+static struct regulator_consumer_supply zeus_ohci_regulator_supplies[] = {
+       REGULATOR_SUPPLY("vbus2", "pxa27x-ohci"),
+};
 
-       /* Port 2 is shared between host and client interface. */
-       UP2OCR = UP2OCR_HXOE | UP2OCR_HXS | UP2OCR_DMPDE | UP2OCR_DPPDE;
+static struct regulator_init_data zeus_ohci_regulator_data = {
+       .constraints = {
+               .valid_ops_mask         = REGULATOR_CHANGE_STATUS,
+       },
+       .num_consumer_supplies  = ARRAY_SIZE(zeus_ohci_regulator_supplies),
+       .consumer_supplies      = zeus_ohci_regulator_supplies,
+};
 
-       return 0;
-}
+static struct fixed_voltage_config zeus_ohci_regulator_config = {
+       .supply_name            = "vbus2",
+       .microvolts             = 5000000, /* 5.0V */
+       .gpio                   = ZEUS_USB2_PWREN_GPIO,
+       .enable_high            = 1,
+       .startup_delay          = 0,
+       .init_data              = &zeus_ohci_regulator_data,
+};
 
-static void zeus_ohci_exit(struct device *dev)
-{
-       /* Power-off port 2 */
-       gpio_direction_output(ZEUS_USB2_PWREN_GPIO, 0);
-       gpio_free(ZEUS_USB2_PWREN_GPIO);
-}
+static struct platform_device zeus_ohci_regulator_device = {
+       .name           = "reg-fixed-voltage",
+       .id             = 1,
+       .dev = {
+               .platform_data = &zeus_ohci_regulator_config,
+       },
+};
 
 static struct pxaohci_platform_data zeus_ohci_platform_data = {
        .port_mode      = PMM_NPS_MODE,
        /* Clear Power Control Polarity Low and set Power Sense
         * Polarity Low. Supply power to USB ports. */
        .flags          = ENABLE_PORT_ALL | POWER_SENSE_LOW,
-       .init           = zeus_ohci_init,
-       .exit           = zeus_ohci_exit,
 };
 
+static void zeus_register_ohci(void)
+{
+       /* Port 2 is shared between host and client interface. */
+       UP2OCR = UP2OCR_HXOE | UP2OCR_HXS | UP2OCR_DMPDE | UP2OCR_DPPDE;
+
+       pxa_set_ohci_info(&zeus_ohci_platform_data);
+}
+
 /*
  * Flat Panel
  */
@@ -677,6 +671,19 @@ static struct pxa2xx_udc_mach_info zeus_udc_info = {
        .udc_command = zeus_udc_command,
 };
 
+static struct platform_device *zeus_devices[] __initdata = {
+       &zeus_serial_device,
+       &zeus_mtd_devices[0],
+       &zeus_dm9k0_device,
+       &zeus_dm9k1_device,
+       &zeus_sram_device,
+       &zeus_leds_device,
+       &zeus_pcmcia_device,
+       &zeus_max6369_device,
+       &can_regulator_device,
+       &zeus_ohci_regulator_device,
+};
+
 #ifdef CONFIG_PM
 static void zeus_power_off(void)
 {
@@ -847,7 +854,7 @@ static void __init zeus_init(void)
 
        platform_add_devices(zeus_devices, ARRAY_SIZE(zeus_devices));
 
-       pxa_set_ohci_info(&zeus_ohci_platform_data);
+       zeus_register_ohci();
 
        if (zeus_setup_fb_gpios())
                pr_err("Failed to setup fb gpios\n");
index ce6ad7e..33f71b0 100644 (file)
@@ -79,6 +79,7 @@ else
         UTS_MACHINE := x86_64
         CHECKFLAGS += -D__x86_64__ -m64
 
+        biarch := -m64
         KBUILD_AFLAGS += -m64
         KBUILD_CFLAGS += -m64
 
index abb9eba..dbe8dd2 100644 (file)
@@ -71,7 +71,7 @@ $(obj)/vmlinux.bin: $(obj)/compressed/vmlinux FORCE
 
 SETUP_OBJS = $(addprefix $(obj)/,$(setup-y))
 
-sed-voffset := -e 's/^\([0-9a-fA-F]*\) . \(_text\|_end\)$$/\#define VO_\2 0x\1/p'
+sed-voffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(_text\|_end\)$$/\#define VO_\2 0x\1/p'
 
 quiet_cmd_voffset = VOFFSET $@
       cmd_voffset = $(NM) $< | sed -n $(sed-voffset) > $@
@@ -80,7 +80,7 @@ targets += voffset.h
 $(obj)/voffset.h: vmlinux FORCE
        $(call if_changed,voffset)
 
-sed-zoffset := -e 's/^\([0-9a-fA-F]*\) . \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p'
+sed-zoffset := -e 's/^\([0-9a-fA-F]*\) [ABCDGRSTVW] \(startup_32\|startup_64\|efi32_stub_entry\|efi64_stub_entry\|efi_pe_entry\|input_data\|_end\|z_.*\)$$/\#define ZO_\2 0x\1/p'
 
 quiet_cmd_zoffset = ZOFFSET $@
       cmd_zoffset = $(NM) $< | sed -n $(sed-zoffset) > $@
index 1768461..57ab74d 100644 (file)
@@ -354,7 +354,7 @@ static void parse_elf(void *output)
        free(phdrs);
 }
 
-asmlinkage void *decompress_kernel(void *rmode, memptr heap,
+asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap,
                                  unsigned char *input_data,
                                  unsigned long input_len,
                                  unsigned char *output,
index b18df57..36f7125 100644 (file)
@@ -63,6 +63,7 @@
 /* hpet memory map physical address */
 extern unsigned long hpet_address;
 extern unsigned long force_hpet_address;
+extern int boot_hpet_disable;
 extern u8 hpet_blockid;
 extern int hpet_force_user;
 extern u8 hpet_msi_disable;
index c827ace..fcf2b3a 100644 (file)
 #define MSR_IA32_MISC_ENABLE_MWAIT_BIT                 18
 #define MSR_IA32_MISC_ENABLE_MWAIT                     (1ULL << MSR_IA32_MISC_ENABLE_MWAIT_BIT)
 #define MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT           22
-#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID               (1ULL << MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT);
+#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID               (1ULL << MSR_IA32_MISC_ENABLE_LIMIT_CPUID_BIT)
 #define MSR_IA32_MISC_ENABLE_XTPR_DISABLE_BIT          23
 #define MSR_IA32_MISC_ENABLE_XTPR_DISABLE              (1ULL << MSR_IA32_MISC_ENABLE_XTPR_DISABLE_BIT)
 #define MSR_IA32_MISC_ENABLE_XD_DISABLE_BIT            34
index 3a2ae4c..3136820 100644 (file)
@@ -31,7 +31,7 @@ static char temp_stack[4096];
  *
  * Wrapper around acpi_enter_sleep_state() to be called by assmebly.
  */
-acpi_status asmlinkage x86_acpi_enter_sleep_state(u8 state)
+acpi_status asmlinkage __visible x86_acpi_enter_sleep_state(u8 state)
 {
        return acpi_enter_sleep_state(state);
 }
index d23aa82..992060e 100644 (file)
@@ -2189,7 +2189,7 @@ void send_cleanup_vector(struct irq_cfg *cfg)
        cfg->move_in_progress = 0;
 }
 
-asmlinkage void smp_irq_move_cleanup_interrupt(void)
+asmlinkage __visible void smp_irq_move_cleanup_interrupt(void)
 {
        unsigned vector, me;
 
index d921b7e..36a1bb6 100644 (file)
@@ -429,14 +429,14 @@ static inline void __smp_thermal_interrupt(void)
        smp_thermal_vector();
 }
 
-asmlinkage void smp_thermal_interrupt(struct pt_regs *regs)
+asmlinkage __visible void smp_thermal_interrupt(struct pt_regs *regs)
 {
        entering_irq();
        __smp_thermal_interrupt();
        exiting_ack_irq();
 }
 
-asmlinkage void smp_trace_thermal_interrupt(struct pt_regs *regs)
+asmlinkage __visible void smp_trace_thermal_interrupt(struct pt_regs *regs)
 {
        entering_irq();
        trace_thermal_apic_entry(THERMAL_APIC_VECTOR);
index fe6b1c8..7245980 100644 (file)
@@ -24,14 +24,14 @@ static inline void __smp_threshold_interrupt(void)
        mce_threshold_vector();
 }
 
-asmlinkage void smp_threshold_interrupt(void)
+asmlinkage __visible void smp_threshold_interrupt(void)
 {
        entering_irq();
        __smp_threshold_interrupt();
        exiting_ack_irq();
 }
 
-asmlinkage void smp_trace_threshold_interrupt(void)
+asmlinkage __visible void smp_trace_threshold_interrupt(void)
 {
        entering_irq();
        trace_threshold_apic_entry(THRESHOLD_APIC_VECTOR);
index 6e2537c..6cda0ba 100644 (file)
@@ -17,6 +17,7 @@
 #include <asm/dma.h>
 #include <asm/io_apic.h>
 #include <asm/apic.h>
+#include <asm/hpet.h>
 #include <asm/iommu.h>
 #include <asm/gart.h>
 #include <asm/irq_remapping.h>
@@ -530,6 +531,15 @@ static void __init intel_graphics_stolen(int num, int slot, int func)
        }
 }
 
+static void __init force_disable_hpet(int num, int slot, int func)
+{
+#ifdef CONFIG_HPET_TIMER
+       boot_hpet_disable = 1;
+       pr_info("x86/hpet: Will disable the HPET for this platform because it's not reliable\n");
+#endif
+}
+
+
 #define QFLAG_APPLY_ONCE       0x1
 #define QFLAG_APPLIED          0x2
 #define QFLAG_DONE             (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
@@ -567,6 +577,12 @@ static struct chipset early_qrk[] __initdata = {
          PCI_BASE_CLASS_BRIDGE, 0, intel_remapping_check },
        { PCI_VENDOR_ID_INTEL, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA, PCI_ANY_ID,
          QFLAG_APPLY_ONCE, intel_graphics_stolen },
+       /*
+        * HPET on current version of Baytrail platform has accuracy
+        * problems, disable it for now:
+        */
+       { PCI_VENDOR_ID_INTEL, 0x0f00,
+               PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet},
        {}
 };
 
index c61a14a..d6c1b98 100644 (file)
@@ -29,7 +29,7 @@ static void __init i386_default_early_setup(void)
        reserve_ebda_region();
 }
 
-asmlinkage void __init i386_start_kernel(void)
+asmlinkage __visible void __init i386_start_kernel(void)
 {
        sanitize_boot_params(&boot_params);
 
index 85126cc..068054f 100644 (file)
@@ -137,7 +137,7 @@ static void __init copy_bootdata(char *real_mode_data)
        }
 }
 
-asmlinkage void __init x86_64_start_kernel(char * real_mode_data)
+asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
 {
        int i;
 
index 8d80ae0..4177bfb 100644 (file)
@@ -88,7 +88,7 @@ static inline void hpet_clear_mapping(void)
 /*
  * HPET command line enable / disable
  */
-static int boot_hpet_disable;
+int boot_hpet_disable;
 int hpet_force_user;
 static int hpet_verbose;
 
index 9c0280f..898d077 100644 (file)
@@ -52,7 +52,7 @@
 
 asmlinkage extern void ret_from_fork(void);
 
-asmlinkage DEFINE_PER_CPU(unsigned long, old_rsp);
+__visible DEFINE_PER_CPU(unsigned long, old_rsp);
 
 /* Prints also some state that isn't saved in the pt_regs */
 void __show_regs(struct pt_regs *regs, int all)
index 3399d3a..52b1157 100644 (file)
@@ -191,6 +191,16 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
                },
        },
 
+       /* Certec */
+       {       /* Handle problems with rebooting on Certec BPC600 */
+               .callback = set_pci_reboot,
+               .ident = "Certec BPC600",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Certec"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "BPC600"),
+               },
+       },
+
        /* Dell */
        {       /* Handle problems with rebooting on Dell DXP061 */
                .callback = set_bios_reboot,
index 7c3a5a6..be8e1bd 100644 (file)
@@ -168,7 +168,7 @@ static int smp_stop_nmi_callback(unsigned int val, struct pt_regs *regs)
  * this function calls the 'stop' function on all other CPUs in the system.
  */
 
-asmlinkage void smp_reboot_interrupt(void)
+asmlinkage __visible void smp_reboot_interrupt(void)
 {
        ack_APIC_irq();
        irq_enter();
index 57409f6..f73b5d4 100644 (file)
@@ -357,7 +357,7 @@ exit:
  * for scheduling or signal handling. The actual stack switch is done in
  * entry.S
  */
-asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs)
+asmlinkage __visible __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs)
 {
        struct pt_regs *regs = eregs;
        /* Did already sync */
@@ -601,11 +601,11 @@ do_spurious_interrupt_bug(struct pt_regs *regs, long error_code)
 #endif
 }
 
-asmlinkage void __attribute__((weak)) smp_thermal_interrupt(void)
+asmlinkage __visible void __attribute__((weak)) smp_thermal_interrupt(void)
 {
 }
 
-asmlinkage void __attribute__((weak)) smp_threshold_interrupt(void)
+asmlinkage __visible void __attribute__((weak)) smp_threshold_interrupt(void)
 {
 }
 
index 5edc34b..b99b9ad 100644 (file)
@@ -36,7 +36,7 @@ static int irq_routing_comply = 1;
  * and vice versa.
  */
 
-asmlinkage unsigned long vsmp_save_fl(void)
+asmlinkage __visible unsigned long vsmp_save_fl(void)
 {
        unsigned long flags = native_save_fl();
 
@@ -56,7 +56,7 @@ __visible void vsmp_restore_fl(unsigned long flags)
 }
 PV_CALLEE_SAVE_REGS_THUNK(vsmp_restore_fl);
 
-asmlinkage void vsmp_irq_disable(void)
+asmlinkage __visible void vsmp_irq_disable(void)
 {
        unsigned long flags = native_save_fl();
 
@@ -64,7 +64,7 @@ asmlinkage void vsmp_irq_disable(void)
 }
 PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_disable);
 
-asmlinkage void vsmp_irq_enable(void)
+asmlinkage __visible void vsmp_irq_enable(void)
 {
        unsigned long flags = native_save_fl();
 
index f9c6e56..9531fbb 100644 (file)
@@ -43,7 +43,7 @@ void update_vsyscall(struct timekeeper *tk)
        vdata->monotonic_time_sec       = tk->xtime_sec
                                        + tk->wall_to_monotonic.tv_sec;
        vdata->monotonic_time_snsec     = tk->xtime_nsec
-                                       + (tk->wall_to_monotonic.tv_nsec
+                                       + ((u64)tk->wall_to_monotonic.tv_nsec
                                                << tk->shift);
        while (vdata->monotonic_time_snsec >=
                                        (((u64)NSEC_PER_SEC) << tk->shift)) {
index 8b8fc0b..b6c0bac 100644 (file)
@@ -280,7 +280,7 @@ int kvm_set_apic_base(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
 }
 EXPORT_SYMBOL_GPL(kvm_set_apic_base);
 
-asmlinkage void kvm_spurious_fault(void)
+asmlinkage __visible void kvm_spurious_fault(void)
 {
        /* Fault while not rebooting.  We want the trace. */
        BUG();
index ad1fb5f..aae9413 100644 (file)
@@ -233,13 +233,13 @@ static void lguest_end_context_switch(struct task_struct *next)
  * flags word contains all kind of stuff, but in practice Linux only cares
  * about the interrupt flag.  Our "save_flags()" just returns that.
  */
-asmlinkage unsigned long lguest_save_fl(void)
+asmlinkage __visible unsigned long lguest_save_fl(void)
 {
        return lguest_data.irq_enabled;
 }
 
 /* Interrupts go off... */
-asmlinkage void lguest_irq_disable(void)
+asmlinkage __visible void lguest_irq_disable(void)
 {
        lguest_data.irq_enabled = 0;
 }
index db9db44..4362373 100644 (file)
@@ -76,7 +76,7 @@ static inline int __flip_bit(u32 msr, u8 bit, bool set)
        if (m1.q == m.q)
                return 0;
 
-       err = msr_write(msr, &m);
+       err = msr_write(msr, &m1);
        if (err)
                return err;
 
index a544908..9e6545f 100644 (file)
@@ -302,7 +302,7 @@ static struct {
              0x242  in div_Xsig.S
  */
 
-asmlinkage void FPU_exception(int n)
+asmlinkage __visible void FPU_exception(int n)
 {
        int i, int_type;
 
@@ -492,7 +492,7 @@ int real_2op_NaN(FPU_REG const *b, u_char tagb,
 
 /* Invalid arith operation on Valid registers */
 /* Returns < 0 if the exception is unmasked */
-asmlinkage int arith_invalid(int deststnr)
+asmlinkage __visible int arith_invalid(int deststnr)
 {
 
        EXCEPTION(EX_Invalid);
@@ -507,7 +507,7 @@ asmlinkage int arith_invalid(int deststnr)
 }
 
 /* Divide a finite number by zero */
-asmlinkage int FPU_divide_by_zero(int deststnr, u_char sign)
+asmlinkage __visible int FPU_divide_by_zero(int deststnr, u_char sign)
 {
        FPU_REG *dest = &st(deststnr);
        int tag = TAG_Valid;
@@ -539,7 +539,7 @@ int set_precision_flag(int flags)
 }
 
 /* This may be called often, so keep it lean */
-asmlinkage void set_precision_flag_up(void)
+asmlinkage __visible void set_precision_flag_up(void)
 {
        if (control_word & CW_Precision)
                partial_status |= (SW_Precision | SW_C1);       /* The masked response */
@@ -548,7 +548,7 @@ asmlinkage void set_precision_flag_up(void)
 }
 
 /* This may be called often, so keep it lean */
-asmlinkage void set_precision_flag_down(void)
+asmlinkage __visible void set_precision_flag_down(void)
 {
        if (control_word & CW_Precision) {      /* The masked response */
                partial_status &= ~SW_C1;
@@ -557,7 +557,7 @@ asmlinkage void set_precision_flag_down(void)
                EXCEPTION(EX_Precision);
 }
 
-asmlinkage int denormal_operand(void)
+asmlinkage __visible int denormal_operand(void)
 {
        if (control_word & CW_Denormal) {       /* The masked response */
                partial_status |= SW_Denorm_Op;
@@ -568,7 +568,7 @@ asmlinkage int denormal_operand(void)
        }
 }
 
-asmlinkage int arith_overflow(FPU_REG *dest)
+asmlinkage __visible int arith_overflow(FPU_REG *dest)
 {
        int tag = TAG_Valid;
 
@@ -596,7 +596,7 @@ asmlinkage int arith_overflow(FPU_REG *dest)
 
 }
 
-asmlinkage int arith_underflow(FPU_REG *dest)
+asmlinkage __visible int arith_underflow(FPU_REG *dest)
 {
        int tag = TAG_Valid;
 
index 81b506d..5241421 100644 (file)
 
 static const struct font_desc *font;
 static u32 efi_x, efi_y;
+static void *efi_fb;
+static bool early_efi_keep;
 
-static __init void early_efi_clear_scanline(unsigned int y)
+/*
+ * efi earlyprintk need use early_ioremap to map the framebuffer.
+ * But early_ioremap is not usable for earlyprintk=efi,keep, ioremap should
+ * be used instead. ioremap will be available after paging_init() which is
+ * earlier than initcall callbacks. Thus adding this early initcall function
+ * early_efi_map_fb to map the whole efi framebuffer.
+ */
+static __init int early_efi_map_fb(void)
 {
-       unsigned long base, *dst;
-       u16 len;
+       unsigned long base, size;
+
+       if (!early_efi_keep)
+               return 0;
 
        base = boot_params.screen_info.lfb_base;
-       len = boot_params.screen_info.lfb_linelength;
+       size = boot_params.screen_info.lfb_size;
+       efi_fb = ioremap(base, size);
+
+       return efi_fb ? 0 : -ENOMEM;
+}
+early_initcall(early_efi_map_fb);
+
+/*
+ * early_efi_map maps efi framebuffer region [start, start + len -1]
+ * In case earlyprintk=efi,keep we have the whole framebuffer mapped already
+ * so just return the offset efi_fb + start.
+ */
+static __init_refok void *early_efi_map(unsigned long start, unsigned long len)
+{
+       unsigned long base;
+
+       base = boot_params.screen_info.lfb_base;
+
+       if (efi_fb)
+               return (efi_fb + start);
+       else
+               return early_ioremap(base + start, len);
+}
 
-       dst = early_ioremap(base + y*len, len);
+static __init_refok void early_efi_unmap(void *addr, unsigned long len)
+{
+       if (!efi_fb)
+               early_iounmap(addr, len);
+}
+
+static void early_efi_clear_scanline(unsigned int y)
+{
+       unsigned long *dst;
+       u16 len;
+
+       len = boot_params.screen_info.lfb_linelength;
+       dst = early_efi_map(y*len, len);
        if (!dst)
                return;
 
        memset(dst, 0, len);
-       early_iounmap(dst, len);
+       early_efi_unmap(dst, len);
 }
 
-static __init void early_efi_scroll_up(void)
+static void early_efi_scroll_up(void)
 {
-       unsigned long base, *dst, *src;
+       unsigned long *dst, *src;
        u16 len;
        u32 i, height;
 
-       base = boot_params.screen_info.lfb_base;
        len = boot_params.screen_info.lfb_linelength;
        height = boot_params.screen_info.lfb_height;
 
        for (i = 0; i < height - font->height; i++) {
-               dst = early_ioremap(base + i*len, len);
+               dst = early_efi_map(i*len, len);
                if (!dst)
                        return;
 
-               src = early_ioremap(base + (i + font->height) * len, len);
+               src = early_efi_map((i + font->height) * len, len);
                if (!src) {
-                       early_iounmap(dst, len);
+                       early_efi_unmap(dst, len);
                        return;
                }
 
                memmove(dst, src, len);
 
-               early_iounmap(src, len);
-               early_iounmap(dst, len);
+               early_efi_unmap(src, len);
+               early_efi_unmap(dst, len);
        }
 }
 
@@ -79,16 +123,14 @@ static void early_efi_write_char(u32 *dst, unsigned char c, unsigned int h)
        }
 }
 
-static __init void
+static void
 early_efi_write(struct console *con, const char *str, unsigned int num)
 {
        struct screen_info *si;
-       unsigned long base;
        unsigned int len;
        const char *s;
        void *dst;
 
-       base = boot_params.screen_info.lfb_base;
        si = &boot_params.screen_info;
        len = si->lfb_linelength;
 
@@ -109,7 +151,7 @@ early_efi_write(struct console *con, const char *str, unsigned int num)
                for (h = 0; h < font->height; h++) {
                        unsigned int n, x;
 
-                       dst = early_ioremap(base + (efi_y + h) * len, len);
+                       dst = early_efi_map((efi_y + h) * len, len);
                        if (!dst)
                                return;
 
@@ -123,7 +165,7 @@ early_efi_write(struct console *con, const char *str, unsigned int num)
                                s++;
                        }
 
-                       early_iounmap(dst, len);
+                       early_efi_unmap(dst, len);
                }
 
                num -= count;
@@ -179,6 +221,9 @@ static __init int early_efi_setup(struct console *con, char *options)
        for (i = 0; i < (yres - efi_y) / font->height; i++)
                early_efi_scroll_up();
 
+       /* early_console_register will unset CON_BOOT in case ,keep */
+       if (!(con->flags & CON_BOOT))
+               early_efi_keep = true;
        return 0;
 }
 
index ff0174d..a9acde7 100644 (file)
@@ -75,7 +75,7 @@ static int xo1_power_state_enter(suspend_state_t pm_state)
        return 0;
 }
 
-asmlinkage int xo1_do_sleep(u8 sleep_state)
+asmlinkage __visible int xo1_do_sleep(u8 sleep_state)
 {
        void *pgd_addr = __va(read_cr3());
 
index 304fca2..35e2bb6 100644 (file)
@@ -23,7 +23,7 @@
 extern __visible const void __nosave_begin, __nosave_end;
 
 /* Defined in hibernate_asm_64.S */
-extern asmlinkage int restore_image(void);
+extern asmlinkage __visible int restore_image(void);
 
 /*
  * Address to jump to in the last phase of restore in order to get to the image
index 201d09a..c34bfc4 100644 (file)
@@ -1515,7 +1515,7 @@ static void __init xen_pvh_early_guest_init(void)
 }
 
 /* First C function to be called on Xen boot */
-asmlinkage void __init xen_start_kernel(void)
+asmlinkage __visible void __init xen_start_kernel(void)
 {
        struct physdev_set_iopl set_iopl;
        int rc;
index 08f763d..a1207cb 100644 (file)
@@ -23,7 +23,7 @@ void xen_force_evtchn_callback(void)
        (void)HYPERVISOR_xen_version(0, NULL);
 }
 
-asmlinkage unsigned long xen_save_fl(void)
+asmlinkage __visible unsigned long xen_save_fl(void)
 {
        struct vcpu_info *vcpu;
        unsigned long flags;
@@ -63,7 +63,7 @@ __visible void xen_restore_fl(unsigned long flags)
 }
 PV_CALLEE_SAVE_REGS_THUNK(xen_restore_fl);
 
-asmlinkage void xen_irq_disable(void)
+asmlinkage __visible void xen_irq_disable(void)
 {
        /* There's a one instruction preempt window here.  We need to
           make sure we're don't switch CPUs between getting the vcpu
@@ -74,7 +74,7 @@ asmlinkage void xen_irq_disable(void)
 }
 PV_CALLEE_SAVE_REGS_THUNK(xen_irq_disable);
 
-asmlinkage void xen_irq_enable(void)
+asmlinkage __visible void xen_irq_enable(void)
 {
        struct vcpu_info *vcpu;
 
index ec82f6b..108e1ec 100644 (file)
@@ -1954,6 +1954,9 @@ struct drm_i915_cmd_table {
 #define IS_ULT(dev)            (IS_HSW_ULT(dev) || IS_BDW_ULT(dev))
 #define IS_HSW_GT3(dev)                (IS_HASWELL(dev) && \
                                 ((dev)->pdev->device & 0x00F0) == 0x0020)
+/* ULX machines are also considered ULT. */
+#define IS_HSW_ULX(dev)                ((dev)->pdev->device == 0x0A0E || \
+                                (dev)->pdev->device == 0x0A1E)
 #define IS_PRELIMINARY_HW(intel_info) ((intel_info)->is_preliminary)
 
 /*
index 62a5c36..154b0f8 100644 (file)
@@ -34,25 +34,35 @@ static void gen8_setup_private_ppat(struct drm_i915_private *dev_priv);
 
 bool intel_enable_ppgtt(struct drm_device *dev, bool full)
 {
-       if (i915.enable_ppgtt == 0 || !HAS_ALIASING_PPGTT(dev))
+       if (i915.enable_ppgtt == 0)
                return false;
 
        if (i915.enable_ppgtt == 1 && full)
                return false;
 
+       return true;
+}
+
+static int sanitize_enable_ppgtt(struct drm_device *dev, int enable_ppgtt)
+{
+       if (enable_ppgtt == 0 || !HAS_ALIASING_PPGTT(dev))
+               return 0;
+
+       if (enable_ppgtt == 1)
+               return 1;
+
+       if (enable_ppgtt == 2 && HAS_PPGTT(dev))
+               return 2;
+
 #ifdef CONFIG_INTEL_IOMMU
        /* Disable ppgtt on SNB if VT-d is on. */
        if (INTEL_INFO(dev)->gen == 6 && intel_iommu_gfx_mapped) {
                DRM_INFO("Disabling PPGTT because VT-d is on\n");
-               return false;
+               return 0;
        }
 #endif
 
-       /* Full ppgtt disabled by default for now due to issues. */
-       if (full)
-               return HAS_PPGTT(dev) && (i915.enable_ppgtt == 2);
-       else
-               return HAS_ALIASING_PPGTT(dev);
+       return HAS_ALIASING_PPGTT(dev) ? 1 : 0;
 }
 
 #define GEN6_PPGTT_PD_ENTRIES 512
@@ -2031,6 +2041,14 @@ int i915_gem_gtt_init(struct drm_device *dev)
                 gtt->base.total >> 20);
        DRM_DEBUG_DRIVER("GMADR size = %ldM\n", gtt->mappable_end >> 20);
        DRM_DEBUG_DRIVER("GTT stolen size = %zdM\n", gtt->stolen_size >> 20);
+       /*
+        * i915.enable_ppgtt is read-only, so do an early pass to validate the
+        * user's requested state against the hardware/driver capabilities.  We
+        * do this now so that we can print out any log messages once rather
+        * than every time we check intel_enable_ppgtt().
+        */
+       i915.enable_ppgtt = sanitize_enable_ppgtt(dev, i915.enable_ppgtt);
+       DRM_DEBUG_DRIVER("ppgtt mode: %i\n", i915.enable_ppgtt);
 
        return 0;
 }
index 69bcc42..48aa516 100644 (file)
@@ -11395,15 +11395,6 @@ void intel_modeset_init(struct drm_device *dev)
        }
 }
 
-static void
-intel_connector_break_all_links(struct intel_connector *connector)
-{
-       connector->base.dpms = DRM_MODE_DPMS_OFF;
-       connector->base.encoder = NULL;
-       connector->encoder->connectors_active = false;
-       connector->encoder->base.crtc = NULL;
-}
-
 static void intel_enable_pipe_a(struct drm_device *dev)
 {
        struct intel_connector *connector;
@@ -11485,8 +11476,17 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
                        if (connector->encoder->base.crtc != &crtc->base)
                                continue;
 
-                       intel_connector_break_all_links(connector);
+                       connector->base.dpms = DRM_MODE_DPMS_OFF;
+                       connector->base.encoder = NULL;
                }
+               /* multiple connectors may have the same encoder:
+                *  handle them and break crtc link separately */
+               list_for_each_entry(connector, &dev->mode_config.connector_list,
+                                   base.head)
+                       if (connector->encoder->base.crtc == &crtc->base) {
+                               connector->encoder->base.crtc = NULL;
+                               connector->encoder->connectors_active = false;
+                       }
 
                WARN_ON(crtc->active);
                crtc->base.enabled = false;
@@ -11568,6 +11568,8 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
                                      drm_get_encoder_name(&encoder->base));
                        encoder->disable(encoder);
                }
+               encoder->base.crtc = NULL;
+               encoder->connectors_active = false;
 
                /* Inconsistent output/port/pipe state happens presumably due to
                 * a bug in one of the get_hw_state functions. Or someplace else
@@ -11578,8 +11580,8 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder)
                                    base.head) {
                        if (connector->encoder != encoder)
                                continue;
-
-                       intel_connector_break_all_links(connector);
+                       connector->base.dpms = DRM_MODE_DPMS_OFF;
+                       connector->base.encoder = NULL;
                }
        }
        /* Enabled encoders without active connectors will be fixed in
index dfa8528..5ca68aa 100644 (file)
@@ -105,7 +105,8 @@ intel_dp_max_link_bw(struct intel_dp *intel_dp)
        case DP_LINK_BW_2_7:
                break;
        case DP_LINK_BW_5_4: /* 1.2 capable displays may advertise higher bw */
-               if ((IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) &&
+               if (((IS_HASWELL(dev) && !IS_HSW_ULX(dev)) ||
+                    INTEL_INFO(dev)->gen >= 8) &&
                    intel_dp->dpcd[DP_DPCD_REV] >= 0x12)
                        max_link_bw = DP_LINK_BW_5_4;
                else
index 1dc37b1..b0d0fb2 100644 (file)
@@ -863,7 +863,7 @@ gm107_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
        mmio_data(0x003000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
-       mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
+       mmio_data(0x200000, 0x1000, NV_MEM_ACCESS_RW);
 
        mmio_list(0x40800c, 0x00000000,  8, 1);
        mmio_list(0x408010, 0x80000000,  0, 0);
@@ -877,6 +877,8 @@ gm107_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        mmio_list(0x418e24, 0x00000000,  8, 0);
        mmio_list(0x418e28, 0x80000030,  0, 0);
 
+       mmio_list(0x4064c8, 0x018002c0,  0, 0);
+
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
        mmio_list(0x419c2c, 0x10000000, 12, 2);
index fb0b6b2..222e8eb 100644 (file)
@@ -168,7 +168,8 @@ nouveau_bios_shadow_prom(struct nouveau_bios *bios)
         */
        i = 16;
        do {
-               if ((nv_rd32(bios, 0x300000) & 0xffff) == 0xaa55)
+               u32 data = le32_to_cpu(nv_rd32(bios, 0x300000)) & 0xffff;
+               if (data == 0xaa55)
                        break;
        } while (i--);
 
@@ -176,14 +177,15 @@ nouveau_bios_shadow_prom(struct nouveau_bios *bios)
                goto out;
 
        /* read entire bios image to system memory */
-       bios->size = ((nv_rd32(bios, 0x300000) >> 16) & 0xff) * 512;
+       bios->size = (le32_to_cpu(nv_rd32(bios, 0x300000)) >> 16) & 0xff;
+       bios->size = bios->size * 512;
        if (!bios->size)
                goto out;
 
        bios->data = kmalloc(bios->size, GFP_KERNEL);
        if (bios->data) {
-               for (i = 0; i < bios->size; i+=4)
-                       nv_wo32(bios, i, nv_rd32(bios, 0x300000 + i));
+               for (i = 0; i < bios->size; i += 4)
+                       ((u32 *)bios->data)[i/4] = nv_rd32(bios, 0x300000 + i);
        }
 
        /* check the PCI record header */
index 83face3..2792069 100644 (file)
@@ -389,9 +389,6 @@ bool nouveau_acpi_rom_supported(struct pci_dev *pdev)
        acpi_status status;
        acpi_handle dhandle, rom_handle;
 
-       if (!nouveau_dsm_priv.dsm_detected && !nouveau_dsm_priv.optimus_detected)
-               return false;
-
        dhandle = ACPI_HANDLE(&pdev->dev);
        if (!dhandle)
                return false;
index 3ff030d..da764a4 100644 (file)
@@ -764,9 +764,9 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
        }
 
        ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence);
-       mutex_unlock(&chan->cli->mutex);
        if (ret)
                goto fail_unreserve;
+       mutex_unlock(&chan->cli->mutex);
 
        /* Update the crtc struct and cleanup */
        crtc->primary->fb = fb;
index fb187c7..c31c12b 100644 (file)
@@ -1177,27 +1177,43 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,
 
                /* Set NUM_BANKS. */
                if (rdev->family >= CHIP_TAHITI) {
-                       unsigned tileb, index, num_banks, tile_split_bytes;
+                       unsigned index, num_banks;
 
-                       /* Calculate the macrotile mode index. */
-                       tile_split_bytes = 64 << tile_split;
-                       tileb = 8 * 8 * target_fb->bits_per_pixel / 8;
-                       tileb = min(tile_split_bytes, tileb);
+                       if (rdev->family >= CHIP_BONAIRE) {
+                               unsigned tileb, tile_split_bytes;
 
-                       for (index = 0; tileb > 64; index++) {
-                               tileb >>= 1;
-                       }
+                               /* Calculate the macrotile mode index. */
+                               tile_split_bytes = 64 << tile_split;
+                               tileb = 8 * 8 * target_fb->bits_per_pixel / 8;
+                               tileb = min(tile_split_bytes, tileb);
 
-                       if (index >= 16) {
-                               DRM_ERROR("Wrong screen bpp (%u) or tile split (%u)\n",
-                                         target_fb->bits_per_pixel, tile_split);
-                               return -EINVAL;
-                       }
+                               for (index = 0; tileb > 64; index++)
+                                       tileb >>= 1;
+
+                               if (index >= 16) {
+                                       DRM_ERROR("Wrong screen bpp (%u) or tile split (%u)\n",
+                                                 target_fb->bits_per_pixel, tile_split);
+                                       return -EINVAL;
+                               }
 
-                       if (rdev->family >= CHIP_BONAIRE)
                                num_banks = (rdev->config.cik.macrotile_mode_array[index] >> 6) & 0x3;
-                       else
+                       } else {
+                               switch (target_fb->bits_per_pixel) {
+                               case 8:
+                                       index = 10;
+                                       break;
+                               case 16:
+                                       index = SI_TILE_MODE_COLOR_2D_SCANOUT_16BPP;
+                                       break;
+                               default:
+                               case 32:
+                                       index = SI_TILE_MODE_COLOR_2D_SCANOUT_32BPP;
+                                       break;
+                               }
+
                                num_banks = (rdev->config.si.tile_mode_array[index] >> 20) & 0x3;
+                       }
+
                        fb_format |= EVERGREEN_GRPH_NUM_BANKS(num_banks);
                } else {
                        /* NI and older. */
@@ -1720,8 +1736,9 @@ static int radeon_atom_pick_pll(struct drm_crtc *crtc)
                }
                /* otherwise, pick one of the plls */
                if ((rdev->family == CHIP_KAVERI) ||
-                   (rdev->family == CHIP_KABINI)) {
-                       /* KB/KV has PPLL1 and PPLL2 */
+                   (rdev->family == CHIP_KABINI) ||
+                   (rdev->family == CHIP_MULLINS)) {
+                       /* KB/KV/ML has PPLL1 and PPLL2 */
                        pll_in_use = radeon_get_pll_use_mask(crtc);
                        if (!(pll_in_use & (1 << ATOM_PPLL2)))
                                return ATOM_PPLL2;
@@ -1885,6 +1902,9 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc,
            (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))
                is_tvcv = true;
 
+       if (!radeon_crtc->adjusted_clock)
+               return -EINVAL;
+
        atombios_crtc_set_pll(crtc, adjusted_mode);
 
        if (ASIC_IS_DCE4(rdev))
index bc0119f..54e4f52 100644 (file)
@@ -366,11 +366,11 @@ static void radeon_dp_probe_oui(struct radeon_connector *radeon_connector)
        if (!(dig_connector->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT))
                return;
 
-       if (drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_SINK_OUI, buf, 3))
+       if (drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_SINK_OUI, buf, 3) == 3)
                DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n",
                              buf[0], buf[1], buf[2]);
 
-       if (drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_BRANCH_OUI, buf, 3))
+       if (drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_BRANCH_OUI, buf, 3) == 3)
                DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n",
                              buf[0], buf[1], buf[2]);
 }
@@ -419,21 +419,23 @@ int radeon_dp_get_panel_mode(struct drm_encoder *encoder,
 
        if (dp_bridge != ENCODER_OBJECT_ID_NONE) {
                /* DP bridge chips */
-               drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
-                                 DP_EDP_CONFIGURATION_CAP, &tmp);
-               if (tmp & 1)
-                       panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
-               else if ((dp_bridge == ENCODER_OBJECT_ID_NUTMEG) ||
-                        (dp_bridge == ENCODER_OBJECT_ID_TRAVIS))
-                       panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
-               else
-                       panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
+               if (drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
+                                     DP_EDP_CONFIGURATION_CAP, &tmp) == 1) {
+                       if (tmp & 1)
+                               panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
+                       else if ((dp_bridge == ENCODER_OBJECT_ID_NUTMEG) ||
+                                (dp_bridge == ENCODER_OBJECT_ID_TRAVIS))
+                               panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE;
+                       else
+                               panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE;
+               }
        } else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
                /* eDP */
-               drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
-                                 DP_EDP_CONFIGURATION_CAP, &tmp);
-               if (tmp & 1)
-                       panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
+               if (drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux,
+                                     DP_EDP_CONFIGURATION_CAP, &tmp) == 1) {
+                       if (tmp & 1)
+                               panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE;
+               }
        }
 
        return panel_mode;
@@ -809,11 +811,15 @@ void radeon_dp_link_train(struct drm_encoder *encoder,
        else
                dp_info.enc_id |= ATOM_DP_CONFIG_LINK_A;
 
-       drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux, DP_MAX_LANE_COUNT, &tmp);
-       if (ASIC_IS_DCE5(rdev) && (tmp & DP_TPS3_SUPPORTED))
-               dp_info.tp3_supported = true;
-       else
+       if (drm_dp_dpcd_readb(&radeon_connector->ddc_bus->aux, DP_MAX_LANE_COUNT, &tmp)
+           == 1) {
+               if (ASIC_IS_DCE5(rdev) && (tmp & DP_TPS3_SUPPORTED))
+                       dp_info.tp3_supported = true;
+               else
+                       dp_info.tp3_supported = false;
+       } else {
                dp_info.tp3_supported = false;
+       }
 
        memcpy(dp_info.dpcd, dig_connector->dpcd, DP_RECEIVER_CAP_SIZE);
        dp_info.rdev = rdev;
index 199eb19..d2fd989 100644 (file)
@@ -63,6 +63,12 @@ MODULE_FIRMWARE("radeon/KABINI_ce.bin");
 MODULE_FIRMWARE("radeon/KABINI_mec.bin");
 MODULE_FIRMWARE("radeon/KABINI_rlc.bin");
 MODULE_FIRMWARE("radeon/KABINI_sdma.bin");
+MODULE_FIRMWARE("radeon/MULLINS_pfp.bin");
+MODULE_FIRMWARE("radeon/MULLINS_me.bin");
+MODULE_FIRMWARE("radeon/MULLINS_ce.bin");
+MODULE_FIRMWARE("radeon/MULLINS_mec.bin");
+MODULE_FIRMWARE("radeon/MULLINS_rlc.bin");
+MODULE_FIRMWARE("radeon/MULLINS_sdma.bin");
 
 extern int r600_ih_ring_alloc(struct radeon_device *rdev);
 extern void r600_ih_ring_fini(struct radeon_device *rdev);
@@ -1473,6 +1479,43 @@ static const u32 hawaii_mgcg_cgcg_init[] =
        0xd80c, 0xff000ff0, 0x00000100
 };
 
+static const u32 godavari_golden_registers[] =
+{
+       0x55e4, 0xff607fff, 0xfc000100,
+       0x6ed8, 0x00010101, 0x00010000,
+       0x9830, 0xffffffff, 0x00000000,
+       0x98302, 0xf00fffff, 0x00000400,
+       0x6130, 0xffffffff, 0x00010000,
+       0x5bb0, 0x000000f0, 0x00000070,
+       0x5bc0, 0xf0311fff, 0x80300000,
+       0x98f8, 0x73773777, 0x12010001,
+       0x98fc, 0xffffffff, 0x00000010,
+       0x8030, 0x00001f0f, 0x0000100a,
+       0x2f48, 0x73773777, 0x12010001,
+       0x2408, 0x000fffff, 0x000c007f,
+       0x8a14, 0xf000003f, 0x00000007,
+       0x8b24, 0xffffffff, 0x00ff0fff,
+       0x30a04, 0x0000ff0f, 0x00000000,
+       0x28a4c, 0x07ffffff, 0x06000000,
+       0x4d8, 0x00000fff, 0x00000100,
+       0xd014, 0x00010000, 0x00810001,
+       0xd814, 0x00010000, 0x00810001,
+       0x3e78, 0x00000001, 0x00000002,
+       0xc768, 0x00000008, 0x00000008,
+       0xc770, 0x00000f00, 0x00000800,
+       0xc774, 0x00000f00, 0x00000800,
+       0xc798, 0x00ffffff, 0x00ff7fbf,
+       0xc79c, 0x00ffffff, 0x00ff7faf,
+       0x8c00, 0x000000ff, 0x00000001,
+       0x214f8, 0x01ff01ff, 0x00000002,
+       0x21498, 0x007ff800, 0x00200000,
+       0x2015c, 0xffffffff, 0x00000f40,
+       0x88c4, 0x001f3ae3, 0x00000082,
+       0x88d4, 0x0000001f, 0x00000010,
+       0x30934, 0xffffffff, 0x00000000
+};
+
+
 static void cik_init_golden_registers(struct radeon_device *rdev)
 {
        switch (rdev->family) {
@@ -1504,6 +1547,20 @@ static void cik_init_golden_registers(struct radeon_device *rdev)
                                                 kalindi_golden_spm_registers,
                                                 (const u32)ARRAY_SIZE(kalindi_golden_spm_registers));
                break;
+       case CHIP_MULLINS:
+               radeon_program_register_sequence(rdev,
+                                                kalindi_mgcg_cgcg_init,
+                                                (const u32)ARRAY_SIZE(kalindi_mgcg_cgcg_init));
+               radeon_program_register_sequence(rdev,
+                                                godavari_golden_registers,
+                                                (const u32)ARRAY_SIZE(godavari_golden_registers));
+               radeon_program_register_sequence(rdev,
+                                                kalindi_golden_common_registers,
+                                                (const u32)ARRAY_SIZE(kalindi_golden_common_registers));
+               radeon_program_register_sequence(rdev,
+                                                kalindi_golden_spm_registers,
+                                                (const u32)ARRAY_SIZE(kalindi_golden_spm_registers));
+               break;
        case CHIP_KAVERI:
                radeon_program_register_sequence(rdev,
                                                 spectre_mgcg_cgcg_init,
@@ -1834,6 +1891,15 @@ static int cik_init_microcode(struct radeon_device *rdev)
                rlc_req_size = KB_RLC_UCODE_SIZE * 4;
                sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
                break;
+       case CHIP_MULLINS:
+               chip_name = "MULLINS";
+               pfp_req_size = CIK_PFP_UCODE_SIZE * 4;
+               me_req_size = CIK_ME_UCODE_SIZE * 4;
+               ce_req_size = CIK_CE_UCODE_SIZE * 4;
+               mec_req_size = CIK_MEC_UCODE_SIZE * 4;
+               rlc_req_size = ML_RLC_UCODE_SIZE * 4;
+               sdma_req_size = CIK_SDMA_UCODE_SIZE * 4;
+               break;
        default: BUG();
        }
 
@@ -3272,6 +3338,7 @@ static void cik_gpu_init(struct radeon_device *rdev)
                gb_addr_config = BONAIRE_GB_ADDR_CONFIG_GOLDEN;
                break;
        case CHIP_KABINI:
+       case CHIP_MULLINS:
        default:
                rdev->config.cik.max_shader_engines = 1;
                rdev->config.cik.max_tile_pipes = 2;
@@ -3702,6 +3769,7 @@ int cik_copy_cpdma(struct radeon_device *rdev,
        r = radeon_fence_emit(rdev, fence, ring->idx);
        if (r) {
                radeon_ring_unlock_undo(rdev, ring);
+               radeon_semaphore_free(rdev, &sem, NULL);
                return r;
        }
 
@@ -5800,6 +5868,9 @@ static int cik_rlc_resume(struct radeon_device *rdev)
        case CHIP_KABINI:
                size = KB_RLC_UCODE_SIZE;
                break;
+       case CHIP_MULLINS:
+               size = ML_RLC_UCODE_SIZE;
+               break;
        }
 
        cik_rlc_stop(rdev);
@@ -6548,6 +6619,7 @@ void cik_get_csb_buffer(struct radeon_device *rdev, volatile u32 *buffer)
                buffer[count++] = cpu_to_le32(0x00000000);
                break;
        case CHIP_KABINI:
+       case CHIP_MULLINS:
                buffer[count++] = cpu_to_le32(0x00000000); /* XXX */
                buffer[count++] = cpu_to_le32(0x00000000);
                break;
@@ -6693,6 +6765,19 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev)
                WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
                WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
        }
+       /* pflip */
+       if (rdev->num_crtc >= 2) {
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
+       }
+       if (rdev->num_crtc >= 4) {
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0);
+       }
+       if (rdev->num_crtc >= 6) {
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0);
+       }
 
        /* dac hotplug */
        WREG32(DAC_AUTODETECT_INT_CONTROL, 0);
@@ -7049,6 +7134,25 @@ int cik_irq_set(struct radeon_device *rdev)
                WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
        }
 
+       if (rdev->num_crtc >= 2) {
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+       }
+       if (rdev->num_crtc >= 4) {
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+       }
+       if (rdev->num_crtc >= 6) {
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+       }
+
        WREG32(DC_HPD1_INT_CONTROL, hpd1);
        WREG32(DC_HPD2_INT_CONTROL, hpd2);
        WREG32(DC_HPD3_INT_CONTROL, hpd3);
@@ -7085,6 +7189,29 @@ static inline void cik_irq_ack(struct radeon_device *rdev)
        rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5);
        rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6);
 
+       rdev->irq.stat_regs.cik.d1grph_int = RREG32(GRPH_INT_STATUS +
+               EVERGREEN_CRTC0_REGISTER_OFFSET);
+       rdev->irq.stat_regs.cik.d2grph_int = RREG32(GRPH_INT_STATUS +
+               EVERGREEN_CRTC1_REGISTER_OFFSET);
+       if (rdev->num_crtc >= 4) {
+               rdev->irq.stat_regs.cik.d3grph_int = RREG32(GRPH_INT_STATUS +
+                       EVERGREEN_CRTC2_REGISTER_OFFSET);
+               rdev->irq.stat_regs.cik.d4grph_int = RREG32(GRPH_INT_STATUS +
+                       EVERGREEN_CRTC3_REGISTER_OFFSET);
+       }
+       if (rdev->num_crtc >= 6) {
+               rdev->irq.stat_regs.cik.d5grph_int = RREG32(GRPH_INT_STATUS +
+                       EVERGREEN_CRTC4_REGISTER_OFFSET);
+               rdev->irq.stat_regs.cik.d6grph_int = RREG32(GRPH_INT_STATUS +
+                       EVERGREEN_CRTC5_REGISTER_OFFSET);
+       }
+
+       if (rdev->irq.stat_regs.cik.d1grph_int & GRPH_PFLIP_INT_OCCURRED)
+               WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_CLEAR);
+       if (rdev->irq.stat_regs.cik.d2grph_int & GRPH_PFLIP_INT_OCCURRED)
+               WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_CLEAR);
        if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT)
                WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK);
        if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT)
@@ -7095,6 +7222,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev)
                WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK);
 
        if (rdev->num_crtc >= 4) {
+               if (rdev->irq.stat_regs.cik.d3grph_int & GRPH_PFLIP_INT_OCCURRED)
+                       WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET,
+                              GRPH_PFLIP_INT_CLEAR);
+               if (rdev->irq.stat_regs.cik.d4grph_int & GRPH_PFLIP_INT_OCCURRED)
+                       WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET,
+                              GRPH_PFLIP_INT_CLEAR);
                if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT)
                        WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK);
                if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT)
@@ -7106,6 +7239,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev)
        }
 
        if (rdev->num_crtc >= 6) {
+               if (rdev->irq.stat_regs.cik.d5grph_int & GRPH_PFLIP_INT_OCCURRED)
+                       WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET,
+                              GRPH_PFLIP_INT_CLEAR);
+               if (rdev->irq.stat_regs.cik.d6grph_int & GRPH_PFLIP_INT_OCCURRED)
+                       WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET,
+                              GRPH_PFLIP_INT_CLEAR);
                if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT)
                        WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK);
                if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT)
@@ -7457,6 +7596,15 @@ restart_ih:
                                break;
                        }
                        break;
+               case 8: /* D1 page flip */
+               case 10: /* D2 page flip */
+               case 12: /* D3 page flip */
+               case 14: /* D4 page flip */
+               case 16: /* D5 page flip */
+               case 18: /* D6 page flip */
+                       DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
+                       radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
+                       break;
                case 42: /* HPD hotplug */
                        switch (src_data) {
                        case 0:
index f7e46cf..72e464c 100644 (file)
@@ -562,6 +562,7 @@ int cik_copy_dma(struct radeon_device *rdev,
        r = radeon_fence_emit(rdev, fence, ring->idx);
        if (r) {
                radeon_ring_unlock_undo(rdev, ring);
+               radeon_semaphore_free(rdev, &sem, NULL);
                return r;
        }
 
index 2138732..dd79263 100644 (file)
 #       define DC_HPD6_RX_INTERRUPT                     (1 << 18)
 #define DISP_INTERRUPT_STATUS_CONTINUE6                 0x6780
 
+/* 0x6858, 0x7458, 0x10058, 0x10c58, 0x11858, 0x12458 */
+#define GRPH_INT_STATUS                                 0x6858
+#       define GRPH_PFLIP_INT_OCCURRED                  (1 << 0)
+#       define GRPH_PFLIP_INT_CLEAR                     (1 << 8)
+/* 0x685c, 0x745c, 0x1005c, 0x10c5c, 0x1185c, 0x1245c */
+#define GRPH_INT_CONTROL                                0x685c
+#       define GRPH_PFLIP_INT_MASK                      (1 << 0)
+#       define GRPH_PFLIP_INT_TYPE                      (1 << 8)
+
 #define        DAC_AUTODETECT_INT_CONTROL                      0x67c8
 
 #define DC_HPD1_INT_STATUS                              0x601c
index b406546..0f7a51a 100644 (file)
@@ -4371,7 +4371,6 @@ int evergreen_irq_set(struct radeon_device *rdev)
        u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
        u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
        u32 grbm_int_cntl = 0;
-       u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0;
        u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0;
        u32 dma_cntl, dma_cntl1 = 0;
        u32 thermal_int = 0;
@@ -4554,15 +4553,21 @@ int evergreen_irq_set(struct radeon_device *rdev)
                WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6);
        }
 
-       WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1);
-       WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2);
+       WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
+              GRPH_PFLIP_INT_MASK);
+       WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
+              GRPH_PFLIP_INT_MASK);
        if (rdev->num_crtc >= 4) {
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3);
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
        }
        if (rdev->num_crtc >= 6) {
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5);
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
        }
 
        WREG32(DC_HPD1_INT_CONTROL, hpd1);
@@ -4951,6 +4956,15 @@ restart_ih:
                                break;
                        }
                        break;
+               case 8: /* D1 page flip */
+               case 10: /* D2 page flip */
+               case 12: /* D3 page flip */
+               case 14: /* D4 page flip */
+               case 16: /* D5 page flip */
+               case 18: /* D6 page flip */
+                       DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
+                       radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
+                       break;
                case 42: /* HPD hotplug */
                        switch (src_data) {
                        case 0:
index 287fe96..478caef 100644 (file)
@@ -151,6 +151,7 @@ int evergreen_copy_dma(struct radeon_device *rdev,
        r = radeon_fence_emit(rdev, fence, ring->idx);
        if (r) {
                radeon_ring_unlock_undo(rdev, ring);
+               radeon_semaphore_free(rdev, &sem, NULL);
                return r;
        }
 
index 16ec9d5..3f6e817 100644 (file)
@@ -546,6 +546,52 @@ static int kv_set_divider_value(struct radeon_device *rdev,
        return 0;
 }
 
+static u32 kv_convert_vid2_to_vid7(struct radeon_device *rdev,
+                                  struct sumo_vid_mapping_table *vid_mapping_table,
+                                  u32 vid_2bit)
+{
+       struct radeon_clock_voltage_dependency_table *vddc_sclk_table =
+               &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
+       u32 i;
+
+       if (vddc_sclk_table && vddc_sclk_table->count) {
+               if (vid_2bit < vddc_sclk_table->count)
+                       return vddc_sclk_table->entries[vid_2bit].v;
+               else
+                       return vddc_sclk_table->entries[vddc_sclk_table->count - 1].v;
+       } else {
+               for (i = 0; i < vid_mapping_table->num_entries; i++) {
+                       if (vid_mapping_table->entries[i].vid_2bit == vid_2bit)
+                               return vid_mapping_table->entries[i].vid_7bit;
+               }
+               return vid_mapping_table->entries[vid_mapping_table->num_entries - 1].vid_7bit;
+       }
+}
+
+static u32 kv_convert_vid7_to_vid2(struct radeon_device *rdev,
+                                  struct sumo_vid_mapping_table *vid_mapping_table,
+                                  u32 vid_7bit)
+{
+       struct radeon_clock_voltage_dependency_table *vddc_sclk_table =
+               &rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk;
+       u32 i;
+
+       if (vddc_sclk_table && vddc_sclk_table->count) {
+               for (i = 0; i < vddc_sclk_table->count; i++) {
+                       if (vddc_sclk_table->entries[i].v == vid_7bit)
+                               return i;
+               }
+               return vddc_sclk_table->count - 1;
+       } else {
+               for (i = 0; i < vid_mapping_table->num_entries; i++) {
+                       if (vid_mapping_table->entries[i].vid_7bit == vid_7bit)
+                               return vid_mapping_table->entries[i].vid_2bit;
+               }
+
+               return vid_mapping_table->entries[vid_mapping_table->num_entries - 1].vid_2bit;
+       }
+}
+
 static u16 kv_convert_8bit_index_to_voltage(struct radeon_device *rdev,
                                            u16 voltage)
 {
@@ -556,9 +602,9 @@ static u16 kv_convert_2bit_index_to_voltage(struct radeon_device *rdev,
                                            u32 vid_2bit)
 {
        struct kv_power_info *pi = kv_get_pi(rdev);
-       u32 vid_8bit = sumo_convert_vid2_to_vid7(rdev,
-                                                &pi->sys_info.vid_mapping_table,
-                                                vid_2bit);
+       u32 vid_8bit = kv_convert_vid2_to_vid7(rdev,
+                                              &pi->sys_info.vid_mapping_table,
+                                              vid_2bit);
 
        return kv_convert_8bit_index_to_voltage(rdev, (u16)vid_8bit);
 }
@@ -639,7 +685,7 @@ static int kv_force_lowest_valid(struct radeon_device *rdev)
 
 static int kv_unforce_levels(struct radeon_device *rdev)
 {
-       if (rdev->family == CHIP_KABINI)
+       if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS)
                return kv_notify_message_to_smu(rdev, PPSMC_MSG_NoForcedLevel);
        else
                return kv_set_enabled_levels(rdev);
@@ -1362,13 +1408,20 @@ static int kv_update_uvd_dpm(struct radeon_device *rdev, bool gate)
        struct radeon_uvd_clock_voltage_dependency_table *table =
                &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table;
        int ret;
+       u32 mask;
 
        if (!gate) {
-               if (!pi->caps_uvd_dpm || table->count || pi->caps_stable_p_state)
+               if (table->count)
                        pi->uvd_boot_level = table->count - 1;
                else
                        pi->uvd_boot_level = 0;
 
+               if (!pi->caps_uvd_dpm || pi->caps_stable_p_state) {
+                       mask = 1 << pi->uvd_boot_level;
+               } else {
+                       mask = 0x1f;
+               }
+
                ret = kv_copy_bytes_to_smc(rdev,
                                           pi->dpm_table_start +
                                           offsetof(SMU7_Fusion_DpmTable, UvdBootLevel),
@@ -1377,11 +1430,9 @@ static int kv_update_uvd_dpm(struct radeon_device *rdev, bool gate)
                if (ret)
                        return ret;
 
-               if (!pi->caps_uvd_dpm ||
-                   pi->caps_stable_p_state)
-                       kv_send_msg_to_smc_with_parameter(rdev,
-                                                         PPSMC_MSG_UVDDPM_SetEnabledMask,
-                                                         (1 << pi->uvd_boot_level));
+               kv_send_msg_to_smc_with_parameter(rdev,
+                                                 PPSMC_MSG_UVDDPM_SetEnabledMask,
+                                                 mask);
        }
 
        return kv_enable_uvd_dpm(rdev, !gate);
@@ -1617,7 +1668,7 @@ static void kv_dpm_powergate_acp(struct radeon_device *rdev, bool gate)
        if (pi->acp_power_gated == gate)
                return;
 
-       if (rdev->family == CHIP_KABINI)
+       if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS)
                return;
 
        pi->acp_power_gated = gate;
@@ -1786,7 +1837,7 @@ int kv_dpm_set_power_state(struct radeon_device *rdev)
                }
        }
 
-       if (rdev->family == CHIP_KABINI) {
+       if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) {
                if (pi->enable_dpm) {
                        kv_set_valid_clock_range(rdev, new_ps);
                        kv_update_dfs_bypass_settings(rdev, new_ps);
@@ -1812,6 +1863,8 @@ int kv_dpm_set_power_state(struct radeon_device *rdev)
                                return ret;
                        }
                        kv_update_sclk_t(rdev);
+                       if (rdev->family == CHIP_MULLINS)
+                               kv_enable_nb_dpm(rdev);
                }
        } else {
                if (pi->enable_dpm) {
@@ -1862,7 +1915,7 @@ void kv_dpm_reset_asic(struct radeon_device *rdev)
 {
        struct kv_power_info *pi = kv_get_pi(rdev);
 
-       if (rdev->family == CHIP_KABINI) {
+       if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) {
                kv_force_lowest_valid(rdev);
                kv_init_graphics_levels(rdev);
                kv_program_bootup_state(rdev);
@@ -1901,14 +1954,41 @@ static void kv_construct_max_power_limits_table(struct radeon_device *rdev,
 static void kv_patch_voltage_values(struct radeon_device *rdev)
 {
        int i;
-       struct radeon_uvd_clock_voltage_dependency_table *table =
+       struct radeon_uvd_clock_voltage_dependency_table *uvd_table =
                &rdev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table;
+       struct radeon_vce_clock_voltage_dependency_table *vce_table =
+               &rdev->pm.dpm.dyn_state.vce_clock_voltage_dependency_table;
+       struct radeon_clock_voltage_dependency_table *samu_table =
+               &rdev->pm.dpm.dyn_state.samu_clock_voltage_dependency_table;
+       struct radeon_clock_voltage_dependency_table *acp_table =
+               &rdev->pm.dpm.dyn_state.acp_clock_voltage_dependency_table;
 
-       if (table->count) {
-               for (i = 0; i < table->count; i++)
-                       table->entries[i].v =
+       if (uvd_table->count) {
+               for (i = 0; i < uvd_table->count; i++)
+                       uvd_table->entries[i].v =
                                kv_convert_8bit_index_to_voltage(rdev,
-                                                                table->entries[i].v);
+                                                                uvd_table->entries[i].v);
+       }
+
+       if (vce_table->count) {
+               for (i = 0; i < vce_table->count; i++)
+                       vce_table->entries[i].v =
+                               kv_convert_8bit_index_to_voltage(rdev,
+                                                                vce_table->entries[i].v);
+       }
+
+       if (samu_table->count) {
+               for (i = 0; i < samu_table->count; i++)
+                       samu_table->entries[i].v =
+                               kv_convert_8bit_index_to_voltage(rdev,
+                                                                samu_table->entries[i].v);
+       }
+
+       if (acp_table->count) {
+               for (i = 0; i < acp_table->count; i++)
+                       acp_table->entries[i].v =
+                               kv_convert_8bit_index_to_voltage(rdev,
+                                                                acp_table->entries[i].v);
        }
 
 }
@@ -1941,7 +2021,7 @@ static int kv_force_dpm_highest(struct radeon_device *rdev)
                        break;
        }
 
-       if (rdev->family == CHIP_KABINI)
+       if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS)
                return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i);
        else
                return kv_set_enabled_level(rdev, i);
@@ -1961,7 +2041,7 @@ static int kv_force_dpm_lowest(struct radeon_device *rdev)
                        break;
        }
 
-       if (rdev->family == CHIP_KABINI)
+       if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS)
                return kv_send_msg_to_smc_with_parameter(rdev, PPSMC_MSG_DPM_ForceState, i);
        else
                return kv_set_enabled_level(rdev, i);
@@ -2118,7 +2198,7 @@ static void kv_apply_state_adjust_rules(struct radeon_device *rdev,
        else
                pi->battery_state = false;
 
-       if (rdev->family == CHIP_KABINI) {
+       if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) {
                ps->dpm0_pg_nb_ps_lo = 0x1;
                ps->dpm0_pg_nb_ps_hi = 0x0;
                ps->dpmx_nb_ps_lo = 0x1;
@@ -2179,7 +2259,7 @@ static int kv_calculate_nbps_level_settings(struct radeon_device *rdev)
        if (pi->lowest_valid > pi->highest_valid)
                return -EINVAL;
 
-       if (rdev->family == CHIP_KABINI) {
+       if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS) {
                for (i = pi->lowest_valid; i <= pi->highest_valid; i++) {
                        pi->graphics_level[i].GnbSlow = 1;
                        pi->graphics_level[i].ForceNbPs1 = 0;
@@ -2253,9 +2333,9 @@ static void kv_init_graphics_levels(struct radeon_device *rdev)
                                break;
 
                        kv_set_divider_value(rdev, i, table->entries[i].clk);
-                       vid_2bit = sumo_convert_vid7_to_vid2(rdev,
-                                                            &pi->sys_info.vid_mapping_table,
-                                                            table->entries[i].v);
+                       vid_2bit = kv_convert_vid7_to_vid2(rdev,
+                                                          &pi->sys_info.vid_mapping_table,
+                                                          table->entries[i].v);
                        kv_set_vid(rdev, i, vid_2bit);
                        kv_set_at(rdev, i, pi->at[i]);
                        kv_dpm_power_level_enabled_for_throttle(rdev, i, true);
@@ -2324,7 +2404,7 @@ static void kv_program_nbps_index_settings(struct radeon_device *rdev,
        struct kv_power_info *pi = kv_get_pi(rdev);
        u32 nbdpmconfig1;
 
-       if (rdev->family == CHIP_KABINI)
+       if (rdev->family == CHIP_KABINI || rdev->family == CHIP_MULLINS)
                return;
 
        if (pi->sys_info.nb_dpm_enable) {
@@ -2631,9 +2711,6 @@ int kv_dpm_init(struct radeon_device *rdev)
 
         pi->sram_end = SMC_RAM_END;
 
-       if (rdev->family == CHIP_KABINI)
-               pi->high_voltage_t = 4001;
-
        pi->enable_nb_dpm = true;
 
        pi->caps_power_containment = true;
index 6e887d0..bbc189f 100644 (file)
@@ -2839,6 +2839,7 @@ int r600_copy_cpdma(struct radeon_device *rdev,
        r = radeon_fence_emit(rdev, fence, ring->idx);
        if (r) {
                radeon_ring_unlock_undo(rdev, ring);
+               radeon_semaphore_free(rdev, &sem, NULL);
                return r;
        }
 
@@ -3505,7 +3506,6 @@ int r600_irq_set(struct radeon_device *rdev)
        u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0;
        u32 grbm_int_cntl = 0;
        u32 hdmi0, hdmi1;
-       u32 d1grph = 0, d2grph = 0;
        u32 dma_cntl;
        u32 thermal_int = 0;
 
@@ -3614,8 +3614,8 @@ int r600_irq_set(struct radeon_device *rdev)
        WREG32(CP_INT_CNTL, cp_int_cntl);
        WREG32(DMA_CNTL, dma_cntl);
        WREG32(DxMODE_INT_MASK, mode_int);
-       WREG32(D1GRPH_INTERRUPT_CONTROL, d1grph);
-       WREG32(D2GRPH_INTERRUPT_CONTROL, d2grph);
+       WREG32(D1GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK);
+       WREG32(D2GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK);
        WREG32(GRBM_INT_CNTL, grbm_int_cntl);
        if (ASIC_IS_DCE3(rdev)) {
                WREG32(DC_HPD1_INT_CONTROL, hpd1);
@@ -3918,6 +3918,14 @@ restart_ih:
                                break;
                        }
                        break;
+               case 9: /* D1 pflip */
+                       DRM_DEBUG("IH: D1 flip\n");
+                       radeon_crtc_handle_flip(rdev, 0);
+                       break;
+               case 11: /* D2 pflip */
+                       DRM_DEBUG("IH: D2 flip\n");
+                       radeon_crtc_handle_flip(rdev, 1);
+                       break;
                case 19: /* HPD/DAC hotplug */
                        switch (src_data) {
                        case 0:
index 53fcb28..4969cef 100644 (file)
@@ -489,6 +489,7 @@ int r600_copy_dma(struct radeon_device *rdev,
        r = radeon_fence_emit(rdev, fence, ring->idx);
        if (r) {
                radeon_ring_unlock_undo(rdev, ring);
+               radeon_semaphore_free(rdev, &sem, NULL);
                return r;
        }
 
index b58e1af..6852861 100644 (file)
@@ -730,6 +730,12 @@ struct cik_irq_stat_regs {
        u32 disp_int_cont4;
        u32 disp_int_cont5;
        u32 disp_int_cont6;
+       u32 d1grph_int;
+       u32 d2grph_int;
+       u32 d3grph_int;
+       u32 d4grph_int;
+       u32 d5grph_int;
+       u32 d6grph_int;
 };
 
 union radeon_irq_stat_regs {
index b8a24a7..be20e62 100644 (file)
@@ -2516,6 +2516,7 @@ int radeon_asic_init(struct radeon_device *rdev)
                break;
        case CHIP_KAVERI:
        case CHIP_KABINI:
+       case CHIP_MULLINS:
                rdev->asic = &kv_asic;
                /* set num crtcs */
                if (rdev->family == CHIP_KAVERI) {
index 511fe26..0e770bb 100644 (file)
@@ -99,6 +99,7 @@ static const char radeon_family_name[][16] = {
        "KAVERI",
        "KABINI",
        "HAWAII",
+       "MULLINS",
        "LAST",
 };
 
index 8d99d5e..408b6ac 100644 (file)
@@ -284,6 +284,10 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id)
        u32 update_pending;
        int vpos, hpos;
 
+       /* can happen during initialization */
+       if (radeon_crtc == NULL)
+               return;
+
        spin_lock_irqsave(&rdev->ddev->event_lock, flags);
        work = radeon_crtc->unpin_work;
        if (work == NULL ||
@@ -826,14 +830,14 @@ static void avivo_reduce_ratio(unsigned *nom, unsigned *den,
 
        /* make sure nominator is large enough */
         if (*nom < nom_min) {
-               tmp = (nom_min + *nom - 1) / *nom;
+               tmp = DIV_ROUND_UP(nom_min, *nom);
                *nom *= tmp;
                *den *= tmp;
        }
 
        /* make sure the denominator is large enough */
        if (*den < den_min) {
-               tmp = (den_min + *den - 1) / *den;
+               tmp = DIV_ROUND_UP(den_min, *den);
                *nom *= tmp;
                *den *= tmp;
        }
@@ -858,7 +862,7 @@ static void avivo_get_fb_ref_div(unsigned nom, unsigned den, unsigned post_div,
                                 unsigned *fb_div, unsigned *ref_div)
 {
        /* limit reference * post divider to a maximum */
-       ref_div_max = min(210 / post_div, ref_div_max);
+       ref_div_max = min(128 / post_div, ref_div_max);
 
        /* get matching reference and feedback divider */
        *ref_div = min(max(DIV_ROUND_CLOSEST(den, post_div), 1u), ref_div_max);
@@ -993,6 +997,16 @@ void radeon_compute_pll_avivo(struct radeon_pll *pll,
        /* this also makes sure that the reference divider is large enough */
        avivo_reduce_ratio(&fb_div, &ref_div, fb_div_min, ref_div_min);
 
+       /* avoid high jitter with small fractional dividers */
+       if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV && (fb_div % 10)) {
+               fb_div_min = max(fb_div_min, (9 - (fb_div % 10)) * 20 + 60);
+               if (fb_div < fb_div_min) {
+                       unsigned tmp = DIV_ROUND_UP(fb_div_min, fb_div);
+                       fb_div *= tmp;
+                       ref_div *= tmp;
+               }
+       }
+
        /* and finally save the result */
        if (pll->flags & RADEON_PLL_USE_FRAC_FB_DIV) {
                *fb_div_p = fb_div / 10;
index 9da5da4..4b7b87f 100644 (file)
@@ -97,6 +97,7 @@ enum radeon_family {
        CHIP_KAVERI,
        CHIP_KABINI,
        CHIP_HAWAII,
+       CHIP_MULLINS,
        CHIP_LAST,
 };
 
index 6fac8ef..f30b842 100644 (file)
@@ -1300,6 +1300,7 @@ int radeon_pm_init(struct radeon_device *rdev)
        case CHIP_KABINI:
        case CHIP_KAVERI:
        case CHIP_HAWAII:
+       case CHIP_MULLINS:
                /* DPM requires the RLC, RV770+ dGPU requires SMC */
                if (!rdev->rlc_fw)
                        rdev->pm.pm_method = PM_METHOD_PROFILE;
index 58d1293..4e7c326 100644 (file)
@@ -52,6 +52,7 @@
 #define BONAIRE_RLC_UCODE_SIZE       2048
 #define KB_RLC_UCODE_SIZE            2560
 #define KV_RLC_UCODE_SIZE            2560
+#define ML_RLC_UCODE_SIZE            2560
 
 /* MC */
 #define BTC_MC_UCODE_SIZE            6024
index 5748bda..1b65ae2 100644 (file)
@@ -99,6 +99,7 @@ int radeon_uvd_init(struct radeon_device *rdev)
        case CHIP_KABINI:
        case CHIP_KAVERI:
        case CHIP_HAWAII:
+       case CHIP_MULLINS:
                fw_name = FIRMWARE_BONAIRE;
                break;
 
@@ -465,6 +466,10 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p,
        cmd = radeon_get_ib_value(p, p->idx) >> 1;
 
        if (cmd < 0x4) {
+               if (end <= start) {
+                       DRM_ERROR("invalid reloc offset %X!\n", offset);
+                       return -EINVAL;
+               }
                if ((end - start) < buf_sizes[cmd]) {
                        DRM_ERROR("buffer (%d) to small (%d / %d)!\n", cmd,
                                  (unsigned)(end - start), buf_sizes[cmd]);
index ced53dd..f73324c 100644 (file)
@@ -66,6 +66,7 @@ int radeon_vce_init(struct radeon_device *rdev)
        case CHIP_BONAIRE:
        case CHIP_KAVERI:
        case CHIP_KABINI:
+       case CHIP_MULLINS:
                fw_name = FIRMWARE_BONAIRE;
                break;
 
index aca8cbe..bbf2e07 100644 (file)
@@ -86,6 +86,7 @@ int rv770_copy_dma(struct radeon_device *rdev,
        r = radeon_fence_emit(rdev, fence, ring->idx);
        if (r) {
                radeon_ring_unlock_undo(rdev, ring);
+               radeon_semaphore_free(rdev, &sem, NULL);
                return r;
        }
 
index ac708e0..22a63c9 100644 (file)
@@ -5780,7 +5780,6 @@ int si_irq_set(struct radeon_device *rdev)
        u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
        u32 hpd1 = 0, hpd2 = 0, hpd3 = 0, hpd4 = 0, hpd5 = 0, hpd6 = 0;
        u32 grbm_int_cntl = 0;
-       u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0;
        u32 dma_cntl, dma_cntl1;
        u32 thermal_int = 0;
 
@@ -5919,16 +5918,22 @@ int si_irq_set(struct radeon_device *rdev)
        }
 
        if (rdev->num_crtc >= 2) {
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1);
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
        }
        if (rdev->num_crtc >= 4) {
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3);
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
        }
        if (rdev->num_crtc >= 6) {
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5);
-               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
+               WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET,
+                      GRPH_PFLIP_INT_MASK);
        }
 
        if (!ASIC_IS_NODCE(rdev)) {
@@ -6292,6 +6297,15 @@ restart_ih:
                                break;
                        }
                        break;
+               case 8: /* D1 page flip */
+               case 10: /* D2 page flip */
+               case 12: /* D3 page flip */
+               case 14: /* D4 page flip */
+               case 16: /* D5 page flip */
+               case 18: /* D6 page flip */
+                       DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1);
+                       radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1);
+                       break;
                case 42: /* HPD hotplug */
                        switch (src_data) {
                        case 0:
index cf0fdad..de0ca07 100644 (file)
@@ -213,6 +213,7 @@ int si_copy_dma(struct radeon_device *rdev,
        r = radeon_fence_emit(rdev, fence, ring->idx);
        if (r) {
                radeon_ring_unlock_undo(rdev, ring);
+               radeon_semaphore_free(rdev, &sem, NULL);
                return r;
        }
 
index 0a243f0..be42c81 100644 (file)
@@ -83,7 +83,10 @@ int uvd_v1_0_init(struct radeon_device *rdev)
        int r;
 
        /* raise clocks while booting up the VCPU */
-       radeon_set_uvd_clocks(rdev, 53300, 40000);
+       if (rdev->family < CHIP_RV740)
+               radeon_set_uvd_clocks(rdev, 10000, 10000);
+       else
+               radeon_set_uvd_clocks(rdev, 53300, 40000);
 
        r = uvd_v1_0_start(rdev);
        if (r)
@@ -407,7 +410,10 @@ int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring)
        struct radeon_fence *fence = NULL;
        int r;
 
-       r = radeon_set_uvd_clocks(rdev, 53300, 40000);
+       if (rdev->family < CHIP_RV740)
+               r = radeon_set_uvd_clocks(rdev, 10000, 10000);
+       else
+               r = radeon_set_uvd_clocks(rdev, 53300, 40000);
        if (r) {
                DRM_ERROR("radeon: failed to raise UVD clocks (%d).\n", r);
                return r;
index 10a2c08..da52279 100644 (file)
@@ -1253,7 +1253,8 @@ EXPORT_SYMBOL_GPL(hid_output_report);
 
 static int hid_report_len(struct hid_report *report)
 {
-       return ((report->size - 1) >> 3) + 1 + (report->id > 0) + 7;
+       /* equivalent to DIV_ROUND_UP(report->size, 8) + !!(report->id > 0) */
+       return ((report->size - 1) >> 3) + 1 + (report->id > 0);
 }
 
 /*
@@ -1266,7 +1267,7 @@ u8 *hid_alloc_report_buf(struct hid_report *report, gfp_t flags)
         * of implement() working on 8 byte chunks
         */
 
-       int len = hid_report_len(report);
+       int len = hid_report_len(report) + 7;
 
        return kmalloc(len, flags);
 }
index c8af720..34bb220 100644 (file)
 
 #define USB_VENDOR_ID_DREAM_CHEEKY     0x1d34
 
+#define USB_VENDOR_ID_ELITEGROUP       0x03fc
+#define USB_DEVICE_ID_ELITEGROUP_05D8  0x05d8
+
 #define USB_VENDOR_ID_ELO              0x04E7
 #define USB_DEVICE_ID_ELO_TS2515       0x0022
 #define USB_DEVICE_ID_ELO_TS2700       0x0020
 #define USB_DEVICE_ID_SYNAPTICS_LTS2   0x1d10
 #define USB_DEVICE_ID_SYNAPTICS_HD     0x0ac3
 #define USB_DEVICE_ID_SYNAPTICS_QUAD_HD        0x1ac3
+#define USB_DEVICE_ID_SYNAPTICS_TP_V103        0x5710
+
+#define USB_VENDOR_ID_TEXAS_INSTRUMENTS        0x2047
+#define USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA    0x0855
 
 #define USB_VENDOR_ID_THINGM           0x27b8
 #define USB_DEVICE_ID_BLINK1           0x01ed
index 35278e4..51e25b9 100644 (file)
@@ -1155,6 +1155,11 @@ static const struct hid_device_id mt_devices[] = {
                MT_USB_DEVICE(USB_VENDOR_ID_DWAV,
                        USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH_A001) },
 
+       /* Elitegroup panel */
+       { .driver_data = MT_CLS_SERIAL,
+               MT_USB_DEVICE(USB_VENDOR_ID_ELITEGROUP,
+                       USB_DEVICE_ID_ELITEGROUP_05D8) },
+
        /* Flatfrog Panels */
        { .driver_data = MT_CLS_FLATFROG,
                MT_USB_DEVICE(USB_VENDOR_ID_FLATFROG,
index af8244b..be14b56 100644 (file)
@@ -708,6 +708,9 @@ static const struct hid_device_id sensor_hub_devices[] = {
        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_STM_0,
                        USB_DEVICE_ID_STM_HID_SENSOR),
                        .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
+       { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, USB_VENDOR_ID_TEXAS_INSTRUMENTS,
+                       USB_DEVICE_ID_TEXAS_INSTRUMENTS_LENOVO_YOGA),
+                       .driver_data = HID_SENSOR_HUB_ENUM_QUIRK},
        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_SENSOR_HUB, HID_ANY_ID,
                     HID_ANY_ID) },
        { }
index dbd8387..8e4ddb3 100644 (file)
@@ -119,6 +119,7 @@ static const struct hid_blacklist {
        { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS2, HID_QUIRK_NO_INIT_REPORTS },
        { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_HD, HID_QUIRK_NO_INIT_REPORTS },
        { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_QUAD_HD, HID_QUIRK_NO_INIT_REPORTS },
+       { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_TP_V103, HID_QUIRK_NO_INIT_REPORTS },
 
        { 0, 0 }
 };
index 2626773..2dd1d0d 100644 (file)
@@ -243,6 +243,12 @@ static void (*atkbd_platform_fixup)(struct atkbd *, const void *data);
 static void *atkbd_platform_fixup_data;
 static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int);
 
+/*
+ * Certain keyboards to not like ATKBD_CMD_RESET_DIS and stop responding
+ * to many commands until full reset (ATKBD_CMD_RESET_BAT) is performed.
+ */
+static bool atkbd_skip_deactivate;
+
 static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf,
                                ssize_t (*handler)(struct atkbd *, char *));
 static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count,
@@ -768,7 +774,8 @@ static int atkbd_probe(struct atkbd *atkbd)
  * Make sure nothing is coming from the keyboard and disturbs our
  * internal state.
  */
-       atkbd_deactivate(atkbd);
+       if (!atkbd_skip_deactivate)
+               atkbd_deactivate(atkbd);
 
        return 0;
 }
@@ -1638,6 +1645,12 @@ static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id)
        return 1;
 }
 
+static int __init atkbd_deactivate_fixup(const struct dmi_system_id *id)
+{
+       atkbd_skip_deactivate = true;
+       return 1;
+}
+
 static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
        {
                .matches = {
@@ -1775,6 +1788,20 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = {
                .callback = atkbd_setup_scancode_fixup,
                .driver_data = atkbd_oqo_01plus_scancode_fixup,
        },
+       {
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "LW25-B7HV"),
+               },
+               .callback = atkbd_deactivate_fixup,
+       },
+       {
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "P1-J273B"),
+               },
+               .callback = atkbd_deactivate_fixup,
+       },
        { }
 };
 
index 55c1530..4e491c1 100644 (file)
@@ -392,6 +392,13 @@ static const struct of_device_id tca8418_dt_ids[] = {
        { }
 };
 MODULE_DEVICE_TABLE(of, tca8418_dt_ids);
+
+/*
+ * The device tree based i2c loader looks for
+ * "i2c:" + second_component_of(property("compatible"))
+ * and therefore we need an alias to be found.
+ */
+MODULE_ALIAS("i2c:tca8418");
 #endif
 
 static struct i2c_driver tca8418_keypad_driver = {
index 52d3a9b..b36831c 100644 (file)
@@ -70,6 +70,7 @@
 #define BMA150_CFG_5_REG       0x11
 
 #define BMA150_CHIP_ID         2
+#define BMA180_CHIP_ID         3
 #define BMA150_CHIP_ID_REG     BMA150_DATA_0_REG
 
 #define BMA150_ACC_X_LSB_REG   BMA150_DATA_2_REG
@@ -539,7 +540,7 @@ static int bma150_probe(struct i2c_client *client,
        }
 
        chip_id = i2c_smbus_read_byte_data(client, BMA150_CHIP_ID_REG);
-       if (chip_id != BMA150_CHIP_ID) {
+       if (chip_id != BMA150_CHIP_ID && chip_id != BMA180_CHIP_ID) {
                dev_err(&client->dev, "BMA150 chip id error: %d\n", chip_id);
                return -EINVAL;
        }
@@ -643,6 +644,7 @@ static UNIVERSAL_DEV_PM_OPS(bma150_pm, bma150_suspend, bma150_resume, NULL);
 
 static const struct i2c_device_id bma150_id[] = {
        { "bma150", 0 },
+       { "bma180", 0 },
        { "smb380", 0 },
        { "bma023", 0 },
        { }
index 088d354..b96e978 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include <linux/delay.h>
+#include <linux/dmi.h>
 #include <linux/slab.h>
 #include <linux/module.h>
 #include <linux/input.h>
@@ -831,7 +832,11 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse)
                break;
 
        case 3:
-               etd->reg_10 = 0x0b;
+               if (etd->set_hw_resolution)
+                       etd->reg_10 = 0x0b;
+               else
+                       etd->reg_10 = 0x03;
+
                if (elantech_write_reg(psmouse, 0x10, etd->reg_10))
                        rc = -1;
 
@@ -1330,6 +1335,22 @@ static int elantech_reconnect(struct psmouse *psmouse)
        return 0;
 }
 
+/*
+ * Some hw_version 3 models go into error state when we try to set bit 3 of r10
+ */
+static const struct dmi_system_id no_hw_res_dmi_table[] = {
+#if defined(CONFIG_DMI) && defined(CONFIG_X86)
+       {
+               /* Gigabyte U2442 */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "U2442"),
+               },
+       },
+#endif
+       { }
+};
+
 /*
  * determine hardware version and set some properties according to it.
  */
@@ -1390,6 +1411,9 @@ static int elantech_set_properties(struct elantech_data *etd)
         */
        etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000);
 
+       /* Enable real hardware resolution on hw_version 3 ? */
+       etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table);
+
        return 0;
 }
 
index 036a04a..9e0e2a1 100644 (file)
@@ -130,6 +130,7 @@ struct elantech_data {
        bool jumpy_cursor;
        bool reports_pressure;
        bool crc_enabled;
+       bool set_hw_resolution;
        unsigned char hw_version;
        unsigned int fw_version;
        unsigned int single_finger_reports;
index ef9f491..d68d33f 100644 (file)
@@ -1565,6 +1565,14 @@ static const struct dmi_system_id min_max_dmi_table[] __initconst = {
                },
                .driver_data = (int []){1232, 5710, 1156, 4696},
        },
+       {
+               /* Lenovo ThinkPad Edge E431 */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                       DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Edge E431"),
+               },
+               .driver_data = (int []){1024, 5022, 2508, 4832},
+       },
        {
                /* Lenovo ThinkPad T431s */
                .matches = {
index c9de3d5..1d15735 100644 (file)
@@ -338,28 +338,58 @@ int rtsx_pci_transfer_data(struct rtsx_pcr *pcr, struct scatterlist *sglist,
                int num_sg, bool read, int timeout)
 {
        struct completion trans_done;
-       int err = 0, count;
+       u8 dir;
+       int err = 0, i, count;
        long timeleft;
        unsigned long flags;
+       struct scatterlist *sg;
+       enum dma_data_direction dma_dir;
+       u32 val;
+       dma_addr_t addr;
+       unsigned int len;
+
+       dev_dbg(&(pcr->pci->dev), "--> %s: num_sg = %d\n", __func__, num_sg);
+
+       /* don't transfer data during abort processing */
+       if (pcr->remove_pci)
+               return -EINVAL;
+
+       if ((sglist == NULL) || (num_sg <= 0))
+               return -EINVAL;
 
-       count = rtsx_pci_dma_map_sg(pcr, sglist, num_sg, read);
+       if (read) {
+               dir = DEVICE_TO_HOST;
+               dma_dir = DMA_FROM_DEVICE;
+       } else {
+               dir = HOST_TO_DEVICE;
+               dma_dir = DMA_TO_DEVICE;
+       }
+
+       count = dma_map_sg(&(pcr->pci->dev), sglist, num_sg, dma_dir);
        if (count < 1) {
                dev_err(&(pcr->pci->dev), "scatterlist map failed\n");
                return -EINVAL;
        }
        dev_dbg(&(pcr->pci->dev), "DMA mapping count: %d\n", count);
 
+       val = ((u32)(dir & 0x01) << 29) | TRIG_DMA | ADMA_MODE;
+       pcr->sgi = 0;
+       for_each_sg(sglist, sg, count, i) {
+               addr = sg_dma_address(sg);
+               len = sg_dma_len(sg);
+               rtsx_pci_add_sg_tbl(pcr, addr, len, i == count - 1);
+       }
 
        spin_lock_irqsave(&pcr->lock, flags);
 
        pcr->done = &trans_done;
        pcr->trans_result = TRANS_NOT_READY;
        init_completion(&trans_done);
+       rtsx_pci_writel(pcr, RTSX_HDBAR, pcr->host_sg_tbl_addr);
+       rtsx_pci_writel(pcr, RTSX_HDBCTLR, val);
 
        spin_unlock_irqrestore(&pcr->lock, flags);
 
-       rtsx_pci_dma_transfer(pcr, sglist, count, read);
-
        timeleft = wait_for_completion_interruptible_timeout(
                        &trans_done, msecs_to_jiffies(timeout));
        if (timeleft <= 0) {
@@ -383,7 +413,7 @@ out:
        pcr->done = NULL;
        spin_unlock_irqrestore(&pcr->lock, flags);
 
-       rtsx_pci_dma_unmap_sg(pcr, sglist, num_sg, read);
+       dma_unmap_sg(&(pcr->pci->dev), sglist, num_sg, dma_dir);
 
        if ((err < 0) && (err != -ENODEV))
                rtsx_pci_stop_cmd(pcr);
@@ -395,73 +425,6 @@ out:
 }
 EXPORT_SYMBOL_GPL(rtsx_pci_transfer_data);
 
-int rtsx_pci_dma_map_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
-               int num_sg, bool read)
-{
-       enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
-
-       if (pcr->remove_pci)
-               return -EINVAL;
-
-       if ((sglist == NULL) || num_sg < 1)
-               return -EINVAL;
-
-       return dma_map_sg(&(pcr->pci->dev), sglist, num_sg, dir);
-}
-EXPORT_SYMBOL_GPL(rtsx_pci_dma_map_sg);
-
-int rtsx_pci_dma_unmap_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
-               int num_sg, bool read)
-{
-       enum dma_data_direction dir = read ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
-
-       if (pcr->remove_pci)
-               return -EINVAL;
-
-       if (sglist == NULL || num_sg < 1)
-               return -EINVAL;
-
-       dma_unmap_sg(&(pcr->pci->dev), sglist, num_sg, dir);
-       return num_sg;
-}
-EXPORT_SYMBOL_GPL(rtsx_pci_dma_unmap_sg);
-
-int rtsx_pci_dma_transfer(struct rtsx_pcr *pcr, struct scatterlist *sglist,
-               int sg_count, bool read)
-{
-       struct scatterlist *sg;
-       dma_addr_t addr;
-       unsigned int len;
-       int i;
-       u32 val;
-       u8 dir = read ? DEVICE_TO_HOST : HOST_TO_DEVICE;
-       unsigned long flags;
-
-       if (pcr->remove_pci)
-               return -EINVAL;
-
-       if ((sglist == NULL) || (sg_count < 1))
-               return -EINVAL;
-
-       val = ((u32)(dir & 0x01) << 29) | TRIG_DMA | ADMA_MODE;
-       pcr->sgi = 0;
-       for_each_sg(sglist, sg, sg_count, i) {
-               addr = sg_dma_address(sg);
-               len = sg_dma_len(sg);
-               rtsx_pci_add_sg_tbl(pcr, addr, len, i == sg_count - 1);
-       }
-
-       spin_lock_irqsave(&pcr->lock, flags);
-
-       rtsx_pci_writel(pcr, RTSX_HDBAR, pcr->host_sg_tbl_addr);
-       rtsx_pci_writel(pcr, RTSX_HDBCTLR, val);
-
-       spin_unlock_irqrestore(&pcr->lock, flags);
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(rtsx_pci_dma_transfer);
-
 int rtsx_pci_read_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len)
 {
        int err;
@@ -873,8 +836,6 @@ static irqreturn_t rtsx_pci_isr(int irq, void *dev_id)
        int_reg = rtsx_pci_readl(pcr, RTSX_BIPR);
        /* Clear interrupt flag */
        rtsx_pci_writel(pcr, RTSX_BIPR, int_reg);
-       dev_dbg(&pcr->pci->dev, "=========== BIPR 0x%8x ==========\n", int_reg);
-
        if ((int_reg & pcr->bier) == 0) {
                spin_unlock(&pcr->lock);
                return IRQ_NONE;
@@ -905,28 +866,17 @@ static irqreturn_t rtsx_pci_isr(int irq, void *dev_id)
        }
 
        if (int_reg & (NEED_COMPLETE_INT | DELINK_INT)) {
-               if (int_reg & (TRANS_FAIL_INT | DELINK_INT))
+               if (int_reg & (TRANS_FAIL_INT | DELINK_INT)) {
                        pcr->trans_result = TRANS_RESULT_FAIL;
-               else if (int_reg & TRANS_OK_INT)
+                       if (pcr->done)
+                               complete(pcr->done);
+               } else if (int_reg & TRANS_OK_INT) {
                        pcr->trans_result = TRANS_RESULT_OK;
-
-               if (pcr->done)
-                       complete(pcr->done);
-
-               if (int_reg & SD_EXIST) {
-                       struct rtsx_slot *slot = &pcr->slots[RTSX_SD_CARD];
-                       if (slot && slot->done_transfer)
-                               slot->done_transfer(slot->p_dev);
-               }
-
-               if (int_reg & MS_EXIST) {
-                       struct rtsx_slot *slot = &pcr->slots[RTSX_SD_CARD];
-                       if (slot && slot->done_transfer)
-                               slot->done_transfer(slot->p_dev);
+                       if (pcr->done)
+                               complete(pcr->done);
                }
        }
 
-
        if (pcr->card_inserted || pcr->card_removed)
                schedule_delayed_work(&pcr->carddet_work,
                                msecs_to_jiffies(200));
index 5fb994f..0b9ded1 100644 (file)
 #include <linux/mfd/rtsx_pci.h>
 #include <asm/unaligned.h>
 
-struct realtek_next {
-       unsigned int    sg_count;
-       s32             cookie;
-};
-
 struct realtek_pci_sdmmc {
        struct platform_device  *pdev;
        struct rtsx_pcr         *pcr;
        struct mmc_host         *mmc;
        struct mmc_request      *mrq;
-       struct mmc_command      *cmd;
-       struct mmc_data         *data;
-
-       spinlock_t              lock;
-       struct timer_list       timer;
-       struct tasklet_struct   cmd_tasklet;
-       struct tasklet_struct   data_tasklet;
-       struct tasklet_struct   finish_tasklet;
-
-       u8                      rsp_type;
-       u8                      rsp_len;
-       int                     sg_count;
+
+       struct mutex            host_mutex;
+
        u8                      ssc_depth;
        unsigned int            clock;
        bool                    vpclk;
@@ -62,13 +48,8 @@ struct realtek_pci_sdmmc {
        int                     power_state;
 #define SDMMC_POWER_ON         1
 #define SDMMC_POWER_OFF                0
-
-       struct realtek_next     next_data;
 };
 
-static int sd_start_multi_rw(struct realtek_pci_sdmmc *host,
-               struct mmc_request *mrq);
-
 static inline struct device *sdmmc_dev(struct realtek_pci_sdmmc *host)
 {
        return &(host->pdev->dev);
@@ -105,95 +86,6 @@ static void sd_print_debug_regs(struct realtek_pci_sdmmc *host)
 #define sd_print_debug_regs(host)
 #endif /* DEBUG */
 
-static void sd_isr_done_transfer(struct platform_device *pdev)
-{
-       struct realtek_pci_sdmmc *host = platform_get_drvdata(pdev);
-
-       spin_lock(&host->lock);
-       if (host->cmd)
-               tasklet_schedule(&host->cmd_tasklet);
-       if (host->data)
-               tasklet_schedule(&host->data_tasklet);
-       spin_unlock(&host->lock);
-}
-
-static void sd_request_timeout(unsigned long host_addr)
-{
-       struct realtek_pci_sdmmc *host = (struct realtek_pci_sdmmc *)host_addr;
-       unsigned long flags;
-
-       spin_lock_irqsave(&host->lock, flags);
-
-       if (!host->mrq) {
-               dev_err(sdmmc_dev(host), "error: no request exist\n");
-               goto out;
-       }
-
-       if (host->cmd)
-               host->cmd->error = -ETIMEDOUT;
-       if (host->data)
-               host->data->error = -ETIMEDOUT;
-
-       dev_dbg(sdmmc_dev(host), "timeout for request\n");
-
-out:
-       tasklet_schedule(&host->finish_tasklet);
-       spin_unlock_irqrestore(&host->lock, flags);
-}
-
-static void sd_finish_request(unsigned long host_addr)
-{
-       struct realtek_pci_sdmmc *host = (struct realtek_pci_sdmmc *)host_addr;
-       struct rtsx_pcr *pcr = host->pcr;
-       struct mmc_request *mrq;
-       struct mmc_command *cmd;
-       struct mmc_data *data;
-       unsigned long flags;
-       bool any_error;
-
-       spin_lock_irqsave(&host->lock, flags);
-
-       del_timer(&host->timer);
-       mrq = host->mrq;
-       if (!mrq) {
-               dev_err(sdmmc_dev(host), "error: no request need finish\n");
-               goto out;
-       }
-
-       cmd = mrq->cmd;
-       data = mrq->data;
-
-       any_error = (mrq->sbc && mrq->sbc->error) ||
-               (mrq->stop && mrq->stop->error) ||
-               (cmd && cmd->error) || (data && data->error);
-
-       if (any_error) {
-               rtsx_pci_stop_cmd(pcr);
-               sd_clear_error(host);
-       }
-
-       if (data) {
-               if (any_error)
-                       data->bytes_xfered = 0;
-               else
-                       data->bytes_xfered = data->blocks * data->blksz;
-
-               if (!data->host_cookie)
-                       rtsx_pci_dma_unmap_sg(pcr, data->sg, data->sg_len,
-                                       data->flags & MMC_DATA_READ);
-
-       }
-
-       host->mrq = NULL;
-       host->cmd = NULL;
-       host->data = NULL;
-
-out:
-       spin_unlock_irqrestore(&host->lock, flags);
-       mutex_unlock(&pcr->pcr_mutex);
-       mmc_request_done(host->mmc, mrq);
-}
-
 static int sd_read_data(struct realtek_pci_sdmmc *host, u8 *cmd, u16 byte_cnt,
                u8 *buf, int buf_len, int timeout)
 {
@@ -311,7 +203,8 @@ static int sd_write_data(struct realtek_pci_sdmmc *host, u8 *cmd, u16 byte_cnt,
        return 0;
 }
 
-static void sd_send_cmd(struct realtek_pci_sdmmc *host, struct mmc_command *cmd)
+static void sd_send_cmd_get_rsp(struct realtek_pci_sdmmc *host,
+               struct mmc_command *cmd)
 {
        struct rtsx_pcr *pcr = host->pcr;
        u8 cmd_idx = (u8)cmd->opcode;
@@ -319,14 +212,11 @@ static void sd_send_cmd(struct realtek_pci_sdmmc *host, struct mmc_command *cmd)
        int err = 0;
        int timeout = 100;
        int i;
+       u8 *ptr;
+       int stat_idx = 0;
        u8 rsp_type;
        int rsp_len = 5;
-       unsigned long flags;
-
-       if (host->cmd)
-               dev_err(sdmmc_dev(host), "error: cmd already exist\n");
-
-       host->cmd = cmd;
+       bool clock_toggled = false;
 
        dev_dbg(sdmmc_dev(host), "%s: SD/MMC CMD %d, arg = 0x%08x\n",
                        __func__, cmd_idx, arg);
@@ -361,8 +251,6 @@ static void sd_send_cmd(struct realtek_pci_sdmmc *host, struct mmc_command *cmd)
                err = -EINVAL;
                goto out;
        }
-       host->rsp_type = rsp_type;
-       host->rsp_len = rsp_len;
 
        if (rsp_type == SD_RSP_TYPE_R1b)
                timeout = 3000;
@@ -372,6 +260,8 @@ static void sd_send_cmd(struct realtek_pci_sdmmc *host, struct mmc_command *cmd)
                                0xFF, SD_CLK_TOGGLE_EN);
                if (err < 0)
                        goto out;
+
+               clock_toggled = true;
        }
 
        rtsx_pci_init_cmd(pcr);
@@ -395,60 +285,25 @@ static void sd_send_cmd(struct realtek_pci_sdmmc *host, struct mmc_command *cmd)
                /* Read data from ping-pong buffer */
                for (i = PPBUF_BASE2; i < PPBUF_BASE2 + 16; i++)
                        rtsx_pci_add_cmd(pcr, READ_REG_CMD, (u16)i, 0, 0);
+               stat_idx = 16;
        } else if (rsp_type != SD_RSP_TYPE_R0) {
                /* Read data from SD_CMDx registers */
                for (i = SD_CMD0; i <= SD_CMD4; i++)
                        rtsx_pci_add_cmd(pcr, READ_REG_CMD, (u16)i, 0, 0);
+               stat_idx = 5;
        }
 
        rtsx_pci_add_cmd(pcr, READ_REG_CMD, SD_STAT1, 0, 0);
 
-       mod_timer(&host->timer, jiffies + msecs_to_jiffies(timeout));
-
-       spin_lock_irqsave(&pcr->lock, flags);
-       pcr->trans_result = TRANS_NOT_READY;
-       rtsx_pci_send_cmd_no_wait(pcr);
-       spin_unlock_irqrestore(&pcr->lock, flags);
-
-       return;
-
-out:
-       cmd->error = err;
-       tasklet_schedule(&host->finish_tasklet);
-}
-
-static void sd_get_rsp(unsigned long host_addr)
-{
-       struct realtek_pci_sdmmc *host = (struct realtek_pci_sdmmc *)host_addr;
-       struct rtsx_pcr *pcr = host->pcr;
-       struct mmc_command *cmd;
-       int i, err = 0, stat_idx;
-       u8 *ptr, rsp_type;
-       unsigned long flags;
-
-       spin_lock_irqsave(&host->lock, flags);
-
-       cmd = host->cmd;
-       host->cmd = NULL;
-
-       if (!cmd) {
-               dev_err(sdmmc_dev(host), "error: cmd not exist\n");
+       err = rtsx_pci_send_cmd(pcr, timeout);
+       if (err < 0) {
+               sd_print_debug_regs(host);
+               sd_clear_error(host);
+               dev_dbg(sdmmc_dev(host),
+                       "rtsx_pci_send_cmd error (err = %d)\n", err);
                goto out;
        }
 
-       spin_lock(&pcr->lock);
-       if (pcr->trans_result == TRANS_NO_DEVICE)
-               err = -ENODEV;
-       else if (pcr->trans_result != TRANS_RESULT_OK)
-               err = -EINVAL;
-       spin_unlock(&pcr->lock);
-
-       if (err < 0)
-               goto out;
-
-       rsp_type = host->rsp_type;
-       stat_idx = host->rsp_len;
-
        if (rsp_type == SD_RSP_TYPE_R0) {
                err = 0;
                goto out;
@@ -485,106 +340,26 @@ static void sd_get_rsp(unsigned long host_addr)
                                cmd->resp[0]);
        }
 
-       if (cmd == host->mrq->sbc) {
-               sd_send_cmd(host, host->mrq->cmd);
-               spin_unlock_irqrestore(&host->lock, flags);
-               return;
-       }
-
-       if (cmd == host->mrq->stop)
-               goto out;
-
-       if (cmd->data) {
-               sd_start_multi_rw(host, host->mrq);
-               spin_unlock_irqrestore(&host->lock, flags);
-               return;
-       }
-
 out:
        cmd->error = err;
 
-       tasklet_schedule(&host->finish_tasklet);
-       spin_unlock_irqrestore(&host->lock, flags);
-}
-
-static int sd_pre_dma_transfer(struct realtek_pci_sdmmc *host,
-                       struct mmc_data *data, struct realtek_next *next)
-{
-       struct rtsx_pcr *pcr = host->pcr;
-       int read = data->flags & MMC_DATA_READ;
-       int sg_count = 0;
-
-       if (!next && data->host_cookie &&
-               data->host_cookie != host->next_data.cookie) {
-               dev_err(sdmmc_dev(host),
-                       "error: invalid cookie data[%d] host[%d]\n",
-                       data->host_cookie, host->next_data.cookie);
-               data->host_cookie = 0;
-       }
-
-       if (next || (!next && data->host_cookie != host->next_data.cookie))
-               sg_count = rtsx_pci_dma_map_sg(pcr,
-                               data->sg, data->sg_len, read);
-       else
-               sg_count = host->next_data.sg_count;
-
-       if (next) {
-               next->sg_count = sg_count;
-               if (++next->cookie < 0)
-                       next->cookie = 1;
-               data->host_cookie = next->cookie;
-       }
-
-       return sg_count;
-}
-
-static void sdmmc_pre_req(struct mmc_host *mmc, struct mmc_request *mrq,
-               bool is_first_req)
-{
-       struct realtek_pci_sdmmc *host = mmc_priv(mmc);
-       struct mmc_data *data = mrq->data;
-
-       if (data->host_cookie) {
-               dev_err(sdmmc_dev(host),
-                       "error: descard already cookie data[%d]\n",
-                       data->host_cookie);
-               data->host_cookie = 0;
-       }
-
-       dev_dbg(sdmmc_dev(host), "dma sg prepared: %d\n",
-               sd_pre_dma_transfer(host, data, &host->next_data));
-}
-
-static void sdmmc_post_req(struct mmc_host *mmc, struct mmc_request *mrq,
-               int err)
-{
-       struct realtek_pci_sdmmc *host = mmc_priv(mmc);
-       struct rtsx_pcr *pcr = host->pcr;
-       struct mmc_data *data = mrq->data;
-       int read = data->flags & MMC_DATA_READ;
-
-       rtsx_pci_dma_unmap_sg(pcr, data->sg, data->sg_len, read);
-       data->host_cookie = 0;
+       if (err && clock_toggled)
+               rtsx_pci_write_register(pcr, SD_BUS_STAT,
+                               SD_CLK_TOGGLE_EN | SD_CLK_FORCE_STOP, 0);
 }
 
-static int sd_start_multi_rw(struct realtek_pci_sdmmc *host,
-               struct mmc_request *mrq)
+static int sd_rw_multi(struct realtek_pci_sdmmc *host, struct mmc_request *mrq)
 {
        struct rtsx_pcr *pcr = host->pcr;
        struct mmc_host *mmc = host->mmc;
        struct mmc_card *card = mmc->card;
        struct mmc_data *data = mrq->data;
        int uhs = mmc_card_uhs(card);
-       int read = data->flags & MMC_DATA_READ;
+       int read = (data->flags & MMC_DATA_READ) ? 1 : 0;
        u8 cfg2, trans_mode;
        int err;
        size_t data_len = data->blksz * data->blocks;
 
-       if (host->data)
-               dev_err(sdmmc_dev(host), "error: data already exist\n");
-
-       host->data = data;
-
        if (read) {
                cfg2 = SD_CALCULATE_CRC7 | SD_CHECK_CRC16 |
                        SD_NO_WAIT_BUSY_END | SD_CHECK_CRC7 | SD_RSP_LEN_0;
@@ -635,54 +410,15 @@ static int sd_start_multi_rw(struct realtek_pci_sdmmc *host,
        rtsx_pci_add_cmd(pcr, CHECK_REG_CMD, SD_TRANSFER,
                        SD_TRANSFER_END, SD_TRANSFER_END);
 
-       mod_timer(&host->timer, jiffies + 10 * HZ);
        rtsx_pci_send_cmd_no_wait(pcr);
 
-       err = rtsx_pci_dma_transfer(pcr, data->sg, host->sg_count, read);
-       if (err < 0) {
-               data->error = err;
-               tasklet_schedule(&host->finish_tasklet);
-       }
-       return 0;
-}
-
-static void sd_finish_multi_rw(unsigned long host_addr)
-{
-       struct realtek_pci_sdmmc *host = (struct realtek_pci_sdmmc *)host_addr;
-       struct rtsx_pcr *pcr = host->pcr;
-       struct mmc_data *data;
-       int err = 0;
-       unsigned long flags;
-
-       spin_lock_irqsave(&host->lock, flags);
-
-       if (!host->data) {
-               dev_err(sdmmc_dev(host), "error: no data exist\n");
-               goto out;
-       }
-
-       data = host->data;
-       host->data = NULL;
-
-       if (pcr->trans_result == TRANS_NO_DEVICE)
-               err = -ENODEV;
-       else if (pcr->trans_result != TRANS_RESULT_OK)
-               err = -EINVAL;
-
+       err = rtsx_pci_transfer_data(pcr, data->sg, data->sg_len, read, 10000);
        if (err < 0) {
-               data->error = err;
-               goto out;
-       }
-
-       if (!host->mrq->sbc && data->stop) {
-               sd_send_cmd(host, data->stop);
-               spin_unlock_irqrestore(&host->lock, flags);
-               return;
+               sd_clear_error(host);
+               return err;
        }
 
-out:
-       tasklet_schedule(&host->finish_tasklet);
-       spin_unlock_irqrestore(&host->lock, flags);
+       return 0;
 }
 
 static inline void sd_enable_initial_mode(struct realtek_pci_sdmmc *host)
@@ -901,13 +637,6 @@ static int sd_tuning_rx(struct realtek_pci_sdmmc *host, u8 opcode)
        return 0;
 }
 
-static inline bool sd_use_muti_rw(struct mmc_command *cmd)
-{
-       return mmc_op_multi(cmd->opcode) ||
-               (cmd->opcode == MMC_READ_SINGLE_BLOCK) ||
-               (cmd->opcode == MMC_WRITE_BLOCK);
-}
-
 static void sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
 {
        struct realtek_pci_sdmmc *host = mmc_priv(mmc);
@@ -916,14 +645,6 @@ static void sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
        struct mmc_data *data = mrq->data;
        unsigned int data_size = 0;
        int err;
-       unsigned long flags;
-
-       mutex_lock(&pcr->pcr_mutex);
-       spin_lock_irqsave(&host->lock, flags);
-
-       if (host->mrq)
-               dev_err(sdmmc_dev(host), "error: request already exist\n");
-       host->mrq = mrq;
 
        if (host->eject) {
                cmd->error = -ENOMEDIUM;
@@ -936,6 +657,8 @@ static void sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
                goto finish;
        }
 
+       mutex_lock(&pcr->pcr_mutex);
+
        rtsx_pci_start_run(pcr);
 
        rtsx_pci_switch_clock(pcr, host->clock, host->ssc_depth,
@@ -944,28 +667,46 @@ static void sdmmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
        rtsx_pci_write_register(pcr, CARD_SHARE_MODE,
                        CARD_SHARE_MASK, CARD_SHARE_48_SD);
 
+       mutex_lock(&host->host_mutex);
+       host->mrq = mrq;
+       mutex_unlock(&host->host_mutex);
+
        if (mrq->data)
                data_size = data->blocks * data->blksz;
 
-       if (sd_use_muti_rw(cmd))
-               host->sg_count = sd_pre_dma_transfer(host, data, NULL);
+       if (!data_size || mmc_op_multi(cmd->opcode) ||
+                       (cmd->opcode == MMC_READ_SINGLE_BLOCK) ||
+                       (cmd->opcode == MMC_WRITE_BLOCK)) {
+               sd_send_cmd_get_rsp(host, cmd);
 
-       if (!data_size || sd_use_muti_rw(cmd)) {
-               if (mrq->sbc)
-                       sd_send_cmd(host, mrq->sbc);
-               else
-                       sd_send_cmd(host, cmd);
-               spin_unlock_irqrestore(&host->lock, flags);
+               if (!cmd->error && data_size) {
+                       sd_rw_multi(host, mrq);
+
+                       if (mmc_op_multi(cmd->opcode) && mrq->stop)
+                               sd_send_cmd_get_rsp(host, mrq->stop);
+               }
        } else {
-               spin_unlock_irqrestore(&host->lock, flags);
                sd_normal_rw(host, mrq);
-               tasklet_schedule(&host->finish_tasklet);
        }
-       return;
+
+       if (mrq->data) {
+               if (cmd->error || data->error)
+                       data->bytes_xfered = 0;
+               else
+                       data->bytes_xfered = data->blocks * data->blksz;
+       }
+
+       mutex_unlock(&pcr->pcr_mutex);
 
 finish:
-       tasklet_schedule(&host->finish_tasklet);
-       spin_unlock_irqrestore(&host->lock, flags);
+       if (cmd->error)
+               dev_dbg(sdmmc_dev(host), "cmd->error = %d\n", cmd->error);
+
+       mutex_lock(&host->host_mutex);
+       host->mrq = NULL;
+       mutex_unlock(&host->host_mutex);
+
+       mmc_request_done(mmc, mrq);
 }
 
 static int sd_set_bus_width(struct realtek_pci_sdmmc *host,
@@ -1400,8 +1141,6 @@ out:
 }
 
 static const struct mmc_host_ops realtek_pci_sdmmc_ops = {
-       .pre_req = sdmmc_pre_req,
-       .post_req = sdmmc_post_req,
        .request = sdmmc_request,
        .set_ios = sdmmc_set_ios,
        .get_ro = sdmmc_get_ro,
@@ -1465,7 +1204,6 @@ static int rtsx_pci_sdmmc_drv_probe(struct platform_device *pdev)
        struct realtek_pci_sdmmc *host;
        struct rtsx_pcr *pcr;
        struct pcr_handle *handle = pdev->dev.platform_data;
-       unsigned long host_addr;
 
        if (!handle)
                return -ENXIO;
@@ -1489,15 +1227,8 @@ static int rtsx_pci_sdmmc_drv_probe(struct platform_device *pdev)
        pcr->slots[RTSX_SD_CARD].p_dev = pdev;
        pcr->slots[RTSX_SD_CARD].card_event = rtsx_pci_sdmmc_card_event;
 
-       host_addr = (unsigned long)host;
-       host->next_data.cookie = 1;
-       setup_timer(&host->timer, sd_request_timeout, host_addr);
-       tasklet_init(&host->cmd_tasklet, sd_get_rsp, host_addr);
-       tasklet_init(&host->data_tasklet, sd_finish_multi_rw, host_addr);
-       tasklet_init(&host->finish_tasklet, sd_finish_request, host_addr);
-       spin_lock_init(&host->lock);
+       mutex_init(&host->host_mutex);
 
-       pcr->slots[RTSX_SD_CARD].done_transfer = sd_isr_done_transfer;
        realtek_init_host(host);
 
        mmc_add_host(mmc);
@@ -1510,8 +1241,6 @@ static int rtsx_pci_sdmmc_drv_remove(struct platform_device *pdev)
        struct realtek_pci_sdmmc *host = platform_get_drvdata(pdev);
        struct rtsx_pcr *pcr;
        struct mmc_host *mmc;
-       struct mmc_request *mrq;
-       unsigned long flags;
 
        if (!host)
                return 0;
@@ -1519,33 +1248,22 @@ static int rtsx_pci_sdmmc_drv_remove(struct platform_device *pdev)
        pcr = host->pcr;
        pcr->slots[RTSX_SD_CARD].p_dev = NULL;
        pcr->slots[RTSX_SD_CARD].card_event = NULL;
-       pcr->slots[RTSX_SD_CARD].done_transfer = NULL;
        mmc = host->mmc;
-       mrq = host->mrq;
 
-       spin_lock_irqsave(&host->lock, flags);
+       mutex_lock(&host->host_mutex);
        if (host->mrq) {
                dev_dbg(&(pdev->dev),
                        "%s: Controller removed during transfer\n",
                        mmc_hostname(mmc));
 
-               if (mrq->sbc)
-                       mrq->sbc->error = -ENOMEDIUM;
-               if (mrq->cmd)
-                       mrq->cmd->error = -ENOMEDIUM;
-               if (mrq->stop)
-                       mrq->stop->error = -ENOMEDIUM;
-               if (mrq->data)
-                       mrq->data->error = -ENOMEDIUM;
+               rtsx_pci_complete_unfinished_transfer(pcr);
 
-               tasklet_schedule(&host->finish_tasklet);
+               host->mrq->cmd->error = -ENOMEDIUM;
+               if (host->mrq->stop)
+                       host->mrq->stop->error = -ENOMEDIUM;
+               mmc_request_done(mmc, host->mrq);
        }
-       spin_unlock_irqrestore(&host->lock, flags);
-
-       del_timer_sync(&host->timer);
-       tasklet_kill(&host->cmd_tasklet);
-       tasklet_kill(&host->data_tasklet);
-       tasklet_kill(&host->finish_tasklet);
+       mutex_unlock(&host->host_mutex);
 
        mmc_remove_host(mmc);
        host->eject = true;
index 4615d79..b922c8e 100644 (file)
@@ -523,6 +523,7 @@ static struct nand_ecclayout hwecc4_2048 = {
 #if defined(CONFIG_OF)
 static const struct of_device_id davinci_nand_of_match[] = {
        {.compatible = "ti,davinci-nand", },
+       {.compatible = "ti,keystone-nand", },
        {},
 };
 MODULE_DEVICE_TABLE(of, davinci_nand_of_match);
@@ -581,6 +582,11 @@ static struct davinci_nand_pdata
                    of_property_read_bool(pdev->dev.of_node,
                        "ti,davinci-nand-use-bbt"))
                        pdata->bbt_options = NAND_BBT_USE_FLASH;
+
+               if (of_device_is_compatible(pdev->dev.of_node,
+                                           "ti,keystone-nand")) {
+                       pdata->options |= NAND_NO_SUBPAGE_WRITE;
+               }
        }
 
        return dev_get_platdata(&pdev->dev);
index deb7f4b..438d4c7 100644 (file)
@@ -37,7 +37,7 @@ __visible struct {
  * kernel begins at offset 3GB...
  */
 
-asmlinkage void pnp_bios_callfunc(void);
+asmlinkage __visible void pnp_bios_callfunc(void);
 
 __asm__(".text                 \n"
        __ALIGN_STR "\n"
index 480bd4d..2f099c7 100644 (file)
@@ -6,6 +6,7 @@ ci_hdrc-y                               := core.o otg.o
 ci_hdrc-$(CONFIG_USB_CHIPIDEA_UDC)     += udc.o
 ci_hdrc-$(CONFIG_USB_CHIPIDEA_HOST)    += host.o
 ci_hdrc-$(CONFIG_USB_CHIPIDEA_DEBUG)   += debug.o
+ci_hdrc-$(CONFIG_USB_OTG_FSM)          += otg_fsm.o
 
 # Glue/Bridge layers go here
 
index 83d06c1..ca57e3d 100644 (file)
 #define DEVICEADDR_USBADR     (0x7FUL << 25)
 
 /* PORTSC */
+#define PORTSC_CCS            BIT(0)
+#define PORTSC_CSC            BIT(1)
+#define PORTSC_PEC            BIT(3)
+#define PORTSC_OCC            BIT(5)
 #define PORTSC_FPR            BIT(6)
 #define PORTSC_SUSP           BIT(7)
 #define PORTSC_HSP            BIT(9)
+#define PORTSC_PP             BIT(12)
 #define PORTSC_PTC            (0x0FUL << 16)
 #define PORTSC_PHCD(d)       ((d) ? BIT(22) : BIT(23))
 /* PTS and PTW for non lpm version only */
@@ -56,6 +61,9 @@
 #define PORTSC_PTW            BIT(28)
 #define PORTSC_STS            BIT(29)
 
+#define PORTSC_W1C_BITS                                                \
+       (PORTSC_CSC | PORTSC_PEC | PORTSC_OCC)
+
 /* DEVLC */
 #define DEVLC_PFSC            BIT(23)
 #define DEVLC_PSPD            (0x03UL << 25)
@@ -72,6 +80,8 @@
 
 /* OTGSC */
 #define OTGSC_IDPU           BIT(5)
+#define OTGSC_HADP           BIT(6)
+#define OTGSC_HABA           BIT(7)
 #define OTGSC_ID             BIT(8)
 #define OTGSC_AVV            BIT(9)
 #define OTGSC_ASV            BIT(10)
index e206406..9563cb5 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/irqreturn.h>
 #include <linux/usb.h>
 #include <linux/usb/gadget.h>
+#include <linux/usb/otg-fsm.h>
 
 /******************************************************************************
  * DEFINE
@@ -139,6 +140,8 @@ struct hw_bank {
  * @roles: array of supported roles for this controller
  * @role: current role
  * @is_otg: if the device is otg-capable
+ * @fsm: otg finite state machine
+ * @fsm_timer: pointer to timer list of otg fsm
  * @work: work for role changing
  * @wq: workqueue thread
  * @qh_pool: allocation pool for queue heads
@@ -174,6 +177,8 @@ struct ci_hdrc {
        struct ci_role_driver           *roles[CI_ROLE_END];
        enum ci_role                    role;
        bool                            is_otg;
+       struct otg_fsm                  fsm;
+       struct ci_otg_fsm_timer_list    *fsm_timer;
        struct work_struct              work;
        struct workqueue_struct         *wq;
 
@@ -319,6 +324,24 @@ static inline u32 hw_test_and_write(struct ci_hdrc *ci, enum ci_hw_regs reg,
        return (val & mask) >> __ffs(mask);
 }
 
+/**
+ * ci_otg_is_fsm_mode: runtime check if otg controller
+ * is in otg fsm mode.
+ */
+static inline bool ci_otg_is_fsm_mode(struct ci_hdrc *ci)
+{
+#ifdef CONFIG_USB_OTG_FSM
+       return ci->is_otg && ci->roles[CI_ROLE_HOST] &&
+                                       ci->roles[CI_ROLE_GADGET];
+#else
+       return false;
+#endif
+}
+
+u32 hw_read_intr_enable(struct ci_hdrc *ci);
+
+u32 hw_read_intr_status(struct ci_hdrc *ci);
+
 int hw_device_reset(struct ci_hdrc *ci, u32 mode);
 
 int hw_port_test_set(struct ci_hdrc *ci, u8 mode);
index 1cd5d0b..128b92b 100644 (file)
@@ -42,7 +42,6 @@
  * - Not Supported: 15 & 16 (ISO)
  *
  * TODO List
- * - OTG
  * - Interrupt Traffic
  * - GET_STATUS(device) - always reports 0
  * - Gadget API (majority of optional features)
@@ -74,6 +73,7 @@
 #include "host.h"
 #include "debug.h"
 #include "otg.h"
+#include "otg_fsm.h"
 
 /* Controller register map */
 static const u8 ci_regs_nolpm[] = {
@@ -139,6 +139,26 @@ static int hw_alloc_regmap(struct ci_hdrc *ci, bool is_lpm)
        return 0;
 }
 
+/**
+ * hw_read_intr_enable: returns interrupt enable register
+ *
+ * This function returns register data
+ */
+u32 hw_read_intr_enable(struct ci_hdrc *ci)
+{
+       return hw_read(ci, OP_USBINTR, ~0);
+}
+
+/**
+ * hw_read_intr_status: returns interrupt status register
+ *
+ * This function returns register data
+ */
+u32 hw_read_intr_status(struct ci_hdrc *ci)
+{
+       return hw_read(ci, OP_USBSTS, ~0);
+}
+
 /**
  * hw_port_test_set: writes port test mode (execute without interruption)
  * @mode: new value
@@ -179,11 +199,10 @@ static void ci_hdrc_enter_lpm(struct ci_hdrc *ci, bool enable)
                hw_write(ci, reg, PORTSC_PHCD(ci->hw_bank.lpm),
                                0);
                /* 
-                * The controller needs at least 1ms to reflect
-                * PHY's status, the PHY also needs some time (less
+                * the PHY needs some time (less
                 * than 1ms) to leave low power mode.
                 */
-               usleep_range(1500, 2000);
+               usleep_range(1000, 1100);
        }
 }
 
@@ -392,8 +411,14 @@ static irqreturn_t ci_irq(int irq, void *data)
        irqreturn_t ret = IRQ_NONE;
        u32 otgsc = 0;
 
-       if (ci->is_otg)
-               otgsc = hw_read(ci, OP_OTGSC, ~0);
+       if (ci->is_otg) {
+               otgsc = hw_read_otgsc(ci, ~0);
+               if (ci_otg_is_fsm_mode(ci)) {
+                       ret = ci_otg_fsm_irq(ci);
+                       if (ret == IRQ_HANDLED)
+                               return ret;
+               }
+       }
 
        /*
         * Handle id change interrupt, it indicates device/host function
@@ -401,7 +426,8 @@ static irqreturn_t ci_irq(int irq, void *data)
         */
        if (ci->is_otg && (otgsc & OTGSC_IDIE) && (otgsc & OTGSC_IDIS)) {
                ci->id_event = true;
-               ci_clear_otg_interrupt(ci, OTGSC_IDIS);
+               /* Clear ID change irq status */
+               hw_write_otgsc(ci, OTGSC_IDIS, OTGSC_IDIS);
                disable_irq_nosync(ci->irq);
                queue_work(ci->wq, &ci->work);
                return IRQ_HANDLED;
@@ -413,7 +439,8 @@ static irqreturn_t ci_irq(int irq, void *data)
         */
        if (ci->is_otg && (otgsc & OTGSC_BSVIE) && (otgsc & OTGSC_BSVIS)) {
                ci->b_sess_valid_event = true;
-               ci_clear_otg_interrupt(ci, OTGSC_BSVIS);
+               /* Clear BSV irq */
+               hw_write_otgsc(ci, OTGSC_BSVIS, OTGSC_BSVIS);
                disable_irq_nosync(ci->irq);
                queue_work(ci->wq, &ci->work);
                return IRQ_HANDLED;
@@ -533,11 +560,8 @@ static void ci_get_otg_capable(struct ci_hdrc *ci)
                ci->is_otg = (hw_read(ci, CAP_DCCPARAMS,
                                DCCPARAMS_DC | DCCPARAMS_HC)
                                        == (DCCPARAMS_DC | DCCPARAMS_HC));
-       if (ci->is_otg) {
+       if (ci->is_otg)
                dev_dbg(ci->dev, "It is OTG capable controller\n");
-               ci_disable_otg_interrupt(ci, OTGSC_INT_EN_BITS);
-               ci_clear_otg_interrupt(ci, OTGSC_INT_STATUS_BITS);
-       }
 }
 
 static int ci_hdrc_probe(struct platform_device *pdev)
@@ -599,6 +623,13 @@ static int ci_hdrc_probe(struct platform_device *pdev)
        if (ret) {
                dev_err(dev, "unable to init phy: %d\n", ret);
                return ret;
+       } else {
+               /* 
+                * The delay to sync PHY's status, the maximum delay is
+                * 2ms since the otgsc uses 1ms timer to debounce the
+                * PHY's input
+                */
+               usleep_range(2000, 2500);
        }
 
        ci->hw_bank.phys = res->start;
@@ -633,6 +664,9 @@ static int ci_hdrc_probe(struct platform_device *pdev)
        }
 
        if (ci->is_otg) {
+               /* Disable and clear all OTG irq */
+               hw_write_otgsc(ci, OTGSC_INT_EN_BITS | OTGSC_INT_STATUS_BITS,
+                                                       OTGSC_INT_STATUS_BITS);
                ret = ci_hdrc_otg_init(ci);
                if (ret) {
                        dev_err(dev, "init otg fails, ret = %d\n", ret);
@@ -642,13 +676,9 @@ static int ci_hdrc_probe(struct platform_device *pdev)
 
        if (ci->roles[CI_ROLE_HOST] && ci->roles[CI_ROLE_GADGET]) {
                if (ci->is_otg) {
-                       /*
-                        * ID pin needs 1ms debouce time,
-                        * we delay 2ms for safe.
-                        */
-                       mdelay(2);
                        ci->role = ci_otg_role(ci);
-                       ci_enable_otg_interrupt(ci, OTGSC_IDIE);
+                       /* Enable ID change irq */
+                       hw_write_otgsc(ci, OTGSC_IDIE, OTGSC_IDIE);
                } else {
                        /*
                         * If the controller is not OTG capable, but support
@@ -667,10 +697,13 @@ static int ci_hdrc_probe(struct platform_device *pdev)
        if (ci->role == CI_ROLE_GADGET)
                ci_handle_vbus_change(ci);
 
-       ret = ci_role_start(ci, ci->role);
-       if (ret) {
-               dev_err(dev, "can't start %s role\n", ci_role(ci)->name);
-               goto stop;
+       if (!ci_otg_is_fsm_mode(ci)) {
+               ret = ci_role_start(ci, ci->role);
+               if (ret) {
+                       dev_err(dev, "can't start %s role\n",
+                                               ci_role(ci)->name);
+                       goto stop;
+               }
        }
 
        platform_set_drvdata(pdev, ci);
@@ -679,6 +712,9 @@ static int ci_hdrc_probe(struct platform_device *pdev)
        if (ret)
                goto stop;
 
+       if (ci_otg_is_fsm_mode(ci))
+               ci_hdrc_otg_fsm_start(ci);
+
        ret = dbg_create_files(ci);
        if (!ret)
                return 0;
@@ -711,6 +747,7 @@ static struct platform_driver ci_hdrc_driver = {
        .remove = ci_hdrc_remove,
        .driver = {
                .name   = "ci_hdrc",
+               .owner  = THIS_MODULE,
        },
 };
 
index 96d899a..7cccab6 100644 (file)
@@ -7,11 +7,15 @@
 #include <linux/uaccess.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
+#include <linux/usb/phy.h>
+#include <linux/usb/otg.h>
+#include <linux/usb/otg-fsm.h>
 
 #include "ci.h"
 #include "udc.h"
 #include "bits.h"
 #include "debug.h"
+#include "otg.h"
 
 /**
  * ci_device_show: prints information about device capabilities and status
@@ -204,6 +208,80 @@ static const struct file_operations ci_requests_fops = {
        .release        = single_release,
 };
 
+int ci_otg_show(struct seq_file *s, void *unused)
+{
+       struct ci_hdrc *ci = s->private;
+       struct otg_fsm *fsm;
+
+       if (!ci || !ci_otg_is_fsm_mode(ci))
+               return 0;
+
+       fsm = &ci->fsm;
+
+       /* ------ State ----- */
+       seq_printf(s, "OTG state: %s\n\n",
+               usb_otg_state_string(ci->transceiver->state));
+
+       /* ------ State Machine Variables ----- */
+       seq_printf(s, "a_bus_drop: %d\n", fsm->a_bus_drop);
+
+       seq_printf(s, "a_bus_req: %d\n", fsm->a_bus_req);
+
+       seq_printf(s, "a_srp_det: %d\n", fsm->a_srp_det);
+
+       seq_printf(s, "a_vbus_vld: %d\n", fsm->a_vbus_vld);
+
+       seq_printf(s, "b_conn: %d\n", fsm->b_conn);
+
+       seq_printf(s, "adp_change: %d\n", fsm->adp_change);
+
+       seq_printf(s, "power_up: %d\n", fsm->power_up);
+
+       seq_printf(s, "a_bus_resume: %d\n", fsm->a_bus_resume);
+
+       seq_printf(s, "a_bus_suspend: %d\n", fsm->a_bus_suspend);
+
+       seq_printf(s, "a_conn: %d\n", fsm->a_conn);
+
+       seq_printf(s, "b_bus_req: %d\n", fsm->b_bus_req);
+
+       seq_printf(s, "b_bus_suspend: %d\n", fsm->b_bus_suspend);
+
+       seq_printf(s, "b_se0_srp: %d\n", fsm->b_se0_srp);
+
+       seq_printf(s, "b_ssend_srp: %d\n", fsm->b_ssend_srp);
+
+       seq_printf(s, "b_sess_vld: %d\n", fsm->b_sess_vld);
+
+       seq_printf(s, "b_srp_done: %d\n", fsm->b_srp_done);
+
+       seq_printf(s, "drv_vbus: %d\n", fsm->drv_vbus);
+
+       seq_printf(s, "loc_conn: %d\n", fsm->loc_conn);
+
+       seq_printf(s, "loc_sof: %d\n", fsm->loc_sof);
+
+       seq_printf(s, "adp_prb: %d\n", fsm->adp_prb);
+
+       seq_printf(s, "id: %d\n", fsm->id);
+
+       seq_printf(s, "protocol: %d\n", fsm->protocol);
+
+       return 0;
+}
+
+static int ci_otg_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, ci_otg_show, inode->i_private);
+}
+
+static const struct file_operations ci_otg_fops = {
+       .open                   = ci_otg_open,
+       .read                   = seq_read,
+       .llseek                 = seq_lseek,
+       .release                = single_release,
+};
+
 static int ci_role_show(struct seq_file *s, void *data)
 {
        struct ci_hdrc *ci = s->private;
@@ -253,6 +331,50 @@ static const struct file_operations ci_role_fops = {
        .release        = single_release,
 };
 
+int ci_registers_show(struct seq_file *s, void *unused)
+{
+       struct ci_hdrc *ci = s->private;
+       u32 tmp_reg;
+
+       if (!ci)
+               return 0;
+
+       /* ------ Registers ----- */
+       tmp_reg = hw_read_intr_enable(ci);
+       seq_printf(s, "USBINTR reg: %08x\n", tmp_reg);
+
+       tmp_reg = hw_read_intr_status(ci);
+       seq_printf(s, "USBSTS reg: %08x\n", tmp_reg);
+
+       tmp_reg = hw_read(ci, OP_USBMODE, ~0);
+       seq_printf(s, "USBMODE reg: %08x\n", tmp_reg);
+
+       tmp_reg = hw_read(ci, OP_USBCMD, ~0);
+       seq_printf(s, "USBCMD reg: %08x\n", tmp_reg);
+
+       tmp_reg = hw_read(ci, OP_PORTSC, ~0);
+       seq_printf(s, "PORTSC reg: %08x\n", tmp_reg);
+
+       if (ci->is_otg) {
+               tmp_reg = hw_read_otgsc(ci, ~0);
+               seq_printf(s, "OTGSC reg: %08x\n", tmp_reg);
+       }
+
+       return 0;
+}
+
+static int ci_registers_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, ci_registers_show, inode->i_private);
+}
+
+static const struct file_operations ci_registers_fops = {
+       .open                   = ci_registers_open,
+       .read                   = seq_read,
+       .llseek                 = seq_lseek,
+       .release                = single_release,
+};
+
 /**
  * dbg_create_files: initializes the attribute interface
  * @ci: device
@@ -287,8 +409,21 @@ int dbg_create_files(struct ci_hdrc *ci)
        if (!dent)
                goto err;
 
+       if (ci_otg_is_fsm_mode(ci)) {
+               dent = debugfs_create_file("otg", S_IRUGO, ci->debugfs, ci,
+                                       &ci_otg_fops);
+               if (!dent)
+                       goto err;
+       }
+
        dent = debugfs_create_file("role", S_IRUGO | S_IWUSR, ci->debugfs, ci,
                                   &ci_role_fops);
+       if (!dent)
+               goto err;
+
+       dent = debugfs_create_file("registers", S_IRUGO, ci->debugfs, ci,
+                               &ci_registers_fops);
+
        if (dent)
                return 0;
 err:
index a8ac6c1..a93d950 100644 (file)
@@ -67,7 +67,11 @@ static int host_start(struct ci_hdrc *ci)
        ehci->has_tdi_phy_lpm = ci->hw_bank.lpm;
        ehci->imx28_write_fix = ci->imx28_write_fix;
 
-       if (ci->platdata->reg_vbus) {
+       /*
+        * vbus is always on if host is not in OTG FSM mode,
+        * otherwise should be controlled by OTG FSM
+        */
+       if (ci->platdata->reg_vbus && !ci_otg_is_fsm_mode(ci)) {
                ret = regulator_enable(ci->platdata->reg_vbus);
                if (ret) {
                        dev_err(ci->dev,
@@ -78,10 +82,17 @@ static int host_start(struct ci_hdrc *ci)
        }
 
        ret = usb_add_hcd(hcd, 0, 0);
-       if (ret)
+       if (ret) {
                goto disable_reg;
-       else
+       } else {
+               struct usb_otg *otg = ci->transceiver->otg;
+
                ci->hcd = hcd;
+               if (otg) {
+                       otg->host = &hcd->self;
+                       hcd->self.otg_port = 1;
+               }
+       }
 
        if (ci->platdata->flags & CI_HDRC_DISABLE_STREAMING)
                hw_write(ci, OP_USBMODE, USBMODE_CI_SDIS, USBMODE_CI_SDIS);
@@ -89,7 +100,7 @@ static int host_start(struct ci_hdrc *ci)
        return ret;
 
 disable_reg:
-       if (ci->platdata->reg_vbus)
+       if (ci->platdata->reg_vbus && !ci_otg_is_fsm_mode(ci))
                regulator_disable(ci->platdata->reg_vbus);
 
 put_hcd:
@@ -105,7 +116,7 @@ static void host_stop(struct ci_hdrc *ci)
        if (hcd) {
                usb_remove_hcd(hcd);
                usb_put_hcd(hcd);
-               if (ci->platdata->reg_vbus)
+               if (ci->platdata->reg_vbus && !ci_otg_is_fsm_mode(ci))
                        regulator_disable(ci->platdata->reg_vbus);
        }
 }
index 39bd7ec..a048b08 100644 (file)
@@ -11,8 +11,8 @@
  */
 
 /*
- * This file mainly handles otgsc register, it may include OTG operation
- * in the future.
+ * This file mainly handles otgsc register, OTG fsm operations for HNP and SRP
+ * are also included.
  */
 
 #include <linux/usb/otg.h>
 #include "ci.h"
 #include "bits.h"
 #include "otg.h"
+#include "otg_fsm.h"
+
+/**
+ * hw_read_otgsc returns otgsc register bits value.
+ * @mask: bitfield mask
+ */
+u32 hw_read_otgsc(struct ci_hdrc *ci, u32 mask)
+{
+       return hw_read(ci, OP_OTGSC, mask);
+}
+
+/**
+ * hw_write_otgsc updates target bits of OTGSC register.
+ * @mask: bitfield mask
+ * @data: to be written
+ */
+void hw_write_otgsc(struct ci_hdrc *ci, u32 mask, u32 data)
+{
+       hw_write(ci, OP_OTGSC, mask | OTGSC_INT_STATUS_BITS, data);
+}
 
 /**
  * ci_otg_role - pick role based on ID pin state
@@ -29,8 +49,7 @@
  */
 enum ci_role ci_otg_role(struct ci_hdrc *ci)
 {
-       u32 sts = hw_read(ci, OP_OTGSC, ~0);
-       enum ci_role role = sts & OTGSC_ID
+       enum ci_role role = hw_read_otgsc(ci, OTGSC_ID)
                ? CI_ROLE_GADGET
                : CI_ROLE_HOST;
 
@@ -39,14 +58,10 @@ enum ci_role ci_otg_role(struct ci_hdrc *ci)
 
 void ci_handle_vbus_change(struct ci_hdrc *ci)
 {
-       u32 otgsc;
-
        if (!ci->is_otg)
                return;
 
-       otgsc = hw_read(ci, OP_OTGSC, ~0);
-
-       if (otgsc & OTGSC_BSV)
+       if (hw_read_otgsc(ci, OTGSC_BSV))
                usb_gadget_vbus_connect(&ci->gadget);
        else
                usb_gadget_vbus_disconnect(&ci->gadget);
@@ -76,6 +91,11 @@ static void ci_otg_work(struct work_struct *work)
 {
        struct ci_hdrc *ci = container_of(work, struct ci_hdrc, work);
 
+       if (ci_otg_is_fsm_mode(ci) && !ci_otg_fsm_work(ci)) {
+               enable_irq(ci->irq);
+               return;
+       }
+
        if (ci->id_event) {
                ci->id_event = false;
                ci_handle_id_switch(ci);
@@ -102,6 +122,9 @@ int ci_hdrc_otg_init(struct ci_hdrc *ci)
                return -ENODEV;
        }
 
+       if (ci_otg_is_fsm_mode(ci))
+               return ci_hdrc_otg_fsm_init(ci);
+
        return 0;
 }
 
@@ -115,6 +138,9 @@ void ci_hdrc_otg_destroy(struct ci_hdrc *ci)
                flush_workqueue(ci->wq);
                destroy_workqueue(ci->wq);
        }
-       ci_disable_otg_interrupt(ci, OTGSC_INT_EN_BITS);
-       ci_clear_otg_interrupt(ci, OTGSC_INT_STATUS_BITS);
+       /* Disable all OTG irq and clear status */
+       hw_write_otgsc(ci, OTGSC_INT_EN_BITS | OTGSC_INT_STATUS_BITS,
+                                               OTGSC_INT_STATUS_BITS);
+       if (ci_otg_is_fsm_mode(ci))
+               ci_hdrc_otg_fsm_remove(ci);
 }
index 449bee0..7349267 100644 (file)
 #ifndef __DRIVERS_USB_CHIPIDEA_OTG_H
 #define __DRIVERS_USB_CHIPIDEA_OTG_H
 
-static inline void ci_clear_otg_interrupt(struct ci_hdrc *ci, u32 bits)
-{
-       /* Only clear request bits */
-       hw_write(ci, OP_OTGSC, OTGSC_INT_STATUS_BITS, bits);
-}
-
-static inline void ci_enable_otg_interrupt(struct ci_hdrc *ci, u32 bits)
-{
-       hw_write(ci, OP_OTGSC, bits | OTGSC_INT_STATUS_BITS, bits);
-}
-
-static inline void ci_disable_otg_interrupt(struct ci_hdrc *ci, u32 bits)
-{
-       hw_write(ci, OP_OTGSC, bits | OTGSC_INT_STATUS_BITS, 0);
-}
-
+u32 hw_read_otgsc(struct ci_hdrc *ci, u32 mask);
+void hw_write_otgsc(struct ci_hdrc *ci, u32 mask, u32 data);
 int ci_hdrc_otg_init(struct ci_hdrc *ci);
 void ci_hdrc_otg_destroy(struct ci_hdrc *ci);
 enum ci_role ci_otg_role(struct ci_hdrc *ci);
diff --git a/drivers/usb/chipidea/otg_fsm.c b/drivers/usb/chipidea/otg_fsm.c
new file mode 100644 (file)
index 0000000..8d4c33d
--- /dev/null
@@ -0,0 +1,865 @@
+/*
+ * otg_fsm.c - ChipIdea USB IP core OTG FSM driver
+ *
+ * Copyright (C) 2014 Freescale Semiconductor, Inc.
+ *
+ * Author: Jun Li
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+/*
+ * This file mainly handles OTG fsm, it includes OTG fsm operations
+ * for HNP and SRP.
+ *
+ * TODO List
+ * - ADP
+ * - OTG test device
+ */
+
+#include <linux/usb/otg.h>
+#include <linux/usb/gadget.h>
+#include <linux/usb/hcd.h>
+#include <linux/usb/chipidea.h>
+#include <linux/regulator/consumer.h>
+
+#include "ci.h"
+#include "bits.h"
+#include "otg.h"
+#include "otg_fsm.h"
+
+static struct ci_otg_fsm_timer *otg_timer_initializer
+(struct ci_hdrc *ci, void (*function)(void *, unsigned long),
+                       unsigned long expires, unsigned long data)
+{
+       struct ci_otg_fsm_timer *timer;
+
+       timer = devm_kzalloc(ci->dev, sizeof(struct ci_otg_fsm_timer),
+                                                               GFP_KERNEL);
+       if (!timer)
+               return NULL;
+       timer->function = function;
+       timer->expires = expires;
+       timer->data = data;
+       return timer;
+}
+
+/* Add for otg: interact with user space app */
+static ssize_t
+get_a_bus_req(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       char            *next;
+       unsigned        size, t;
+       struct ci_hdrc  *ci = dev_get_drvdata(dev);
+
+       next = buf;
+       size = PAGE_SIZE;
+       t = scnprintf(next, size, "%d\n", ci->fsm.a_bus_req);
+       size -= t;
+       next += t;
+
+       return PAGE_SIZE - size;
+}
+
+static ssize_t
+set_a_bus_req(struct device *dev, struct device_attribute *attr,
+                                       const char *buf, size_t count)
+{
+       struct ci_hdrc *ci = dev_get_drvdata(dev);
+
+       if (count > 2)
+               return -1;
+
+       mutex_lock(&ci->fsm.lock);
+       if (buf[0] == '0') {
+               ci->fsm.a_bus_req = 0;
+       } else if (buf[0] == '1') {
+               /* If a_bus_drop is TRUE, a_bus_req can't be set */
+               if (ci->fsm.a_bus_drop) {
+                       mutex_unlock(&ci->fsm.lock);
+                       return count;
+               }
+               ci->fsm.a_bus_req = 1;
+       }
+
+       disable_irq_nosync(ci->irq);
+       queue_work(ci->wq, &ci->work);
+       mutex_unlock(&ci->fsm.lock);
+
+       return count;
+}
+static DEVICE_ATTR(a_bus_req, S_IRUGO | S_IWUSR, get_a_bus_req, set_a_bus_req);
+
+static ssize_t
+get_a_bus_drop(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       char            *next;
+       unsigned        size, t;
+       struct ci_hdrc  *ci = dev_get_drvdata(dev);
+
+       next = buf;
+       size = PAGE_SIZE;
+       t = scnprintf(next, size, "%d\n", ci->fsm.a_bus_drop);
+       size -= t;
+       next += t;
+
+       return PAGE_SIZE - size;
+}
+
+static ssize_t
+set_a_bus_drop(struct device *dev, struct device_attribute *attr,
+                                       const char *buf, size_t count)
+{
+       struct ci_hdrc  *ci = dev_get_drvdata(dev);
+
+       if (count > 2)
+               return -1;
+
+       mutex_lock(&ci->fsm.lock);
+       if (buf[0] == '0') {
+               ci->fsm.a_bus_drop = 0;
+       } else if (buf[0] == '1') {
+               ci->fsm.a_bus_drop = 1;
+               ci->fsm.a_bus_req = 0;
+       }
+
+       disable_irq_nosync(ci->irq);
+       queue_work(ci->wq, &ci->work);
+       mutex_unlock(&ci->fsm.lock);
+
+       return count;
+}
+static DEVICE_ATTR(a_bus_drop, S_IRUGO | S_IWUSR, get_a_bus_drop,
+                                               set_a_bus_drop);
+
+static ssize_t
+get_b_bus_req(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       char            *next;
+       unsigned        size, t;
+       struct ci_hdrc  *ci = dev_get_drvdata(dev);
+
+       next = buf;
+       size = PAGE_SIZE;
+       t = scnprintf(next, size, "%d\n", ci->fsm.b_bus_req);
+       size -= t;
+       next += t;
+
+       return PAGE_SIZE - size;
+}
+
+static ssize_t
+set_b_bus_req(struct device *dev, struct device_attribute *attr,
+                                       const char *buf, size_t count)
+{
+       struct ci_hdrc  *ci = dev_get_drvdata(dev);
+
+       if (count > 2)
+               return -1;
+
+       mutex_lock(&ci->fsm.lock);
+       if (buf[0] == '0')
+               ci->fsm.b_bus_req = 0;
+       else if (buf[0] == '1')
+               ci->fsm.b_bus_req = 1;
+
+       disable_irq_nosync(ci->irq);
+       queue_work(ci->wq, &ci->work);
+       mutex_unlock(&ci->fsm.lock);
+
+       return count;
+}
+static DEVICE_ATTR(b_bus_req, S_IRUGO | S_IWUSR, get_b_bus_req, set_b_bus_req);
+
+static ssize_t
+set_a_clr_err(struct device *dev, struct device_attribute *attr,
+                                       const char *buf, size_t count)
+{
+       struct ci_hdrc  *ci = dev_get_drvdata(dev);
+
+       if (count > 2)
+               return -1;
+
+       mutex_lock(&ci->fsm.lock);
+       if (buf[0] == '1')
+               ci->fsm.a_clr_err = 1;
+
+       disable_irq_nosync(ci->irq);
+       queue_work(ci->wq, &ci->work);
+       mutex_unlock(&ci->fsm.lock);
+
+       return count;
+}
+static DEVICE_ATTR(a_clr_err, S_IWUSR, NULL, set_a_clr_err);
+
+static struct attribute *inputs_attrs[] = {
+       &dev_attr_a_bus_req.attr,
+       &dev_attr_a_bus_drop.attr,
+       &dev_attr_b_bus_req.attr,
+       &dev_attr_a_clr_err.attr,
+       NULL,
+};
+
+static struct attribute_group inputs_attr_group = {
+       .name = "inputs",
+       .attrs = inputs_attrs,
+};
+
+/*
+ * Add timer to active timer list
+ */
+static void ci_otg_add_timer(struct ci_hdrc *ci, enum ci_otg_fsm_timer_index t)
+{
+       struct ci_otg_fsm_timer *tmp_timer;
+       struct ci_otg_fsm_timer *timer = ci->fsm_timer->timer_list[t];
+       struct list_head *active_timers = &ci->fsm_timer->active_timers;
+
+       if (t >= NUM_CI_OTG_FSM_TIMERS)
+               return;
+
+       /*
+        * Check if the timer is already in the active list,
+        * if so update timer count
+        */
+       list_for_each_entry(tmp_timer, active_timers, list)
+               if (tmp_timer == timer) {
+                       timer->count = timer->expires;
+                       return;
+               }
+
+       timer->count = timer->expires;
+       list_add_tail(&timer->list, active_timers);
+
+       /* Enable 1ms irq */
+       if (!(hw_read_otgsc(ci, OTGSC_1MSIE)))
+               hw_write_otgsc(ci, OTGSC_1MSIE, OTGSC_1MSIE);
+}
+
+/*
+ * Remove timer from active timer list
+ */
+static void ci_otg_del_timer(struct ci_hdrc *ci, enum ci_otg_fsm_timer_index t)
+{
+       struct ci_otg_fsm_timer *tmp_timer, *del_tmp;
+       struct ci_otg_fsm_timer *timer = ci->fsm_timer->timer_list[t];
+       struct list_head *active_timers = &ci->fsm_timer->active_timers;
+
+       if (t >= NUM_CI_OTG_FSM_TIMERS)
+               return;
+
+       list_for_each_entry_safe(tmp_timer, del_tmp, active_timers, list)
+               if (tmp_timer == timer)
+                       list_del(&timer->list);
+
+       /* Disable 1ms irq if there is no any active timer */
+       if (list_empty(active_timers))
+               hw_write_otgsc(ci, OTGSC_1MSIE, 0);
+}
+
+/*
+ * Reduce timer count by 1, and find timeout conditions.
+ * Called by otg 1ms timer interrupt
+ */
+static inline int ci_otg_tick_timer(struct ci_hdrc *ci)
+{
+       struct ci_otg_fsm_timer *tmp_timer, *del_tmp;
+       struct list_head *active_timers = &ci->fsm_timer->active_timers;
+       int expired = 0;
+
+       list_for_each_entry_safe(tmp_timer, del_tmp, active_timers, list) {
+               tmp_timer->count--;
+               /* check if timer expires */
+               if (!tmp_timer->count) {
+                       list_del(&tmp_timer->list);
+                       tmp_timer->function(ci, tmp_timer->data);
+                       expired = 1;
+               }
+       }
+
+       /* disable 1ms irq if there is no any timer active */
+       if ((expired == 1) && list_empty(active_timers))
+               hw_write_otgsc(ci, OTGSC_1MSIE, 0);
+
+       return expired;
+}
+
+/* The timeout callback function to set time out bit */
+static void set_tmout(void *ptr, unsigned long indicator)
+{
+       *(int *)indicator = 1;
+}
+
+static void set_tmout_and_fsm(void *ptr, unsigned long indicator)
+{
+       struct ci_hdrc *ci = (struct ci_hdrc *)ptr;
+
+       set_tmout(ci, indicator);
+
+       disable_irq_nosync(ci->irq);
+       queue_work(ci->wq, &ci->work);
+}
+
+static void a_wait_vfall_tmout_func(void *ptr, unsigned long indicator)
+{
+       struct ci_hdrc *ci = (struct ci_hdrc *)ptr;
+
+       set_tmout(ci, indicator);
+       /* Disable port power */
+       hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_PP, 0);
+       /* Clear exsiting DP irq */
+       hw_write_otgsc(ci, OTGSC_DPIS, OTGSC_DPIS);
+       /* Enable data pulse irq */
+       hw_write_otgsc(ci, OTGSC_DPIE, OTGSC_DPIE);
+       disable_irq_nosync(ci->irq);
+       queue_work(ci->wq, &ci->work);
+}
+
+static void b_ase0_brst_tmout_func(void *ptr, unsigned long indicator)
+{
+       struct ci_hdrc *ci = (struct ci_hdrc *)ptr;
+
+       set_tmout(ci, indicator);
+       if (!hw_read_otgsc(ci, OTGSC_BSV))
+               ci->fsm.b_sess_vld = 0;
+
+       disable_irq_nosync(ci->irq);
+       queue_work(ci->wq, &ci->work);
+}
+
+static void b_ssend_srp_tmout_func(void *ptr, unsigned long indicator)
+{
+       struct ci_hdrc *ci = (struct ci_hdrc *)ptr;
+
+       set_tmout(ci, indicator);
+
+       /* only vbus fall below B_sess_vld in b_idle state */
+       if (ci->transceiver->state == OTG_STATE_B_IDLE) {
+               disable_irq_nosync(ci->irq);
+               queue_work(ci->wq, &ci->work);
+       }
+}
+
+static void b_sess_vld_tmout_func(void *ptr, unsigned long indicator)
+{
+       struct ci_hdrc *ci = (struct ci_hdrc *)ptr;
+
+       /* Check if A detached */
+       if (!(hw_read_otgsc(ci, OTGSC_BSV))) {
+               ci->fsm.b_sess_vld = 0;
+               ci_otg_add_timer(ci, B_SSEND_SRP);
+               disable_irq_nosync(ci->irq);
+               queue_work(ci->wq, &ci->work);
+       }
+}
+
+static void b_data_pulse_end(void *ptr, unsigned long indicator)
+{
+       struct ci_hdrc *ci = (struct ci_hdrc *)ptr;
+
+       ci->fsm.b_srp_done = 1;
+       ci->fsm.b_bus_req = 0;
+       if (ci->fsm.power_up)
+               ci->fsm.power_up = 0;
+
+       hw_write_otgsc(ci, OTGSC_HABA, 0);
+
+       disable_irq_nosync(ci->irq);
+       queue_work(ci->wq, &ci->work);
+}
+
+/* Initialize timers */
+static int ci_otg_init_timers(struct ci_hdrc *ci)
+{
+       struct otg_fsm *fsm = &ci->fsm;
+
+       /* FSM used timers */
+       ci->fsm_timer->timer_list[A_WAIT_VRISE] =
+               otg_timer_initializer(ci, &set_tmout_and_fsm, TA_WAIT_VRISE,
+                       (unsigned long)&fsm->a_wait_vrise_tmout);
+       if (ci->fsm_timer->timer_list[A_WAIT_VRISE] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[A_WAIT_VFALL] =
+               otg_timer_initializer(ci, &a_wait_vfall_tmout_func,
+               TA_WAIT_VFALL, (unsigned long)&fsm->a_wait_vfall_tmout);
+       if (ci->fsm_timer->timer_list[A_WAIT_VFALL] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[A_WAIT_BCON] =
+               otg_timer_initializer(ci, &set_tmout_and_fsm, TA_WAIT_BCON,
+                               (unsigned long)&fsm->a_wait_bcon_tmout);
+       if (ci->fsm_timer->timer_list[A_WAIT_BCON] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[A_AIDL_BDIS] =
+               otg_timer_initializer(ci, &set_tmout_and_fsm, TA_AIDL_BDIS,
+                               (unsigned long)&fsm->a_aidl_bdis_tmout);
+       if (ci->fsm_timer->timer_list[A_AIDL_BDIS] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[A_BIDL_ADIS] =
+               otg_timer_initializer(ci, &set_tmout_and_fsm, TA_BIDL_ADIS,
+                               (unsigned long)&fsm->a_bidl_adis_tmout);
+       if (ci->fsm_timer->timer_list[A_BIDL_ADIS] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[B_ASE0_BRST] =
+               otg_timer_initializer(ci, &b_ase0_brst_tmout_func, TB_ASE0_BRST,
+                                       (unsigned long)&fsm->b_ase0_brst_tmout);
+       if (ci->fsm_timer->timer_list[B_ASE0_BRST] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[B_SE0_SRP] =
+               otg_timer_initializer(ci, &set_tmout_and_fsm, TB_SE0_SRP,
+                                       (unsigned long)&fsm->b_se0_srp);
+       if (ci->fsm_timer->timer_list[B_SE0_SRP] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[B_SSEND_SRP] =
+               otg_timer_initializer(ci, &b_ssend_srp_tmout_func, TB_SSEND_SRP,
+                                       (unsigned long)&fsm->b_ssend_srp);
+       if (ci->fsm_timer->timer_list[B_SSEND_SRP] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[B_SRP_FAIL] =
+               otg_timer_initializer(ci, &set_tmout, TB_SRP_FAIL,
+                               (unsigned long)&fsm->b_srp_done);
+       if (ci->fsm_timer->timer_list[B_SRP_FAIL] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[B_DATA_PLS] =
+               otg_timer_initializer(ci, &b_data_pulse_end, TB_DATA_PLS, 0);
+       if (ci->fsm_timer->timer_list[B_DATA_PLS] == NULL)
+               return -ENOMEM;
+
+       ci->fsm_timer->timer_list[B_SESS_VLD] = otg_timer_initializer(ci,
+                                       &b_sess_vld_tmout_func, TB_SESS_VLD, 0);
+       if (ci->fsm_timer->timer_list[B_SESS_VLD] == NULL)
+               return -ENOMEM;
+
+       return 0;
+}
+
+/* -------------------------------------------------------------*/
+/* Operations that will be called from OTG Finite State Machine */
+/* -------------------------------------------------------------*/
+static void ci_otg_fsm_add_timer(struct otg_fsm *fsm, enum otg_fsm_timer t)
+{
+       struct ci_hdrc  *ci = container_of(fsm, struct ci_hdrc, fsm);
+
+       if (t < NUM_OTG_FSM_TIMERS)
+               ci_otg_add_timer(ci, t);
+       return;
+}
+
+static void ci_otg_fsm_del_timer(struct otg_fsm *fsm, enum otg_fsm_timer t)
+{
+       struct ci_hdrc  *ci = container_of(fsm, struct ci_hdrc, fsm);
+
+       if (t < NUM_OTG_FSM_TIMERS)
+               ci_otg_del_timer(ci, t);
+       return;
+}
+
+/*
+ * A-device drive vbus: turn on vbus regulator and enable port power
+ * Data pulse irq should be disabled while vbus is on.
+ */
+static void ci_otg_drv_vbus(struct otg_fsm *fsm, int on)
+{
+       int ret;
+       struct ci_hdrc  *ci = container_of(fsm, struct ci_hdrc, fsm);
+
+       if (on) {
+               /* Enable power power */
+               hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_PP,
+                                                       PORTSC_PP);
+               if (ci->platdata->reg_vbus) {
+                       ret = regulator_enable(ci->platdata->reg_vbus);
+                       if (ret) {
+                               dev_err(ci->dev,
+                               "Failed to enable vbus regulator, ret=%d\n",
+                               ret);
+                               return;
+                       }
+               }
+               /* Disable data pulse irq */
+               hw_write_otgsc(ci, OTGSC_DPIE, 0);
+
+               fsm->a_srp_det = 0;
+               fsm->power_up = 0;
+       } else {
+               if (ci->platdata->reg_vbus)
+                       regulator_disable(ci->platdata->reg_vbus);
+
+               fsm->a_bus_drop = 1;
+               fsm->a_bus_req = 0;
+       }
+}
+
+/*
+ * Control data line by Run Stop bit.
+ */
+static void ci_otg_loc_conn(struct otg_fsm *fsm, int on)
+{
+       struct ci_hdrc  *ci = container_of(fsm, struct ci_hdrc, fsm);
+
+       if (on)
+               hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS);
+       else
+               hw_write(ci, OP_USBCMD, USBCMD_RS, 0);
+}
+
+/*
+ * Generate SOF by host.
+ * This is controlled through suspend/resume the port.
+ * In host mode, controller will automatically send SOF.
+ * Suspend will block the data on the port.
+ */
+static void ci_otg_loc_sof(struct otg_fsm *fsm, int on)
+{
+       struct ci_hdrc  *ci = container_of(fsm, struct ci_hdrc, fsm);
+
+       if (on)
+               hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_FPR,
+                                                       PORTSC_FPR);
+       else
+               hw_write(ci, OP_PORTSC, PORTSC_W1C_BITS | PORTSC_SUSP,
+                                                       PORTSC_SUSP);
+}
+
+/*
+ * Start SRP pulsing by data-line pulsing,
+ * no v-bus pulsing followed
+ */
+static void ci_otg_start_pulse(struct otg_fsm *fsm)
+{
+       struct ci_hdrc  *ci = container_of(fsm, struct ci_hdrc, fsm);
+
+       /* Hardware Assistant Data pulse */
+       hw_write_otgsc(ci, OTGSC_HADP, OTGSC_HADP);
+
+       ci_otg_add_timer(ci, B_DATA_PLS);
+}
+
+static int ci_otg_start_host(struct otg_fsm *fsm, int on)
+{
+       struct ci_hdrc  *ci = container_of(fsm, struct ci_hdrc, fsm);
+
+       mutex_unlock(&fsm->lock);
+       if (on) {
+               ci_role_stop(ci);
+               ci_role_start(ci, CI_ROLE_HOST);
+       } else {
+               ci_role_stop(ci);
+               hw_device_reset(ci, USBMODE_CM_DC);
+               ci_role_start(ci, CI_ROLE_GADGET);
+       }
+       mutex_lock(&fsm->lock);
+       return 0;
+}
+
+static int ci_otg_start_gadget(struct otg_fsm *fsm, int on)
+{
+       struct ci_hdrc  *ci = container_of(fsm, struct ci_hdrc, fsm);
+
+       mutex_unlock(&fsm->lock);
+       if (on)
+               usb_gadget_vbus_connect(&ci->gadget);
+       else
+               usb_gadget_vbus_disconnect(&ci->gadget);
+       mutex_lock(&fsm->lock);
+
+       return 0;
+}
+
+static struct otg_fsm_ops ci_otg_ops = {
+       .drv_vbus = ci_otg_drv_vbus,
+       .loc_conn = ci_otg_loc_conn,
+       .loc_sof = ci_otg_loc_sof,
+       .start_pulse = ci_otg_start_pulse,
+       .add_timer = ci_otg_fsm_add_timer,
+       .del_timer = ci_otg_fsm_del_timer,
+       .start_host = ci_otg_start_host,
+       .start_gadget = ci_otg_start_gadget,
+};
+
+int ci_otg_fsm_work(struct ci_hdrc *ci)
+{
+       /*
+        * Don't do fsm transition for B device
+        * when there is no gadget class driver
+        */
+       if (ci->fsm.id && !(ci->driver) &&
+               ci->transceiver->state < OTG_STATE_A_IDLE)
+               return 0;
+
+       if (otg_statemachine(&ci->fsm)) {
+               if (ci->transceiver->state == OTG_STATE_A_IDLE) {
+                       /*
+                        * Further state change for cases:
+                        * a_idle to b_idle; or
+                        * a_idle to a_wait_vrise due to ID change(1->0), so
+                        * B-dev becomes A-dev can try to start new session
+                        * consequently; or
+                        * a_idle to a_wait_vrise when power up
+                        */
+                       if ((ci->fsm.id) || (ci->id_event) ||
+                                               (ci->fsm.power_up)) {
+                               disable_irq_nosync(ci->irq);
+                               queue_work(ci->wq, &ci->work);
+                       }
+                       if (ci->id_event)
+                               ci->id_event = false;
+               } else if (ci->transceiver->state == OTG_STATE_B_IDLE) {
+                       if (ci->fsm.b_sess_vld) {
+                               ci->fsm.power_up = 0;
+                               /*
+                                * Further transite to b_periphearl state
+                                * when register gadget driver with vbus on
+                                */
+                               disable_irq_nosync(ci->irq);
+                               queue_work(ci->wq, &ci->work);
+                       }
+               }
+       }
+       return 0;
+}
+
+/*
+ * Update fsm variables in each state if catching expected interrupts,
+ * called by otg fsm isr.
+ */
+static void ci_otg_fsm_event(struct ci_hdrc *ci)
+{
+       u32 intr_sts, otg_bsess_vld, port_conn;
+       struct otg_fsm *fsm = &ci->fsm;
+
+       intr_sts = hw_read_intr_status(ci);
+       otg_bsess_vld = hw_read_otgsc(ci, OTGSC_BSV);
+       port_conn = hw_read(ci, OP_PORTSC, PORTSC_CCS);
+
+       switch (ci->transceiver->state) {
+       case OTG_STATE_A_WAIT_BCON:
+               if (port_conn) {
+                       fsm->b_conn = 1;
+                       fsm->a_bus_req = 1;
+                       disable_irq_nosync(ci->irq);
+                       queue_work(ci->wq, &ci->work);
+               }
+               break;
+       case OTG_STATE_B_IDLE:
+               if (otg_bsess_vld && (intr_sts & USBi_PCI) && port_conn) {
+                       fsm->b_sess_vld = 1;
+                       disable_irq_nosync(ci->irq);
+                       queue_work(ci->wq, &ci->work);
+               }
+               break;
+       case OTG_STATE_B_PERIPHERAL:
+               if ((intr_sts & USBi_SLI) && port_conn && otg_bsess_vld) {
+                       fsm->a_bus_suspend = 1;
+                       disable_irq_nosync(ci->irq);
+                       queue_work(ci->wq, &ci->work);
+               } else if (intr_sts & USBi_PCI) {
+                       if (fsm->a_bus_suspend == 1)
+                               fsm->a_bus_suspend = 0;
+               }
+               break;
+       case OTG_STATE_B_HOST:
+               if ((intr_sts & USBi_PCI) && !port_conn) {
+                       fsm->a_conn = 0;
+                       fsm->b_bus_req = 0;
+                       disable_irq_nosync(ci->irq);
+                       queue_work(ci->wq, &ci->work);
+                       ci_otg_add_timer(ci, B_SESS_VLD);
+               }
+               break;
+       case OTG_STATE_A_PERIPHERAL:
+               if (intr_sts & USBi_SLI) {
+                        fsm->b_bus_suspend = 1;
+                       /*
+                        * Init a timer to know how long this suspend
+                        * will contine, if time out, indicates B no longer
+                        * wants to be host role
+                        */
+                        ci_otg_add_timer(ci, A_BIDL_ADIS);
+               }
+
+               if (intr_sts & USBi_URI)
+                       ci_otg_del_timer(ci, A_BIDL_ADIS);
+
+               if (intr_sts & USBi_PCI) {
+                       if (fsm->b_bus_suspend == 1) {
+                               ci_otg_del_timer(ci, A_BIDL_ADIS);
+                               fsm->b_bus_suspend = 0;
+                       }
+               }
+               break;
+       case OTG_STATE_A_SUSPEND:
+               if ((intr_sts & USBi_PCI) && !port_conn) {
+                       fsm->b_conn = 0;
+
+                       /* if gadget driver is binded */
+                       if (ci->driver) {
+                               /* A device to be peripheral mode */
+                               ci->gadget.is_a_peripheral = 1;
+                       }
+                       disable_irq_nosync(ci->irq);
+                       queue_work(ci->wq, &ci->work);
+               }
+               break;
+       case OTG_STATE_A_HOST:
+               if ((intr_sts & USBi_PCI) && !port_conn) {
+                       fsm->b_conn = 0;
+                       disable_irq_nosync(ci->irq);
+                       queue_work(ci->wq, &ci->work);
+               }
+               break;
+       case OTG_STATE_B_WAIT_ACON:
+               if ((intr_sts & USBi_PCI) && port_conn) {
+                       fsm->a_conn = 1;
+                       disable_irq_nosync(ci->irq);
+                       queue_work(ci->wq, &ci->work);
+               }
+               break;
+       default:
+               break;
+       }
+}
+
+/*
+ * ci_otg_irq - otg fsm related irq handling
+ * and also update otg fsm variable by monitoring usb host and udc
+ * state change interrupts.
+ * @ci: ci_hdrc
+ */
+irqreturn_t ci_otg_fsm_irq(struct ci_hdrc *ci)
+{
+       irqreturn_t retval =  IRQ_NONE;
+       u32 otgsc, otg_int_src = 0;
+       struct otg_fsm *fsm = &ci->fsm;
+
+       otgsc = hw_read_otgsc(ci, ~0);
+       otg_int_src = otgsc & OTGSC_INT_STATUS_BITS & (otgsc >> 8);
+       fsm->id = (otgsc & OTGSC_ID) ? 1 : 0;
+
+       if (otg_int_src) {
+               if (otg_int_src & OTGSC_1MSIS) {
+                       hw_write_otgsc(ci, OTGSC_1MSIS, OTGSC_1MSIS);
+                       retval = ci_otg_tick_timer(ci);
+                       return IRQ_HANDLED;
+               } else if (otg_int_src & OTGSC_DPIS) {
+                       hw_write_otgsc(ci, OTGSC_DPIS, OTGSC_DPIS);
+                       fsm->a_srp_det = 1;
+                       fsm->a_bus_drop = 0;
+               } else if (otg_int_src & OTGSC_IDIS) {
+                       hw_write_otgsc(ci, OTGSC_IDIS, OTGSC_IDIS);
+                       if (fsm->id == 0) {
+                               fsm->a_bus_drop = 0;
+                               fsm->a_bus_req = 1;
+                               ci->id_event = true;
+                       }
+               } else if (otg_int_src & OTGSC_BSVIS) {
+                       hw_write_otgsc(ci, OTGSC_BSVIS, OTGSC_BSVIS);
+                       if (otgsc & OTGSC_BSV) {
+                               fsm->b_sess_vld = 1;
+                               ci_otg_del_timer(ci, B_SSEND_SRP);
+                               ci_otg_del_timer(ci, B_SRP_FAIL);
+                               fsm->b_ssend_srp = 0;
+                       } else {
+                               fsm->b_sess_vld = 0;
+                               if (fsm->id)
+                                       ci_otg_add_timer(ci, B_SSEND_SRP);
+                       }
+               } else if (otg_int_src & OTGSC_AVVIS) {
+                       hw_write_otgsc(ci, OTGSC_AVVIS, OTGSC_AVVIS);
+                       if (otgsc & OTGSC_AVV) {
+                               fsm->a_vbus_vld = 1;
+                       } else {
+                               fsm->a_vbus_vld = 0;
+                               fsm->b_conn = 0;
+                       }
+               }
+               disable_irq_nosync(ci->irq);
+               queue_work(ci->wq, &ci->work);
+               return IRQ_HANDLED;
+       }
+
+       ci_otg_fsm_event(ci);
+
+       return retval;
+}
+
+void ci_hdrc_otg_fsm_start(struct ci_hdrc *ci)
+{
+       disable_irq_nosync(ci->irq);
+       queue_work(ci->wq, &ci->work);
+}
+
+int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci)
+{
+       int retval = 0;
+       struct usb_otg *otg;
+
+       otg = devm_kzalloc(ci->dev,
+                       sizeof(struct usb_otg), GFP_KERNEL);
+       if (!otg) {
+               dev_err(ci->dev,
+               "Failed to allocate usb_otg structure for ci hdrc otg!\n");
+               return -ENOMEM;
+       }
+
+       otg->phy = ci->transceiver;
+       otg->gadget = &ci->gadget;
+       ci->fsm.otg = otg;
+       ci->transceiver->otg = ci->fsm.otg;
+       ci->fsm.power_up = 1;
+       ci->fsm.id = hw_read_otgsc(ci, OTGSC_ID) ? 1 : 0;
+       ci->transceiver->state = OTG_STATE_UNDEFINED;
+       ci->fsm.ops = &ci_otg_ops;
+
+       mutex_init(&ci->fsm.lock);
+
+       ci->fsm_timer = devm_kzalloc(ci->dev,
+                       sizeof(struct ci_otg_fsm_timer_list), GFP_KERNEL);
+       if (!ci->fsm_timer) {
+               dev_err(ci->dev,
+               "Failed to allocate timer structure for ci hdrc otg!\n");
+               return -ENOMEM;
+       }
+
+       INIT_LIST_HEAD(&ci->fsm_timer->active_timers);
+       retval = ci_otg_init_timers(ci);
+       if (retval) {
+               dev_err(ci->dev, "Couldn't init OTG timers\n");
+               return retval;
+       }
+
+       retval = sysfs_create_group(&ci->dev->kobj, &inputs_attr_group);
+       if (retval < 0) {
+               dev_dbg(ci->dev,
+                       "Can't register sysfs attr group: %d\n", retval);
+               return retval;
+       }
+
+       /* Enable A vbus valid irq */
+       hw_write_otgsc(ci, OTGSC_AVVIE, OTGSC_AVVIE);
+
+       if (ci->fsm.id) {
+               ci->fsm.b_ssend_srp =
+                       hw_read_otgsc(ci, OTGSC_BSV) ? 0 : 1;
+               ci->fsm.b_sess_vld =
+                       hw_read_otgsc(ci, OTGSC_BSV) ? 1 : 0;
+               /* Enable BSV irq */
+               hw_write_otgsc(ci, OTGSC_BSVIE, OTGSC_BSVIE);
+       }
+
+       return 0;
+}
+
+void ci_hdrc_otg_fsm_remove(struct ci_hdrc *ci)
+{
+       sysfs_remove_group(&ci->dev->kobj, &inputs_attr_group);
+}
diff --git a/drivers/usb/chipidea/otg_fsm.h b/drivers/usb/chipidea/otg_fsm.h
new file mode 100644 (file)
index 0000000..94c085f
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2014 Freescale Semiconductor, Inc.
+ *
+ * Author: Jun Li
+ *
+ * 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 __DRIVERS_USB_CHIPIDEA_OTG_FSM_H
+#define __DRIVERS_USB_CHIPIDEA_OTG_FSM_H
+
+#include <linux/usb/otg-fsm.h>
+
+/*
+ *  A-DEVICE timing  constants
+ */
+
+/* Wait for VBUS Rise  */
+#define TA_WAIT_VRISE        (100)     /* a_wait_vrise: section 7.1.2
+                                        * a_wait_vrise_tmr: section 7.4.5.1
+                                        * TA_VBUS_RISE <= 100ms, section 4.4
+                                        * Table 4-1: Electrical Characteristics
+                                        * ->DC Electrical Timing
+                                        */
+/* Wait for VBUS Fall  */
+#define TA_WAIT_VFALL        (1000)    /* a_wait_vfall: section 7.1.7
+                                        * a_wait_vfall_tmr: section: 7.4.5.2
+                                        */
+/* Wait for B-Connect */
+#define TA_WAIT_BCON         (10000)   /* a_wait_bcon: section 7.1.3
+                                        * TA_WAIT_BCON: should be between 1100
+                                        * and 30000 ms, section 5.5, Table 5-1
+                                        */
+/* A-Idle to B-Disconnect */
+#define TA_AIDL_BDIS         (5000)    /* a_suspend min 200 ms, section 5.2.1
+                                        * TA_AIDL_BDIS: section 5.5, Table 5-1
+                                        */
+/* B-Idle to A-Disconnect */
+#define TA_BIDL_ADIS         (500)     /* TA_BIDL_ADIS: section 5.2.1
+                                        * 500ms is used for B switch to host
+                                        * for safe
+                                        */
+
+/*
+ * B-device timing constants
+ */
+
+/* Data-Line Pulse Time*/
+#define TB_DATA_PLS          (10)      /* b_srp_init,continue 5~10ms
+                                        * section:5.1.3
+                                        */
+/* SRP Fail Time  */
+#define TB_SRP_FAIL          (6000)    /* b_srp_init,fail time 5~6s
+                                        * section:5.1.6
+                                        */
+/* A-SE0 to B-Reset  */
+#define TB_ASE0_BRST         (155)     /* minimum 155 ms, section:5.3.1 */
+/* SE0 Time Before SRP */
+#define TB_SE0_SRP           (1000)    /* b_idle,minimum 1s, section:5.1.2 */
+/* SSEND time before SRP */
+#define TB_SSEND_SRP         (1500)    /* minimum 1.5 sec, section:5.1.2 */
+
+#define TB_SESS_VLD          (1000)
+
+enum ci_otg_fsm_timer_index {
+       /*
+        * CI specific timers, start from the end
+        * of standard and auxiliary OTG timers
+        */
+       B_DATA_PLS = NUM_OTG_FSM_TIMERS,
+       B_SSEND_SRP,
+       B_SESS_VLD,
+
+       NUM_CI_OTG_FSM_TIMERS,
+};
+
+struct ci_otg_fsm_timer {
+       unsigned long expires;  /* Number of count increase to timeout */
+       unsigned long count;    /* Tick counter */
+       void (*function)(void *, unsigned long);        /* Timeout function */
+       unsigned long data;     /* Data passed to function */
+       struct list_head list;
+};
+
+struct ci_otg_fsm_timer_list {
+       struct ci_otg_fsm_timer *timer_list[NUM_CI_OTG_FSM_TIMERS];
+       struct list_head active_timers;
+};
+
+#ifdef CONFIG_USB_OTG_FSM
+
+int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci);
+int ci_otg_fsm_work(struct ci_hdrc *ci);
+irqreturn_t ci_otg_fsm_irq(struct ci_hdrc *ci);
+void ci_hdrc_otg_fsm_start(struct ci_hdrc *ci);
+void ci_hdrc_otg_fsm_remove(struct ci_hdrc *ci);
+
+#else
+
+static inline int ci_hdrc_otg_fsm_init(struct ci_hdrc *ci)
+{
+       return 0;
+}
+
+static inline int ci_otg_fsm_work(struct ci_hdrc *ci)
+{
+       return -ENXIO;
+}
+
+static inline irqreturn_t ci_otg_fsm_irq(struct ci_hdrc *ci)
+{
+       return IRQ_NONE;
+}
+
+static inline void ci_hdrc_otg_fsm_start(struct ci_hdrc *ci)
+{
+
+}
+
+static inline void ci_hdrc_otg_fsm_remove(struct ci_hdrc *ci)
+{
+
+}
+
+#endif
+
+#endif /* __DRIVERS_USB_CHIPIDEA_OTG_FSM_H */
index 7739c64..150592f 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
+#include <linux/usb/otg-fsm.h>
 #include <linux/usb/chipidea.h>
 
 #include "ci.h"
@@ -27,6 +28,7 @@
 #include "bits.h"
 #include "debug.h"
 #include "otg.h"
+#include "otg_fsm.h"
 
 /* control endpoint description */
 static const struct usb_endpoint_descriptor
@@ -241,26 +243,6 @@ static int hw_port_is_high_speed(struct ci_hdrc *ci)
                hw_read(ci, OP_PORTSC, PORTSC_HSP);
 }
 
-/**
- * hw_read_intr_enable: returns interrupt enable register
- *
- * This function returns register data
- */
-static u32 hw_read_intr_enable(struct ci_hdrc *ci)
-{
-       return hw_read(ci, OP_USBINTR, ~0);
-}
-
-/**
- * hw_read_intr_status: returns interrupt status register
- *
- * This function returns register data
- */
-static u32 hw_read_intr_status(struct ci_hdrc *ci)
-{
-       return hw_read(ci, OP_USBSTS, ~0);
-}
-
 /**
  * hw_test_and_clear_complete: test & clear complete status (execute without
  *                             interruption)
@@ -1072,6 +1054,14 @@ __acquires(ci->lock)
                                default:
                                        break;
                                }
+                               break;
+                       case USB_DEVICE_B_HNP_ENABLE:
+                               if (ci_otg_is_fsm_mode(ci)) {
+                                       ci->gadget.b_hnp_enable = 1;
+                                       err = isr_setup_status_phase(
+                                                       ci);
+                               }
+                               break;
                        default:
                                goto delegate;
                        }
@@ -1655,6 +1645,13 @@ static int ci_udc_start(struct usb_gadget *gadget,
                return retval;
 
        ci->driver = driver;
+
+       /* Start otg fsm for B-device */
+       if (ci_otg_is_fsm_mode(ci) && ci->fsm.id) {
+               ci_hdrc_otg_fsm_start(ci);
+               return retval;
+       }
+
        pm_runtime_get_sync(&ci->gadget.dev);
        if (ci->vbus_active) {
                spin_lock_irqsave(&ci->lock, flags);
@@ -1779,7 +1776,7 @@ static int udc_start(struct ci_hdrc *ci)
        ci->gadget.ops          = &usb_gadget_ops;
        ci->gadget.speed        = USB_SPEED_UNKNOWN;
        ci->gadget.max_speed    = USB_SPEED_HIGH;
-       ci->gadget.is_otg       = 0;
+       ci->gadget.is_otg       = ci->is_otg ? 1 : 0;
        ci->gadget.name         = ci->platdata->name;
 
        INIT_LIST_HEAD(&ci->gadget.ep_list);
@@ -1843,21 +1840,22 @@ void ci_hdrc_gadget_destroy(struct ci_hdrc *ci)
 
 static int udc_id_switch_for_device(struct ci_hdrc *ci)
 {
-       if (ci->is_otg) {
-               ci_clear_otg_interrupt(ci, OTGSC_BSVIS);
-               ci_enable_otg_interrupt(ci, OTGSC_BSVIE);
-       }
+       if (ci->is_otg)
+               /* Clear and enable BSV irq */
+               hw_write_otgsc(ci, OTGSC_BSVIS | OTGSC_BSVIE,
+                                       OTGSC_BSVIS | OTGSC_BSVIE);
 
        return 0;
 }
 
 static void udc_id_switch_for_host(struct ci_hdrc *ci)
 {
-       if (ci->is_otg) {
-               /* host doesn't care B_SESSION_VALID event */
-               ci_clear_otg_interrupt(ci, OTGSC_BSVIS);
-               ci_disable_otg_interrupt(ci, OTGSC_BSVIE);
-       }
+       /*
+        * host doesn't care B_SESSION_VALID event
+        * so clear and disbale BSV irq
+        */
+       if (ci->is_otg)
+               hw_write_otgsc(ci, OTGSC_BSVIE | OTGSC_BSVIS, OTGSC_BSVIS);
 }
 
 /**
index cd061ab..419b895 100644 (file)
 #define MX25_USB_PHY_CTRL_OFFSET       0x08
 #define MX25_BM_EXTERNAL_VBUS_DIVIDER  BIT(23)
 
+#define MX25_EHCI_INTERFACE_SINGLE_UNI (2 << 0)
+#define MX25_EHCI_INTERFACE_DIFF_UNI   (0 << 0)
+#define MX25_EHCI_INTERFACE_MASK       (0xf)
+
+#define MX25_OTG_SIC_SHIFT             29
+#define MX25_OTG_SIC_MASK              (0x3 << MX25_OTG_SIC_SHIFT)
+#define MX25_OTG_PM_BIT                        BIT(24)
+#define MX25_OTG_PP_BIT                        BIT(11)
+#define MX25_OTG_OCPOL_BIT             BIT(3)
+
+#define MX25_H1_SIC_SHIFT              21
+#define MX25_H1_SIC_MASK               (0x3 << MX25_H1_SIC_SHIFT)
+#define MX25_H1_PP_BIT                 BIT(18)
+#define MX25_H1_PM_BIT                 BIT(16)
+#define MX25_H1_IPPUE_UP_BIT           BIT(7)
+#define MX25_H1_IPPUE_DOWN_BIT         BIT(6)
+#define MX25_H1_TLL_BIT                        BIT(5)
+#define MX25_H1_USBTE_BIT              BIT(4)
+#define MX25_H1_OCPOL_BIT              BIT(2)
+
 #define MX27_H1_PM_BIT                 BIT(8)
 #define MX27_H2_PM_BIT                 BIT(16)
 #define MX27_OTG_PM_BIT                        BIT(24)
@@ -50,6 +70,39 @@ struct imx_usbmisc {
 
 static struct imx_usbmisc *usbmisc;
 
+static int usbmisc_imx25_init(struct imx_usbmisc_data *data)
+{
+       unsigned long flags;
+       u32 val = 0;
+
+       if (data->index > 1)
+               return -EINVAL;
+
+       spin_lock_irqsave(&usbmisc->lock, flags);
+       switch (data->index) {
+       case 0:
+               val = readl(usbmisc->base);
+               val &= ~(MX25_OTG_SIC_MASK | MX25_OTG_PP_BIT);
+               val |= (MX25_EHCI_INTERFACE_DIFF_UNI & MX25_EHCI_INTERFACE_MASK) << MX25_OTG_SIC_SHIFT;
+               val |= (MX25_OTG_PM_BIT | MX25_OTG_OCPOL_BIT);
+               writel(val, usbmisc->base);
+               break;
+       case 1:
+               val = readl(usbmisc->base);
+               val &= ~(MX25_H1_SIC_MASK | MX25_H1_PP_BIT |  MX25_H1_IPPUE_UP_BIT);
+               val |= (MX25_EHCI_INTERFACE_SINGLE_UNI & MX25_EHCI_INTERFACE_MASK) << MX25_H1_SIC_SHIFT;
+               val |= (MX25_H1_PM_BIT | MX25_H1_OCPOL_BIT | MX25_H1_TLL_BIT |
+                       MX25_H1_USBTE_BIT | MX25_H1_IPPUE_DOWN_BIT);
+
+               writel(val, usbmisc->base);
+
+               break;
+       }
+       spin_unlock_irqrestore(&usbmisc->lock, flags);
+
+       return 0;
+}
+
 static int usbmisc_imx25_post(struct imx_usbmisc_data *data)
 {
        void __iomem *reg;
@@ -159,6 +212,7 @@ static int usbmisc_imx6q_init(struct imx_usbmisc_data *data)
 }
 
 static const struct usbmisc_ops imx25_usbmisc_ops = {
+       .init = usbmisc_imx25_init,
        .post = usbmisc_imx25_post,
 };
 
@@ -199,6 +253,10 @@ static const struct of_device_id usbmisc_imx_dt_ids[] = {
                .compatible = "fsl,imx25-usbmisc",
                .data = &imx25_usbmisc_ops,
        },
+       {
+               .compatible = "fsl,imx35-usbmisc",
+               .data = &imx25_usbmisc_ops,
+       },
        {
                .compatible = "fsl,imx27-usbmisc",
                .data = &imx27_usbmisc_ops,
index be947d6..f93807b 100644 (file)
@@ -1,25 +1,58 @@
 config USB_DWC2
-       tristate "DesignWare USB2 DRD Core Support"
+       bool "DesignWare USB2 DRD Core Support"
        depends on USB
        help
-         Say Y or M here if your system has a Dual Role HighSpeed
-         USB controller based on the DesignWare HSOTG IP Core.
+         Say Y here if your system has a Dual Role Hi-Speed USB
+         controller based on the DesignWare HSOTG IP Core.
 
-         If you choose to build this driver as dynamically linked
-         modules, the core module will be called dwc2.ko, the
-         PCI bus interface module (if you have a PCI bus system)
-         will be called dwc2_pci.ko and the platform interface module
-         (for controllers directly connected to the CPU) will be called
-         dwc2_platform.ko.
+         For host mode, if you choose to build the driver as dynamically
+         linked modules, the core module will be called dwc2.ko, the PCI
+         bus interface module (if you have a PCI bus system) will be
+         called dwc2_pci.ko, and the platform interface module (for
+         controllers directly connected to the CPU) will be called
+         dwc2_platform.ko. For gadget mode, there will be a single
+         module called dwc2_gadget.ko.
 
-         NOTE: This driver at present only implements the Host mode
-         of the controller. The existing s3c-hsotg driver supports
-         Peripheral mode, but only for the Samsung S3C platforms.
-         There are plans to merge the s3c-hsotg driver with this
-         driver in the near future to create a dual-role driver.
+         NOTE: The s3c-hsotg driver is now renamed to dwc2_gadget. The
+         host and gadget drivers are still currently separate drivers.
+         There are plans to merge the dwc2_gadget driver with the dwc2
+         host driver in the near future to create a dual-role driver.
 
 if USB_DWC2
 
+config USB_DWC2_HOST
+       tristate "Host only mode"
+       depends on USB
+       help
+         The Designware USB2.0 high-speed host controller
+         integrated into many SoCs.
+
+config USB_DWC2_PLATFORM
+       bool "DWC2 Platform"
+       depends on USB_DWC2_HOST
+       default USB_DWC2_HOST
+       help
+         The Designware USB2.0 platform interface module for
+         controllers directly connected to the CPU. This is only
+         used for host mode.
+
+config USB_DWC2_PCI
+       bool "DWC2 PCI"
+       depends on USB_DWC2_HOST && PCI
+       default USB_DWC2_HOST
+       help
+         The Designware USB2.0 PCI interface module for controllers
+         connected to a PCI bus. This is only used for host mode.
+
+comment "Gadget mode requires USB Gadget support to be enabled"
+
+config USB_DWC2_PERIPHERAL
+       tristate "Gadget only mode"
+       depends on USB_GADGET
+       help
+         The Designware USB2.0 high-speed gadget controller
+         integrated into many SoCs.
+
 config USB_DWC2_DEBUG
        bool "Enable Debugging Messages"
        help
index 11529d3..b73d2a5 100644 (file)
@@ -1,25 +1,28 @@
 ccflags-$(CONFIG_USB_DWC2_DEBUG)       += -DDEBUG
 ccflags-$(CONFIG_USB_DWC2_VERBOSE)     += -DVERBOSE_DEBUG
 
-obj-$(CONFIG_USB_DWC2)                 += dwc2.o
-
-dwc2-y                                 += core.o core_intr.o
-
-# NOTE: This driver at present only implements the Host mode
-# of the controller. The existing s3c-hsotg driver supports
-# Peripheral mode, but only for the Samsung S3C platforms.
-# There are plans to merge the s3c-hsotg driver with this
-# driver in the near future to create a dual-role driver. Once
-# that is done, Host mode will become an optional feature that
-# is selected with a config option.
-
+obj-$(CONFIG_USB_DWC2_HOST)            += dwc2.o
+dwc2-y                                 := core.o core_intr.o
 dwc2-y                                 += hcd.o hcd_intr.o
 dwc2-y                                 += hcd_queue.o hcd_ddma.o
 
-ifneq ($(CONFIG_PCI),)
-       obj-$(CONFIG_USB_DWC2)          += dwc2_pci.o
+# NOTE: The previous s3c-hsotg peripheral mode only driver has been moved to
+# this location and renamed gadget.c. When building for dynamically linked
+# modules, dwc2_gadget.ko will get built for peripheral mode. For host mode,
+# the core module will be dwc2.ko, the PCI bus interface module will called
+# dwc2_pci.ko and the platform interface module will be called dwc2_platform.ko.
+# At present the host and gadget driver will be separate drivers, but there
+# are plans in the near future to create a dual-role driver.
+
+ifneq ($(CONFIG_USB_DWC2_PCI),)
+       obj-$(CONFIG_USB_DWC2_HOST)     += dwc2_pci.o
+       dwc2_pci-y                      := pci.o
+endif
+
+ifneq ($(CONFIG_USB_DWC2_PLATFORM),)
+       obj-$(CONFIG_USB_DWC2_HOST)     += dwc2_platform.o
+       dwc2_platform-y                 := platform.o
 endif
-obj-$(CONFIG_USB_DWC2)                 += dwc2_platform.o
 
-dwc2_pci-y                             += pci.o
-dwc2_platform-y                                += platform.o
+obj-$(CONFIG_USB_DWC2_PERIPHERAL)      += dwc2_gadget.o
+dwc2_gadget-y                          := gadget.o
index 648519c..1efd10c 100644 (file)
 #ifndef __DWC2_CORE_H__
 #define __DWC2_CORE_H__
 
+#include <linux/phy/phy.h>
+#include <linux/regulator/consumer.h>
+#include <linux/usb/gadget.h>
+#include <linux/usb/otg.h>
 #include <linux/usb/phy.h>
 #include "hw.h"
 
@@ -54,6 +58,184 @@ static inline void do_write(u32 value, void *addr)
 /* Maximum number of Endpoints/HostChannels */
 #define MAX_EPS_CHANNELS       16
 
+/* s3c-hsotg declarations */
+static const char * const s3c_hsotg_supply_names[] = {
+       "vusb_d",               /* digital USB supply, 1.2V */
+       "vusb_a",               /* analog USB supply, 1.1V */
+};
+
+/*
+ * EP0_MPS_LIMIT
+ *
+ * Unfortunately there seems to be a limit of the amount of data that can
+ * be transferred by IN transactions on EP0. This is either 127 bytes or 3
+ * packets (which practically means 1 packet and 63 bytes of data) when the
+ * MPS is set to 64.
+ *
+ * This means if we are wanting to move >127 bytes of data, we need to
+ * split the transactions up, but just doing one packet at a time does
+ * not work (this may be an implicit DATA0 PID on first packet of the
+ * transaction) and doing 2 packets is outside the controller's limits.
+ *
+ * If we try to lower the MPS size for EP0, then no transfers work properly
+ * for EP0, and the system will fail basic enumeration. As no cause for this
+ * has currently been found, we cannot support any large IN transfers for
+ * EP0.
+ */
+#define EP0_MPS_LIMIT   64
+
+struct s3c_hsotg;
+struct s3c_hsotg_req;
+
+/**
+ * struct s3c_hsotg_ep - driver endpoint definition.
+ * @ep: The gadget layer representation of the endpoint.
+ * @name: The driver generated name for the endpoint.
+ * @queue: Queue of requests for this endpoint.
+ * @parent: Reference back to the parent device structure.
+ * @req: The current request that the endpoint is processing. This is
+ *       used to indicate an request has been loaded onto the endpoint
+ *       and has yet to be completed (maybe due to data move, or simply
+ *       awaiting an ack from the core all the data has been completed).
+ * @debugfs: File entry for debugfs file for this endpoint.
+ * @lock: State lock to protect contents of endpoint.
+ * @dir_in: Set to true if this endpoint is of the IN direction, which
+ *          means that it is sending data to the Host.
+ * @index: The index for the endpoint registers.
+ * @mc: Multi Count - number of transactions per microframe
+ * @interval - Interval for periodic endpoints
+ * @name: The name array passed to the USB core.
+ * @halted: Set if the endpoint has been halted.
+ * @periodic: Set if this is a periodic ep, such as Interrupt
+ * @isochronous: Set if this is a isochronous ep
+ * @sent_zlp: Set if we've sent a zero-length packet.
+ * @total_data: The total number of data bytes done.
+ * @fifo_size: The size of the FIFO (for periodic IN endpoints)
+ * @fifo_load: The amount of data loaded into the FIFO (periodic IN)
+ * @last_load: The offset of data for the last start of request.
+ * @size_loaded: The last loaded size for DxEPTSIZE for periodic IN
+ *
+ * This is the driver's state for each registered enpoint, allowing it
+ * to keep track of transactions that need doing. Each endpoint has a
+ * lock to protect the state, to try and avoid using an overall lock
+ * for the host controller as much as possible.
+ *
+ * For periodic IN endpoints, we have fifo_size and fifo_load to try
+ * and keep track of the amount of data in the periodic FIFO for each
+ * of these as we don't have a status register that tells us how much
+ * is in each of them. (note, this may actually be useless information
+ * as in shared-fifo mode periodic in acts like a single-frame packet
+ * buffer than a fifo)
+ */
+struct s3c_hsotg_ep {
+       struct usb_ep           ep;
+       struct list_head        queue;
+       struct s3c_hsotg        *parent;
+       struct s3c_hsotg_req    *req;
+       struct dentry           *debugfs;
+
+       unsigned long           total_data;
+       unsigned int            size_loaded;
+       unsigned int            last_load;
+       unsigned int            fifo_load;
+       unsigned short          fifo_size;
+
+       unsigned char           dir_in;
+       unsigned char           index;
+       unsigned char           mc;
+       unsigned char           interval;
+
+       unsigned int            halted:1;
+       unsigned int            periodic:1;
+       unsigned int            isochronous:1;
+       unsigned int            sent_zlp:1;
+
+       char                    name[10];
+};
+
+/**
+ * struct s3c_hsotg - driver state.
+ * @dev: The parent device supplied to the probe function
+ * @driver: USB gadget driver
+ * @phy: The otg phy transceiver structure for phy control.
+ * @uphy: The otg phy transceiver structure for old USB phy control.
+ * @plat: The platform specific configuration data. This can be removed once
+ * all SoCs support usb transceiver.
+ * @regs: The memory area mapped for accessing registers.
+ * @irq: The IRQ number we are using
+ * @supplies: Definition of USB power supplies
+ * @phyif: PHY interface width
+ * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos.
+ * @num_of_eps: Number of available EPs (excluding EP0)
+ * @debug_root: root directrory for debugfs.
+ * @debug_file: main status file for debugfs.
+ * @debug_fifo: FIFO status file for debugfs.
+ * @ep0_reply: Request used for ep0 reply.
+ * @ep0_buff: Buffer for EP0 reply data, if needed.
+ * @ctrl_buff: Buffer for EP0 control requests.
+ * @ctrl_req: Request for EP0 control packets.
+ * @setup: NAK management for EP0 SETUP
+ * @last_rst: Time of last reset
+ * @eps: The endpoints being supplied to the gadget framework
+ */
+struct s3c_hsotg {
+       struct device            *dev;
+       struct usb_gadget_driver *driver;
+       struct phy               *phy;
+       struct usb_phy           *uphy;
+       struct s3c_hsotg_plat    *plat;
+
+       spinlock_t              lock;
+
+       void __iomem            *regs;
+       int                     irq;
+       struct clk              *clk;
+
+       struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)];
+
+       u32                     phyif;
+       unsigned int            dedicated_fifos:1;
+       unsigned char           num_of_eps;
+
+       struct dentry           *debug_root;
+       struct dentry           *debug_file;
+       struct dentry           *debug_fifo;
+
+       struct usb_request      *ep0_reply;
+       struct usb_request      *ctrl_req;
+       u8                      ep0_buff[8];
+       u8                      ctrl_buff[8];
+
+       struct usb_gadget       gadget;
+       unsigned int            setup;
+       unsigned long           last_rst;
+       struct s3c_hsotg_ep     *eps;
+};
+
+/**
+ * struct s3c_hsotg_req - data transfer request
+ * @req: The USB gadget request
+ * @queue: The list of requests for the endpoint this is queued for.
+ * @in_progress: Has already had size/packets written to core
+ * @mapped: DMA buffer for this request has been mapped via dma_map_single().
+ */
+struct s3c_hsotg_req {
+       struct usb_request      req;
+       struct list_head        queue;
+       unsigned char           in_progress;
+       unsigned char           mapped;
+};
+
+#define call_gadget(_hs, _entry) \
+do { \
+       if ((_hs)->gadget.speed != USB_SPEED_UNKNOWN && \
+               (_hs)->driver && (_hs)->driver->_entry) { \
+               spin_unlock(&_hs->lock); \
+               (_hs)->driver->_entry(&(_hs)->gadget); \
+               spin_lock(&_hs->lock); \
+       } \
+} while (0)
+
 struct dwc2_hsotg;
 struct dwc2_host_chan;
 
similarity index 85%
rename from drivers/usb/gadget/s3c-hsotg.c
rename to drivers/usb/dwc2/gadget.c
index 2a9cb67..2057c38 100644 (file)
 #include <linux/usb/phy.h>
 #include <linux/platform_data/s3c-hsotg.h>
 
-#include "s3c-hsotg.h"
-
-static const char * const s3c_hsotg_supply_names[] = {
-       "vusb_d",               /* digital USB supply, 1.2V */
-       "vusb_a",               /* analog USB supply, 1.1V */
-};
-
-/*
- * EP0_MPS_LIMIT
- *
- * Unfortunately there seems to be a limit of the amount of data that can
- * be transferred by IN transactions on EP0. This is either 127 bytes or 3
- * packets (which practically means 1 packet and 63 bytes of data) when the
- * MPS is set to 64.
- *
- * This means if we are wanting to move >127 bytes of data, we need to
- * split the transactions up, but just doing one packet at a time does
- * not work (this may be an implicit DATA0 PID on first packet of the
- * transaction) and doing 2 packets is outside the controller's limits.
- *
- * If we try to lower the MPS size for EP0, then no transfers work properly
- * for EP0, and the system will fail basic enumeration. As no cause for this
- * has currently been found, we cannot support any large IN transfers for
- * EP0.
- */
-#define EP0_MPS_LIMIT  64
-
-struct s3c_hsotg;
-struct s3c_hsotg_req;
-
-/**
- * struct s3c_hsotg_ep - driver endpoint definition.
- * @ep: The gadget layer representation of the endpoint.
- * @name: The driver generated name for the endpoint.
- * @queue: Queue of requests for this endpoint.
- * @parent: Reference back to the parent device structure.
- * @req: The current request that the endpoint is processing. This is
- *       used to indicate an request has been loaded onto the endpoint
- *       and has yet to be completed (maybe due to data move, or simply
- *      awaiting an ack from the core all the data has been completed).
- * @debugfs: File entry for debugfs file for this endpoint.
- * @lock: State lock to protect contents of endpoint.
- * @dir_in: Set to true if this endpoint is of the IN direction, which
- *         means that it is sending data to the Host.
- * @index: The index for the endpoint registers.
- * @mc: Multi Count - number of transactions per microframe
- * @interval - Interval for periodic endpoints
- * @name: The name array passed to the USB core.
- * @halted: Set if the endpoint has been halted.
- * @periodic: Set if this is a periodic ep, such as Interrupt
- * @isochronous: Set if this is a isochronous ep
- * @sent_zlp: Set if we've sent a zero-length packet.
- * @total_data: The total number of data bytes done.
- * @fifo_size: The size of the FIFO (for periodic IN endpoints)
- * @fifo_load: The amount of data loaded into the FIFO (periodic IN)
- * @last_load: The offset of data for the last start of request.
- * @size_loaded: The last loaded size for DxEPTSIZE for periodic IN
- *
- * This is the driver's state for each registered enpoint, allowing it
- * to keep track of transactions that need doing. Each endpoint has a
- * lock to protect the state, to try and avoid using an overall lock
- * for the host controller as much as possible.
- *
- * For periodic IN endpoints, we have fifo_size and fifo_load to try
- * and keep track of the amount of data in the periodic FIFO for each
- * of these as we don't have a status register that tells us how much
- * is in each of them. (note, this may actually be useless information
- * as in shared-fifo mode periodic in acts like a single-frame packet
- * buffer than a fifo)
- */
-struct s3c_hsotg_ep {
-       struct usb_ep           ep;
-       struct list_head        queue;
-       struct s3c_hsotg        *parent;
-       struct s3c_hsotg_req    *req;
-       struct dentry           *debugfs;
-
-
-       unsigned long           total_data;
-       unsigned int            size_loaded;
-       unsigned int            last_load;
-       unsigned int            fifo_load;
-       unsigned short          fifo_size;
-
-       unsigned char           dir_in;
-       unsigned char           index;
-       unsigned char           mc;
-       unsigned char           interval;
-
-       unsigned int            halted:1;
-       unsigned int            periodic:1;
-       unsigned int            isochronous:1;
-       unsigned int            sent_zlp:1;
-
-       char                    name[10];
-};
-
-/**
- * struct s3c_hsotg - driver state.
- * @dev: The parent device supplied to the probe function
- * @driver: USB gadget driver
- * @phy: The otg phy transceiver structure for phy control.
- * @uphy: The otg phy transceiver structure for old USB phy control.
- * @plat: The platform specific configuration data. This can be removed once
- * all SoCs support usb transceiver.
- * @regs: The memory area mapped for accessing registers.
- * @irq: The IRQ number we are using
- * @supplies: Definition of USB power supplies
- * @phyif: PHY interface width
- * @dedicated_fifos: Set if the hardware has dedicated IN-EP fifos.
- * @num_of_eps: Number of available EPs (excluding EP0)
- * @debug_root: root directrory for debugfs.
- * @debug_file: main status file for debugfs.
- * @debug_fifo: FIFO status file for debugfs.
- * @ep0_reply: Request used for ep0 reply.
- * @ep0_buff: Buffer for EP0 reply data, if needed.
- * @ctrl_buff: Buffer for EP0 control requests.
- * @ctrl_req: Request for EP0 control packets.
- * @setup: NAK management for EP0 SETUP
- * @last_rst: Time of last reset
- * @eps: The endpoints being supplied to the gadget framework
- */
-struct s3c_hsotg {
-       struct device            *dev;
-       struct usb_gadget_driver *driver;
-       struct phy               *phy;
-       struct usb_phy           *uphy;
-       struct s3c_hsotg_plat    *plat;
-
-       spinlock_t              lock;
-
-       void __iomem            *regs;
-       int                     irq;
-       struct clk              *clk;
-
-       struct regulator_bulk_data supplies[ARRAY_SIZE(s3c_hsotg_supply_names)];
-
-       u32                     phyif;
-       unsigned int            dedicated_fifos:1;
-       unsigned char           num_of_eps;
-
-       struct dentry           *debug_root;
-       struct dentry           *debug_file;
-       struct dentry           *debug_fifo;
-
-       struct usb_request      *ep0_reply;
-       struct usb_request      *ctrl_req;
-       u8                      ep0_buff[8];
-       u8                      ctrl_buff[8];
-
-       struct usb_gadget       gadget;
-       unsigned int            setup;
-       unsigned long           last_rst;
-       struct s3c_hsotg_ep     *eps;
-};
-
-/**
- * struct s3c_hsotg_req - data transfer request
- * @req: The USB gadget request
- * @queue: The list of requests for the endpoint this is queued for.
- * @in_progress: Has already had size/packets written to core
- * @mapped: DMA buffer for this request has been mapped via dma_map_single().
- */
-struct s3c_hsotg_req {
-       struct usb_request      req;
-       struct list_head        queue;
-       unsigned char           in_progress;
-       unsigned char           mapped;
-};
+#include "core.h"
 
 /* conversion functions */
 static inline struct s3c_hsotg_req *our_req(struct usb_request *req)
@@ -340,9 +172,8 @@ static void s3c_hsotg_init_fifo(struct s3c_hsotg *hsotg)
        /* set FIFO sizes to 2048/1024 */
 
        writel(2048, hsotg->regs + GRXFSIZ);
-       writel(GNPTXFSIZ_NPTxFStAddr(2048) |
-              GNPTXFSIZ_NPTxFDep(1024),
-              hsotg->regs + GNPTXFSIZ);
+       writel((2048 << FIFOSIZE_STARTADDR_SHIFT) |
+               (1024 << FIFOSIZE_DEPTH_SHIFT), hsotg->regs + GNPTXFSIZ);
 
        /*
         * arange all the rest of the TX FIFOs, as some versions of this
@@ -362,10 +193,10 @@ static void s3c_hsotg_init_fifo(struct s3c_hsotg *hsotg)
 
        for (ep = 1; ep <= 15; ep++) {
                val = addr;
-               val |= size << DPTXFSIZn_DPTxFSize_SHIFT;
+               val |= size << FIFOSIZE_DEPTH_SHIFT;
                addr += size;
 
-               writel(val, hsotg->regs + DPTXFSIZn(ep));
+               writel(val, hsotg->regs + DPTXFSIZN(ep));
        }
 
        /*
@@ -373,15 +204,15 @@ static void s3c_hsotg_init_fifo(struct s3c_hsotg *hsotg)
         * all fifos are flushed before continuing
         */
 
-       writel(GRSTCTL_TxFNum(0x10) | GRSTCTL_TxFFlsh |
-              GRSTCTL_RxFFlsh, hsotg->regs + GRSTCTL);
+       writel(GRSTCTL_TXFNUM(0x10) | GRSTCTL_TXFFLSH |
+              GRSTCTL_RXFFLSH, hsotg->regs + GRSTCTL);
 
        /* wait until the fifos are both flushed */
        timeout = 100;
        while (1) {
                val = readl(hsotg->regs + GRSTCTL);
 
-               if ((val & (GRSTCTL_TxFFlsh | GRSTCTL_RxFFlsh)) == 0)
+               if ((val & (GRSTCTL_TXFFLSH | GRSTCTL_RXFFLSH)) == 0)
                        break;
 
                if (--timeout == 0) {
@@ -495,14 +326,14 @@ static int s3c_hsotg_write_fifo(struct s3c_hsotg *hsotg,
                 * how much data is left in the fifo.
                 */
 
-               size_left = DxEPTSIZ_XferSize_GET(epsize);
+               size_left = DXEPTSIZ_XFERSIZE_GET(epsize);
 
                /*
                 * if shared fifo, we cannot write anything until the
                 * previous data has been completely sent.
                 */
                if (hs_ep->fifo_load != 0) {
-                       s3c_hsotg_en_gsint(hsotg, GINTSTS_PTxFEmp);
+                       s3c_hsotg_en_gsint(hsotg, GINTSTS_PTXFEMP);
                        return -ENOSPC;
                }
 
@@ -523,7 +354,7 @@ static int s3c_hsotg_write_fifo(struct s3c_hsotg *hsotg,
                        __func__, can_write);
 
                if (can_write <= 0) {
-                       s3c_hsotg_en_gsint(hsotg, GINTSTS_PTxFEmp);
+                       s3c_hsotg_en_gsint(hsotg, GINTSTS_PTXFEMP);
                        return -ENOSPC;
                }
        } else if (hsotg->dedicated_fifos && hs_ep->index != 0) {
@@ -532,16 +363,16 @@ static int s3c_hsotg_write_fifo(struct s3c_hsotg *hsotg,
                can_write &= 0xffff;
                can_write *= 4;
        } else {
-               if (GNPTXSTS_NPTxQSpcAvail_GET(gnptxsts) == 0) {
+               if (GNPTXSTS_NP_TXQ_SPC_AVAIL_GET(gnptxsts) == 0) {
                        dev_dbg(hsotg->dev,
                                "%s: no queue slots available (0x%08x)\n",
                                __func__, gnptxsts);
 
-                       s3c_hsotg_en_gsint(hsotg, GINTSTS_NPTxFEmp);
+                       s3c_hsotg_en_gsint(hsotg, GINTSTS_NPTXFEMP);
                        return -ENOSPC;
                }
 
-               can_write = GNPTXSTS_NPTxFSpcAvail_GET(gnptxsts);
+               can_write = GNPTXSTS_NP_TXF_SPC_AVAIL_GET(gnptxsts);
                can_write *= 4; /* fifo size is in 32bit quantities. */
        }
 
@@ -569,8 +400,8 @@ static int s3c_hsotg_write_fifo(struct s3c_hsotg *hsotg,
                /* it's needed only when we do not use dedicated fifos */
                if (!hsotg->dedicated_fifos)
                        s3c_hsotg_en_gsint(hsotg,
-                                          periodic ? GINTSTS_PTxFEmp :
-                                          GINTSTS_NPTxFEmp);
+                                          periodic ? GINTSTS_PTXFEMP :
+                                          GINTSTS_NPTXFEMP);
        }
 
        /* see if we can write data */
@@ -598,8 +429,8 @@ static int s3c_hsotg_write_fifo(struct s3c_hsotg *hsotg,
                /* it's needed only when we do not use dedicated fifos */
                if (!hsotg->dedicated_fifos)
                        s3c_hsotg_en_gsint(hsotg,
-                                          periodic ? GINTSTS_PTxFEmp :
-                                          GINTSTS_NPTxFEmp);
+                                          periodic ? GINTSTS_PTXFEMP :
+                                          GINTSTS_NPTXFEMP);
        }
 
        dev_dbg(hsotg->dev, "write %d/%d, can_write %d, done %d\n",
@@ -636,12 +467,12 @@ static unsigned get_ep_limit(struct s3c_hsotg_ep *hs_ep)
        unsigned maxpkt;
 
        if (index != 0) {
-               maxsize = DxEPTSIZ_XferSize_LIMIT + 1;
-               maxpkt = DxEPTSIZ_PktCnt_LIMIT + 1;
+               maxsize = DXEPTSIZ_XFERSIZE_LIMIT + 1;
+               maxpkt = DXEPTSIZ_PKTCNT_LIMIT + 1;
        } else {
                maxsize = 64+64;
                if (hs_ep->dir_in)
-                       maxpkt = DIEPTSIZ0_PktCnt_LIMIT + 1;
+                       maxpkt = DIEPTSIZ0_PKTCNT_LIMIT + 1;
                else
                        maxpkt = 2;
        }
@@ -710,7 +541,7 @@ static void s3c_hsotg_start_req(struct s3c_hsotg *hsotg,
        /* If endpoint is stalled, we will restart request later */
        ctrl = readl(hsotg->regs + epctrl_reg);
 
-       if (ctrl & DxEPCTL_Stall) {
+       if (ctrl & DXEPCTL_STALL) {
                dev_warn(hsotg->dev, "%s: ep%d is stalled\n", __func__, index);
                return;
        }
@@ -750,9 +581,9 @@ static void s3c_hsotg_start_req(struct s3c_hsotg *hsotg,
 
        if (dir_in && index != 0)
                if (hs_ep->isochronous)
-                       epsize = DxEPTSIZ_MC(packets);
+                       epsize = DXEPTSIZ_MC(packets);
                else
-                       epsize = DxEPTSIZ_MC(1);
+                       epsize = DXEPTSIZ_MC(1);
        else
                epsize = 0;
 
@@ -766,8 +597,8 @@ static void s3c_hsotg_start_req(struct s3c_hsotg *hsotg,
                        packets++;
        }
 
-       epsize |= DxEPTSIZ_PktCnt(packets);
-       epsize |= DxEPTSIZ_XferSize(length);
+       epsize |= DXEPTSIZ_PKTCNT(packets);
+       epsize |= DXEPTSIZ_XFERSIZE(length);
 
        dev_dbg(hsotg->dev, "%s: %d@%d/%d, 0x%08x => 0x%08x\n",
                __func__, packets, length, ureq->length, epsize, epsize_reg);
@@ -793,8 +624,8 @@ static void s3c_hsotg_start_req(struct s3c_hsotg *hsotg,
                        __func__, &ureq->dma, dma_reg);
        }
 
-       ctrl |= DxEPCTL_EPEna;  /* ensure ep enabled */
-       ctrl |= DxEPCTL_USBActEp;
+       ctrl |= DXEPCTL_EPENA;  /* ensure ep enabled */
+       ctrl |= DXEPCTL_USBACTEP;
 
        dev_dbg(hsotg->dev, "setup req:%d\n", hsotg->setup);
 
@@ -802,7 +633,7 @@ static void s3c_hsotg_start_req(struct s3c_hsotg *hsotg,
        if (hsotg->setup && index == 0)
                hsotg->setup = 0;
        else
-               ctrl |= DxEPCTL_CNAK;   /* clear NAK set by core */
+               ctrl |= DXEPCTL_CNAK;   /* clear NAK set by core */
 
 
        dev_dbg(hsotg->dev, "%s: DxEPCTL=0x%08x\n", __func__, ctrl);
@@ -828,7 +659,7 @@ static void s3c_hsotg_start_req(struct s3c_hsotg *hsotg,
         * to debugging to see what is going on.
         */
        if (dir_in)
-               writel(DIEPMSK_INTknTXFEmpMsk,
+               writel(DIEPMSK_INTKNTXFEMPMSK,
                       hsotg->regs + DIEPINT(index));
 
        /*
@@ -837,12 +668,12 @@ static void s3c_hsotg_start_req(struct s3c_hsotg *hsotg,
         */
 
        /* check ep is enabled */
-       if (!(readl(hsotg->regs + epctrl_reg) & DxEPCTL_EPEna))
+       if (!(readl(hsotg->regs + epctrl_reg) & DXEPCTL_EPENA))
                dev_warn(hsotg->dev,
-                        "ep%d: failed to become enabled (DxEPCTL=0x%08x)?\n",
+                        "ep%d: failed to become enabled (DXEPCTL=0x%08x)?\n",
                         index, readl(hsotg->regs + epctrl_reg));
 
-       dev_dbg(hsotg->dev, "%s: DxEPCTL=0x%08x\n",
+       dev_dbg(hsotg->dev, "%s: DXEPCTL=0x%08x\n",
                __func__, readl(hsotg->regs + epctrl_reg));
 
        /* enable ep interrupts */
@@ -1205,12 +1036,12 @@ static void s3c_hsotg_stall_ep0(struct s3c_hsotg *hsotg) {
         */
 
        ctrl = readl(hsotg->regs + reg);
-       ctrl |= DxEPCTL_Stall;
-       ctrl |= DxEPCTL_CNAK;
+       ctrl |= DXEPCTL_STALL;
+       ctrl |= DXEPCTL_CNAK;
        writel(ctrl, hsotg->regs + reg);
 
        dev_dbg(hsotg->dev,
-               "written DxEPCTL=0x%08x to %08x (DxEPCTL=0x%08x)\n",
+               "written DXEPCTL=0x%08x to %08x (DXEPCTL=0x%08x)\n",
                ctrl, reg, readl(hsotg->regs + reg));
 
         /*
@@ -1262,8 +1093,9 @@ static void s3c_hsotg_process_control(struct s3c_hsotg *hsotg,
                case USB_REQ_SET_ADDRESS:
                        s3c_hsotg_disconnect(hsotg);
                        dcfg = readl(hsotg->regs + DCFG);
-                       dcfg &= ~DCFG_DevAddr_MASK;
-                       dcfg |= ctrl->wValue << DCFG_DevAddr_SHIFT;
+                       dcfg &= ~DCFG_DEVADDR_MASK;
+                       dcfg |= (le16_to_cpu(ctrl->wValue) <<
+                                DCFG_DEVADDR_SHIFT) & DCFG_DEVADDR_MASK;
                        writel(dcfg, hsotg->regs + DCFG);
 
                        dev_info(hsotg->dev, "new address %d\n", ctrl->wValue);
@@ -1458,7 +1290,7 @@ static void s3c_hsotg_rx_data(struct s3c_hsotg *hsotg, int ep_idx, int size)
                int ptr;
 
                dev_warn(hsotg->dev,
-                        "%s: FIFO %d bytes on ep%d but no req (DxEPCTl=0x%08x)\n",
+                        "%s: FIFO %d bytes on ep%d but no req (DXEPCTl=0x%08x)\n",
                         __func__, size, ep_idx, epctl);
 
                /* dump the data from the FIFO, we've nothing we can do */
@@ -1530,13 +1362,13 @@ static void s3c_hsotg_send_zlp(struct s3c_hsotg *hsotg,
        dev_dbg(hsotg->dev, "sending zero-length packet\n");
 
        /* issue a zero-sized packet to terminate this */
-       writel(DxEPTSIZ_MC(1) | DxEPTSIZ_PktCnt(1) |
-              DxEPTSIZ_XferSize(0), hsotg->regs + DIEPTSIZ(0));
+       writel(DXEPTSIZ_MC(1) | DXEPTSIZ_PKTCNT(1) |
+              DXEPTSIZ_XFERSIZE(0), hsotg->regs + DIEPTSIZ(0));
 
        ctrl = readl(hsotg->regs + DIEPCTL0);
-       ctrl |= DxEPCTL_CNAK;  /* clear NAK set by core */
-       ctrl |= DxEPCTL_EPEna; /* ensure ep enabled */
-       ctrl |= DxEPCTL_USBActEp;
+       ctrl |= DXEPCTL_CNAK;  /* clear NAK set by core */
+       ctrl |= DXEPCTL_EPENA; /* ensure ep enabled */
+       ctrl |= DXEPCTL_USBACTEP;
        writel(ctrl, hsotg->regs + DIEPCTL0);
 }
 
@@ -1557,7 +1389,7 @@ static void s3c_hsotg_handle_outdone(struct s3c_hsotg *hsotg,
        struct s3c_hsotg_ep *hs_ep = &hsotg->eps[epnum];
        struct s3c_hsotg_req *hs_req = hs_ep->req;
        struct usb_request *req = &hs_req->req;
-       unsigned size_left = DxEPTSIZ_XferSize_GET(epsize);
+       unsigned size_left = DXEPTSIZ_XFERSIZE_GET(epsize);
        int result = 0;
 
        if (!hs_req) {
@@ -1657,24 +1489,22 @@ static void s3c_hsotg_handle_rx(struct s3c_hsotg *hsotg)
 
        WARN_ON(using_dma(hsotg));
 
-       epnum = grxstsr & GRXSTS_EPNum_MASK;
-       status = grxstsr & GRXSTS_PktSts_MASK;
+       epnum = grxstsr & GRXSTS_EPNUM_MASK;
+       status = grxstsr & GRXSTS_PKTSTS_MASK;
 
-       size = grxstsr & GRXSTS_ByteCnt_MASK;
-       size >>= GRXSTS_ByteCnt_SHIFT;
+       size = grxstsr & GRXSTS_BYTECNT_MASK;
+       size >>= GRXSTS_BYTECNT_SHIFT;
 
        if (1)
                dev_dbg(hsotg->dev, "%s: GRXSTSP=0x%08x (%d@%d)\n",
                        __func__, grxstsr, size, epnum);
 
-#define __status(x) ((x) >> GRXSTS_PktSts_SHIFT)
-
-       switch (status >> GRXSTS_PktSts_SHIFT) {
-       case __status(GRXSTS_PktSts_GlobalOutNAK):
-               dev_dbg(hsotg->dev, "GlobalOutNAK\n");
+       switch ((status & GRXSTS_PKTSTS_MASK) >> GRXSTS_PKTSTS_SHIFT) {
+       case GRXSTS_PKTSTS_GLOBALOUTNAK:
+               dev_dbg(hsotg->dev, "GLOBALOUTNAK\n");
                break;
 
-       case __status(GRXSTS_PktSts_OutDone):
+       case GRXSTS_PKTSTS_OUTDONE:
                dev_dbg(hsotg->dev, "OutDone (Frame=0x%08x)\n",
                        s3c_hsotg_read_frameno(hsotg));
 
@@ -1682,7 +1512,7 @@ static void s3c_hsotg_handle_rx(struct s3c_hsotg *hsotg)
                        s3c_hsotg_handle_outdone(hsotg, epnum, false);
                break;
 
-       case __status(GRXSTS_PktSts_SetupDone):
+       case GRXSTS_PKTSTS_SETUPDONE:
                dev_dbg(hsotg->dev,
                        "SetupDone (Frame=0x%08x, DOPEPCTL=0x%08x)\n",
                        s3c_hsotg_read_frameno(hsotg),
@@ -1691,11 +1521,11 @@ static void s3c_hsotg_handle_rx(struct s3c_hsotg *hsotg)
                s3c_hsotg_handle_outdone(hsotg, epnum, true);
                break;
 
-       case __status(GRXSTS_PktSts_OutRX):
+       case GRXSTS_PKTSTS_OUTRX:
                s3c_hsotg_rx_data(hsotg, epnum, size);
                break;
 
-       case __status(GRXSTS_PktSts_SetupRX):
+       case GRXSTS_PKTSTS_SETUPRX:
                dev_dbg(hsotg->dev,
                        "SetupRX (Frame=0x%08x, DOPEPCTL=0x%08x)\n",
                        s3c_hsotg_read_frameno(hsotg),
@@ -1761,7 +1591,7 @@ static void s3c_hsotg_set_ep_maxpacket(struct s3c_hsotg *hsotg,
                hs_ep->ep.maxpacket = mps;
                hs_ep->mc = 1;
        } else {
-               mpsval = mps & DxEPCTL_MPS_MASK;
+               mpsval = mps & DXEPCTL_MPS_MASK;
                if (mpsval > 1024)
                        goto bad_mps;
                mcval = ((mps >> 11) & 0x3) + 1;
@@ -1777,13 +1607,13 @@ static void s3c_hsotg_set_ep_maxpacket(struct s3c_hsotg *hsotg,
         */
 
        reg = readl(regs + DIEPCTL(ep));
-       reg &= ~DxEPCTL_MPS_MASK;
+       reg &= ~DXEPCTL_MPS_MASK;
        reg |= mpsval;
        writel(reg, regs + DIEPCTL(ep));
 
        if (ep) {
                reg = readl(regs + DOEPCTL(ep));
-               reg &= ~DxEPCTL_MPS_MASK;
+               reg &= ~DXEPCTL_MPS_MASK;
                reg |= mpsval;
                writel(reg, regs + DOEPCTL(ep));
        }
@@ -1804,7 +1634,7 @@ static void s3c_hsotg_txfifo_flush(struct s3c_hsotg *hsotg, unsigned int idx)
        int timeout;
        int val;
 
-       writel(GRSTCTL_TxFNum(idx) | GRSTCTL_TxFFlsh,
+       writel(GRSTCTL_TXFNUM(idx) | GRSTCTL_TXFFLSH,
                hsotg->regs + GRSTCTL);
 
        /* wait until the fifo is flushed */
@@ -1813,7 +1643,7 @@ static void s3c_hsotg_txfifo_flush(struct s3c_hsotg *hsotg, unsigned int idx)
        while (1) {
                val = readl(hsotg->regs + GRSTCTL);
 
-               if ((val & (GRSTCTL_TxFFlsh)) == 0)
+               if ((val & (GRSTCTL_TXFFLSH)) == 0)
                        break;
 
                if (--timeout == 0) {
@@ -1896,7 +1726,7 @@ static void s3c_hsotg_complete_in(struct s3c_hsotg *hsotg,
         * aligned).
         */
 
-       size_left = DxEPTSIZ_XferSize_GET(epsize);
+       size_left = DXEPTSIZ_XFERSIZE_GET(epsize);
 
        size_done = hs_ep->size_loaded - size_left;
        size_done += hs_ep->last_load;
@@ -1963,17 +1793,17 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx,
        dev_dbg(hsotg->dev, "%s: ep%d(%s) DxEPINT=0x%08x\n",
                __func__, idx, dir_in ? "in" : "out", ints);
 
-       if (ints & DxEPINT_XferCompl) {
+       if (ints & DXEPINT_XFERCOMPL) {
                if (hs_ep->isochronous && hs_ep->interval == 1) {
-                       if (ctrl & DxEPCTL_EOFrNum)
-                               ctrl |= DxEPCTL_SetEvenFr;
+                       if (ctrl & DXEPCTL_EOFRNUM)
+                               ctrl |= DXEPCTL_SETEVENFR;
                        else
-                               ctrl |= DxEPCTL_SetOddFr;
+                               ctrl |= DXEPCTL_SETODDFR;
                        writel(ctrl, hsotg->regs + epctl_reg);
                }
 
                dev_dbg(hsotg->dev,
-                       "%s: XferCompl: DxEPCTL=0x%08x, DxEPTSIZ=%08x\n",
+                       "%s: XferCompl: DxEPCTL=0x%08x, DXEPTSIZ=%08x\n",
                        __func__, readl(hsotg->regs + epctl_reg),
                        readl(hsotg->regs + epsiz_reg));
 
@@ -1996,7 +1826,7 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx,
                }
        }
 
-       if (ints & DxEPINT_EPDisbld) {
+       if (ints & DXEPINT_EPDISBLD) {
                dev_dbg(hsotg->dev, "%s: EPDisbld\n", __func__);
 
                if (dir_in) {
@@ -2004,20 +1834,20 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx,
 
                        s3c_hsotg_txfifo_flush(hsotg, idx);
 
-                       if ((epctl & DxEPCTL_Stall) &&
-                               (epctl & DxEPCTL_EPType_Bulk)) {
+                       if ((epctl & DXEPCTL_STALL) &&
+                               (epctl & DXEPCTL_EPTYPE_BULK)) {
                                int dctl = readl(hsotg->regs + DCTL);
 
-                               dctl |= DCTL_CGNPInNAK;
+                               dctl |= DCTL_CGNPINNAK;
                                writel(dctl, hsotg->regs + DCTL);
                        }
                }
        }
 
-       if (ints & DxEPINT_AHBErr)
+       if (ints & DXEPINT_AHBERR)
                dev_dbg(hsotg->dev, "%s: AHBErr\n", __func__);
 
-       if (ints & DxEPINT_Setup) {  /* Setup or Timeout */
+       if (ints & DXEPINT_SETUP) {  /* Setup or Timeout */
                dev_dbg(hsotg->dev, "%s: Setup/Timeout\n",  __func__);
 
                if (using_dma(hsotg) && idx == 0) {
@@ -2035,25 +1865,25 @@ static void s3c_hsotg_epint(struct s3c_hsotg *hsotg, unsigned int idx,
                }
        }
 
-       if (ints & DxEPINT_Back2BackSetup)
+       if (ints & DXEPINT_BACK2BACKSETUP)
                dev_dbg(hsotg->dev, "%s: B2BSetup/INEPNakEff\n", __func__);
 
        if (dir_in && !hs_ep->isochronous) {
                /* not sure if this is important, but we'll clear it anyway */
-               if (ints & DIEPMSK_INTknTXFEmpMsk) {
+               if (ints & DIEPMSK_INTKNTXFEMPMSK) {
                        dev_dbg(hsotg->dev, "%s: ep%d: INTknTXFEmpMsk\n",
                                __func__, idx);
                }
 
                /* this probably means something bad is happening */
-               if (ints & DIEPMSK_INTknEPMisMsk) {
+               if (ints & DIEPMSK_INTKNEPMISMSK) {
                        dev_warn(hsotg->dev, "%s: ep%d: INTknEP\n",
                                 __func__, idx);
                }
 
                /* FIFO has space or is empty (see GAHBCFG) */
                if (hsotg->dedicated_fifos &&
-                   ints & DIEPMSK_TxFIFOEmpty) {
+                   ints & DIEPMSK_TXFIFOEMPTY) {
                        dev_dbg(hsotg->dev, "%s: ep%d: TxFIFOEmpty\n",
                                __func__, idx);
                        if (!using_dma(hsotg))
@@ -2089,21 +1919,21 @@ static void s3c_hsotg_irq_enumdone(struct s3c_hsotg *hsotg)
         */
 
        /* catch both EnumSpd_FS and EnumSpd_FS48 */
-       switch (dsts & DSTS_EnumSpd_MASK) {
-       case DSTS_EnumSpd_FS:
-       case DSTS_EnumSpd_FS48:
+       switch (dsts & DSTS_ENUMSPD_MASK) {
+       case DSTS_ENUMSPD_FS:
+       case DSTS_ENUMSPD_FS48:
                hsotg->gadget.speed = USB_SPEED_FULL;
                ep0_mps = EP0_MPS_LIMIT;
                ep_mps = 1023;
                break;
 
-       case DSTS_EnumSpd_HS:
+       case DSTS_ENUMSPD_HS:
                hsotg->gadget.speed = USB_SPEED_HIGH;
                ep0_mps = EP0_MPS_LIMIT;
                ep_mps = 1024;
                break;
 
-       case DSTS_EnumSpd_LS:
+       case DSTS_ENUMSPD_LS:
                hsotg->gadget.speed = USB_SPEED_LOW;
                /*
                 * note, we don't actually support LS in this driver at the
@@ -2169,16 +1999,6 @@ static void kill_all_requests(struct s3c_hsotg *hsotg,
                        s3c_hsotg_txfifo_flush(hsotg, ep->index);
 }
 
-#define call_gadget(_hs, _entry) \
-do { \
-       if ((_hs)->gadget.speed != USB_SPEED_UNKNOWN && \
-           (_hs)->driver && (_hs)->driver->_entry) { \
-               spin_unlock(&_hs->lock); \
-               (_hs)->driver->_entry(&(_hs)->gadget); \
-               spin_lock(&_hs->lock); \
-       } \
-} while (0)
-
 /**
  * s3c_hsotg_disconnect - disconnect service
  * @hsotg: The device state.
@@ -2226,9 +2046,9 @@ static void s3c_hsotg_irq_fifoempty(struct s3c_hsotg *hsotg, bool periodic)
 }
 
 /* IRQ flags which will trigger a retry around the IRQ loop */
-#define IRQ_RETRY_MASK (GINTSTS_NPTxFEmp | \
-                       GINTSTS_PTxFEmp |  \
-                       GINTSTS_RxFLvl)
+#define IRQ_RETRY_MASK (GINTSTS_NPTXFEMP | \
+                       GINTSTS_PTXFEMP |  \
+                       GINTSTS_RXFLVL)
 
 /**
  * s3c_hsotg_corereset - issue softreset to the core
@@ -2244,14 +2064,14 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg)
        dev_dbg(hsotg->dev, "resetting core\n");
 
        /* issue soft reset */
-       writel(GRSTCTL_CSftRst, hsotg->regs + GRSTCTL);
+       writel(GRSTCTL_CSFTRST, hsotg->regs + GRSTCTL);
 
        timeout = 10000;
        do {
                grstctl = readl(hsotg->regs + GRSTCTL);
-       } while ((grstctl & GRSTCTL_CSftRst) && timeout-- > 0);
+       } while ((grstctl & GRSTCTL_CSFTRST) && timeout-- > 0);
 
-       if (grstctl & GRSTCTL_CSftRst) {
+       if (grstctl & GRSTCTL_CSFTRST) {
                dev_err(hsotg->dev, "Failed to get CSftRst asserted\n");
                return -EINVAL;
        }
@@ -2268,7 +2088,7 @@ static int s3c_hsotg_corereset(struct s3c_hsotg *hsotg)
                        return -ETIMEDOUT;
                }
 
-               if (!(grstctl & GRSTCTL_AHBIdle))
+               if (!(grstctl & GRSTCTL_AHBIDLE))
                        continue;
 
                break;          /* reset done */
@@ -2294,14 +2114,14 @@ static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg)
         */
 
        /* set the PLL on, remove the HNP/SRP and set the PHY */
-       writel(hsotg->phyif | GUSBCFG_TOutCal(7) |
+       writel(hsotg->phyif | GUSBCFG_TOUTCAL(7) |
               (0x5 << 10), hsotg->regs + GUSBCFG);
 
        s3c_hsotg_init_fifo(hsotg);
 
-       __orr32(hsotg->regs + DCTL, DCTL_SftDiscon);
+       __orr32(hsotg->regs + DCTL, DCTL_SFTDISCON);
 
-       writel(1 << 18 | DCFG_DevSpd_HS,  hsotg->regs + DCFG);
+       writel(1 << 18 | DCFG_DEVSPD_HS,  hsotg->regs + DCFG);
 
        /* Clear any pending OTG interrupts */
        writel(0xffffffff, hsotg->regs + GOTGINT);
@@ -2309,21 +2129,21 @@ static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg)
        /* Clear any pending interrupts */
        writel(0xffffffff, hsotg->regs + GINTSTS);
 
-       writel(GINTSTS_ErlySusp | GINTSTS_SessReqInt |
-              GINTSTS_GOUTNakEff | GINTSTS_GINNakEff |
-              GINTSTS_ConIDStsChng | GINTSTS_USBRst |
-              GINTSTS_EnumDone | GINTSTS_OTGInt |
-              GINTSTS_USBSusp | GINTSTS_WkUpInt,
-              hsotg->regs + GINTMSK);
+       writel(GINTSTS_ERLYSUSP | GINTSTS_SESSREQINT |
+               GINTSTS_GOUTNAKEFF | GINTSTS_GINNAKEFF |
+               GINTSTS_CONIDSTSCHNG | GINTSTS_USBRST |
+               GINTSTS_ENUMDONE | GINTSTS_OTGINT |
+               GINTSTS_USBSUSP | GINTSTS_WKUPINT,
+               hsotg->regs + GINTMSK);
 
        if (using_dma(hsotg))
-               writel(GAHBCFG_GlblIntrEn | GAHBCFG_DMAEn |
-                      GAHBCFG_HBstLen_Incr4,
+               writel(GAHBCFG_GLBL_INTR_EN | GAHBCFG_DMA_EN |
+                      GAHBCFG_HBSTLEN_INCR4,
                       hsotg->regs + GAHBCFG);
        else
-               writel(((hsotg->dedicated_fifos) ? (GAHBCFG_NPTxFEmpLvl |
-                                                   GAHBCFG_PTxFEmpLvl) : 0) |
-                      GAHBCFG_GlblIntrEn,
+               writel(((hsotg->dedicated_fifos) ? (GAHBCFG_NP_TXF_EMP_LVL |
+                                                   GAHBCFG_P_TXF_EMP_LVL) : 0) |
+                      GAHBCFG_GLBL_INTR_EN,
                       hsotg->regs + GAHBCFG);
 
        /*
@@ -2332,22 +2152,22 @@ static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg)
         * interrupts.
         */
 
-       writel(((hsotg->dedicated_fifos) ? DIEPMSK_TxFIFOEmpty |
-              DIEPMSK_INTknTXFEmpMsk : 0) |
-              DIEPMSK_EPDisbldMsk | DIEPMSK_XferComplMsk |
-              DIEPMSK_TimeOUTMsk | DIEPMSK_AHBErrMsk |
-              DIEPMSK_INTknEPMisMsk,
-              hsotg->regs + DIEPMSK);
+       writel(((hsotg->dedicated_fifos) ? DIEPMSK_TXFIFOEMPTY |
+               DIEPMSK_INTKNTXFEMPMSK : 0) |
+               DIEPMSK_EPDISBLDMSK | DIEPMSK_XFERCOMPLMSK |
+               DIEPMSK_TIMEOUTMSK | DIEPMSK_AHBERRMSK |
+               DIEPMSK_INTKNEPMISMSK,
+               hsotg->regs + DIEPMSK);
 
        /*
         * don't need XferCompl, we get that from RXFIFO in slave mode. In
         * DMA mode we may need this.
         */
-       writel((using_dma(hsotg) ? (DIEPMSK_XferComplMsk |
-                                   DIEPMSK_TimeOUTMsk) : 0) |
-              DOEPMSK_EPDisbldMsk | DOEPMSK_AHBErrMsk |
-              DOEPMSK_SetupMsk,
-              hsotg->regs + DOEPMSK);
+       writel((using_dma(hsotg) ? (DIEPMSK_XFERCOMPLMSK |
+                                   DIEPMSK_TIMEOUTMSK) : 0) |
+               DOEPMSK_EPDISBLDMSK | DOEPMSK_AHBERRMSK |
+               DOEPMSK_SETUPMSK,
+               hsotg->regs + DOEPMSK);
 
        writel(0, hsotg->regs + DAINTMSK);
 
@@ -2356,7 +2176,7 @@ static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg)
                readl(hsotg->regs + DOEPCTL0));
 
        /* enable in and out endpoint interrupts */
-       s3c_hsotg_en_gsint(hsotg, GINTSTS_OEPInt | GINTSTS_IEPInt);
+       s3c_hsotg_en_gsint(hsotg, GINTSTS_OEPINT | GINTSTS_IEPINT);
 
        /*
         * Enable the RXFIFO when in slave mode, as this is how we collect
@@ -2364,15 +2184,15 @@ static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg)
         * things we cannot process, so do not use it.
         */
        if (!using_dma(hsotg))
-               s3c_hsotg_en_gsint(hsotg, GINTSTS_RxFLvl);
+               s3c_hsotg_en_gsint(hsotg, GINTSTS_RXFLVL);
 
        /* Enable interrupts for EP0 in and out */
        s3c_hsotg_ctrl_epint(hsotg, 0, 0, 1);
        s3c_hsotg_ctrl_epint(hsotg, 0, 1, 1);
 
-       __orr32(hsotg->regs + DCTL, DCTL_PWROnPrgDone);
+       __orr32(hsotg->regs + DCTL, DCTL_PWRONPRGDONE);
        udelay(10);  /* see openiboot */
-       __bic32(hsotg->regs + DCTL, DCTL_PWROnPrgDone);
+       __bic32(hsotg->regs + DCTL, DCTL_PWRONPRGDONE);
 
        dev_dbg(hsotg->dev, "DCTL=0x%08x\n", readl(hsotg->regs + DCTL));
 
@@ -2382,17 +2202,17 @@ static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg)
         */
 
        /* set to read 1 8byte packet */
-       writel(DxEPTSIZ_MC(1) | DxEPTSIZ_PktCnt(1) |
-              DxEPTSIZ_XferSize(8), hsotg->regs + DOEPTSIZ0);
+       writel(DXEPTSIZ_MC(1) | DXEPTSIZ_PKTCNT(1) |
+              DXEPTSIZ_XFERSIZE(8), hsotg->regs + DOEPTSIZ0);
 
        writel(s3c_hsotg_ep0_mps(hsotg->eps[0].ep.maxpacket) |
-              DxEPCTL_CNAK | DxEPCTL_EPEna |
-              DxEPCTL_USBActEp,
+              DXEPCTL_CNAK | DXEPCTL_EPENA |
+              DXEPCTL_USBACTEP,
               hsotg->regs + DOEPCTL0);
 
        /* enable, but don't activate EP0in */
        writel(s3c_hsotg_ep0_mps(hsotg->eps[0].ep.maxpacket) |
-              DxEPCTL_USBActEp, hsotg->regs + DIEPCTL0);
+              DXEPCTL_USBACTEP, hsotg->regs + DIEPCTL0);
 
        s3c_hsotg_enqueue_setup(hsotg);
 
@@ -2401,14 +2221,14 @@ static void s3c_hsotg_core_init(struct s3c_hsotg *hsotg)
                readl(hsotg->regs + DOEPCTL0));
 
        /* clear global NAKs */
-       writel(DCTL_CGOUTNak | DCTL_CGNPInNAK,
+       writel(DCTL_CGOUTNAK | DCTL_CGNPINNAK,
               hsotg->regs + DCTL);
 
        /* must be at-least 3ms to allow bus to see disconnect */
        mdelay(3);
 
        /* remove the soft-disconnect and let's go */
-       __bic32(hsotg->regs + DCTL, DCTL_SftDiscon);
+       __bic32(hsotg->regs + DCTL, DCTL_SFTDISCON);
 }
 
 /**
@@ -2433,7 +2253,7 @@ irq_retry:
 
        gintsts &= gintmsk;
 
-       if (gintsts & GINTSTS_OTGInt) {
+       if (gintsts & GINTSTS_OTGINT) {
                u32 otgint = readl(hsotg->regs + GOTGINT);
 
                dev_info(hsotg->dev, "OTGInt: %08x\n", otgint);
@@ -2441,34 +2261,34 @@ irq_retry:
                writel(otgint, hsotg->regs + GOTGINT);
        }
 
-       if (gintsts & GINTSTS_SessReqInt) {
+       if (gintsts & GINTSTS_SESSREQINT) {
                dev_dbg(hsotg->dev, "%s: SessReqInt\n", __func__);
-               writel(GINTSTS_SessReqInt, hsotg->regs + GINTSTS);
+               writel(GINTSTS_SESSREQINT, hsotg->regs + GINTSTS);
        }
 
-       if (gintsts & GINTSTS_EnumDone) {
-               writel(GINTSTS_EnumDone, hsotg->regs + GINTSTS);
+       if (gintsts & GINTSTS_ENUMDONE) {
+               writel(GINTSTS_ENUMDONE, hsotg->regs + GINTSTS);
 
                s3c_hsotg_irq_enumdone(hsotg);
        }
 
-       if (gintsts & GINTSTS_ConIDStsChng) {
+       if (gintsts & GINTSTS_CONIDSTSCHNG) {
                dev_dbg(hsotg->dev, "ConIDStsChg (DSTS=0x%08x, GOTCTL=%08x)\n",
                        readl(hsotg->regs + DSTS),
                        readl(hsotg->regs + GOTGCTL));
 
-               writel(GINTSTS_ConIDStsChng, hsotg->regs + GINTSTS);
+               writel(GINTSTS_CONIDSTSCHNG, hsotg->regs + GINTSTS);
        }
 
-       if (gintsts & (GINTSTS_OEPInt | GINTSTS_IEPInt)) {
+       if (gintsts & (GINTSTS_OEPINT | GINTSTS_IEPINT)) {
                u32 daint = readl(hsotg->regs + DAINT);
                u32 daintmsk = readl(hsotg->regs + DAINTMSK);
                u32 daint_out, daint_in;
                int ep;
 
                daint &= daintmsk;
-               daint_out = daint >> DAINT_OutEP_SHIFT;
-               daint_in = daint & ~(daint_out << DAINT_OutEP_SHIFT);
+               daint_out = daint >> DAINT_OUTEP_SHIFT;
+               daint_in = daint & ~(daint_out << DAINT_OUTEP_SHIFT);
 
                dev_dbg(hsotg->dev, "%s: daint=%08x\n", __func__, daint);
 
@@ -2483,7 +2303,7 @@ irq_retry:
                }
        }
 
-       if (gintsts & GINTSTS_USBRst) {
+       if (gintsts & GINTSTS_USBRST) {
 
                u32 usb_status = readl(hsotg->regs + GOTGCTL);
 
@@ -2491,7 +2311,7 @@ irq_retry:
                dev_dbg(hsotg->dev, "GNPTXSTS=%08x\n",
                        readl(hsotg->regs + GNPTXSTS));
 
-               writel(GINTSTS_USBRst, hsotg->regs + GINTSTS);
+               writel(GINTSTS_USBRST, hsotg->regs + GINTSTS);
 
                if (usb_status & GOTGCTL_BSESVLD) {
                        if (time_after(jiffies, hsotg->last_rst +
@@ -2508,7 +2328,7 @@ irq_retry:
 
        /* check both FIFOs */
 
-       if (gintsts & GINTSTS_NPTxFEmp) {
+       if (gintsts & GINTSTS_NPTXFEMP) {
                dev_dbg(hsotg->dev, "NPTxFEmp\n");
 
                /*
@@ -2517,20 +2337,20 @@ irq_retry:
                 * it needs re-enabling
                 */
 
-               s3c_hsotg_disable_gsint(hsotg, GINTSTS_NPTxFEmp);
+               s3c_hsotg_disable_gsint(hsotg, GINTSTS_NPTXFEMP);
                s3c_hsotg_irq_fifoempty(hsotg, false);
        }
 
-       if (gintsts & GINTSTS_PTxFEmp) {
+       if (gintsts & GINTSTS_PTXFEMP) {
                dev_dbg(hsotg->dev, "PTxFEmp\n");
 
                /* See note in GINTSTS_NPTxFEmp */
 
-               s3c_hsotg_disable_gsint(hsotg, GINTSTS_PTxFEmp);
+               s3c_hsotg_disable_gsint(hsotg, GINTSTS_PTXFEMP);
                s3c_hsotg_irq_fifoempty(hsotg, true);
        }
 
-       if (gintsts & GINTSTS_RxFLvl) {
+       if (gintsts & GINTSTS_RXFLVL) {
                /*
                 * note, since GINTSTS_RxFLvl doubles as FIFO-not-empty,
                 * we need to retry s3c_hsotg_handle_rx if this is still
@@ -2540,28 +2360,28 @@ irq_retry:
                s3c_hsotg_handle_rx(hsotg);
        }
 
-       if (gintsts & GINTSTS_ModeMis) {
+       if (gintsts & GINTSTS_MODEMIS) {
                dev_warn(hsotg->dev, "warning, mode mismatch triggered\n");
-               writel(GINTSTS_ModeMis, hsotg->regs + GINTSTS);
+               writel(GINTSTS_MODEMIS, hsotg->regs + GINTSTS);
        }
 
-       if (gintsts & GINTSTS_USBSusp) {
+       if (gintsts & GINTSTS_USBSUSP) {
                dev_info(hsotg->dev, "GINTSTS_USBSusp\n");
-               writel(GINTSTS_USBSusp, hsotg->regs + GINTSTS);
+               writel(GINTSTS_USBSUSP, hsotg->regs + GINTSTS);
 
                call_gadget(hsotg, suspend);
        }
 
-       if (gintsts & GINTSTS_WkUpInt) {
+       if (gintsts & GINTSTS_WKUPINT) {
                dev_info(hsotg->dev, "GINTSTS_WkUpIn\n");
-               writel(GINTSTS_WkUpInt, hsotg->regs + GINTSTS);
+               writel(GINTSTS_WKUPINT, hsotg->regs + GINTSTS);
 
                call_gadget(hsotg, resume);
        }
 
-       if (gintsts & GINTSTS_ErlySusp) {
+       if (gintsts & GINTSTS_ERLYSUSP) {
                dev_dbg(hsotg->dev, "GINTSTS_ErlySusp\n");
-               writel(GINTSTS_ErlySusp, hsotg->regs + GINTSTS);
+               writel(GINTSTS_ERLYSUSP, hsotg->regs + GINTSTS);
        }
 
        /*
@@ -2570,18 +2390,18 @@ irq_retry:
         * the occurrence.
         */
 
-       if (gintsts & GINTSTS_GOUTNakEff) {
+       if (gintsts & GINTSTS_GOUTNAKEFF) {
                dev_info(hsotg->dev, "GOUTNakEff triggered\n");
 
-               writel(DCTL_CGOUTNak, hsotg->regs + DCTL);
+               writel(DCTL_CGOUTNAK, hsotg->regs + DCTL);
 
                s3c_hsotg_dump(hsotg);
        }
 
-       if (gintsts & GINTSTS_GINNakEff) {
+       if (gintsts & GINTSTS_GINNAKEFF) {
                dev_info(hsotg->dev, "GINNakEff triggered\n");
 
-               writel(DCTL_CGNPInNAK, hsotg->regs + DCTL);
+               writel(DCTL_CGNPINNAK, hsotg->regs + DCTL);
 
                s3c_hsotg_dump(hsotg);
        }
@@ -2645,14 +2465,14 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
 
        spin_lock_irqsave(&hsotg->lock, flags);
 
-       epctrl &= ~(DxEPCTL_EPType_MASK | DxEPCTL_MPS_MASK);
-       epctrl |= DxEPCTL_MPS(mps);
+       epctrl &= ~(DXEPCTL_EPTYPE_MASK | DXEPCTL_MPS_MASK);
+       epctrl |= DXEPCTL_MPS(mps);
 
        /*
         * mark the endpoint as active, otherwise the core may ignore
         * transactions entirely for this endpoint
         */
-       epctrl |= DxEPCTL_USBActEp;
+       epctrl |= DXEPCTL_USBACTEP;
 
        /*
         * set the NAK status on the endpoint, otherwise we might try and
@@ -2661,7 +2481,7 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
         * size register hasn't been set.
         */
 
-       epctrl |= DxEPCTL_SNAK;
+       epctrl |= DXEPCTL_SNAK;
 
        /* update the endpoint state */
        s3c_hsotg_set_ep_maxpacket(hsotg, hs_ep->index, mps);
@@ -2677,15 +2497,15 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
 
        switch (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
        case USB_ENDPOINT_XFER_ISOC:
-               epctrl |= DxEPCTL_EPType_Iso;
-               epctrl |= DxEPCTL_SetEvenFr;
+               epctrl |= DXEPCTL_EPTYPE_ISO;
+               epctrl |= DXEPCTL_SETEVENFR;
                hs_ep->isochronous = 1;
                if (dir_in)
                        hs_ep->periodic = 1;
                break;
 
        case USB_ENDPOINT_XFER_BULK:
-               epctrl |= DxEPCTL_EPType_Bulk;
+               epctrl |= DXEPCTL_EPTYPE_BULK;
                break;
 
        case USB_ENDPOINT_XFER_INT:
@@ -2698,14 +2518,14 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
                         */
 
                        hs_ep->periodic = 1;
-                       epctrl |= DxEPCTL_TxFNum(index);
+                       epctrl |= DXEPCTL_TXFNUM(index);
                }
 
-               epctrl |= DxEPCTL_EPType_Intterupt;
+               epctrl |= DXEPCTL_EPTYPE_INTERRUPT;
                break;
 
        case USB_ENDPOINT_XFER_CONTROL:
-               epctrl |= DxEPCTL_EPType_Control;
+               epctrl |= DXEPCTL_EPTYPE_CONTROL;
                break;
        }
 
@@ -2714,11 +2534,11 @@ static int s3c_hsotg_ep_enable(struct usb_ep *ep,
         * a unique tx-fifo even if it is non-periodic.
         */
        if (dir_in && hsotg->dedicated_fifos)
-               epctrl |= DxEPCTL_TxFNum(index);
+               epctrl |= DXEPCTL_TXFNUM(index);
 
        /* for non control endpoints, set PID to D0 */
        if (index)
-               epctrl |= DxEPCTL_SetD0PID;
+               epctrl |= DXEPCTL_SETD0PID;
 
        dev_dbg(hsotg->dev, "%s: write DxEPCTL=0x%08x\n",
                __func__, epctrl);
@@ -2763,9 +2583,9 @@ static int s3c_hsotg_ep_disable(struct usb_ep *ep)
 
 
        ctrl = readl(hsotg->regs + epctrl_reg);
-       ctrl &= ~DxEPCTL_EPEna;
-       ctrl &= ~DxEPCTL_USBActEp;
-       ctrl |= DxEPCTL_SNAK;
+       ctrl &= ~DXEPCTL_EPENA;
+       ctrl &= ~DXEPCTL_USBACTEP;
+       ctrl |= DXEPCTL_SNAK;
 
        dev_dbg(hsotg->dev, "%s: DxEPCTL=0x%08x\n", __func__, ctrl);
        writel(ctrl, hsotg->regs + epctrl_reg);
@@ -2852,15 +2672,15 @@ static int s3c_hsotg_ep_sethalt(struct usb_ep *ep, int value)
        epctl = readl(hs->regs + epreg);
 
        if (value) {
-               epctl |= DxEPCTL_Stall + DxEPCTL_SNAK;
-               if (epctl & DxEPCTL_EPEna)
-                       epctl |= DxEPCTL_EPDis;
+               epctl |= DXEPCTL_STALL + DXEPCTL_SNAK;
+               if (epctl & DXEPCTL_EPENA)
+                       epctl |= DXEPCTL_EPDIS;
        } else {
-               epctl &= ~DxEPCTL_Stall;
-               xfertype = epctl & DxEPCTL_EPType_MASK;
-               if (xfertype == DxEPCTL_EPType_Bulk ||
-                       xfertype == DxEPCTL_EPType_Intterupt)
-                               epctl |= DxEPCTL_SetD0PID;
+               epctl &= ~DXEPCTL_STALL;
+               xfertype = epctl & DXEPCTL_EPTYPE_MASK;
+               if (xfertype == DXEPCTL_EPTYPE_BULK ||
+                       xfertype == DXEPCTL_EPTYPE_INTERRUPT)
+                               epctl |= DXEPCTL_SETD0PID;
        }
 
        writel(epctl, hs->regs + epreg);
@@ -2869,13 +2689,13 @@ static int s3c_hsotg_ep_sethalt(struct usb_ep *ep, int value)
        epctl = readl(hs->regs + epreg);
 
        if (value)
-               epctl |= DxEPCTL_Stall;
+               epctl |= DXEPCTL_STALL;
        else {
-               epctl &= ~DxEPCTL_Stall;
-               xfertype = epctl & DxEPCTL_EPType_MASK;
-               if (xfertype == DxEPCTL_EPType_Bulk ||
-                       xfertype == DxEPCTL_EPType_Intterupt)
-                               epctl |= DxEPCTL_SetD0PID;
+               epctl &= ~DXEPCTL_STALL;
+               xfertype = epctl & DXEPCTL_EPTYPE_MASK;
+               if (xfertype == DXEPCTL_EPTYPE_BULK ||
+                       xfertype == DXEPCTL_EPTYPE_INTERRUPT)
+                               epctl |= DXEPCTL_SETD0PID;
        }
 
        writel(epctl, hs->regs + epreg);
@@ -2965,22 +2785,22 @@ static void s3c_hsotg_init(struct s3c_hsotg *hsotg)
 {
        /* unmask subset of endpoint interrupts */
 
-       writel(DIEPMSK_TimeOUTMsk | DIEPMSK_AHBErrMsk |
-              DIEPMSK_EPDisbldMsk | DIEPMSK_XferComplMsk,
-              hsotg->regs + DIEPMSK);
+       writel(DIEPMSK_TIMEOUTMSK | DIEPMSK_AHBERRMSK |
+               DIEPMSK_EPDISBLDMSK | DIEPMSK_XFERCOMPLMSK,
+               hsotg->regs + DIEPMSK);
 
-       writel(DOEPMSK_SetupMsk | DOEPMSK_AHBErrMsk |
-              DOEPMSK_EPDisbldMsk | DOEPMSK_XferComplMsk,
-              hsotg->regs + DOEPMSK);
+       writel(DOEPMSK_SETUPMSK | DOEPMSK_AHBERRMSK |
+               DOEPMSK_EPDISBLDMSK | DOEPMSK_XFERCOMPLMSK,
+               hsotg->regs + DOEPMSK);
 
        writel(0, hsotg->regs + DAINTMSK);
 
        /* Be in disconnected state until gadget is registered */
-       __orr32(hsotg->regs + DCTL, DCTL_SftDiscon);
+       __orr32(hsotg->regs + DCTL, DCTL_SFTDISCON);
 
        if (0) {
                /* post global nak until we're ready */
-               writel(DCTL_SGNPInNAK | DCTL_SGOUTNak,
+               writel(DCTL_SGNPINNAK | DCTL_SGOUTNAK,
                       hsotg->regs + DCTL);
        }
 
@@ -2993,10 +2813,10 @@ static void s3c_hsotg_init(struct s3c_hsotg *hsotg)
        s3c_hsotg_init_fifo(hsotg);
 
        /* set the PLL on, remove the HNP/SRP and set the PHY */
-       writel(GUSBCFG_PHYIf16 | GUSBCFG_TOutCal(7) | (0x5 << 10),
+       writel(GUSBCFG_PHYIF16 | GUSBCFG_TOUTCAL(7) | (0x5 << 10),
               hsotg->regs + GUSBCFG);
 
-       writel(using_dma(hsotg) ? GAHBCFG_DMAEn : 0x0,
+       writel(using_dma(hsotg) ? GAHBCFG_DMA_EN : 0x0,
               hsotg->regs + GAHBCFG);
 }
 
@@ -3187,8 +3007,8 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg,
         * code is changed to make each endpoint's direction changeable.
         */
 
-       ptxfifo = readl(hsotg->regs + DPTXFSIZn(epnum));
-       hs_ep->fifo_size = DPTXFSIZn_DPTxFSize_GET(ptxfifo) * 4;
+       ptxfifo = readl(hsotg->regs + DPTXFSIZN(epnum));
+       hs_ep->fifo_size = FIFOSIZE_DEPTH_GET(ptxfifo) * 4;
 
        /*
         * if we're using dma, we need to set the next-endpoint pointer
@@ -3196,7 +3016,7 @@ static void s3c_hsotg_initep(struct s3c_hsotg *hsotg,
         */
 
        if (using_dma(hsotg)) {
-               u32 next = DxEPCTL_NextEp((epnum + 1) % 15);
+               u32 next = DXEPCTL_NEXTEP((epnum + 1) % 15);
                writel(next, hsotg->regs + DIEPCTL(epnum));
                writel(next, hsotg->regs + DOEPCTL(epnum));
        }
@@ -3250,10 +3070,10 @@ static void s3c_hsotg_dump(struct s3c_hsotg *hsotg)
        /* show periodic fifo settings */
 
        for (idx = 1; idx <= 15; idx++) {
-               val = readl(regs + DPTXFSIZn(idx));
+               val = readl(regs + DPTXFSIZN(idx));
                dev_info(dev, "DPTx[%d] FSize=%d, StAddr=0x%08x\n", idx,
-                        val >> DPTXFSIZn_DPTxFSize_SHIFT,
-                        val & DPTXFSIZn_DPTxFStAddr_MASK);
+                        val >> FIFOSIZE_DEPTH_SHIFT,
+                        val & FIFOSIZE_STARTADDR_MASK);
        }
 
        for (idx = 0; idx < 15; idx++) {
@@ -3368,17 +3188,17 @@ static int fifo_show(struct seq_file *seq, void *v)
 
        val = readl(regs + GNPTXFSIZ);
        seq_printf(seq, "NPTXFIFO: Size %d, Start 0x%08x\n",
-                  val >> GNPTXFSIZ_NPTxFDep_SHIFT,
-                  val & GNPTXFSIZ_NPTxFStAddr_MASK);
+                  val >> FIFOSIZE_DEPTH_SHIFT,
+                  val & FIFOSIZE_DEPTH_MASK);
 
        seq_puts(seq, "\nPeriodic TXFIFOs:\n");
 
        for (idx = 1; idx <= 15; idx++) {
-               val = readl(regs + DPTXFSIZn(idx));
+               val = readl(regs + DPTXFSIZN(idx));
 
                seq_printf(seq, "\tDPTXFIFO%2d: Size %d, Start 0x%08x\n", idx,
-                          val >> DPTXFSIZn_DPTxFSize_SHIFT,
-                          val & DPTXFSIZn_DPTxFStAddr_MASK);
+                          val >> FIFOSIZE_DEPTH_SHIFT,
+                          val & FIFOSIZE_STARTADDR_MASK);
        }
 
        return 0;
@@ -3662,14 +3482,14 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
        }
 
        /* Set default UTMI width */
-       hsotg->phyif = GUSBCFG_PHYIf16;
+       hsotg->phyif = GUSBCFG_PHYIF16;
 
        /*
         * If using the generic PHY framework, check if the PHY bus
         * width is 8-bit and set the phyif appropriately.
         */
        if (hsotg->phy && (phy_get_bus_width(phy) == 8))
-               hsotg->phyif = GUSBCFG_PHYIf8;
+               hsotg->phyif = GUSBCFG_PHYIF8;
 
        if (hsotg->phy)
                phy_init(hsotg->phy);
index 9c92a3c..51248b9 100644 (file)
 #define GUSBCFG_FSINTF                 (1 << 5)
 #define GUSBCFG_ULPI_UTMI_SEL          (1 << 4)
 #define GUSBCFG_PHYIF16                        (1 << 3)
+#define GUSBCFG_PHYIF8                 (0 << 3)
 #define GUSBCFG_TOUTCAL_MASK           (0x7 << 0)
 #define GUSBCFG_TOUTCAL_SHIFT          0
 #define GUSBCFG_TOUTCAL_LIMIT          0x7
 #define FIFOSIZE_DEPTH_SHIFT           16
 #define FIFOSIZE_STARTADDR_MASK                (0xffff << 0)
 #define FIFOSIZE_STARTADDR_SHIFT       0
+#define FIFOSIZE_DEPTH_GET(_x)         (((_x) >> 16) & 0xffff)
 
 /* Device mode registers */
 
 #define DXEPCTL_STALL                  (1 << 21)
 #define DXEPCTL_SNP                    (1 << 20)
 #define DXEPCTL_EPTYPE_MASK            (0x3 << 18)
-#define DXEPCTL_EPTYPE_SHIFT           18
-#define DXEPCTL_EPTYPE_CONTROL         0
-#define DXEPCTL_EPTYPE_ISO             1
-#define DXEPCTL_EPTYPE_BULK            2
-#define DXEPCTL_EPTYPE_INTTERUPT       3
+#define DXEPCTL_EPTYPE_CONTROL         (0x0 << 18)
+#define DXEPCTL_EPTYPE_ISO             (0x1 << 18)
+#define DXEPCTL_EPTYPE_BULK            (0x2 << 18)
+#define DXEPCTL_EPTYPE_INTERRUPT       (0x3 << 18)
+
 #define DXEPCTL_NAKSTS                 (1 << 17)
 #define DXEPCTL_DPID                   (1 << 16)
 #define DXEPCTL_EOFRNUM                        (1 << 16)
index 3557c7e..7fca52b 100644 (file)
@@ -300,12 +300,6 @@ config USB_PXA27X
           dynamically linked module called "pxa27x_udc" and force all
           gadget drivers to also be dynamically linked.
 
-config USB_S3C_HSOTG
-       tristate "Designware/S3C HS/OtG USB Device controller"
-       help
-         The Designware USB2.0 high-speed gadget controller
-         integrated into many SoCs.
-
 config USB_S3C2410
        tristate "S3C2410 USB Device Controller"
        depends on ARCH_S3C24XX
index 5f150bc..49514ea 100644 (file)
@@ -26,7 +26,6 @@ fsl_usb2_udc-$(CONFIG_ARCH_MXC)       += fsl_mxc_udc.o
 obj-$(CONFIG_USB_M66592)       += m66592-udc.o
 obj-$(CONFIG_USB_R8A66597)     += r8a66597-udc.o
 obj-$(CONFIG_USB_FSL_QE)       += fsl_qe_udc.o
-obj-$(CONFIG_USB_S3C_HSOTG)    += s3c-hsotg.o
 obj-$(CONFIG_USB_S3C_HSUDC)    += s3c-hsudc.o
 obj-$(CONFIG_USB_LPC32XX)      += lpc32xx_udc.o
 obj-$(CONFIG_USB_EG20T)                += pch_udc.o
diff --git a/drivers/usb/gadget/s3c-hsotg.h b/drivers/usb/gadget/s3c-hsotg.h
deleted file mode 100644 (file)
index 85f549f..0000000
+++ /dev/null
@@ -1,378 +0,0 @@
-/* drivers/usb/gadget/s3c-hsotg.h
- *
- * Copyright 2008 Openmoko, Inc.
- * Copyright 2008 Simtec Electronics
- *      http://armlinux.simtec.co.uk/
- *      Ben Dooks <ben@simtec.co.uk>
- *
- * USB2.0 Highspeed/OtG Synopsis DWC2 device block registers
- *
- * 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 __REGS_USB_HSOTG_H
-#define __REGS_USB_HSOTG_H __FILE__
-
-#define HSOTG_REG(x) (x)
-
-#define GOTGCTL                                HSOTG_REG(0x000)
-#define GOTGCTL_BSESVLD                        (1 << 19)
-#define GOTGCTL_ASESVLD                        (1 << 18)
-#define GOTGCTL_DBNC_SHORT                     (1 << 17)
-#define GOTGCTL_CONID_B                        (1 << 16)
-#define GOTGCTL_DEVHNPEN                       (1 << 11)
-#define GOTGCTL_HSSETHNPEN                     (1 << 10)
-#define GOTGCTL_HNPREQ                         (1 << 9)
-#define GOTGCTL_HSTNEGSCS                      (1 << 8)
-#define GOTGCTL_SESREQ                         (1 << 1)
-#define GOTGCTL_SESREQSCS                      (1 << 0)
-
-#define GOTGINT                                HSOTG_REG(0x004)
-#define GOTGINT_DbnceDone                      (1 << 19)
-#define GOTGINT_ADevTOUTChg                    (1 << 18)
-#define GOTGINT_HstNegDet                      (1 << 17)
-#define GOTGINT_HstnegSucStsChng               (1 << 9)
-#define GOTGINT_SesReqSucStsChng               (1 << 8)
-#define GOTGINT_SesEndDet                      (1 << 2)
-
-#define GAHBCFG                                HSOTG_REG(0x008)
-#define GAHBCFG_PTxFEmpLvl                     (1 << 8)
-#define GAHBCFG_NPTxFEmpLvl                    (1 << 7)
-#define GAHBCFG_DMAEn                          (1 << 5)
-#define GAHBCFG_HBstLen_MASK                   (0xf << 1)
-#define GAHBCFG_HBstLen_SHIFT                  (1)
-#define GAHBCFG_HBstLen_Single                 (0x0 << 1)
-#define GAHBCFG_HBstLen_Incr                   (0x1 << 1)
-#define GAHBCFG_HBstLen_Incr4                  (0x3 << 1)
-#define GAHBCFG_HBstLen_Incr8                  (0x5 << 1)
-#define GAHBCFG_HBstLen_Incr16                 (0x7 << 1)
-#define GAHBCFG_GlblIntrEn                     (1 << 0)
-
-#define GUSBCFG                                HSOTG_REG(0x00C)
-#define GUSBCFG_PHYLPClkSel                    (1 << 15)
-#define GUSBCFG_HNPCap                         (1 << 9)
-#define GUSBCFG_SRPCap                         (1 << 8)
-#define GUSBCFG_PHYIf16                        (1 << 3)
-#define GUSBCFG_PHYIf8                         (0 << 3)
-#define GUSBCFG_TOutCal_MASK                   (0x7 << 0)
-#define GUSBCFG_TOutCal_SHIFT                  (0)
-#define GUSBCFG_TOutCal_LIMIT                  (0x7)
-#define GUSBCFG_TOutCal(_x)                    ((_x) << 0)
-
-#define GRSTCTL                                HSOTG_REG(0x010)
-
-#define GRSTCTL_AHBIdle                        (1 << 31)
-#define GRSTCTL_DMAReq                         (1 << 30)
-#define GRSTCTL_TxFNum_MASK                    (0x1f << 6)
-#define GRSTCTL_TxFNum_SHIFT                   (6)
-#define GRSTCTL_TxFNum_LIMIT                   (0x1f)
-#define GRSTCTL_TxFNum(_x)                     ((_x) << 6)
-#define GRSTCTL_TxFFlsh                        (1 << 5)
-#define GRSTCTL_RxFFlsh                        (1 << 4)
-#define GRSTCTL_INTknQFlsh                     (1 << 3)
-#define GRSTCTL_FrmCntrRst                     (1 << 2)
-#define GRSTCTL_HSftRst                        (1 << 1)
-#define GRSTCTL_CSftRst                        (1 << 0)
-
-#define GINTSTS                                HSOTG_REG(0x014)
-#define GINTMSK                                HSOTG_REG(0x018)
-
-#define GINTSTS_WkUpInt                        (1 << 31)
-#define GINTSTS_SessReqInt                     (1 << 30)
-#define GINTSTS_DisconnInt                     (1 << 29)
-#define GINTSTS_ConIDStsChng                   (1 << 28)
-#define GINTSTS_PTxFEmp                        (1 << 26)
-#define GINTSTS_HChInt                         (1 << 25)
-#define GINTSTS_PrtInt                         (1 << 24)
-#define GINTSTS_FetSusp                        (1 << 22)
-#define GINTSTS_incompIP                       (1 << 21)
-#define GINTSTS_IncomplSOIN                    (1 << 20)
-#define GINTSTS_OEPInt                         (1 << 19)
-#define GINTSTS_IEPInt                         (1 << 18)
-#define GINTSTS_EPMis                          (1 << 17)
-#define GINTSTS_EOPF                           (1 << 15)
-#define GINTSTS_ISOutDrop                      (1 << 14)
-#define GINTSTS_EnumDone                       (1 << 13)
-#define GINTSTS_USBRst                         (1 << 12)
-#define GINTSTS_USBSusp                        (1 << 11)
-#define GINTSTS_ErlySusp                       (1 << 10)
-#define GINTSTS_GOUTNakEff                     (1 << 7)
-#define GINTSTS_GINNakEff                      (1 << 6)
-#define GINTSTS_NPTxFEmp                       (1 << 5)
-#define GINTSTS_RxFLvl                         (1 << 4)
-#define GINTSTS_SOF                            (1 << 3)
-#define GINTSTS_OTGInt                         (1 << 2)
-#define GINTSTS_ModeMis                        (1 << 1)
-#define GINTSTS_CurMod_Host                    (1 << 0)
-
-#define GRXSTSR                                HSOTG_REG(0x01C)
-#define GRXSTSP                                HSOTG_REG(0x020)
-
-#define GRXSTS_FN_MASK                         (0x7f << 25)
-#define GRXSTS_FN_SHIFT                        (25)
-
-#define GRXSTS_PktSts_MASK                     (0xf << 17)
-#define GRXSTS_PktSts_SHIFT                    (17)
-#define GRXSTS_PktSts_GlobalOutNAK             (0x1 << 17)
-#define GRXSTS_PktSts_OutRX                    (0x2 << 17)
-#define GRXSTS_PktSts_OutDone                  (0x3 << 17)
-#define GRXSTS_PktSts_SetupDone                (0x4 << 17)
-#define GRXSTS_PktSts_SetupRX                  (0x6 << 17)
-
-#define GRXSTS_DPID_MASK                       (0x3 << 15)
-#define GRXSTS_DPID_SHIFT                      (15)
-#define GRXSTS_ByteCnt_MASK                    (0x7ff << 4)
-#define GRXSTS_ByteCnt_SHIFT                   (4)
-#define GRXSTS_EPNum_MASK                      (0xf << 0)
-#define GRXSTS_EPNum_SHIFT                     (0)
-
-#define GRXFSIZ                                HSOTG_REG(0x024)
-
-#define GNPTXFSIZ                              HSOTG_REG(0x028)
-
-#define GNPTXFSIZ_NPTxFDep_MASK                (0xffff << 16)
-#define GNPTXFSIZ_NPTxFDep_SHIFT               (16)
-#define GNPTXFSIZ_NPTxFDep_LIMIT               (0xffff)
-#define GNPTXFSIZ_NPTxFDep(_x)                 ((_x) << 16)
-#define GNPTXFSIZ_NPTxFStAddr_MASK             (0xffff << 0)
-#define GNPTXFSIZ_NPTxFStAddr_SHIFT            (0)
-#define GNPTXFSIZ_NPTxFStAddr_LIMIT            (0xffff)
-#define GNPTXFSIZ_NPTxFStAddr(_x)              ((_x) << 0)
-
-#define GNPTXSTS                               HSOTG_REG(0x02C)
-
-#define GNPTXSTS_NPtxQTop_MASK                 (0x7f << 24)
-#define GNPTXSTS_NPtxQTop_SHIFT                (24)
-
-#define GNPTXSTS_NPTxQSpcAvail_MASK            (0xff << 16)
-#define GNPTXSTS_NPTxQSpcAvail_SHIFT           (16)
-#define GNPTXSTS_NPTxQSpcAvail_GET(_v)         (((_v) >> 16) & 0xff)
-
-#define GNPTXSTS_NPTxFSpcAvail_MASK            (0xffff << 0)
-#define GNPTXSTS_NPTxFSpcAvail_SHIFT           (0)
-#define GNPTXSTS_NPTxFSpcAvail_GET(_v)         (((_v) >> 0) & 0xffff)
-
-
-#define HPTXFSIZ                               HSOTG_REG(0x100)
-
-#define DPTXFSIZn(_a)          HSOTG_REG(0x104 + (((_a) - 1) * 4))
-
-#define DPTXFSIZn_DPTxFSize_MASK               (0xffff << 16)
-#define DPTXFSIZn_DPTxFSize_SHIFT              (16)
-#define DPTXFSIZn_DPTxFSize_GET(_v)            (((_v) >> 16) & 0xffff)
-#define DPTXFSIZn_DPTxFSize_LIMIT              (0xffff)
-#define DPTXFSIZn_DPTxFSize(_x)                ((_x) << 16)
-
-#define DPTXFSIZn_DPTxFStAddr_MASK             (0xffff << 0)
-#define DPTXFSIZn_DPTxFStAddr_SHIFT            (0)
-
-/* Device mode registers */
-#define DCFG                                   HSOTG_REG(0x800)
-
-#define DCFG_EPMisCnt_MASK                     (0x1f << 18)
-#define DCFG_EPMisCnt_SHIFT                    (18)
-#define DCFG_EPMisCnt_LIMIT                    (0x1f)
-#define DCFG_EPMisCnt(_x)                      ((_x) << 18)
-
-#define DCFG_PerFrInt_MASK                     (0x3 << 11)
-#define DCFG_PerFrInt_SHIFT                    (11)
-#define DCFG_PerFrInt_LIMIT                    (0x3)
-#define DCFG_PerFrInt(_x)                      ((_x) << 11)
-
-#define DCFG_DevAddr_MASK                      (0x7f << 4)
-#define DCFG_DevAddr_SHIFT                     (4)
-#define DCFG_DevAddr_LIMIT                     (0x7f)
-#define DCFG_DevAddr(_x)                       ((_x) << 4)
-
-#define DCFG_NZStsOUTHShk                      (1 << 2)
-
-#define DCFG_DevSpd_MASK                       (0x3 << 0)
-#define DCFG_DevSpd_SHIFT                      (0)
-#define DCFG_DevSpd_HS                         (0x0 << 0)
-#define DCFG_DevSpd_FS                         (0x1 << 0)
-#define DCFG_DevSpd_LS                         (0x2 << 0)
-#define DCFG_DevSpd_FS48                       (0x3 << 0)
-
-#define DCTL                                   HSOTG_REG(0x804)
-
-#define DCTL_PWROnPrgDone                      (1 << 11)
-#define DCTL_CGOUTNak                          (1 << 10)
-#define DCTL_SGOUTNak                          (1 << 9)
-#define DCTL_CGNPInNAK                         (1 << 8)
-#define DCTL_SGNPInNAK                         (1 << 7)
-#define DCTL_TstCtl_MASK                       (0x7 << 4)
-#define DCTL_TstCtl_SHIFT                      (4)
-#define DCTL_GOUTNakSts                        (1 << 3)
-#define DCTL_GNPINNakSts                       (1 << 2)
-#define DCTL_SftDiscon                         (1 << 1)
-#define DCTL_RmtWkUpSig                        (1 << 0)
-
-#define DSTS                                   HSOTG_REG(0x808)
-
-#define DSTS_SOFFN_MASK                        (0x3fff << 8)
-#define DSTS_SOFFN_SHIFT                       (8)
-#define DSTS_SOFFN_LIMIT                       (0x3fff)
-#define DSTS_SOFFN(_x)                         ((_x) << 8)
-#define DSTS_ErraticErr                        (1 << 3)
-#define DSTS_EnumSpd_MASK                      (0x3 << 1)
-#define DSTS_EnumSpd_SHIFT                     (1)
-#define DSTS_EnumSpd_HS                        (0x0 << 1)
-#define DSTS_EnumSpd_FS                        (0x1 << 1)
-#define DSTS_EnumSpd_LS                        (0x2 << 1)
-#define DSTS_EnumSpd_FS48                      (0x3 << 1)
-
-#define DSTS_SuspSts                           (1 << 0)
-
-#define DIEPMSK                                HSOTG_REG(0x810)
-
-#define DIEPMSK_TxFIFOEmpty                    (1 << 7)
-#define DIEPMSK_INEPNakEffMsk                  (1 << 6)
-#define DIEPMSK_INTknEPMisMsk                  (1 << 5)
-#define DIEPMSK_INTknTXFEmpMsk                 (1 << 4)
-#define DIEPMSK_TimeOUTMsk                     (1 << 3)
-#define DIEPMSK_AHBErrMsk                      (1 << 2)
-#define DIEPMSK_EPDisbldMsk                    (1 << 1)
-#define DIEPMSK_XferComplMsk                   (1 << 0)
-
-#define DOEPMSK                                HSOTG_REG(0x814)
-
-#define DOEPMSK_Back2BackSetup                 (1 << 6)
-#define DOEPMSK_OUTTknEPdisMsk                 (1 << 4)
-#define DOEPMSK_SetupMsk                       (1 << 3)
-#define DOEPMSK_AHBErrMsk                      (1 << 2)
-#define DOEPMSK_EPDisbldMsk                    (1 << 1)
-#define DOEPMSK_XferComplMsk                   (1 << 0)
-
-#define DAINT                                  HSOTG_REG(0x818)
-#define DAINTMSK                               HSOTG_REG(0x81C)
-
-#define DAINT_OutEP_SHIFT                      (16)
-#define DAINT_OutEP(x)                         (1 << ((x) + 16))
-#define DAINT_InEP(x)                          (1 << (x))
-
-#define DTKNQR1                                HSOTG_REG(0x820)
-#define DTKNQR2                                HSOTG_REG(0x824)
-#define DTKNQR3                                HSOTG_REG(0x830)
-#define DTKNQR4                                HSOTG_REG(0x834)
-
-#define DVBUSDIS                               HSOTG_REG(0x828)
-#define DVBUSPULSE                             HSOTG_REG(0x82C)
-
-#define DIEPCTL0                               HSOTG_REG(0x900)
-#define DOEPCTL0                               HSOTG_REG(0xB00)
-#define DIEPCTL(_a)                    HSOTG_REG(0x900 + ((_a) * 0x20))
-#define DOEPCTL(_a)                    HSOTG_REG(0xB00 + ((_a) * 0x20))
-
-/* EP0 specialness:
- * bits[29..28] - reserved (no SetD0PID, SetD1PID)
- * bits[25..22] - should always be zero, this isn't a periodic endpoint
- * bits[10..0] - MPS setting differenct for EP0
- */
-#define D0EPCTL_MPS_MASK                       (0x3 << 0)
-#define D0EPCTL_MPS_SHIFT                      (0)
-#define D0EPCTL_MPS_64                         (0x0 << 0)
-#define D0EPCTL_MPS_32                         (0x1 << 0)
-#define D0EPCTL_MPS_16                         (0x2 << 0)
-#define D0EPCTL_MPS_8                          (0x3 << 0)
-
-#define DxEPCTL_EPEna                          (1 << 31)
-#define DxEPCTL_EPDis                          (1 << 30)
-#define DxEPCTL_SetD1PID                       (1 << 29)
-#define DxEPCTL_SetOddFr                       (1 << 29)
-#define DxEPCTL_SetD0PID                       (1 << 28)
-#define DxEPCTL_SetEvenFr                      (1 << 28)
-#define DxEPCTL_SNAK                           (1 << 27)
-#define DxEPCTL_CNAK                           (1 << 26)
-#define DxEPCTL_TxFNum_MASK                    (0xf << 22)
-#define DxEPCTL_TxFNum_SHIFT                   (22)
-#define DxEPCTL_TxFNum_LIMIT                   (0xf)
-#define DxEPCTL_TxFNum(_x)                     ((_x) << 22)
-
-#define DxEPCTL_Stall                          (1 << 21)
-#define DxEPCTL_Snp                            (1 << 20)
-#define DxEPCTL_EPType_MASK                    (0x3 << 18)
-#define DxEPCTL_EPType_SHIFT                   (18)
-#define DxEPCTL_EPType_Control                 (0x0 << 18)
-#define DxEPCTL_EPType_Iso                     (0x1 << 18)
-#define DxEPCTL_EPType_Bulk                    (0x2 << 18)
-#define DxEPCTL_EPType_Intterupt               (0x3 << 18)
-
-#define DxEPCTL_NAKsts                         (1 << 17)
-#define DxEPCTL_DPID                           (1 << 16)
-#define DxEPCTL_EOFrNum                        (1 << 16)
-#define DxEPCTL_USBActEp                       (1 << 15)
-#define DxEPCTL_NextEp_MASK                    (0xf << 11)
-#define DxEPCTL_NextEp_SHIFT                   (11)
-#define DxEPCTL_NextEp_LIMIT                   (0xf)
-#define DxEPCTL_NextEp(_x)                     ((_x) << 11)
-
-#define DxEPCTL_MPS_MASK                       (0x7ff << 0)
-#define DxEPCTL_MPS_SHIFT                      (0)
-#define DxEPCTL_MPS_LIMIT                      (0x7ff)
-#define DxEPCTL_MPS(_x)                        ((_x) << 0)
-
-#define DIEPINT(_a)                    HSOTG_REG(0x908 + ((_a) * 0x20))
-#define DOEPINT(_a)                    HSOTG_REG(0xB08 + ((_a) * 0x20))
-
-#define DxEPINT_INEPNakEff                     (1 << 6)
-#define DxEPINT_Back2BackSetup                 (1 << 6)
-#define DxEPINT_INTknEPMis                     (1 << 5)
-#define DxEPINT_INTknTXFEmp                    (1 << 4)
-#define DxEPINT_OUTTknEPdis                    (1 << 4)
-#define DxEPINT_Timeout                        (1 << 3)
-#define DxEPINT_Setup                          (1 << 3)
-#define DxEPINT_AHBErr                         (1 << 2)
-#define DxEPINT_EPDisbld                       (1 << 1)
-#define DxEPINT_XferCompl                      (1 << 0)
-
-#define DIEPTSIZ0                              HSOTG_REG(0x910)
-
-#define DIEPTSIZ0_PktCnt_MASK                  (0x3 << 19)
-#define DIEPTSIZ0_PktCnt_SHIFT                 (19)
-#define DIEPTSIZ0_PktCnt_LIMIT                 (0x3)
-#define DIEPTSIZ0_PktCnt(_x)                   ((_x) << 19)
-
-#define DIEPTSIZ0_XferSize_MASK                (0x7f << 0)
-#define DIEPTSIZ0_XferSize_SHIFT               (0)
-#define DIEPTSIZ0_XferSize_LIMIT               (0x7f)
-#define DIEPTSIZ0_XferSize(_x)                 ((_x) << 0)
-
-#define DOEPTSIZ0                              HSOTG_REG(0xB10)
-#define DOEPTSIZ0_SUPCnt_MASK                  (0x3 << 29)
-#define DOEPTSIZ0_SUPCnt_SHIFT                 (29)
-#define DOEPTSIZ0_SUPCnt_LIMIT                 (0x3)
-#define DOEPTSIZ0_SUPCnt(_x)                   ((_x) << 29)
-
-#define DOEPTSIZ0_PktCnt                       (1 << 19)
-#define DOEPTSIZ0_XferSize_MASK                (0x7f << 0)
-#define DOEPTSIZ0_XferSize_SHIFT               (0)
-
-#define DIEPTSIZ(_a)                   HSOTG_REG(0x910 + ((_a) * 0x20))
-#define DOEPTSIZ(_a)                   HSOTG_REG(0xB10 + ((_a) * 0x20))
-
-#define DxEPTSIZ_MC_MASK                       (0x3 << 29)
-#define DxEPTSIZ_MC_SHIFT                      (29)
-#define DxEPTSIZ_MC_LIMIT                      (0x3)
-#define DxEPTSIZ_MC(_x)                        ((_x) << 29)
-
-#define DxEPTSIZ_PktCnt_MASK                   (0x3ff << 19)
-#define DxEPTSIZ_PktCnt_SHIFT                  (19)
-#define DxEPTSIZ_PktCnt_GET(_v)                (((_v) >> 19) & 0x3ff)
-#define DxEPTSIZ_PktCnt_LIMIT                  (0x3ff)
-#define DxEPTSIZ_PktCnt(_x)                    ((_x) << 19)
-
-#define DxEPTSIZ_XferSize_MASK                 (0x7ffff << 0)
-#define DxEPTSIZ_XferSize_SHIFT                (0)
-#define DxEPTSIZ_XferSize_GET(_v)              (((_v) >> 0) & 0x7ffff)
-#define DxEPTSIZ_XferSize_LIMIT                (0x7ffff)
-#define DxEPTSIZ_XferSize(_x)                  ((_x) << 0)
-
-#define DIEPDMA(_a)                    HSOTG_REG(0x914 + ((_a) * 0x20))
-#define DOEPDMA(_a)                    HSOTG_REG(0xB14 + ((_a) * 0x20))
-#define DTXFSTS(_a)                    HSOTG_REG(0x918 + ((_a) * 0x20))
-
-#define EPFIFO(_a)                     HSOTG_REG(0x1000 + ((_a) * 0x1000))
-
-#endif /* __REGS_USB_HSOTG_H */
index 7ae0c4d..cc305c7 100644 (file)
 
 #ifdef CONFIG_PM
 
-static int ehci_hub_control(
-       struct usb_hcd  *hcd,
-       u16             typeReq,
-       u16             wValue,
-       u16             wIndex,
-       char            *buf,
-       u16             wLength
-);
-
 static int persist_enabled_on_companion(struct usb_device *udev, void *unused)
 {
        return !udev->maxchild && udev->persist_enabled &&
@@ -865,7 +856,7 @@ cleanup:
 #endif /* CONFIG_USB_HCD_TEST_MODE */
 /*-------------------------------------------------------------------------*/
 
-static int ehci_hub_control (
+int ehci_hub_control(
        struct usb_hcd  *hcd,
        u16             typeReq,
        u16             wValue,
@@ -1285,6 +1276,7 @@ error_exit:
        spin_unlock_irqrestore (&ehci->lock, flags);
        return retval;
 }
+EXPORT_SYMBOL_GPL(ehci_hub_control);
 
 static void ehci_relinquish_port(struct usb_hcd *hcd, int portnum)
 {
index 7ef00ec..572634c 100644 (file)
@@ -51,10 +51,6 @@ struct tegra_ehci_soc_config {
        bool has_hostpc;
 };
 
-static int (*orig_hub_control)(struct usb_hcd *hcd,
-                               u16 typeReq, u16 wValue, u16 wIndex,
-                               char *buf, u16 wLength);
-
 struct tegra_ehci_hcd {
        struct tegra_usb_phy *phy;
        struct clk *clk;
@@ -236,7 +232,7 @@ static int tegra_ehci_hub_control(
        spin_unlock_irqrestore(&ehci->lock, flags);
 
        /* Handle the hub control events here */
-       return orig_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
+       return ehci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
 
 done:
        spin_unlock_irqrestore(&ehci->lock, flags);
@@ -554,8 +550,6 @@ static int __init ehci_tegra_init(void)
         * too easy.
         */
 
-       orig_hub_control = tegra_ehci_hc_driver.hub_control;
-
        tegra_ehci_hc_driver.map_urb_for_dma = tegra_ehci_map_urb_for_dma;
        tegra_ehci_hc_driver.unmap_urb_for_dma = tegra_ehci_unmap_urb_for_dma;
        tegra_ehci_hc_driver.hub_control = tegra_ehci_hub_control;
index 9dfc6c1..eee228a 100644 (file)
@@ -872,4 +872,7 @@ extern int  ehci_suspend(struct usb_hcd *hcd, bool do_wakeup);
 extern int     ehci_resume(struct usb_hcd *hcd, bool hibernated);
 #endif /* CONFIG_PM */
 
+extern int     ehci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
+                                u16 wIndex, char *buf, u16 wLength);
+
 #endif /* __LINUX_EHCI_HCD_H */
index 091ae49..e49eb4f 100644 (file)
@@ -46,9 +46,6 @@ static const char hcd_name[] = "ohci-atmel";
 
 static struct hc_driver __read_mostly ohci_at91_hc_driver;
 static int clocked;
-static int (*orig_ohci_hub_control)(struct usb_hcd  *hcd, u16 typeReq,
-                       u16 wValue, u16 wIndex, char *buf, u16 wLength);
-static int (*orig_ohci_hub_status_data)(struct usb_hcd *hcd, char *buf);
 
 extern int usb_disabled(void);
 
@@ -262,7 +259,7 @@ static int ohci_at91_usb_get_power(struct at91_usbh_data *pdata, int port)
 static int ohci_at91_hub_status_data(struct usb_hcd *hcd, char *buf)
 {
        struct at91_usbh_data *pdata = hcd->self.controller->platform_data;
-       int length = orig_ohci_hub_status_data(hcd, buf);
+       int length = ohci_hub_status_data(hcd, buf);
        int port;
 
        at91_for_each_port(port) {
@@ -340,8 +337,7 @@ static int ohci_at91_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
                break;
        }
 
-       ret = orig_ohci_hub_control(hcd, typeReq, wValue, wIndex + 1,
-                               buf, wLength);
+       ret = ohci_hub_control(hcd, typeReq, wValue, wIndex + 1, buf, wLength);
        if (ret)
                goto out;
 
@@ -690,9 +686,6 @@ static int __init ohci_at91_init(void)
         * too easy.
         */
 
-       orig_ohci_hub_control = ohci_at91_hc_driver.hub_control;
-       orig_ohci_hub_status_data = ohci_at91_hc_driver.hub_status_data;
-
        ohci_at91_hc_driver.hub_status_data     = ohci_at91_hub_status_data;
        ohci_at91_hc_driver.hub_control         = ohci_at91_hub_control;
 
index 68588d8..9cf80cb 100644 (file)
@@ -190,17 +190,13 @@ static int exynos_ohci_suspend(struct device *dev)
 {
        struct usb_hcd *hcd = dev_get_drvdata(dev);
        struct exynos_ohci_hcd *exynos_ohci = to_exynos_ohci(hcd);
-       struct ohci_hcd *ohci = hcd_to_ohci(hcd);
        struct platform_device *pdev = to_platform_device(dev);
        bool do_wakeup = device_may_wakeup(dev);
-       unsigned long flags;
        int rc = ohci_suspend(hcd, do_wakeup);
 
        if (rc)
                return rc;
 
-       spin_lock_irqsave(&ohci->lock, flags);
-
        if (exynos_ohci->otg)
                exynos_ohci->otg->set_host(exynos_ohci->otg, &hcd->self);
 
@@ -208,8 +204,6 @@ static int exynos_ohci_suspend(struct device *dev)
 
        clk_disable_unprepare(exynos_ohci->clk);
 
-       spin_unlock_irqrestore(&ohci->lock, flags);
-
        return 0;
 }
 
index cd871b8..b4940de 100644 (file)
@@ -456,8 +456,7 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
 
 /* build "status change" packet (one or two bytes) from HC registers */
 
-static int
-ohci_hub_status_data (struct usb_hcd *hcd, char *buf)
+int ohci_hub_status_data(struct usb_hcd *hcd, char *buf)
 {
        struct ohci_hcd *ohci = hcd_to_ohci (hcd);
        int             i, changed = 0, length = 1;
@@ -522,6 +521,7 @@ done:
 
        return changed ? length : 0;
 }
+EXPORT_SYMBOL_GPL(ohci_hub_status_data);
 
 /*-------------------------------------------------------------------------*/
 
@@ -664,7 +664,7 @@ static inline int root_port_reset (struct ohci_hcd *ohci, unsigned port)
        return 0;
 }
 
-static int ohci_hub_control (
+int ohci_hub_control(
        struct usb_hcd  *hcd,
        u16             typeReq,
        u16             wValue,
@@ -790,4 +790,4 @@ error:
        }
        return retval;
 }
-
+EXPORT_SYMBOL_GPL(ohci_hub_control);
index d21d5fe..e68f3d0 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/platform_data/usb-ohci-pxa27x.h>
 #include <linux/platform_data/usb-pxa3xx-ulpi.h>
 #include <linux/platform_device.h>
+#include <linux/regulator/consumer.h>
 #include <linux/signal.h>
 #include <linux/usb.h>
 #include <linux/usb/hcd.h>
@@ -120,6 +121,8 @@ static struct hc_driver __read_mostly ohci_pxa27x_hc_driver;
 struct pxa27x_ohci {
        struct clk      *clk;
        void __iomem    *mmio_base;
+       struct regulator *vbus[3];
+       bool            vbus_enabled[3];
 };
 
 #define to_pxa27x_ohci(hcd)    (struct pxa27x_ohci *)(hcd_to_ohci(hcd)->priv)
@@ -166,6 +169,52 @@ static int pxa27x_ohci_select_pmm(struct pxa27x_ohci *pxa_ohci, int mode)
        return 0;
 }
 
+static int pxa27x_ohci_set_vbus_power(struct pxa27x_ohci *pxa_ohci,
+                                     unsigned int port, bool enable)
+{
+       struct regulator *vbus = pxa_ohci->vbus[port];
+       int ret = 0;
+
+       if (IS_ERR_OR_NULL(vbus))
+               return 0;
+
+       if (enable && !pxa_ohci->vbus_enabled[port])
+               ret = regulator_enable(vbus);
+       else if (!enable && pxa_ohci->vbus_enabled[port])
+               ret = regulator_disable(vbus);
+
+       if (ret < 0)
+               return ret;
+
+       pxa_ohci->vbus_enabled[port] = enable;
+
+       return 0;
+}
+
+static int pxa27x_ohci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
+                                  u16 wIndex, char *buf, u16 wLength)
+{
+       struct pxa27x_ohci *pxa_ohci = to_pxa27x_ohci(hcd);
+       int ret;
+
+       switch (typeReq) {
+       case SetPortFeature:
+       case ClearPortFeature:
+               if (!wIndex || wIndex > 3)
+                       return -EPIPE;
+
+               if (wValue != USB_PORT_FEAT_POWER)
+                       break;
+
+               ret = pxa27x_ohci_set_vbus_power(pxa_ohci, wIndex - 1,
+                                                typeReq == SetPortFeature);
+               if (ret)
+                       return ret;
+               break;
+       }
+
+       return ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
+}
 /*-------------------------------------------------------------------------*/
 
 static inline void pxa27x_setup_hc(struct pxa27x_ohci *pxa_ohci,
@@ -372,6 +421,7 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device
        struct ohci_hcd *ohci;
        struct resource *r;
        struct clk *usb_clk;
+       unsigned int i;
 
        retval = ohci_pxa_of_init(pdev);
        if (retval)
@@ -417,6 +467,16 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device
        pxa_ohci->clk = usb_clk;
        pxa_ohci->mmio_base = (void __iomem *)hcd->regs;
 
+       for (i = 0; i < 3; ++i) {
+               char name[6];
+
+               if (!(inf->flags & (ENABLE_PORT1 << i)))
+                       continue;
+
+               sprintf(name, "vbus%u", i + 1);
+               pxa_ohci->vbus[i] = devm_regulator_get(&pdev->dev, name);
+       }
+
        retval = pxa27x_start_hc(pxa_ohci, &pdev->dev);
        if (retval < 0) {
                pr_debug("pxa27x_start_hc failed");
@@ -462,9 +522,14 @@ int usb_hcd_pxa27x_probe (const struct hc_driver *driver, struct platform_device
 void usb_hcd_pxa27x_remove (struct usb_hcd *hcd, struct platform_device *pdev)
 {
        struct pxa27x_ohci *pxa_ohci = to_pxa27x_ohci(hcd);
+       unsigned int i;
 
        usb_remove_hcd(hcd);
        pxa27x_stop_hc(pxa_ohci, &pdev->dev);
+
+       for (i = 0; i < 3; ++i)
+               pxa27x_ohci_set_vbus_power(pxa_ohci, i, false);
+
        usb_put_hcd(hcd);
 }
 
@@ -563,7 +628,10 @@ static int __init ohci_pxa27x_init(void)
                return -ENODEV;
 
        pr_info("%s: " DRIVER_DESC "\n", hcd_name);
+
        ohci_init_driver(&ohci_pxa27x_hc_driver, &pxa27x_overrides);
+       ohci_pxa27x_hc_driver.hub_control = pxa27x_ohci_hub_control;
+
        return platform_driver_register(&ohci_hcd_pxa27x_driver);
 }
 module_init(ohci_pxa27x_init);
index ff7c8f1..3d753a9 100644 (file)
@@ -45,10 +45,6 @@ static struct clk *usb_clk;
 
 /* forward definitions */
 
-static int (*orig_ohci_hub_control)(struct usb_hcd  *hcd, u16 typeReq,
-                       u16 wValue, u16 wIndex, char *buf, u16 wLength);
-static int (*orig_ohci_hub_status_data)(struct usb_hcd *hcd, char *buf);
-
 static void s3c2410_hcd_oc(struct s3c2410_hcd_info *info, int port_oc);
 
 /* conversion functions */
@@ -110,7 +106,7 @@ ohci_s3c2410_hub_status_data(struct usb_hcd *hcd, char *buf)
        int orig;
        int portno;
 
-       orig = orig_ohci_hub_status_data(hcd, buf);
+       orig = ohci_hub_status_data(hcd, buf);
 
        if (info == NULL)
                return orig;
@@ -181,7 +177,7 @@ static int ohci_s3c2410_hub_control(
         * process the request straight away and exit */
 
        if (info == NULL) {
-               ret = orig_ohci_hub_control(hcd, typeReq, wValue,
+               ret = ohci_hub_control(hcd, typeReq, wValue,
                                       wIndex, buf, wLength);
                goto out;
        }
@@ -231,7 +227,7 @@ static int ohci_s3c2410_hub_control(
                break;
        }
 
-       ret = orig_ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
+       ret = ohci_hub_control(hcd, typeReq, wValue, wIndex, buf, wLength);
        if (ret)
                goto out;
 
@@ -489,9 +485,6 @@ static int __init ohci_s3c2410_init(void)
         * override these functions by making it too easy.
         */
 
-       orig_ohci_hub_control = ohci_s3c2410_hc_driver.hub_control;
-       orig_ohci_hub_status_data = ohci_s3c2410_hc_driver.hub_status_data;
-
        ohci_s3c2410_hc_driver.hub_status_data  = ohci_s3c2410_hub_status_data;
        ohci_s3c2410_hc_driver.hub_control      = ohci_s3c2410_hub_control;
 
index 4550ce0..05e02a7 100644 (file)
@@ -729,3 +729,6 @@ extern int  ohci_setup(struct usb_hcd *hcd);
 extern int     ohci_suspend(struct usb_hcd *hcd, bool do_wakeup);
 extern int     ohci_resume(struct usb_hcd *hcd, bool hibernated);
 #endif
+extern int     ohci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
+                                u16 wIndex, char *buf, u16 wLength);
+extern int     ohci_hub_status_data(struct usb_hcd *hcd, char *buf);
index a4a3c7c..8ab1f8f 100644 (file)
@@ -1,40 +1,43 @@
 /*
-* USB FTDI client driver for Elan Digital Systems's Uxxx adapters
-*
-* Copyright(C) 2006 Elan Digital Systems Limited
-* http://www.elandigitalsystems.com
-*
-* Author and Maintainer - Tony Olech - Elan Digital Systems
-* tony.olech@elandigitalsystems.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 driver was written by Tony Olech(tony.olech@elandigitalsystems.com)
-* based on various USB client drivers in the 2.6.15 linux kernel
-* with constant reference to the 3rd Edition of Linux Device Drivers
-* published by O'Reilly
-*
-* The U132 adapter is a USB to CardBus adapter specifically designed
-* for PC cards that contain an OHCI host controller. Typical PC cards
-* are the Orange Mobile 3G Option GlobeTrotter Fusion card.
-*
-* The U132 adapter will *NOT *work with PC cards that do not contain
-* an OHCI controller. A simple way to test whether a PC card has an
-* OHCI controller as an interface is to insert the PC card directly
-* into a laptop(or desktop) with a CardBus slot and if "lspci" shows
-* a new USB controller and "lsusb -v" shows a new OHCI Host Controller
-* then there is a good chance that the U132 adapter will support the
-* PC card.(you also need the specific client driver for the PC card)
-*
-* Please inform the Author and Maintainer about any PC cards that
-* contain OHCI Host Controller and work when directly connected to
-* an embedded CardBus slot but do not work when they are connected
-* via an ELAN U132 adapter.
-*
-*/
+ * USB FTDI client driver for Elan Digital Systems's Uxxx adapters
+ *
+ * Copyright(C) 2006 Elan Digital Systems Limited
+ * http://www.elandigitalsystems.com
+ *
+ * Author and Maintainer - Tony Olech - Elan Digital Systems
+ * tony.olech@elandigitalsystems.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 driver was written by Tony Olech(tony.olech@elandigitalsystems.com)
+ * based on various USB client drivers in the 2.6.15 linux kernel
+ * with constant reference to the 3rd Edition of Linux Device Drivers
+ * published by O'Reilly
+ *
+ * The U132 adapter is a USB to CardBus adapter specifically designed
+ * for PC cards that contain an OHCI host controller. Typical PC cards
+ * are the Orange Mobile 3G Option GlobeTrotter Fusion card.
+ *
+ * The U132 adapter will *NOT *work with PC cards that do not contain
+ * an OHCI controller. A simple way to test whether a PC card has an
+ * OHCI controller as an interface is to insert the PC card directly
+ * into a laptop(or desktop) with a CardBus slot and if "lspci" shows
+ * a new USB controller and "lsusb -v" shows a new OHCI Host Controller
+ * then there is a good chance that the U132 adapter will support the
+ * PC card.(you also need the specific client driver for the PC card)
+ *
+ * Please inform the Author and Maintainer about any PC cards that
+ * contain OHCI Host Controller and work when directly connected to
+ * an embedded CardBus slot but do not work when they are connected
+ * via an ELAN U132 adapter.
+ *
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/init.h>
@@ -55,31 +58,31 @@ MODULE_LICENSE("GPL");
 #define INT_MODULE_PARM(n, v) static int n = v;module_param(n, int, 0444)
 static bool distrust_firmware = 1;
 module_param(distrust_firmware, bool, 0);
-MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren"
-        "t setup");
+MODULE_PARM_DESC(distrust_firmware,
+                "true to distrust firmware power/overcurrent setup");
 extern struct platform_driver u132_platform_driver;
 static struct workqueue_struct *status_queue;
 static struct workqueue_struct *command_queue;
 static struct workqueue_struct *respond_queue;
 /*
-* ftdi_module_lock exists to protect access to global variables
-*
-*/
+ * ftdi_module_lock exists to protect access to global variables
+ *
+ */
 static struct mutex ftdi_module_lock;
 static int ftdi_instances = 0;
 static struct list_head ftdi_static_list;
 /*
-* end of the global variables protected by ftdi_module_lock
-*/
+ * end of the global variables protected by ftdi_module_lock
+ */
 #include "usb_u132.h"
 #include <asm/io.h>
 #include <linux/usb/hcd.h>
 
-       /* FIXME ohci.h is ONLY for internal use by the OHCI driver.
       * If you're going to try stuff like this, you need to split
       * out shareable stuff (register declarations?) into its own
       * file, maybe name <linux/usb/ohci.h>
       */
+/* FIXME ohci.h is ONLY for internal use by the OHCI driver.
+ * If you're going to try stuff like this, you need to split
+ * out shareable stuff (register declarations?) into its own
+ * file, maybe name <linux/usb/ohci.h>
+ */
 
 #include "../host/ohci.h"
 /* Define these values to match your devices*/
@@ -87,140 +90,140 @@ static struct list_head ftdi_static_list;
 #define USB_FTDI_ELAN_PRODUCT_ID 0xd6ea
 /* table of devices that work with this driver*/
 static const struct usb_device_id ftdi_elan_table[] = {
-        {USB_DEVICE(USB_FTDI_ELAN_VENDOR_ID, USB_FTDI_ELAN_PRODUCT_ID)},
-        { /* Terminating entry */ }
+       {USB_DEVICE(USB_FTDI_ELAN_VENDOR_ID, USB_FTDI_ELAN_PRODUCT_ID)},
+       { /* Terminating entry */ }
 };
 
 MODULE_DEVICE_TABLE(usb, ftdi_elan_table);
 /* only the jtag(firmware upgrade device) interface requires
-* a device file and corresponding minor number, but the
-* interface is created unconditionally - I suppose it could
-* be configured or not according to a module parameter.
-* But since we(now) require one interface per device,
-* and since it unlikely that a normal installation would
-* require more than a couple of elan-ftdi devices, 8 seems
-* like a reasonable limit to have here, and if someone
-* really requires more than 8 devices, then they can frig the
-* code and recompile
-*/
+ * a device file and corresponding minor number, but the
+ * interface is created unconditionally - I suppose it could
+ * be configured or not according to a module parameter.
+ * But since we(now) require one interface per device,
+ * and since it unlikely that a normal installation would
+ * require more than a couple of elan-ftdi devices, 8 seems
+ * like a reasonable limit to have here, and if someone
+ * really requires more than 8 devices, then they can frig the
+ * code and recompile
+ */
 #define USB_FTDI_ELAN_MINOR_BASE 192
 #define COMMAND_BITS 5
 #define COMMAND_SIZE (1<<COMMAND_BITS)
 #define COMMAND_MASK (COMMAND_SIZE-1)
 struct u132_command {
-        u8 header;
-        u16 length;
-        u8 address;
-        u8 width;
-        u32 value;
-        int follows;
-        void *buffer;
+       u8 header;
+       u16 length;
+       u8 address;
+       u8 width;
+       u32 value;
+       int follows;
+       void *buffer;
 };
 #define RESPOND_BITS 5
 #define RESPOND_SIZE (1<<RESPOND_BITS)
 #define RESPOND_MASK (RESPOND_SIZE-1)
 struct u132_respond {
-        u8 header;
-        u8 address;
-        u32 *value;
-        int *result;
-        struct completion wait_completion;
+       u8 header;
+       u8 address;
+       u32 *value;
+       int *result;
+       struct completion wait_completion;
 };
 struct u132_target {
-        void *endp;
-        struct urb *urb;
-        int toggle_bits;
-        int error_count;
-        int condition_code;
-        int repeat_number;
-        int halted;
-        int skipped;
-        int actual;
-        int non_null;
-        int active;
-        int abandoning;
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-                int toggle_bits, int error_count, int condition_code,
-                int repeat_number, int halted, int skipped, int actual,
-                int non_null);
+       void *endp;
+       struct urb *urb;
+       int toggle_bits;
+       int error_count;
+       int condition_code;
+       int repeat_number;
+       int halted;
+       int skipped;
+       int actual;
+       int non_null;
+       int active;
+       int abandoning;
+       void (*callback)(void *endp, struct urb *urb, u8 *buf, int len,
+                        int toggle_bits, int error_count, int condition_code,
+                        int repeat_number, int halted, int skipped, int actual,
+                        int non_null);
 };
 /* Structure to hold all of our device specific stuff*/
 struct usb_ftdi {
-        struct list_head ftdi_list;
-        struct mutex u132_lock;
-        int command_next;
-        int command_head;
-        struct u132_command command[COMMAND_SIZE];
-        int respond_next;
-        int respond_head;
-        struct u132_respond respond[RESPOND_SIZE];
-        struct u132_target target[4];
-        char device_name[16];
-        unsigned synchronized:1;
-        unsigned enumerated:1;
-        unsigned registered:1;
-        unsigned initialized:1;
-        unsigned card_ejected:1;
-        int function;
-        int sequence_num;
-        int disconnected;
-        int gone_away;
-        int stuck_status;
-        int status_queue_delay;
-        struct semaphore sw_lock;
-        struct usb_device *udev;
-        struct usb_interface *interface;
-        struct usb_class_driver *class;
-        struct delayed_work status_work;
-        struct delayed_work command_work;
-        struct delayed_work respond_work;
-        struct u132_platform_data platform_data;
-        struct resource resources[0];
-        struct platform_device platform_dev;
-        unsigned char *bulk_in_buffer;
-        size_t bulk_in_size;
-        size_t bulk_in_last;
-        size_t bulk_in_left;
-        __u8 bulk_in_endpointAddr;
-        __u8 bulk_out_endpointAddr;
-        struct kref kref;
-        u32 controlreg;
-        u8 response[4 + 1024];
-        int expected;
-        int received;
-        int ed_found;
+       struct list_head ftdi_list;
+       struct mutex u132_lock;
+       int command_next;
+       int command_head;
+       struct u132_command command[COMMAND_SIZE];
+       int respond_next;
+       int respond_head;
+       struct u132_respond respond[RESPOND_SIZE];
+       struct u132_target target[4];
+       char device_name[16];
+       unsigned synchronized:1;
+       unsigned enumerated:1;
+       unsigned registered:1;
+       unsigned initialized:1;
+       unsigned card_ejected:1;
+       int function;
+       int sequence_num;
+       int disconnected;
+       int gone_away;
+       int stuck_status;
+       int status_queue_delay;
+       struct semaphore sw_lock;
+       struct usb_device *udev;
+       struct usb_interface *interface;
+       struct usb_class_driver *class;
+       struct delayed_work status_work;
+       struct delayed_work command_work;
+       struct delayed_work respond_work;
+       struct u132_platform_data platform_data;
+       struct resource resources[0];
+       struct platform_device platform_dev;
+       unsigned char *bulk_in_buffer;
+       size_t bulk_in_size;
+       size_t bulk_in_last;
+       size_t bulk_in_left;
+       __u8 bulk_in_endpointAddr;
+       __u8 bulk_out_endpointAddr;
+       struct kref kref;
+       u32 controlreg;
+       u8 response[4 + 1024];
+       int expected;
+       int received;
+       int ed_found;
 };
 #define kref_to_usb_ftdi(d) container_of(d, struct usb_ftdi, kref)
 #define platform_device_to_usb_ftdi(d) container_of(d, struct usb_ftdi, \
-        platform_dev)
+                                                   platform_dev)
 static struct usb_driver ftdi_elan_driver;
 static void ftdi_elan_delete(struct kref *kref)
 {
-        struct usb_ftdi *ftdi = kref_to_usb_ftdi(kref);
-        dev_warn(&ftdi->udev->dev, "FREEING ftdi=%p\n", ftdi);
-        usb_put_dev(ftdi->udev);
-        ftdi->disconnected += 1;
-        mutex_lock(&ftdi_module_lock);
-        list_del_init(&ftdi->ftdi_list);
-        ftdi_instances -= 1;
-        mutex_unlock(&ftdi_module_lock);
-        kfree(ftdi->bulk_in_buffer);
-        ftdi->bulk_in_buffer = NULL;
+       struct usb_ftdi *ftdi = kref_to_usb_ftdi(kref);
+       dev_warn(&ftdi->udev->dev, "FREEING ftdi=%p\n", ftdi);
+       usb_put_dev(ftdi->udev);
+       ftdi->disconnected += 1;
+       mutex_lock(&ftdi_module_lock);
+       list_del_init(&ftdi->ftdi_list);
+       ftdi_instances -= 1;
+       mutex_unlock(&ftdi_module_lock);
+       kfree(ftdi->bulk_in_buffer);
+       ftdi->bulk_in_buffer = NULL;
 }
 
 static void ftdi_elan_put_kref(struct usb_ftdi *ftdi)
 {
-        kref_put(&ftdi->kref, ftdi_elan_delete);
+       kref_put(&ftdi->kref, ftdi_elan_delete);
 }
 
 static void ftdi_elan_get_kref(struct usb_ftdi *ftdi)
 {
-        kref_get(&ftdi->kref);
+       kref_get(&ftdi->kref);
 }
 
 static void ftdi_elan_init_kref(struct usb_ftdi *ftdi)
 {
-        kref_init(&ftdi->kref);
+       kref_init(&ftdi->kref);
 }
 
 static void ftdi_status_requeue_work(struct usb_ftdi *ftdi, unsigned int delta)
@@ -237,8 +240,8 @@ static void ftdi_status_queue_work(struct usb_ftdi *ftdi, unsigned int delta)
 
 static void ftdi_status_cancel_work(struct usb_ftdi *ftdi)
 {
-        if (cancel_delayed_work(&ftdi->status_work))
-                kref_put(&ftdi->kref, ftdi_elan_delete);
+       if (cancel_delayed_work(&ftdi->status_work))
+               kref_put(&ftdi->kref, ftdi_elan_delete);
 }
 
 static void ftdi_command_requeue_work(struct usb_ftdi *ftdi, unsigned int delta)
@@ -255,12 +258,12 @@ static void ftdi_command_queue_work(struct usb_ftdi *ftdi, unsigned int delta)
 
 static void ftdi_command_cancel_work(struct usb_ftdi *ftdi)
 {
-        if (cancel_delayed_work(&ftdi->command_work))
-                kref_put(&ftdi->kref, ftdi_elan_delete);
+       if (cancel_delayed_work(&ftdi->command_work))
+               kref_put(&ftdi->kref, ftdi_elan_delete);
 }
 
 static void ftdi_response_requeue_work(struct usb_ftdi *ftdi,
-        unsigned int delta)
+                                      unsigned int delta)
 {
        if (!queue_delayed_work(respond_queue, &ftdi->respond_work, delta))
                kref_put(&ftdi->kref, ftdi_elan_delete);
@@ -274,26 +277,26 @@ static void ftdi_respond_queue_work(struct usb_ftdi *ftdi, unsigned int delta)
 
 static void ftdi_response_cancel_work(struct usb_ftdi *ftdi)
 {
-        if (cancel_delayed_work(&ftdi->respond_work))
-                kref_put(&ftdi->kref, ftdi_elan_delete);
+       if (cancel_delayed_work(&ftdi->respond_work))
+               kref_put(&ftdi->kref, ftdi_elan_delete);
 }
 
 void ftdi_elan_gone_away(struct platform_device *pdev)
 {
-        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
-        ftdi->gone_away += 1;
-        ftdi_elan_put_kref(ftdi);
+       struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
+       ftdi->gone_away += 1;
+       ftdi_elan_put_kref(ftdi);
 }
 
 
 EXPORT_SYMBOL_GPL(ftdi_elan_gone_away);
 static void ftdi_release_platform_dev(struct device *dev)
 {
-        dev->parent = NULL;
+       dev->parent = NULL;
 }
 
 static void ftdi_elan_do_callback(struct usb_ftdi *ftdi,
-        struct u132_target *target, u8 *buffer, int length);
+                                 struct u132_target *target, u8 *buffer, int length);
 static void ftdi_elan_kick_command_queue(struct usb_ftdi *ftdi);
 static void ftdi_elan_kick_respond_queue(struct usb_ftdi *ftdi);
 static int ftdi_elan_setupOHCI(struct usb_ftdi *ftdi);
@@ -305,421 +308,416 @@ static int ftdi_elan_command_engine(struct usb_ftdi *ftdi);
 static int ftdi_elan_respond_engine(struct usb_ftdi *ftdi);
 static int ftdi_elan_hcd_init(struct usb_ftdi *ftdi)
 {
-        int result;
-        if (ftdi->platform_dev.dev.parent)
-                return -EBUSY;
-        ftdi_elan_get_kref(ftdi);
-        ftdi->platform_data.potpg = 100;
-        ftdi->platform_data.reset = NULL;
-        ftdi->platform_dev.id = ftdi->sequence_num;
-        ftdi->platform_dev.resource = ftdi->resources;
-        ftdi->platform_dev.num_resources = ARRAY_SIZE(ftdi->resources);
-        ftdi->platform_dev.dev.platform_data = &ftdi->platform_data;
-        ftdi->platform_dev.dev.parent = NULL;
-        ftdi->platform_dev.dev.release = ftdi_release_platform_dev;
-        ftdi->platform_dev.dev.dma_mask = NULL;
-        snprintf(ftdi->device_name, sizeof(ftdi->device_name), "u132_hcd");
-        ftdi->platform_dev.name = ftdi->device_name;
-        dev_info(&ftdi->udev->dev, "requesting module '%s'\n", "u132_hcd");
-        request_module("u132_hcd");
-        dev_info(&ftdi->udev->dev, "registering '%s'\n",
-                ftdi->platform_dev.name);
-        result = platform_device_register(&ftdi->platform_dev);
-        return result;
+       int result;
+       if (ftdi->platform_dev.dev.parent)
+               return -EBUSY;
+       ftdi_elan_get_kref(ftdi);
+       ftdi->platform_data.potpg = 100;
+       ftdi->platform_data.reset = NULL;
+       ftdi->platform_dev.id = ftdi->sequence_num;
+       ftdi->platform_dev.resource = ftdi->resources;
+       ftdi->platform_dev.num_resources = ARRAY_SIZE(ftdi->resources);
+       ftdi->platform_dev.dev.platform_data = &ftdi->platform_data;
+       ftdi->platform_dev.dev.parent = NULL;
+       ftdi->platform_dev.dev.release = ftdi_release_platform_dev;
+       ftdi->platform_dev.dev.dma_mask = NULL;
+       snprintf(ftdi->device_name, sizeof(ftdi->device_name), "u132_hcd");
+       ftdi->platform_dev.name = ftdi->device_name;
+       dev_info(&ftdi->udev->dev, "requesting module '%s'\n", "u132_hcd");
+       request_module("u132_hcd");
+       dev_info(&ftdi->udev->dev, "registering '%s'\n",
+                ftdi->platform_dev.name);
+       result = platform_device_register(&ftdi->platform_dev);
+       return result;
 }
 
 static void ftdi_elan_abandon_completions(struct usb_ftdi *ftdi)
 {
-        mutex_lock(&ftdi->u132_lock);
-        while (ftdi->respond_next > ftdi->respond_head) {
-                struct u132_respond *respond = &ftdi->respond[RESPOND_MASK &
-                        ftdi->respond_head++];
-                *respond->result = -ESHUTDOWN;
-                *respond->value = 0;
-                complete(&respond->wait_completion);
-        } mutex_unlock(&ftdi->u132_lock);
+       mutex_lock(&ftdi->u132_lock);
+       while (ftdi->respond_next > ftdi->respond_head) {
+               struct u132_respond *respond = &ftdi->respond[RESPOND_MASK &
+                                                             ftdi->respond_head++];
+               *respond->result = -ESHUTDOWN;
+               *respond->value = 0;
+               complete(&respond->wait_completion);
+       } mutex_unlock(&ftdi->u132_lock);
 }
 
 static void ftdi_elan_abandon_targets(struct usb_ftdi *ftdi)
 {
-        int ed_number = 4;
-        mutex_lock(&ftdi->u132_lock);
-        while (ed_number-- > 0) {
-                struct u132_target *target = &ftdi->target[ed_number];
-                if (target->active == 1) {
-                        target->condition_code = TD_DEVNOTRESP;
-                        mutex_unlock(&ftdi->u132_lock);
-                        ftdi_elan_do_callback(ftdi, target, NULL, 0);
-                        mutex_lock(&ftdi->u132_lock);
-                }
-        }
-        ftdi->received = 0;
-        ftdi->expected = 4;
-        ftdi->ed_found = 0;
-        mutex_unlock(&ftdi->u132_lock);
+       int ed_number = 4;
+       mutex_lock(&ftdi->u132_lock);
+       while (ed_number-- > 0) {
+               struct u132_target *target = &ftdi->target[ed_number];
+               if (target->active == 1) {
+                       target->condition_code = TD_DEVNOTRESP;
+                       mutex_unlock(&ftdi->u132_lock);
+                       ftdi_elan_do_callback(ftdi, target, NULL, 0);
+                       mutex_lock(&ftdi->u132_lock);
+               }
+       }
+       ftdi->received = 0;
+       ftdi->expected = 4;
+       ftdi->ed_found = 0;
+       mutex_unlock(&ftdi->u132_lock);
 }
 
 static void ftdi_elan_flush_targets(struct usb_ftdi *ftdi)
 {
-        int ed_number = 4;
-        mutex_lock(&ftdi->u132_lock);
-        while (ed_number-- > 0) {
-                struct u132_target *target = &ftdi->target[ed_number];
-                target->abandoning = 1;
-              wait_1:if (target->active == 1) {
-                        int command_size = ftdi->command_next -
-                                ftdi->command_head;
-                        if (command_size < COMMAND_SIZE) {
-                                struct u132_command *command = &ftdi->command[
-                                        COMMAND_MASK & ftdi->command_next];
-                                command->header = 0x80 | (ed_number << 5) | 0x4;
-                                command->length = 0x00;
-                                command->address = 0x00;
-                                command->width = 0x00;
-                                command->follows = 0;
-                                command->value = 0;
-                                command->buffer = &command->value;
-                                ftdi->command_next += 1;
-                                ftdi_elan_kick_command_queue(ftdi);
-                        } else {
-                                mutex_unlock(&ftdi->u132_lock);
-                                msleep(100);
-                                mutex_lock(&ftdi->u132_lock);
-                                goto wait_1;
-                        }
-                }
-              wait_2:if (target->active == 1) {
-                        int command_size = ftdi->command_next -
-                                ftdi->command_head;
-                        if (command_size < COMMAND_SIZE) {
-                                struct u132_command *command = &ftdi->command[
-                                        COMMAND_MASK & ftdi->command_next];
-                                command->header = 0x90 | (ed_number << 5);
-                                command->length = 0x00;
-                                command->address = 0x00;
-                                command->width = 0x00;
-                                command->follows = 0;
-                                command->value = 0;
-                                command->buffer = &command->value;
-                                ftdi->command_next += 1;
-                                ftdi_elan_kick_command_queue(ftdi);
-                        } else {
-                                mutex_unlock(&ftdi->u132_lock);
-                                msleep(100);
-                                mutex_lock(&ftdi->u132_lock);
-                                goto wait_2;
-                        }
-                }
-        }
-        ftdi->received = 0;
-        ftdi->expected = 4;
-        ftdi->ed_found = 0;
-        mutex_unlock(&ftdi->u132_lock);
+       int ed_number = 4;
+       mutex_lock(&ftdi->u132_lock);
+       while (ed_number-- > 0) {
+               struct u132_target *target = &ftdi->target[ed_number];
+               target->abandoning = 1;
+       wait_1:if (target->active == 1) {
+                       int command_size = ftdi->command_next -
+                               ftdi->command_head;
+                       if (command_size < COMMAND_SIZE) {
+                               struct u132_command *command = &ftdi->command[
+                                       COMMAND_MASK & ftdi->command_next];
+                               command->header = 0x80 | (ed_number << 5) | 0x4;
+                               command->length = 0x00;
+                               command->address = 0x00;
+                               command->width = 0x00;
+                               command->follows = 0;
+                               command->value = 0;
+                               command->buffer = &command->value;
+                               ftdi->command_next += 1;
+                               ftdi_elan_kick_command_queue(ftdi);
+                       } else {
+                               mutex_unlock(&ftdi->u132_lock);
+                               msleep(100);
+                               mutex_lock(&ftdi->u132_lock);
+                               goto wait_1;
+                       }
+               }
+       wait_2:if (target->active == 1) {
+                       int command_size = ftdi->command_next -
+                               ftdi->command_head;
+                       if (command_size < COMMAND_SIZE) {
+                               struct u132_command *command = &ftdi->command[
+                                       COMMAND_MASK & ftdi->command_next];
+                               command->header = 0x90 | (ed_number << 5);
+                               command->length = 0x00;
+                               command->address = 0x00;
+                               command->width = 0x00;
+                               command->follows = 0;
+                               command->value = 0;
+                               command->buffer = &command->value;
+                               ftdi->command_next += 1;
+                               ftdi_elan_kick_command_queue(ftdi);
+                       } else {
+                               mutex_unlock(&ftdi->u132_lock);
+                               msleep(100);
+                               mutex_lock(&ftdi->u132_lock);
+                               goto wait_2;
+                       }
+               }
+       }
+       ftdi->received = 0;
+       ftdi->expected = 4;
+       ftdi->ed_found = 0;
+       mutex_unlock(&ftdi->u132_lock);
 }
 
 static void ftdi_elan_cancel_targets(struct usb_ftdi *ftdi)
 {
-        int ed_number = 4;
-        mutex_lock(&ftdi->u132_lock);
-        while (ed_number-- > 0) {
-                struct u132_target *target = &ftdi->target[ed_number];
-                target->abandoning = 1;
-              wait:if (target->active == 1) {
-                        int command_size = ftdi->command_next -
-                                ftdi->command_head;
-                        if (command_size < COMMAND_SIZE) {
-                                struct u132_command *command = &ftdi->command[
-                                        COMMAND_MASK & ftdi->command_next];
-                                command->header = 0x80 | (ed_number << 5) | 0x4;
-                                command->length = 0x00;
-                                command->address = 0x00;
-                                command->width = 0x00;
-                                command->follows = 0;
-                                command->value = 0;
-                                command->buffer = &command->value;
-                                ftdi->command_next += 1;
-                                ftdi_elan_kick_command_queue(ftdi);
-                        } else {
-                                mutex_unlock(&ftdi->u132_lock);
-                                msleep(100);
-                                mutex_lock(&ftdi->u132_lock);
-                                goto wait;
-                        }
-                }
-        }
-        ftdi->received = 0;
-        ftdi->expected = 4;
-        ftdi->ed_found = 0;
-        mutex_unlock(&ftdi->u132_lock);
+       int ed_number = 4;
+       mutex_lock(&ftdi->u132_lock);
+       while (ed_number-- > 0) {
+               struct u132_target *target = &ftdi->target[ed_number];
+               target->abandoning = 1;
+       wait:if (target->active == 1) {
+                       int command_size = ftdi->command_next -
+                               ftdi->command_head;
+                       if (command_size < COMMAND_SIZE) {
+                               struct u132_command *command = &ftdi->command[
+                                       COMMAND_MASK & ftdi->command_next];
+                               command->header = 0x80 | (ed_number << 5) | 0x4;
+                               command->length = 0x00;
+                               command->address = 0x00;
+                               command->width = 0x00;
+                               command->follows = 0;
+                               command->value = 0;
+                               command->buffer = &command->value;
+                               ftdi->command_next += 1;
+                               ftdi_elan_kick_command_queue(ftdi);
+                       } else {
+                               mutex_unlock(&ftdi->u132_lock);
+                               msleep(100);
+                               mutex_lock(&ftdi->u132_lock);
+                               goto wait;
+                       }
+               }
+       }
+       ftdi->received = 0;
+       ftdi->expected = 4;
+       ftdi->ed_found = 0;
+       mutex_unlock(&ftdi->u132_lock);
 }
 
 static void ftdi_elan_kick_command_queue(struct usb_ftdi *ftdi)
 {
-        ftdi_command_queue_work(ftdi, 0);
+       ftdi_command_queue_work(ftdi, 0);
 }
 
 static void ftdi_elan_command_work(struct work_struct *work)
 {
-        struct usb_ftdi *ftdi =
+       struct usb_ftdi *ftdi =
                container_of(work, struct usb_ftdi, command_work.work);
 
-        if (ftdi->disconnected > 0) {
-                ftdi_elan_put_kref(ftdi);
-                return;
-        } else {
-                int retval = ftdi_elan_command_engine(ftdi);
-                if (retval == -ESHUTDOWN) {
-                        ftdi->disconnected += 1;
-                } else if (retval == -ENODEV) {
-                        ftdi->disconnected += 1;
-                } else if (retval)
-                        dev_err(&ftdi->udev->dev, "command error %d\n", retval);
-                ftdi_command_requeue_work(ftdi, msecs_to_jiffies(10));
-                return;
-        }
+       if (ftdi->disconnected > 0) {
+               ftdi_elan_put_kref(ftdi);
+               return;
+       } else {
+               int retval = ftdi_elan_command_engine(ftdi);
+               if (retval == -ESHUTDOWN) {
+                       ftdi->disconnected += 1;
+               } else if (retval == -ENODEV) {
+                       ftdi->disconnected += 1;
+               } else if (retval)
+                       dev_err(&ftdi->udev->dev, "command error %d\n", retval);
+               ftdi_command_requeue_work(ftdi, msecs_to_jiffies(10));
+               return;
+       }
 }
 
 static void ftdi_elan_kick_respond_queue(struct usb_ftdi *ftdi)
 {
-        ftdi_respond_queue_work(ftdi, 0);
+       ftdi_respond_queue_work(ftdi, 0);
 }
 
 static void ftdi_elan_respond_work(struct work_struct *work)
 {
-        struct usb_ftdi *ftdi =
+       struct usb_ftdi *ftdi =
                container_of(work, struct usb_ftdi, respond_work.work);
-        if (ftdi->disconnected > 0) {
-                ftdi_elan_put_kref(ftdi);
-                return;
-        } else {
-                int retval = ftdi_elan_respond_engine(ftdi);
-                if (retval == 0) {
-                } else if (retval == -ESHUTDOWN) {
-                        ftdi->disconnected += 1;
-                } else if (retval == -ENODEV) {
-                        ftdi->disconnected += 1;
-                } else if (retval == -EILSEQ) {
-                        ftdi->disconnected += 1;
-                } else {
-                        ftdi->disconnected += 1;
-                        dev_err(&ftdi->udev->dev, "respond error %d\n", retval);
-                }
-                if (ftdi->disconnected > 0) {
-                        ftdi_elan_abandon_completions(ftdi);
-                        ftdi_elan_abandon_targets(ftdi);
-                }
-                ftdi_response_requeue_work(ftdi, msecs_to_jiffies(10));
-                return;
-        }
+       if (ftdi->disconnected > 0) {
+               ftdi_elan_put_kref(ftdi);
+               return;
+       } else {
+               int retval = ftdi_elan_respond_engine(ftdi);
+               if (retval == 0) {
+               } else if (retval == -ESHUTDOWN) {
+                       ftdi->disconnected += 1;
+               } else if (retval == -ENODEV) {
+                       ftdi->disconnected += 1;
+               } else if (retval == -EILSEQ) {
+                       ftdi->disconnected += 1;
+               } else {
+                       ftdi->disconnected += 1;
+                       dev_err(&ftdi->udev->dev, "respond error %d\n", retval);
+               }
+               if (ftdi->disconnected > 0) {
+                       ftdi_elan_abandon_completions(ftdi);
+                       ftdi_elan_abandon_targets(ftdi);
+               }
+               ftdi_response_requeue_work(ftdi, msecs_to_jiffies(10));
+               return;
+       }
 }
 
 
 /*
-* the sw_lock is initially held and will be freed
-* after the FTDI has been synchronized
-*
-*/
+ * the sw_lock is initially held and will be freed
+ * after the FTDI has been synchronized
+ *
+ */
 static void ftdi_elan_status_work(struct work_struct *work)
 {
-        struct usb_ftdi *ftdi =
+       struct usb_ftdi *ftdi =
                container_of(work, struct usb_ftdi, status_work.work);
-        int work_delay_in_msec = 0;
-        if (ftdi->disconnected > 0) {
-                ftdi_elan_put_kref(ftdi);
-                return;
-        } else if (ftdi->synchronized == 0) {
-                down(&ftdi->sw_lock);
-                if (ftdi_elan_synchronize(ftdi) == 0) {
-                        ftdi->synchronized = 1;
-                        ftdi_command_queue_work(ftdi, 1);
-                        ftdi_respond_queue_work(ftdi, 1);
-                        up(&ftdi->sw_lock);
-                        work_delay_in_msec = 100;
-                } else {
-                        dev_err(&ftdi->udev->dev, "synchronize failed\n");
-                        up(&ftdi->sw_lock);
-                        work_delay_in_msec = 10 *1000;
-                }
-        } else if (ftdi->stuck_status > 0) {
-                if (ftdi_elan_stuck_waiting(ftdi) == 0) {
-                        ftdi->stuck_status = 0;
-                        ftdi->synchronized = 0;
-                } else if ((ftdi->stuck_status++ % 60) == 1) {
-                        dev_err(&ftdi->udev->dev, "WRONG type of card inserted "
-                                "- please remove\n");
-                } else
-                        dev_err(&ftdi->udev->dev, "WRONG type of card inserted "
-                                "- checked %d times\n", ftdi->stuck_status);
-                work_delay_in_msec = 100;
-        } else if (ftdi->enumerated == 0) {
-                if (ftdi_elan_enumeratePCI(ftdi) == 0) {
-                        ftdi->enumerated = 1;
-                        work_delay_in_msec = 250;
-                } else
-                        work_delay_in_msec = 1000;
-        } else if (ftdi->initialized == 0) {
-                if (ftdi_elan_setupOHCI(ftdi) == 0) {
-                        ftdi->initialized = 1;
-                        work_delay_in_msec = 500;
-                } else {
-                        dev_err(&ftdi->udev->dev, "initialized failed - trying "
-                                "again in 10 seconds\n");
-                        work_delay_in_msec = 1 *1000;
-                }
-        } else if (ftdi->registered == 0) {
-                work_delay_in_msec = 10;
-                if (ftdi_elan_hcd_init(ftdi) == 0) {
-                        ftdi->registered = 1;
-                } else
-                        dev_err(&ftdi->udev->dev, "register failed\n");
-                work_delay_in_msec = 250;
-        } else {
-                if (ftdi_elan_checkingPCI(ftdi) == 0) {
-                        work_delay_in_msec = 250;
-                } else if (ftdi->controlreg & 0x00400000) {
-                        if (ftdi->gone_away > 0) {
-                                dev_err(&ftdi->udev->dev, "PCI device eject con"
-                                        "firmed platform_dev.dev.parent=%p plat"
-                                        "form_dev.dev=%p\n",
-                                        ftdi->platform_dev.dev.parent,
-                                        &ftdi->platform_dev.dev);
-                                platform_device_unregister(&ftdi->platform_dev);
-                                ftdi->platform_dev.dev.parent = NULL;
-                                ftdi->registered = 0;
-                                ftdi->enumerated = 0;
-                                ftdi->card_ejected = 0;
-                                ftdi->initialized = 0;
-                                ftdi->gone_away = 0;
-                        } else
-                                ftdi_elan_flush_targets(ftdi);
-                        work_delay_in_msec = 250;
-                } else {
-                        dev_err(&ftdi->udev->dev, "PCI device has disappeared\n"
-                                );
-                        ftdi_elan_cancel_targets(ftdi);
-                        work_delay_in_msec = 500;
-                        ftdi->enumerated = 0;
-                        ftdi->initialized = 0;
-                }
-        }
-        if (ftdi->disconnected > 0) {
-                ftdi_elan_put_kref(ftdi);
-                return;
-        } else {
-                ftdi_status_requeue_work(ftdi,
-                        msecs_to_jiffies(work_delay_in_msec));
-                return;
-        }
+       int work_delay_in_msec = 0;
+       if (ftdi->disconnected > 0) {
+               ftdi_elan_put_kref(ftdi);
+               return;
+       } else if (ftdi->synchronized == 0) {
+               down(&ftdi->sw_lock);
+               if (ftdi_elan_synchronize(ftdi) == 0) {
+                       ftdi->synchronized = 1;
+                       ftdi_command_queue_work(ftdi, 1);
+                       ftdi_respond_queue_work(ftdi, 1);
+                       up(&ftdi->sw_lock);
+                       work_delay_in_msec = 100;
+               } else {
+                       dev_err(&ftdi->udev->dev, "synchronize failed\n");
+                       up(&ftdi->sw_lock);
+                       work_delay_in_msec = 10 *1000;
+               }
+       } else if (ftdi->stuck_status > 0) {
+               if (ftdi_elan_stuck_waiting(ftdi) == 0) {
+                       ftdi->stuck_status = 0;
+                       ftdi->synchronized = 0;
+               } else if ((ftdi->stuck_status++ % 60) == 1) {
+                       dev_err(&ftdi->udev->dev, "WRONG type of card inserted - please remove\n");
+               } else
+                       dev_err(&ftdi->udev->dev, "WRONG type of card inserted - checked %d times\n",
+                               ftdi->stuck_status);
+               work_delay_in_msec = 100;
+       } else if (ftdi->enumerated == 0) {
+               if (ftdi_elan_enumeratePCI(ftdi) == 0) {
+                       ftdi->enumerated = 1;
+                       work_delay_in_msec = 250;
+               } else
+                       work_delay_in_msec = 1000;
+       } else if (ftdi->initialized == 0) {
+               if (ftdi_elan_setupOHCI(ftdi) == 0) {
+                       ftdi->initialized = 1;
+                       work_delay_in_msec = 500;
+               } else {
+                       dev_err(&ftdi->udev->dev, "initialized failed - trying again in 10 seconds\n");
+                       work_delay_in_msec = 1 *1000;
+               }
+       } else if (ftdi->registered == 0) {
+               work_delay_in_msec = 10;
+               if (ftdi_elan_hcd_init(ftdi) == 0) {
+                       ftdi->registered = 1;
+               } else
+                       dev_err(&ftdi->udev->dev, "register failed\n");
+               work_delay_in_msec = 250;
+       } else {
+               if (ftdi_elan_checkingPCI(ftdi) == 0) {
+                       work_delay_in_msec = 250;
+               } else if (ftdi->controlreg & 0x00400000) {
+                       if (ftdi->gone_away > 0) {
+                               dev_err(&ftdi->udev->dev, "PCI device eject confirmed platform_dev.dev.parent=%p platform_dev.dev=%p\n",
+                                       ftdi->platform_dev.dev.parent,
+                                       &ftdi->platform_dev.dev);
+                               platform_device_unregister(&ftdi->platform_dev);
+                               ftdi->platform_dev.dev.parent = NULL;
+                               ftdi->registered = 0;
+                               ftdi->enumerated = 0;
+                               ftdi->card_ejected = 0;
+                               ftdi->initialized = 0;
+                               ftdi->gone_away = 0;
+                       } else
+                               ftdi_elan_flush_targets(ftdi);
+                       work_delay_in_msec = 250;
+               } else {
+                       dev_err(&ftdi->udev->dev, "PCI device has disappeared\n");
+                       ftdi_elan_cancel_targets(ftdi);
+                       work_delay_in_msec = 500;
+                       ftdi->enumerated = 0;
+                       ftdi->initialized = 0;
+               }
+       }
+       if (ftdi->disconnected > 0) {
+               ftdi_elan_put_kref(ftdi);
+               return;
+       } else {
+               ftdi_status_requeue_work(ftdi,
+                                        msecs_to_jiffies(work_delay_in_msec));
+               return;
+       }
 }
 
 
 /*
-* file_operations for the jtag interface
-*
-* the usage count for the device is incremented on open()
-* and decremented on release()
-*/
+ * file_operations for the jtag interface
+ *
+ * the usage count for the device is incremented on open()
+ * and decremented on release()
+ */
 static int ftdi_elan_open(struct inode *inode, struct file *file)
 {
        int subminor;
        struct usb_interface *interface;
 
-        subminor = iminor(inode);
-        interface = usb_find_interface(&ftdi_elan_driver, subminor);
-
-        if (!interface) {
-                printk(KERN_ERR "can't find device for minor %d\n", subminor);
-                return -ENODEV;
-        } else {
-                struct usb_ftdi *ftdi = usb_get_intfdata(interface);
-                if (!ftdi) {
-                        return -ENODEV;
-                } else {
-                        if (down_interruptible(&ftdi->sw_lock)) {
-                                return -EINTR;
-                        } else {
-                                ftdi_elan_get_kref(ftdi);
-                                file->private_data = ftdi;
-                                return 0;
-                        }
-                }
-        }
+       subminor = iminor(inode);
+       interface = usb_find_interface(&ftdi_elan_driver, subminor);
+
+       if (!interface) {
+               pr_err("can't find device for minor %d\n", subminor);
+               return -ENODEV;
+       } else {
+               struct usb_ftdi *ftdi = usb_get_intfdata(interface);
+               if (!ftdi) {
+                       return -ENODEV;
+               } else {
+                       if (down_interruptible(&ftdi->sw_lock)) {
+                               return -EINTR;
+                       } else {
+                               ftdi_elan_get_kref(ftdi);
+                               file->private_data = ftdi;
+                               return 0;
+                       }
+               }
+       }
 }
 
 static int ftdi_elan_release(struct inode *inode, struct file *file)
 {
-        struct usb_ftdi *ftdi = file->private_data;
-        if (ftdi == NULL)
-                return -ENODEV;
-        up(&ftdi->sw_lock);        /* decrement the count on our device */
-        ftdi_elan_put_kref(ftdi);
-        return 0;
+       struct usb_ftdi *ftdi = file->private_data;
+       if (ftdi == NULL)
+               return -ENODEV;
+       up(&ftdi->sw_lock);        /* decrement the count on our device */
+       ftdi_elan_put_kref(ftdi);
+       return 0;
 }
 
 
 /*
-*
-* blocking bulk reads are used to get data from the device
-*
-*/
+ *
+ * blocking bulk reads are used to get data from the device
+ *
+ */
 static ssize_t ftdi_elan_read(struct file *file, char __user *buffer,
                              size_t count, loff_t *ppos)
 {
-        char data[30 *3 + 4];
-        char *d = data;
-        int m = (sizeof(data) - 1) / 3;
-        int bytes_read = 0;
-        int retry_on_empty = 10;
-        int retry_on_timeout = 5;
-        struct usb_ftdi *ftdi = file->private_data;
-        if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        }
-        data[0] = 0;
-      have:if (ftdi->bulk_in_left > 0) {
-                if (count-- > 0) {
-                        char *p = ++ftdi->bulk_in_last + ftdi->bulk_in_buffer;
-                        ftdi->bulk_in_left -= 1;
-                        if (bytes_read < m) {
-                                d += sprintf(d, " %02X", 0x000000FF & *p);
-                        } else if (bytes_read > m) {
-                        } else
-                                d += sprintf(d, " ..");
-                        if (copy_to_user(buffer++, p, 1)) {
-                                return -EFAULT;
-                        } else {
-                                bytes_read += 1;
-                                goto have;
-                        }
-                } else
-                        return bytes_read;
-        }
-      more:if (count > 0) {
-                int packet_bytes = 0;
-                int retval = usb_bulk_msg(ftdi->udev,
-                        usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
-                         ftdi->bulk_in_buffer, ftdi->bulk_in_size,
-                        &packet_bytes, 50);
-                if (packet_bytes > 2) {
-                        ftdi->bulk_in_left = packet_bytes - 2;
-                        ftdi->bulk_in_last = 1;
-                        goto have;
-                } else if (retval == -ETIMEDOUT) {
-                        if (retry_on_timeout-- > 0) {
-                                goto more;
-                        } else if (bytes_read > 0) {
-                                return bytes_read;
-                        } else
-                                return retval;
-                } else if (retval == 0) {
-                        if (retry_on_empty-- > 0) {
-                                goto more;
-                        } else
-                                return bytes_read;
-                } else
-                        return retval;
-        } else
-                return bytes_read;
+       char data[30 *3 + 4];
+       char *d = data;
+       int m = (sizeof(data) - 1) / 3;
+       int bytes_read = 0;
+       int retry_on_empty = 10;
+       int retry_on_timeout = 5;
+       struct usb_ftdi *ftdi = file->private_data;
+       if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       }
+       data[0] = 0;
+have:if (ftdi->bulk_in_left > 0) {
+               if (count-- > 0) {
+                       char *p = ++ftdi->bulk_in_last + ftdi->bulk_in_buffer;
+                       ftdi->bulk_in_left -= 1;
+                       if (bytes_read < m) {
+                               d += sprintf(d, " %02X", 0x000000FF & *p);
+                       } else if (bytes_read > m) {
+                       } else
+                               d += sprintf(d, " ..");
+                       if (copy_to_user(buffer++, p, 1)) {
+                               return -EFAULT;
+                       } else {
+                               bytes_read += 1;
+                               goto have;
+                       }
+               } else
+                       return bytes_read;
+       }
+more:if (count > 0) {
+               int packet_bytes = 0;
+               int retval = usb_bulk_msg(ftdi->udev,
+                                         usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
+                                         ftdi->bulk_in_buffer, ftdi->bulk_in_size,
+                                         &packet_bytes, 50);
+               if (packet_bytes > 2) {
+                       ftdi->bulk_in_left = packet_bytes - 2;
+                       ftdi->bulk_in_last = 1;
+                       goto have;
+               } else if (retval == -ETIMEDOUT) {
+                       if (retry_on_timeout-- > 0) {
+                               goto more;
+                       } else if (bytes_read > 0) {
+                               return bytes_read;
+                       } else
+                               return retval;
+               } else if (retval == 0) {
+                       if (retry_on_empty-- > 0) {
+                               goto more;
+                       } else
+                               return bytes_read;
+               } else
+                       return retval;
+       } else
+               return bytes_read;
 }
 
 static void ftdi_elan_write_bulk_callback(struct urb *urb)
@@ -728,467 +726,460 @@ static void ftdi_elan_write_bulk_callback(struct urb *urb)
        int status = urb->status;
 
        if (status && !(status == -ENOENT || status == -ECONNRESET ||
-           status == -ESHUTDOWN)) {
-                dev_err(&ftdi->udev->dev, "urb=%p write bulk status received: %"
-                        "d\n", urb, status);
-        }
-        usb_free_coherent(urb->dev, urb->transfer_buffer_length,
-                urb->transfer_buffer, urb->transfer_dma);
+                       status == -ESHUTDOWN)) {
+               dev_err(&ftdi->udev->dev,
+                       "urb=%p write bulk status received: %d\n", urb, status);
+       }
+       usb_free_coherent(urb->dev, urb->transfer_buffer_length,
+                         urb->transfer_buffer, urb->transfer_dma);
 }
 
 static int fill_buffer_with_all_queued_commands(struct usb_ftdi *ftdi,
-        char *buf, int command_size, int total_size)
-{
-        int ed_commands = 0;
-        int b = 0;
-        int I = command_size;
-        int i = ftdi->command_head;
-        while (I-- > 0) {
-                struct u132_command *command = &ftdi->command[COMMAND_MASK &
-                        i++];
-                int F = command->follows;
-                u8 *f = command->buffer;
-                if (command->header & 0x80) {
-                        ed_commands |= 1 << (0x3 & (command->header >> 5));
-                }
-                buf[b++] = command->header;
-                buf[b++] = (command->length >> 0) & 0x00FF;
-                buf[b++] = (command->length >> 8) & 0x00FF;
-                buf[b++] = command->address;
-                buf[b++] = command->width;
-                while (F-- > 0) {
-                        buf[b++] = *f++;
-                }
-        }
-        return ed_commands;
+                                               char *buf, int command_size, int total_size)
+{
+       int ed_commands = 0;
+       int b = 0;
+       int I = command_size;
+       int i = ftdi->command_head;
+       while (I-- > 0) {
+               struct u132_command *command = &ftdi->command[COMMAND_MASK &
+                                                             i++];
+               int F = command->follows;
+               u8 *f = command->buffer;
+               if (command->header & 0x80) {
+                       ed_commands |= 1 << (0x3 & (command->header >> 5));
+               }
+               buf[b++] = command->header;
+               buf[b++] = (command->length >> 0) & 0x00FF;
+               buf[b++] = (command->length >> 8) & 0x00FF;
+               buf[b++] = command->address;
+               buf[b++] = command->width;
+               while (F-- > 0) {
+                       buf[b++] = *f++;
+               }
+       }
+       return ed_commands;
 }
 
 static int ftdi_elan_total_command_size(struct usb_ftdi *ftdi, int command_size)
 {
-        int total_size = 0;
-        int I = command_size;
-        int i = ftdi->command_head;
-        while (I-- > 0) {
-                struct u132_command *command = &ftdi->command[COMMAND_MASK &
-                        i++];
-                total_size += 5 + command->follows;
-        } return total_size;
+       int total_size = 0;
+       int I = command_size;
+       int i = ftdi->command_head;
+       while (I-- > 0) {
+               struct u132_command *command = &ftdi->command[COMMAND_MASK &
+                                                             i++];
+               total_size += 5 + command->follows;
+       } return total_size;
 }
 
 static int ftdi_elan_command_engine(struct usb_ftdi *ftdi)
 {
-        int retval;
-        char *buf;
-        int ed_commands;
-        int total_size;
-        struct urb *urb;
-        int command_size = ftdi->command_next - ftdi->command_head;
-        if (command_size == 0)
-                return 0;
-        total_size = ftdi_elan_total_command_size(ftdi, command_size);
-        urb = usb_alloc_urb(0, GFP_KERNEL);
-        if (!urb) {
-                dev_err(&ftdi->udev->dev, "could not get a urb to write %d comm"
-                        "ands totaling %d bytes to the Uxxx\n", command_size,
-                        total_size);
-                return -ENOMEM;
-        }
-        buf = usb_alloc_coherent(ftdi->udev, total_size, GFP_KERNEL,
-                &urb->transfer_dma);
-        if (!buf) {
-                dev_err(&ftdi->udev->dev, "could not get a buffer to write %d c"
-                        "ommands totaling %d bytes to the Uxxx\n", command_size,
-                         total_size);
-                usb_free_urb(urb);
-                return -ENOMEM;
-        }
-        ed_commands = fill_buffer_with_all_queued_commands(ftdi, buf,
-                command_size, total_size);
-        usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
-                ftdi->bulk_out_endpointAddr), buf, total_size,
-                ftdi_elan_write_bulk_callback, ftdi);
-        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-        if (ed_commands) {
-                char diag[40 *3 + 4];
-                char *d = diag;
-                int m = total_size;
-                u8 *c = buf;
-                int s = (sizeof(diag) - 1) / 3;
-                diag[0] = 0;
-                while (s-- > 0 && m-- > 0) {
-                        if (s > 0 || m == 0) {
-                                d += sprintf(d, " %02X", *c++);
-                        } else
-                                d += sprintf(d, " ..");
-                }
-        }
-        retval = usb_submit_urb(urb, GFP_KERNEL);
-        if (retval) {
-                dev_err(&ftdi->udev->dev, "failed %d to submit urb %p to write "
-                        "%d commands totaling %d bytes to the Uxxx\n", retval,
-                        urb, command_size, total_size);
-                usb_free_coherent(ftdi->udev, total_size, buf, urb->transfer_dma);
-                usb_free_urb(urb);
-                return retval;
-        }
-        usb_free_urb(urb);        /* release our reference to this urb,
-                the USB core will eventually free it entirely */
-        ftdi->command_head += command_size;
-        ftdi_elan_kick_respond_queue(ftdi);
-        return 0;
+       int retval;
+       char *buf;
+       int ed_commands;
+       int total_size;
+       struct urb *urb;
+       int command_size = ftdi->command_next - ftdi->command_head;
+       if (command_size == 0)
+               return 0;
+       total_size = ftdi_elan_total_command_size(ftdi, command_size);
+       urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!urb) {
+               dev_err(&ftdi->udev->dev, "could not get a urb to write %d commands totaling %d bytes to the Uxxx\n",
+                       command_size, total_size);
+               return -ENOMEM;
+       }
+       buf = usb_alloc_coherent(ftdi->udev, total_size, GFP_KERNEL,
+                                &urb->transfer_dma);
+       if (!buf) {
+               dev_err(&ftdi->udev->dev, "could not get a buffer to write %d commands totaling %d bytes to the Uxxx\n",
+                       command_size, total_size);
+               usb_free_urb(urb);
+               return -ENOMEM;
+       }
+       ed_commands = fill_buffer_with_all_queued_commands(ftdi, buf,
+                                                          command_size, total_size);
+       usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
+                                                          ftdi->bulk_out_endpointAddr), buf, total_size,
+                         ftdi_elan_write_bulk_callback, ftdi);
+       urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+       if (ed_commands) {
+               char diag[40 *3 + 4];
+               char *d = diag;
+               int m = total_size;
+               u8 *c = buf;
+               int s = (sizeof(diag) - 1) / 3;
+               diag[0] = 0;
+               while (s-- > 0 && m-- > 0) {
+                       if (s > 0 || m == 0) {
+                               d += sprintf(d, " %02X", *c++);
+                       } else
+                               d += sprintf(d, " ..");
+               }
+       }
+       retval = usb_submit_urb(urb, GFP_KERNEL);
+       if (retval) {
+               dev_err(&ftdi->udev->dev, "failed %d to submit urb %p to write %d commands totaling %d bytes to the Uxxx\n",
+                       retval, urb, command_size, total_size);
+               usb_free_coherent(ftdi->udev, total_size, buf, urb->transfer_dma);
+               usb_free_urb(urb);
+               return retval;
+       }
+       usb_free_urb(urb);        /* release our reference to this urb,
+                                    the USB core will eventually free it entirely */
+       ftdi->command_head += command_size;
+       ftdi_elan_kick_respond_queue(ftdi);
+       return 0;
 }
 
 static void ftdi_elan_do_callback(struct usb_ftdi *ftdi,
-        struct u132_target *target, u8 *buffer, int length)
-{
-        struct urb *urb = target->urb;
-        int halted = target->halted;
-        int skipped = target->skipped;
-        int actual = target->actual;
-        int non_null = target->non_null;
-        int toggle_bits = target->toggle_bits;
-        int error_count = target->error_count;
-        int condition_code = target->condition_code;
-        int repeat_number = target->repeat_number;
-        void (*callback) (void *, struct urb *, u8 *, int, int, int, int, int,
-                int, int, int, int) = target->callback;
-        target->active -= 1;
-        target->callback = NULL;
-        (*callback) (target->endp, urb, buffer, length, toggle_bits,
-                error_count, condition_code, repeat_number, halted, skipped,
-                actual, non_null);
+                                 struct u132_target *target, u8 *buffer, int length)
+{
+       struct urb *urb = target->urb;
+       int halted = target->halted;
+       int skipped = target->skipped;
+       int actual = target->actual;
+       int non_null = target->non_null;
+       int toggle_bits = target->toggle_bits;
+       int error_count = target->error_count;
+       int condition_code = target->condition_code;
+       int repeat_number = target->repeat_number;
+       void (*callback) (void *, struct urb *, u8 *, int, int, int, int, int,
+                         int, int, int, int) = target->callback;
+       target->active -= 1;
+       target->callback = NULL;
+       (*callback) (target->endp, urb, buffer, length, toggle_bits,
+                    error_count, condition_code, repeat_number, halted, skipped,
+                    actual, non_null);
 }
 
 static char *have_ed_set_response(struct usb_ftdi *ftdi,
-        struct u132_target *target, u16 ed_length, int ed_number, int ed_type,
-        char *b)
-{
-        int payload = (ed_length >> 0) & 0x07FF;
-        mutex_lock(&ftdi->u132_lock);
-        target->actual = 0;
-        target->non_null = (ed_length >> 15) & 0x0001;
-        target->repeat_number = (ed_length >> 11) & 0x000F;
-        if (ed_type == 0x02) {
-                if (payload == 0 || target->abandoning > 0) {
-                        target->abandoning = 0;
-                        mutex_unlock(&ftdi->u132_lock);
-                        ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
-                                payload);
-                        ftdi->received = 0;
-                        ftdi->expected = 4;
-                        ftdi->ed_found = 0;
-                        return ftdi->response;
-                } else {
-                        ftdi->expected = 4 + payload;
-                        ftdi->ed_found = 1;
-                        mutex_unlock(&ftdi->u132_lock);
-                        return b;
-                }
-        } else if (ed_type == 0x03) {
-                if (payload == 0 || target->abandoning > 0) {
-                        target->abandoning = 0;
-                        mutex_unlock(&ftdi->u132_lock);
-                        ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
-                                payload);
-                        ftdi->received = 0;
-                        ftdi->expected = 4;
-                        ftdi->ed_found = 0;
-                        return ftdi->response;
-                } else {
-                        ftdi->expected = 4 + payload;
-                        ftdi->ed_found = 1;
-                        mutex_unlock(&ftdi->u132_lock);
-                        return b;
-                }
-        } else if (ed_type == 0x01) {
-                target->abandoning = 0;
-                mutex_unlock(&ftdi->u132_lock);
-                ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
-                        payload);
-                ftdi->received = 0;
-                ftdi->expected = 4;
-                ftdi->ed_found = 0;
-                return ftdi->response;
-        } else {
-                target->abandoning = 0;
-                mutex_unlock(&ftdi->u132_lock);
-                ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
-                        payload);
-                ftdi->received = 0;
-                ftdi->expected = 4;
-                ftdi->ed_found = 0;
-                return ftdi->response;
-        }
+                                 struct u132_target *target, u16 ed_length, int ed_number, int ed_type,
+                                 char *b)
+{
+       int payload = (ed_length >> 0) & 0x07FF;
+       mutex_lock(&ftdi->u132_lock);
+       target->actual = 0;
+       target->non_null = (ed_length >> 15) & 0x0001;
+       target->repeat_number = (ed_length >> 11) & 0x000F;
+       if (ed_type == 0x02) {
+               if (payload == 0 || target->abandoning > 0) {
+                       target->abandoning = 0;
+                       mutex_unlock(&ftdi->u132_lock);
+                       ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
+                                             payload);
+                       ftdi->received = 0;
+                       ftdi->expected = 4;
+                       ftdi->ed_found = 0;
+                       return ftdi->response;
+               } else {
+                       ftdi->expected = 4 + payload;
+                       ftdi->ed_found = 1;
+                       mutex_unlock(&ftdi->u132_lock);
+                       return b;
+               }
+       } else if (ed_type == 0x03) {
+               if (payload == 0 || target->abandoning > 0) {
+                       target->abandoning = 0;
+                       mutex_unlock(&ftdi->u132_lock);
+                       ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
+                                             payload);
+                       ftdi->received = 0;
+                       ftdi->expected = 4;
+                       ftdi->ed_found = 0;
+                       return ftdi->response;
+               } else {
+                       ftdi->expected = 4 + payload;
+                       ftdi->ed_found = 1;
+                       mutex_unlock(&ftdi->u132_lock);
+                       return b;
+               }
+       } else if (ed_type == 0x01) {
+               target->abandoning = 0;
+               mutex_unlock(&ftdi->u132_lock);
+               ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
+                                     payload);
+               ftdi->received = 0;
+               ftdi->expected = 4;
+               ftdi->ed_found = 0;
+               return ftdi->response;
+       } else {
+               target->abandoning = 0;
+               mutex_unlock(&ftdi->u132_lock);
+               ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
+                                     payload);
+               ftdi->received = 0;
+               ftdi->expected = 4;
+               ftdi->ed_found = 0;
+               return ftdi->response;
+       }
 }
 
 static char *have_ed_get_response(struct usb_ftdi *ftdi,
-        struct u132_target *target, u16 ed_length, int ed_number, int ed_type,
-        char *b)
+                                 struct u132_target *target, u16 ed_length, int ed_number, int ed_type,
+                                 char *b)
 {
-        mutex_lock(&ftdi->u132_lock);
-        target->condition_code = TD_DEVNOTRESP;
-        target->actual = (ed_length >> 0) & 0x01FF;
-        target->non_null = (ed_length >> 15) & 0x0001;
-        target->repeat_number = (ed_length >> 11) & 0x000F;
-        mutex_unlock(&ftdi->u132_lock);
-        if (target->active)
-                ftdi_elan_do_callback(ftdi, target, NULL, 0);
-        target->abandoning = 0;
-        ftdi->received = 0;
-        ftdi->expected = 4;
-        ftdi->ed_found = 0;
-        return ftdi->response;
+       mutex_lock(&ftdi->u132_lock);
+       target->condition_code = TD_DEVNOTRESP;
+       target->actual = (ed_length >> 0) & 0x01FF;
+       target->non_null = (ed_length >> 15) & 0x0001;
+       target->repeat_number = (ed_length >> 11) & 0x000F;
+       mutex_unlock(&ftdi->u132_lock);
+       if (target->active)
+               ftdi_elan_do_callback(ftdi, target, NULL, 0);
+       target->abandoning = 0;
+       ftdi->received = 0;
+       ftdi->expected = 4;
+       ftdi->ed_found = 0;
+       return ftdi->response;
 }
 
 
 /*
-* The engine tries to empty the FTDI fifo
-*
-* all responses found in the fifo data are dispatched thus
-* the response buffer can only ever hold a maximum sized
-* response from the Uxxx.
-*
-*/
+ * The engine tries to empty the FTDI fifo
+ *
+ * all responses found in the fifo data are dispatched thus
+ * the response buffer can only ever hold a maximum sized
+ * response from the Uxxx.
+ *
+ */
 static int ftdi_elan_respond_engine(struct usb_ftdi *ftdi)
 {
-        u8 *b = ftdi->response + ftdi->received;
-        int bytes_read = 0;
-        int retry_on_empty = 1;
-        int retry_on_timeout = 3;
-        int empty_packets = 0;
-      read:{
-                int packet_bytes = 0;
-                int retval = usb_bulk_msg(ftdi->udev,
-                        usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
-                         ftdi->bulk_in_buffer, ftdi->bulk_in_size,
-                        &packet_bytes, 500);
-                char diag[30 *3 + 4];
-                char *d = diag;
-                int m = packet_bytes;
-                u8 *c = ftdi->bulk_in_buffer;
-                int s = (sizeof(diag) - 1) / 3;
-                diag[0] = 0;
-                while (s-- > 0 && m-- > 0) {
-                        if (s > 0 || m == 0) {
-                                d += sprintf(d, " %02X", *c++);
-                        } else
-                                d += sprintf(d, " ..");
-                }
-                if (packet_bytes > 2) {
-                        ftdi->bulk_in_left = packet_bytes - 2;
-                        ftdi->bulk_in_last = 1;
-                        goto have;
-                } else if (retval == -ETIMEDOUT) {
-                        if (retry_on_timeout-- > 0) {
-                                dev_err(&ftdi->udev->dev, "TIMED OUT with packe"
-                                        "t_bytes = %d with total %d bytes%s\n",
-                                        packet_bytes, bytes_read, diag);
-                                goto more;
-                        } else if (bytes_read > 0) {
-                                dev_err(&ftdi->udev->dev, "ONLY %d bytes%s\n",
-                                        bytes_read, diag);
-                                return -ENOMEM;
-                        } else {
-                                dev_err(&ftdi->udev->dev, "TIMED OUT with packe"
-                                        "t_bytes = %d with total %d bytes%s\n",
-                                        packet_bytes, bytes_read, diag);
-                                return -ENOMEM;
-                        }
-                } else if (retval == -EILSEQ) {
-                        dev_err(&ftdi->udev->dev, "error = %d with packet_bytes"
-                                " = %d with total %d bytes%s\n", retval,
-                                packet_bytes, bytes_read, diag);
-                        return retval;
-                } else if (retval) {
-                        dev_err(&ftdi->udev->dev, "error = %d with packet_bytes"
-                                " = %d with total %d bytes%s\n", retval,
-                                packet_bytes, bytes_read, diag);
-                        return retval;
-                } else if (packet_bytes == 2) {
-                        unsigned char s0 = ftdi->bulk_in_buffer[0];
-                        unsigned char s1 = ftdi->bulk_in_buffer[1];
-                        empty_packets += 1;
-                        if (s0 == 0x31 && s1 == 0x60) {
-                                if (retry_on_empty-- > 0) {
-                                        goto more;
-                                } else
-                                        return 0;
-                        } else if (s0 == 0x31 && s1 == 0x00) {
-                                if (retry_on_empty-- > 0) {
-                                        goto more;
-                                } else
-                                        return 0;
-                        } else {
-                                if (retry_on_empty-- > 0) {
-                                        goto more;
-                                } else
-                                        return 0;
-                        }
-                } else if (packet_bytes == 1) {
-                        if (retry_on_empty-- > 0) {
-                                goto more;
-                        } else
-                                return 0;
-                } else {
-                        if (retry_on_empty-- > 0) {
-                                goto more;
-                        } else
-                                return 0;
-                }
-        }
-      more:{
-                goto read;
-        }
-      have:if (ftdi->bulk_in_left > 0) {
-                u8 c = ftdi->bulk_in_buffer[++ftdi->bulk_in_last];
-                bytes_read += 1;
-                ftdi->bulk_in_left -= 1;
-                if (ftdi->received == 0 && c == 0xFF) {
-                        goto have;
-                } else
-                        *b++ = c;
-                if (++ftdi->received < ftdi->expected) {
-                        goto have;
-                } else if (ftdi->ed_found) {
-                        int ed_number = (ftdi->response[0] >> 5) & 0x03;
-                        u16 ed_length = (ftdi->response[2] << 8) |
-                                ftdi->response[1];
-                        struct u132_target *target = &ftdi->target[ed_number];
-                        int payload = (ed_length >> 0) & 0x07FF;
-                        char diag[30 *3 + 4];
-                        char *d = diag;
-                        int m = payload;
-                        u8 *c = 4 + ftdi->response;
-                        int s = (sizeof(diag) - 1) / 3;
-                        diag[0] = 0;
-                        while (s-- > 0 && m-- > 0) {
-                                if (s > 0 || m == 0) {
-                                        d += sprintf(d, " %02X", *c++);
-                                } else
-                                        d += sprintf(d, " ..");
-                        }
-                        ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
-                                payload);
-                        ftdi->received = 0;
-                        ftdi->expected = 4;
-                        ftdi->ed_found = 0;
-                        b = ftdi->response;
-                        goto have;
-                } else if (ftdi->expected == 8) {
-                        u8 buscmd;
-                        int respond_head = ftdi->respond_head++;
-                        struct u132_respond *respond = &ftdi->respond[
-                                RESPOND_MASK & respond_head];
-                        u32 data = ftdi->response[7];
-                        data <<= 8;
-                        data |= ftdi->response[6];
-                        data <<= 8;
-                        data |= ftdi->response[5];
-                        data <<= 8;
-                        data |= ftdi->response[4];
-                        *respond->value = data;
-                        *respond->result = 0;
-                        complete(&respond->wait_completion);
-                        ftdi->received = 0;
-                        ftdi->expected = 4;
-                        ftdi->ed_found = 0;
-                        b = ftdi->response;
-                        buscmd = (ftdi->response[0] >> 0) & 0x0F;
-                        if (buscmd == 0x00) {
-                        } else if (buscmd == 0x02) {
-                        } else if (buscmd == 0x06) {
-                        } else if (buscmd == 0x0A) {
-                        } else
-                                dev_err(&ftdi->udev->dev, "Uxxx unknown(%0X) va"
-                                        "lue = %08X\n", buscmd, data);
-                        goto have;
-                } else {
-                        if ((ftdi->response[0] & 0x80) == 0x00) {
-                                ftdi->expected = 8;
-                                goto have;
-                        } else {
-                                int ed_number = (ftdi->response[0] >> 5) & 0x03;
-                                int ed_type = (ftdi->response[0] >> 0) & 0x03;
-                                u16 ed_length = (ftdi->response[2] << 8) |
-                                        ftdi->response[1];
-                                struct u132_target *target = &ftdi->target[
-                                        ed_number];
-                                target->halted = (ftdi->response[0] >> 3) &
-                                        0x01;
-                                target->skipped = (ftdi->response[0] >> 2) &
-                                        0x01;
-                                target->toggle_bits = (ftdi->response[3] >> 6)
-                                        & 0x03;
-                                target->error_count = (ftdi->response[3] >> 4)
-                                        & 0x03;
-                                target->condition_code = (ftdi->response[
-                                        3] >> 0) & 0x0F;
-                                if ((ftdi->response[0] & 0x10) == 0x00) {
-                                        b = have_ed_set_response(ftdi, target,
-                                                ed_length, ed_number, ed_type,
-                                                b);
-                                        goto have;
-                                } else {
-                                        b = have_ed_get_response(ftdi, target,
-                                                ed_length, ed_number, ed_type,
-                                                b);
-                                        goto have;
-                                }
-                        }
-                }
-        } else
-                goto more;
+       u8 *b = ftdi->response + ftdi->received;
+       int bytes_read = 0;
+       int retry_on_empty = 1;
+       int retry_on_timeout = 3;
+       int empty_packets = 0;
+read:{
+               int packet_bytes = 0;
+               int retval = usb_bulk_msg(ftdi->udev,
+                                         usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
+                                         ftdi->bulk_in_buffer, ftdi->bulk_in_size,
+                                         &packet_bytes, 500);
+               char diag[30 *3 + 4];
+               char *d = diag;
+               int m = packet_bytes;
+               u8 *c = ftdi->bulk_in_buffer;
+               int s = (sizeof(diag) - 1) / 3;
+               diag[0] = 0;
+               while (s-- > 0 && m-- > 0) {
+                       if (s > 0 || m == 0) {
+                               d += sprintf(d, " %02X", *c++);
+                       } else
+                               d += sprintf(d, " ..");
+               }
+               if (packet_bytes > 2) {
+                       ftdi->bulk_in_left = packet_bytes - 2;
+                       ftdi->bulk_in_last = 1;
+                       goto have;
+               } else if (retval == -ETIMEDOUT) {
+                       if (retry_on_timeout-- > 0) {
+                               dev_err(&ftdi->udev->dev, "TIMED OUT with packet_bytes = %d with total %d bytes%s\n",
+                                       packet_bytes, bytes_read, diag);
+                               goto more;
+                       } else if (bytes_read > 0) {
+                               dev_err(&ftdi->udev->dev, "ONLY %d bytes%s\n",
+                                       bytes_read, diag);
+                               return -ENOMEM;
+                       } else {
+                               dev_err(&ftdi->udev->dev, "TIMED OUT with packet_bytes = %d with total %d bytes%s\n",
+                                       packet_bytes, bytes_read, diag);
+                               return -ENOMEM;
+                       }
+               } else if (retval == -EILSEQ) {
+                       dev_err(&ftdi->udev->dev, "error = %d with packet_bytes = %d with total %d bytes%s\n",
+                               retval, packet_bytes, bytes_read, diag);
+                       return retval;
+               } else if (retval) {
+                       dev_err(&ftdi->udev->dev, "error = %d with packet_bytes = %d with total %d bytes%s\n",
+                               retval, packet_bytes, bytes_read, diag);
+                       return retval;
+               } else if (packet_bytes == 2) {
+                       unsigned char s0 = ftdi->bulk_in_buffer[0];
+                       unsigned char s1 = ftdi->bulk_in_buffer[1];
+                       empty_packets += 1;
+                       if (s0 == 0x31 && s1 == 0x60) {
+                               if (retry_on_empty-- > 0) {
+                                       goto more;
+                               } else
+                                       return 0;
+                       } else if (s0 == 0x31 && s1 == 0x00) {
+                               if (retry_on_empty-- > 0) {
+                                       goto more;
+                               } else
+                                       return 0;
+                       } else {
+                               if (retry_on_empty-- > 0) {
+                                       goto more;
+                               } else
+                                       return 0;
+                       }
+               } else if (packet_bytes == 1) {
+                       if (retry_on_empty-- > 0) {
+                               goto more;
+                       } else
+                               return 0;
+               } else {
+                       if (retry_on_empty-- > 0) {
+                               goto more;
+                       } else
+                               return 0;
+               }
+       }
+more:{
+               goto read;
+       }
+have:if (ftdi->bulk_in_left > 0) {
+               u8 c = ftdi->bulk_in_buffer[++ftdi->bulk_in_last];
+               bytes_read += 1;
+               ftdi->bulk_in_left -= 1;
+               if (ftdi->received == 0 && c == 0xFF) {
+                       goto have;
+               } else
+                       *b++ = c;
+               if (++ftdi->received < ftdi->expected) {
+                       goto have;
+               } else if (ftdi->ed_found) {
+                       int ed_number = (ftdi->response[0] >> 5) & 0x03;
+                       u16 ed_length = (ftdi->response[2] << 8) |
+                               ftdi->response[1];
+                       struct u132_target *target = &ftdi->target[ed_number];
+                       int payload = (ed_length >> 0) & 0x07FF;
+                       char diag[30 *3 + 4];
+                       char *d = diag;
+                       int m = payload;
+                       u8 *c = 4 + ftdi->response;
+                       int s = (sizeof(diag) - 1) / 3;
+                       diag[0] = 0;
+                       while (s-- > 0 && m-- > 0) {
+                               if (s > 0 || m == 0) {
+                                       d += sprintf(d, " %02X", *c++);
+                               } else
+                                       d += sprintf(d, " ..");
+                       }
+                       ftdi_elan_do_callback(ftdi, target, 4 + ftdi->response,
+                                             payload);
+                       ftdi->received = 0;
+                       ftdi->expected = 4;
+                       ftdi->ed_found = 0;
+                       b = ftdi->response;
+                       goto have;
+               } else if (ftdi->expected == 8) {
+                       u8 buscmd;
+                       int respond_head = ftdi->respond_head++;
+                       struct u132_respond *respond = &ftdi->respond[
+                               RESPOND_MASK & respond_head];
+                       u32 data = ftdi->response[7];
+                       data <<= 8;
+                       data |= ftdi->response[6];
+                       data <<= 8;
+                       data |= ftdi->response[5];
+                       data <<= 8;
+                       data |= ftdi->response[4];
+                       *respond->value = data;
+                       *respond->result = 0;
+                       complete(&respond->wait_completion);
+                       ftdi->received = 0;
+                       ftdi->expected = 4;
+                       ftdi->ed_found = 0;
+                       b = ftdi->response;
+                       buscmd = (ftdi->response[0] >> 0) & 0x0F;
+                       if (buscmd == 0x00) {
+                       } else if (buscmd == 0x02) {
+                       } else if (buscmd == 0x06) {
+                       } else if (buscmd == 0x0A) {
+                       } else
+                               dev_err(&ftdi->udev->dev, "Uxxx unknown(%0X) value = %08X\n",
+                                       buscmd, data);
+                       goto have;
+               } else {
+                       if ((ftdi->response[0] & 0x80) == 0x00) {
+                               ftdi->expected = 8;
+                               goto have;
+                       } else {
+                               int ed_number = (ftdi->response[0] >> 5) & 0x03;
+                               int ed_type = (ftdi->response[0] >> 0) & 0x03;
+                               u16 ed_length = (ftdi->response[2] << 8) |
+                                       ftdi->response[1];
+                               struct u132_target *target = &ftdi->target[
+                                       ed_number];
+                               target->halted = (ftdi->response[0] >> 3) &
+                                       0x01;
+                               target->skipped = (ftdi->response[0] >> 2) &
+                                       0x01;
+                               target->toggle_bits = (ftdi->response[3] >> 6)
+                                       & 0x03;
+                               target->error_count = (ftdi->response[3] >> 4)
+                                       & 0x03;
+                               target->condition_code = (ftdi->response[
+                                                                 3] >> 0) & 0x0F;
+                               if ((ftdi->response[0] & 0x10) == 0x00) {
+                                       b = have_ed_set_response(ftdi, target,
+                                                                ed_length, ed_number, ed_type,
+                                                                b);
+                                       goto have;
+                               } else {
+                                       b = have_ed_get_response(ftdi, target,
+                                                                ed_length, ed_number, ed_type,
+                                                                b);
+                                       goto have;
+                               }
+                       }
+               }
+       } else
+               goto more;
 }
 
 
 /*
-* create a urb, and a buffer for it, and copy the data to the urb
-*
-*/
+ * create a urb, and a buffer for it, and copy the data to the urb
+ *
+ */
 static ssize_t ftdi_elan_write(struct file *file,
                               const char __user *user_buffer, size_t count,
                               loff_t *ppos)
 {
-        int retval = 0;
-        struct urb *urb;
-        char *buf;
-        struct usb_ftdi *ftdi = file->private_data;
-
-        if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        }
-        if (count == 0) {
-                goto exit;
-        }
-        urb = usb_alloc_urb(0, GFP_KERNEL);
-        if (!urb) {
-                retval = -ENOMEM;
-                goto error_1;
-        }
-        buf = usb_alloc_coherent(ftdi->udev, count, GFP_KERNEL,
-                &urb->transfer_dma);
-        if (!buf) {
-                retval = -ENOMEM;
-                goto error_2;
-        }
-        if (copy_from_user(buf, user_buffer, count)) {
-                retval = -EFAULT;
-                goto error_3;
-        }
-        usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
-                ftdi->bulk_out_endpointAddr), buf, count,
-                ftdi_elan_write_bulk_callback, ftdi);
-        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-        retval = usb_submit_urb(urb, GFP_KERNEL);
-        if (retval) {
-                dev_err(&ftdi->udev->dev, "failed submitting write urb, error %"
-                        "d\n", retval);
-                goto error_3;
-        }
-        usb_free_urb(urb);
+       int retval = 0;
+       struct urb *urb;
+       char *buf;
+       struct usb_ftdi *ftdi = file->private_data;
+
+       if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       }
+       if (count == 0) {
+               goto exit;
+       }
+       urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!urb) {
+               retval = -ENOMEM;
+               goto error_1;
+       }
+       buf = usb_alloc_coherent(ftdi->udev, count, GFP_KERNEL,
+                                &urb->transfer_dma);
+       if (!buf) {
+               retval = -ENOMEM;
+               goto error_2;
+       }
+       if (copy_from_user(buf, user_buffer, count)) {
+               retval = -EFAULT;
+               goto error_3;
+       }
+       usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
+                                                          ftdi->bulk_out_endpointAddr), buf, count,
+                         ftdi_elan_write_bulk_callback, ftdi);
+       urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+       retval = usb_submit_urb(urb, GFP_KERNEL);
+       if (retval) {
+               dev_err(&ftdi->udev->dev,
+                       "failed submitting write urb, error %d\n", retval);
+               goto error_3;
+       }
+       usb_free_urb(urb);
 
 exit:
-        return count;
+       return count;
 error_3:
        usb_free_coherent(ftdi->udev, count, buf, urb->transfer_dma);
 error_2:
@@ -1198,29 +1189,29 @@ error_1:
 }
 
 static const struct file_operations ftdi_elan_fops = {
-        .owner = THIS_MODULE,
-        .llseek = no_llseek,
-        .read = ftdi_elan_read,
-        .write = ftdi_elan_write,
-        .open = ftdi_elan_open,
-        .release = ftdi_elan_release,
+       .owner = THIS_MODULE,
+       .llseek = no_llseek,
+       .read = ftdi_elan_read,
+       .write = ftdi_elan_write,
+       .open = ftdi_elan_open,
+       .release = ftdi_elan_release,
 };
 
 /*
-* usb class driver info in order to get a minor number from the usb core,
-* and to have the device registered with the driver core
-*/
+ * usb class driver info in order to get a minor number from the usb core,
+ * and to have the device registered with the driver core
+ */
 static struct usb_class_driver ftdi_elan_jtag_class = {
-        .name = "ftdi-%d-jtag",
-        .fops = &ftdi_elan_fops,
-        .minor_base = USB_FTDI_ELAN_MINOR_BASE,
+       .name = "ftdi-%d-jtag",
+       .fops = &ftdi_elan_fops,
+       .minor_base = USB_FTDI_ELAN_MINOR_BASE,
 };
 
 /*
-* the following definitions are for the
-* ELAN FPGA state machgine processor that
-* lies on the other side of the FTDI chip
-*/
+ * the following definitions are for the
+ * ELAN FPGA state machgine processor that
+ * lies on the other side of the FTDI chip
+ */
 #define cPCIu132rd 0x0
 #define cPCIu132wr 0x1
 #define cPCIiord 0x2
@@ -1251,1694 +1242,1663 @@ static struct usb_class_driver ftdi_elan_jtag_class = {
 #define cCCnotaccessed 0xF
 static int ftdi_elan_write_reg(struct usb_ftdi *ftdi, u32 data)
 {
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                if (command_size < COMMAND_SIZE) {
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        command->header = 0x00 | cPCIu132wr;
-                        command->length = 0x04;
-                        command->address = 0x00;
-                        command->width = 0x00;
-                        command->follows = 4;
-                        command->value = data;
-                        command->buffer = &command->value;
-                        ftdi->command_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               if (command_size < COMMAND_SIZE) {
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       command->header = 0x00 | cPCIu132wr;
+                       command->length = 0x04;
+                       command->address = 0x00;
+                       command->width = 0x00;
+                       command->follows = 4;
+                       command->value = data;
+                       command->buffer = &command->value;
+                       ftdi->command_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 static int ftdi_elan_write_config(struct usb_ftdi *ftdi, int config_offset,
-        u8 width, u32 data)
-{
-        u8 addressofs = config_offset / 4;
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                if (command_size < COMMAND_SIZE) {
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        command->header = 0x00 | (cPCIcfgwr & 0x0F);
-                        command->length = 0x04;
-                        command->address = addressofs;
-                        command->width = 0x00 | (width & 0x0F);
-                        command->follows = 4;
-                        command->value = data;
-                        command->buffer = &command->value;
-                        ftdi->command_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+                                 u8 width, u32 data)
+{
+       u8 addressofs = config_offset / 4;
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               if (command_size < COMMAND_SIZE) {
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       command->header = 0x00 | (cPCIcfgwr & 0x0F);
+                       command->length = 0x04;
+                       command->address = addressofs;
+                       command->width = 0x00 | (width & 0x0F);
+                       command->follows = 4;
+                       command->value = data;
+                       command->buffer = &command->value;
+                       ftdi->command_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 static int ftdi_elan_write_pcimem(struct usb_ftdi *ftdi, int mem_offset,
-        u8 width, u32 data)
-{
-        u8 addressofs = mem_offset / 4;
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                if (command_size < COMMAND_SIZE) {
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        command->header = 0x00 | (cPCImemwr & 0x0F);
-                        command->length = 0x04;
-                        command->address = addressofs;
-                        command->width = 0x00 | (width & 0x0F);
-                        command->follows = 4;
-                        command->value = data;
-                        command->buffer = &command->value;
-                        ftdi->command_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+                                 u8 width, u32 data)
+{
+       u8 addressofs = mem_offset / 4;
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               if (command_size < COMMAND_SIZE) {
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       command->header = 0x00 | (cPCImemwr & 0x0F);
+                       command->length = 0x04;
+                       command->address = addressofs;
+                       command->width = 0x00 | (width & 0x0F);
+                       command->follows = 4;
+                       command->value = data;
+                       command->buffer = &command->value;
+                       ftdi->command_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 int usb_ftdi_elan_write_pcimem(struct platform_device *pdev, int mem_offset,
-        u8 width, u32 data)
+                              u8 width, u32 data)
 {
-        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
-        return ftdi_elan_write_pcimem(ftdi, mem_offset, width, data);
+       struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
+       return ftdi_elan_write_pcimem(ftdi, mem_offset, width, data);
 }
 
 
 EXPORT_SYMBOL_GPL(usb_ftdi_elan_write_pcimem);
 static int ftdi_elan_read_reg(struct usb_ftdi *ftdi, u32 *data)
 {
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                int respond_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                respond_size = ftdi->respond_next - ftdi->respond_head;
-                if (command_size < COMMAND_SIZE && respond_size < RESPOND_SIZE)
-                        {
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        struct u132_respond *respond = &ftdi->respond[
-                                RESPOND_MASK & ftdi->respond_next];
-                        int result = -ENODEV;
-                        respond->result = &result;
-                        respond->header = command->header = 0x00 | cPCIu132rd;
-                        command->length = 0x04;
-                        respond->address = command->address = cU132cmd_status;
-                        command->width = 0x00;
-                        command->follows = 0;
-                        command->value = 0;
-                        command->buffer = NULL;
-                        respond->value = data;
-                        init_completion(&respond->wait_completion);
-                        ftdi->command_next += 1;
-                        ftdi->respond_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        wait_for_completion(&respond->wait_completion);
-                        return result;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               int respond_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               respond_size = ftdi->respond_next - ftdi->respond_head;
+               if (command_size < COMMAND_SIZE && respond_size < RESPOND_SIZE)
+               {
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       struct u132_respond *respond = &ftdi->respond[
+                               RESPOND_MASK & ftdi->respond_next];
+                       int result = -ENODEV;
+                       respond->result = &result;
+                       respond->header = command->header = 0x00 | cPCIu132rd;
+                       command->length = 0x04;
+                       respond->address = command->address = cU132cmd_status;
+                       command->width = 0x00;
+                       command->follows = 0;
+                       command->value = 0;
+                       command->buffer = NULL;
+                       respond->value = data;
+                       init_completion(&respond->wait_completion);
+                       ftdi->command_next += 1;
+                       ftdi->respond_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       wait_for_completion(&respond->wait_completion);
+                       return result;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 static int ftdi_elan_read_config(struct usb_ftdi *ftdi, int config_offset,
-        u8 width, u32 *data)
-{
-        u8 addressofs = config_offset / 4;
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                int respond_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                respond_size = ftdi->respond_next - ftdi->respond_head;
-                if (command_size < COMMAND_SIZE && respond_size < RESPOND_SIZE)
-                        {
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        struct u132_respond *respond = &ftdi->respond[
-                                RESPOND_MASK & ftdi->respond_next];
-                        int result = -ENODEV;
-                        respond->result = &result;
-                        respond->header = command->header = 0x00 | (cPCIcfgrd &
-                                0x0F);
-                        command->length = 0x04;
-                        respond->address = command->address = addressofs;
-                        command->width = 0x00 | (width & 0x0F);
-                        command->follows = 0;
-                        command->value = 0;
-                        command->buffer = NULL;
-                        respond->value = data;
-                        init_completion(&respond->wait_completion);
-                        ftdi->command_next += 1;
-                        ftdi->respond_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        wait_for_completion(&respond->wait_completion);
-                        return result;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+                                u8 width, u32 *data)
+{
+       u8 addressofs = config_offset / 4;
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               int respond_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               respond_size = ftdi->respond_next - ftdi->respond_head;
+               if (command_size < COMMAND_SIZE && respond_size < RESPOND_SIZE)
+               {
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       struct u132_respond *respond = &ftdi->respond[
+                               RESPOND_MASK & ftdi->respond_next];
+                       int result = -ENODEV;
+                       respond->result = &result;
+                       respond->header = command->header = 0x00 | (cPCIcfgrd &
+                                                                   0x0F);
+                       command->length = 0x04;
+                       respond->address = command->address = addressofs;
+                       command->width = 0x00 | (width & 0x0F);
+                       command->follows = 0;
+                       command->value = 0;
+                       command->buffer = NULL;
+                       respond->value = data;
+                       init_completion(&respond->wait_completion);
+                       ftdi->command_next += 1;
+                       ftdi->respond_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       wait_for_completion(&respond->wait_completion);
+                       return result;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 static int ftdi_elan_read_pcimem(struct usb_ftdi *ftdi, int mem_offset,
-        u8 width, u32 *data)
-{
-        u8 addressofs = mem_offset / 4;
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                int respond_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                respond_size = ftdi->respond_next - ftdi->respond_head;
-                if (command_size < COMMAND_SIZE && respond_size < RESPOND_SIZE)
-                        {
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        struct u132_respond *respond = &ftdi->respond[
-                                RESPOND_MASK & ftdi->respond_next];
-                        int result = -ENODEV;
-                        respond->result = &result;
-                        respond->header = command->header = 0x00 | (cPCImemrd &
-                                0x0F);
-                        command->length = 0x04;
-                        respond->address = command->address = addressofs;
-                        command->width = 0x00 | (width & 0x0F);
-                        command->follows = 0;
-                        command->value = 0;
-                        command->buffer = NULL;
-                        respond->value = data;
-                        init_completion(&respond->wait_completion);
-                        ftdi->command_next += 1;
-                        ftdi->respond_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        wait_for_completion(&respond->wait_completion);
-                        return result;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+                                u8 width, u32 *data)
+{
+       u8 addressofs = mem_offset / 4;
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               int respond_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               respond_size = ftdi->respond_next - ftdi->respond_head;
+               if (command_size < COMMAND_SIZE && respond_size < RESPOND_SIZE)
+               {
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       struct u132_respond *respond = &ftdi->respond[
+                               RESPOND_MASK & ftdi->respond_next];
+                       int result = -ENODEV;
+                       respond->result = &result;
+                       respond->header = command->header = 0x00 | (cPCImemrd &
+                                                                   0x0F);
+                       command->length = 0x04;
+                       respond->address = command->address = addressofs;
+                       command->width = 0x00 | (width & 0x0F);
+                       command->follows = 0;
+                       command->value = 0;
+                       command->buffer = NULL;
+                       respond->value = data;
+                       init_completion(&respond->wait_completion);
+                       ftdi->command_next += 1;
+                       ftdi->respond_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       wait_for_completion(&respond->wait_completion);
+                       return result;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 int usb_ftdi_elan_read_pcimem(struct platform_device *pdev, int mem_offset,
-        u8 width, u32 *data)
+                             u8 width, u32 *data)
 {
-        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
-        if (ftdi->initialized == 0) {
-                return -ENODEV;
-        } else
-                return ftdi_elan_read_pcimem(ftdi, mem_offset, width, data);
+       struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
+       if (ftdi->initialized == 0) {
+               return -ENODEV;
+       } else
+               return ftdi_elan_read_pcimem(ftdi, mem_offset, width, data);
 }
 
 
 EXPORT_SYMBOL_GPL(usb_ftdi_elan_read_pcimem);
 static int ftdi_elan_edset_setup(struct usb_ftdi *ftdi, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
-{
-        u8 ed = ed_number - 1;
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else if (ftdi->initialized == 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                if (command_size < COMMAND_SIZE) {
-                        struct u132_target *target = &ftdi->target[ed];
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        command->header = 0x80 | (ed << 5);
-                        command->length = 0x8007;
-                        command->address = (toggle_bits << 6) | (ep_number << 2)
-                                | (address << 0);
-                        command->width = usb_maxpacket(urb->dev, urb->pipe,
-                                usb_pipeout(urb->pipe));
-                        command->follows = 8;
-                        command->value = 0;
-                        command->buffer = urb->setup_packet;
-                        target->callback = callback;
-                        target->endp = endp;
-                        target->urb = urb;
-                        target->active = 1;
-                        ftdi->command_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+                                void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                                void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                                  int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                                  int halted, int skipped, int actual, int non_null))
+{
+       u8 ed = ed_number - 1;
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else if (ftdi->initialized == 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               if (command_size < COMMAND_SIZE) {
+                       struct u132_target *target = &ftdi->target[ed];
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       command->header = 0x80 | (ed << 5);
+                       command->length = 0x8007;
+                       command->address = (toggle_bits << 6) | (ep_number << 2)
+                               | (address << 0);
+                       command->width = usb_maxpacket(urb->dev, urb->pipe,
+                                                      usb_pipeout(urb->pipe));
+                       command->follows = 8;
+                       command->value = 0;
+                       command->buffer = urb->setup_packet;
+                       target->callback = callback;
+                       target->endp = endp;
+                       target->urb = urb;
+                       target->active = 1;
+                       ftdi->command_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 int usb_ftdi_elan_edset_setup(struct platform_device *pdev, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
+                             void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                             void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                               int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                               int halted, int skipped, int actual, int non_null))
 {
-        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
-        return ftdi_elan_edset_setup(ftdi, ed_number, endp, urb, address,
-                ep_number, toggle_bits, callback);
+       struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
+       return ftdi_elan_edset_setup(ftdi, ed_number, endp, urb, address,
+                                    ep_number, toggle_bits, callback);
 }
 
 
 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_setup);
 static int ftdi_elan_edset_input(struct usb_ftdi *ftdi, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
-{
-        u8 ed = ed_number - 1;
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else if (ftdi->initialized == 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                if (command_size < COMMAND_SIZE) {
-                        struct u132_target *target = &ftdi->target[ed];
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        u32 remaining_length = urb->transfer_buffer_length -
-                                urb->actual_length;
-                        command->header = 0x82 | (ed << 5);
-                        if (remaining_length == 0) {
-                                command->length = 0x0000;
-                        } else if (remaining_length > 1024) {
-                                command->length = 0x8000 | 1023;
-                        } else
-                                command->length = 0x8000 | (remaining_length -
-                                        1);
-                        command->address = (toggle_bits << 6) | (ep_number << 2)
-                                | (address << 0);
-                        command->width = usb_maxpacket(urb->dev, urb->pipe,
-                                usb_pipeout(urb->pipe));
-                        command->follows = 0;
-                        command->value = 0;
-                        command->buffer = NULL;
-                        target->callback = callback;
-                        target->endp = endp;
-                        target->urb = urb;
-                        target->active = 1;
-                        ftdi->command_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+                                void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                                void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                                  int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                                  int halted, int skipped, int actual, int non_null))
+{
+       u8 ed = ed_number - 1;
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else if (ftdi->initialized == 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               if (command_size < COMMAND_SIZE) {
+                       struct u132_target *target = &ftdi->target[ed];
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       u32 remaining_length = urb->transfer_buffer_length -
+                               urb->actual_length;
+                       command->header = 0x82 | (ed << 5);
+                       if (remaining_length == 0) {
+                               command->length = 0x0000;
+                       } else if (remaining_length > 1024) {
+                               command->length = 0x8000 | 1023;
+                       } else
+                               command->length = 0x8000 | (remaining_length -
+                                                           1);
+                       command->address = (toggle_bits << 6) | (ep_number << 2)
+                               | (address << 0);
+                       command->width = usb_maxpacket(urb->dev, urb->pipe,
+                                                      usb_pipeout(urb->pipe));
+                       command->follows = 0;
+                       command->value = 0;
+                       command->buffer = NULL;
+                       target->callback = callback;
+                       target->endp = endp;
+                       target->urb = urb;
+                       target->active = 1;
+                       ftdi->command_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 int usb_ftdi_elan_edset_input(struct platform_device *pdev, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
+                             void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                             void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                               int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                               int halted, int skipped, int actual, int non_null))
 {
-        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
-        return ftdi_elan_edset_input(ftdi, ed_number, endp, urb, address,
-                ep_number, toggle_bits, callback);
+       struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
+       return ftdi_elan_edset_input(ftdi, ed_number, endp, urb, address,
+                                    ep_number, toggle_bits, callback);
 }
 
 
 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_input);
 static int ftdi_elan_edset_empty(struct usb_ftdi *ftdi, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
-{
-        u8 ed = ed_number - 1;
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else if (ftdi->initialized == 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                if (command_size < COMMAND_SIZE) {
-                        struct u132_target *target = &ftdi->target[ed];
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        command->header = 0x81 | (ed << 5);
-                        command->length = 0x0000;
-                        command->address = (toggle_bits << 6) | (ep_number << 2)
-                                | (address << 0);
-                        command->width = usb_maxpacket(urb->dev, urb->pipe,
-                                usb_pipeout(urb->pipe));
-                        command->follows = 0;
-                        command->value = 0;
-                        command->buffer = NULL;
-                        target->callback = callback;
-                        target->endp = endp;
-                        target->urb = urb;
-                        target->active = 1;
-                        ftdi->command_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+                                void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                                void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                                  int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                                  int halted, int skipped, int actual, int non_null))
+{
+       u8 ed = ed_number - 1;
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else if (ftdi->initialized == 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               if (command_size < COMMAND_SIZE) {
+                       struct u132_target *target = &ftdi->target[ed];
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       command->header = 0x81 | (ed << 5);
+                       command->length = 0x0000;
+                       command->address = (toggle_bits << 6) | (ep_number << 2)
+                               | (address << 0);
+                       command->width = usb_maxpacket(urb->dev, urb->pipe,
+                                                      usb_pipeout(urb->pipe));
+                       command->follows = 0;
+                       command->value = 0;
+                       command->buffer = NULL;
+                       target->callback = callback;
+                       target->endp = endp;
+                       target->urb = urb;
+                       target->active = 1;
+                       ftdi->command_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 int usb_ftdi_elan_edset_empty(struct platform_device *pdev, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
+                             void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                             void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                               int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                               int halted, int skipped, int actual, int non_null))
 {
-        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
-        return ftdi_elan_edset_empty(ftdi, ed_number, endp, urb, address,
-                ep_number, toggle_bits, callback);
+       struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
+       return ftdi_elan_edset_empty(ftdi, ed_number, endp, urb, address,
+                                    ep_number, toggle_bits, callback);
 }
 
 
 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_empty);
 static int ftdi_elan_edset_output(struct usb_ftdi *ftdi, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
-{
-        u8 ed = ed_number - 1;
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else if (ftdi->initialized == 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                if (command_size < COMMAND_SIZE) {
-                        u8 *b;
-                        u16 urb_size;
-                        int i = 0;
-                        char data[30 *3 + 4];
-                        char *d = data;
-                        int m = (sizeof(data) - 1) / 3;
-                        int l = 0;
-                        struct u132_target *target = &ftdi->target[ed];
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        command->header = 0x81 | (ed << 5);
-                        command->address = (toggle_bits << 6) | (ep_number << 2)
-                                | (address << 0);
-                        command->width = usb_maxpacket(urb->dev, urb->pipe,
-                                usb_pipeout(urb->pipe));
-                        command->follows = min_t(u32, 1024,
-                                urb->transfer_buffer_length -
-                                urb->actual_length);
-                        command->value = 0;
-                        command->buffer = urb->transfer_buffer +
-                                urb->actual_length;
-                        command->length = 0x8000 | (command->follows - 1);
-                        b = command->buffer;
-                        urb_size = command->follows;
-                        data[0] = 0;
-                        while (urb_size-- > 0) {
-                                if (i > m) {
-                                } else if (i++ < m) {
-                                        int w = sprintf(d, " %02X", *b++);
-                                        d += w;
-                                        l += w;
-                                } else
-                                        d += sprintf(d, " ..");
-                        }
-                        target->callback = callback;
-                        target->endp = endp;
-                        target->urb = urb;
-                        target->active = 1;
-                        ftdi->command_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+                                 void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                                 void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                                   int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                                   int halted, int skipped, int actual, int non_null))
+{
+       u8 ed = ed_number - 1;
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else if (ftdi->initialized == 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               if (command_size < COMMAND_SIZE) {
+                       u8 *b;
+                       u16 urb_size;
+                       int i = 0;
+                       char data[30 *3 + 4];
+                       char *d = data;
+                       int m = (sizeof(data) - 1) / 3;
+                       int l = 0;
+                       struct u132_target *target = &ftdi->target[ed];
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       command->header = 0x81 | (ed << 5);
+                       command->address = (toggle_bits << 6) | (ep_number << 2)
+                               | (address << 0);
+                       command->width = usb_maxpacket(urb->dev, urb->pipe,
+                                                      usb_pipeout(urb->pipe));
+                       command->follows = min_t(u32, 1024,
+                                                urb->transfer_buffer_length -
+                                                urb->actual_length);
+                       command->value = 0;
+                       command->buffer = urb->transfer_buffer +
+                               urb->actual_length;
+                       command->length = 0x8000 | (command->follows - 1);
+                       b = command->buffer;
+                       urb_size = command->follows;
+                       data[0] = 0;
+                       while (urb_size-- > 0) {
+                               if (i > m) {
+                               } else if (i++ < m) {
+                                       int w = sprintf(d, " %02X", *b++);
+                                       d += w;
+                                       l += w;
+                               } else
+                                       d += sprintf(d, " ..");
+                       }
+                       target->callback = callback;
+                       target->endp = endp;
+                       target->urb = urb;
+                       target->active = 1;
+                       ftdi->command_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 int usb_ftdi_elan_edset_output(struct platform_device *pdev, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
+                              void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                              void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                                int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                                int halted, int skipped, int actual, int non_null))
 {
-        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
-        return ftdi_elan_edset_output(ftdi, ed_number, endp, urb, address,
-                ep_number, toggle_bits, callback);
+       struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
+       return ftdi_elan_edset_output(ftdi, ed_number, endp, urb, address,
+                                     ep_number, toggle_bits, callback);
 }
 
 
 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_output);
 static int ftdi_elan_edset_single(struct usb_ftdi *ftdi, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
-{
-        u8 ed = ed_number - 1;
-      wait:if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else if (ftdi->initialized == 0) {
-                return -ENODEV;
-        } else {
-                int command_size;
-                mutex_lock(&ftdi->u132_lock);
-                command_size = ftdi->command_next - ftdi->command_head;
-                if (command_size < COMMAND_SIZE) {
-                        u32 remaining_length = urb->transfer_buffer_length -
-                                urb->actual_length;
-                        struct u132_target *target = &ftdi->target[ed];
-                        struct u132_command *command = &ftdi->command[
-                                COMMAND_MASK & ftdi->command_next];
-                        command->header = 0x83 | (ed << 5);
-                        if (remaining_length == 0) {
-                                command->length = 0x0000;
-                        } else if (remaining_length > 1024) {
-                                command->length = 0x8000 | 1023;
-                        } else
-                                command->length = 0x8000 | (remaining_length -
-                                        1);
-                        command->address = (toggle_bits << 6) | (ep_number << 2)
-                                | (address << 0);
-                        command->width = usb_maxpacket(urb->dev, urb->pipe,
-                                usb_pipeout(urb->pipe));
-                        command->follows = 0;
-                        command->value = 0;
-                        command->buffer = NULL;
-                        target->callback = callback;
-                        target->endp = endp;
-                        target->urb = urb;
-                        target->active = 1;
-                        ftdi->command_next += 1;
-                        ftdi_elan_kick_command_queue(ftdi);
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                } else {
-                        mutex_unlock(&ftdi->u132_lock);
-                        msleep(100);
-                        goto wait;
-                }
-        }
+                                 void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                                 void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                                   int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                                   int halted, int skipped, int actual, int non_null))
+{
+       u8 ed = ed_number - 1;
+wait:if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else if (ftdi->initialized == 0) {
+               return -ENODEV;
+       } else {
+               int command_size;
+               mutex_lock(&ftdi->u132_lock);
+               command_size = ftdi->command_next - ftdi->command_head;
+               if (command_size < COMMAND_SIZE) {
+                       u32 remaining_length = urb->transfer_buffer_length -
+                               urb->actual_length;
+                       struct u132_target *target = &ftdi->target[ed];
+                       struct u132_command *command = &ftdi->command[
+                               COMMAND_MASK & ftdi->command_next];
+                       command->header = 0x83 | (ed << 5);
+                       if (remaining_length == 0) {
+                               command->length = 0x0000;
+                       } else if (remaining_length > 1024) {
+                               command->length = 0x8000 | 1023;
+                       } else
+                               command->length = 0x8000 | (remaining_length -
+                                                           1);
+                       command->address = (toggle_bits << 6) | (ep_number << 2)
+                               | (address << 0);
+                       command->width = usb_maxpacket(urb->dev, urb->pipe,
+                                                      usb_pipeout(urb->pipe));
+                       command->follows = 0;
+                       command->value = 0;
+                       command->buffer = NULL;
+                       target->callback = callback;
+                       target->endp = endp;
+                       target->urb = urb;
+                       target->active = 1;
+                       ftdi->command_next += 1;
+                       ftdi_elan_kick_command_queue(ftdi);
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               } else {
+                       mutex_unlock(&ftdi->u132_lock);
+                       msleep(100);
+                       goto wait;
+               }
+       }
 }
 
 int usb_ftdi_elan_edset_single(struct platform_device *pdev, u8 ed_number,
-        void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
-        void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
-        int toggle_bits, int error_count, int condition_code, int repeat_number,
-         int halted, int skipped, int actual, int non_null))
+                              void *endp, struct urb *urb, u8 address, u8 ep_number, u8 toggle_bits,
+                              void (*callback) (void *endp, struct urb *urb, u8 *buf, int len,
+                                                int toggle_bits, int error_count, int condition_code, int repeat_number,
+                                                int halted, int skipped, int actual, int non_null))
 {
-        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
-        return ftdi_elan_edset_single(ftdi, ed_number, endp, urb, address,
-                ep_number, toggle_bits, callback);
+       struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
+       return ftdi_elan_edset_single(ftdi, ed_number, endp, urb, address,
+                                     ep_number, toggle_bits, callback);
 }
 
 
 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_single);
 static int ftdi_elan_edset_flush(struct usb_ftdi *ftdi, u8 ed_number,
-        void *endp)
-{
-        u8 ed = ed_number - 1;
-        if (ftdi->disconnected > 0) {
-                return -ENODEV;
-        } else if (ftdi->initialized == 0) {
-                return -ENODEV;
-        } else {
-                struct u132_target *target = &ftdi->target[ed];
-                mutex_lock(&ftdi->u132_lock);
-                if (target->abandoning > 0) {
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                } else {
-                        target->abandoning = 1;
-                      wait_1:if (target->active == 1) {
-                                int command_size = ftdi->command_next -
-                                        ftdi->command_head;
-                                if (command_size < COMMAND_SIZE) {
-                                        struct u132_command *command =
-                                                &ftdi->command[COMMAND_MASK &
-                                                ftdi->command_next];
-                                        command->header = 0x80 | (ed << 5) |
-                                                0x4;
-                                        command->length = 0x00;
-                                        command->address = 0x00;
-                                        command->width = 0x00;
-                                        command->follows = 0;
-                                        command->value = 0;
-                                        command->buffer = &command->value;
-                                        ftdi->command_next += 1;
-                                        ftdi_elan_kick_command_queue(ftdi);
-                                } else {
-                                        mutex_unlock(&ftdi->u132_lock);
-                                        msleep(100);
-                                        mutex_lock(&ftdi->u132_lock);
-                                        goto wait_1;
-                                }
-                        }
-                        mutex_unlock(&ftdi->u132_lock);
-                        return 0;
-                }
-        }
+                                void *endp)
+{
+       u8 ed = ed_number - 1;
+       if (ftdi->disconnected > 0) {
+               return -ENODEV;
+       } else if (ftdi->initialized == 0) {
+               return -ENODEV;
+       } else {
+               struct u132_target *target = &ftdi->target[ed];
+               mutex_lock(&ftdi->u132_lock);
+               if (target->abandoning > 0) {
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               } else {
+                       target->abandoning = 1;
+               wait_1:if (target->active == 1) {
+                               int command_size = ftdi->command_next -
+                                       ftdi->command_head;
+                               if (command_size < COMMAND_SIZE) {
+                                       struct u132_command *command =
+                                               &ftdi->command[COMMAND_MASK &
+                                                              ftdi->command_next];
+                                       command->header = 0x80 | (ed << 5) |
+                                               0x4;
+                                       command->length = 0x00;
+                                       command->address = 0x00;
+                                       command->width = 0x00;
+                                       command->follows = 0;
+                                       command->value = 0;
+                                       command->buffer = &command->value;
+                                       ftdi->command_next += 1;
+                                       ftdi_elan_kick_command_queue(ftdi);
+                               } else {
+                                       mutex_unlock(&ftdi->u132_lock);
+                                       msleep(100);
+                                       mutex_lock(&ftdi->u132_lock);
+                                       goto wait_1;
+                               }
+                       }
+                       mutex_unlock(&ftdi->u132_lock);
+                       return 0;
+               }
+       }
 }
 
 int usb_ftdi_elan_edset_flush(struct platform_device *pdev, u8 ed_number,
-        void *endp)
+                             void *endp)
 {
-        struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
-        return ftdi_elan_edset_flush(ftdi, ed_number, endp);
+       struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev);
+       return ftdi_elan_edset_flush(ftdi, ed_number, endp);
 }
 
 
 EXPORT_SYMBOL_GPL(usb_ftdi_elan_edset_flush);
 static int ftdi_elan_flush_input_fifo(struct usb_ftdi *ftdi)
 {
-        int retry_on_empty = 10;
-        int retry_on_timeout = 5;
-        int retry_on_status = 20;
-      more:{
-                int packet_bytes = 0;
-                int retval = usb_bulk_msg(ftdi->udev,
-                        usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
-                         ftdi->bulk_in_buffer, ftdi->bulk_in_size,
-                        &packet_bytes, 100);
-                if (packet_bytes > 2) {
-                        char diag[30 *3 + 4];
-                        char *d = diag;
-                        int m = (sizeof(diag) - 1) / 3;
-                        char *b = ftdi->bulk_in_buffer;
-                        int bytes_read = 0;
-                        diag[0] = 0;
-                        while (packet_bytes-- > 0) {
-                                char c = *b++;
-                                if (bytes_read < m) {
-                                        d += sprintf(d, " %02X",
-                                                0x000000FF & c);
-                                } else if (bytes_read > m) {
-                                } else
-                                        d += sprintf(d, " ..");
-                                bytes_read += 1;
-                                continue;
-                        }
-                        goto more;
-                } else if (packet_bytes > 1) {
-                        char s1 = ftdi->bulk_in_buffer[0];
-                        char s2 = ftdi->bulk_in_buffer[1];
-                        if (s1 == 0x31 && s2 == 0x60) {
-                                return 0;
-                        } else if (retry_on_status-- > 0) {
-                                goto more;
-                        } else {
-                                dev_err(&ftdi->udev->dev, "STATUS ERROR retry l"
-                                        "imit reached\n");
-                                return -EFAULT;
-                        }
-                } else if (packet_bytes > 0) {
-                        char b1 = ftdi->bulk_in_buffer[0];
-                        dev_err(&ftdi->udev->dev, "only one byte flushed from F"
-                                "TDI = %02X\n", b1);
-                        if (retry_on_status-- > 0) {
-                                goto more;
-                        } else {
-                                dev_err(&ftdi->udev->dev, "STATUS ERROR retry l"
-                                        "imit reached\n");
-                                return -EFAULT;
-                        }
-                } else if (retval == -ETIMEDOUT) {
-                        if (retry_on_timeout-- > 0) {
-                                goto more;
-                        } else {
-                                dev_err(&ftdi->udev->dev, "TIMED OUT retry limi"
-                                        "t reached\n");
-                                return -ENOMEM;
-                        }
-                } else if (retval == 0) {
-                        if (retry_on_empty-- > 0) {
-                                goto more;
-                        } else {
-                                dev_err(&ftdi->udev->dev, "empty packet retry l"
-                                        "imit reached\n");
-                                return -ENOMEM;
-                        }
-                } else {
-                        dev_err(&ftdi->udev->dev, "error = %d\n", retval);
-                        return retval;
-                }
-        }
-        return -1;
+       int retry_on_empty = 10;
+       int retry_on_timeout = 5;
+       int retry_on_status = 20;
+more:{
+               int packet_bytes = 0;
+               int retval = usb_bulk_msg(ftdi->udev,
+                                         usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
+                                         ftdi->bulk_in_buffer, ftdi->bulk_in_size,
+                                         &packet_bytes, 100);
+               if (packet_bytes > 2) {
+                       char diag[30 *3 + 4];
+                       char *d = diag;
+                       int m = (sizeof(diag) - 1) / 3;
+                       char *b = ftdi->bulk_in_buffer;
+                       int bytes_read = 0;
+                       diag[0] = 0;
+                       while (packet_bytes-- > 0) {
+                               char c = *b++;
+                               if (bytes_read < m) {
+                                       d += sprintf(d, " %02X",
+                                                    0x000000FF & c);
+                               } else if (bytes_read > m) {
+                               } else
+                                       d += sprintf(d, " ..");
+                               bytes_read += 1;
+                               continue;
+                       }
+                       goto more;
+               } else if (packet_bytes > 1) {
+                       char s1 = ftdi->bulk_in_buffer[0];
+                       char s2 = ftdi->bulk_in_buffer[1];
+                       if (s1 == 0x31 && s2 == 0x60) {
+                               return 0;
+                       } else if (retry_on_status-- > 0) {
+                               goto more;
+                       } else {
+                               dev_err(&ftdi->udev->dev, "STATUS ERROR retry limit reached\n");
+                               return -EFAULT;
+                       }
+               } else if (packet_bytes > 0) {
+                       char b1 = ftdi->bulk_in_buffer[0];
+                       dev_err(&ftdi->udev->dev, "only one byte flushed from FTDI = %02X\n",
+                               b1);
+                       if (retry_on_status-- > 0) {
+                               goto more;
+                       } else {
+                               dev_err(&ftdi->udev->dev, "STATUS ERROR retry limit reached\n");
+                               return -EFAULT;
+                       }
+               } else if (retval == -ETIMEDOUT) {
+                       if (retry_on_timeout-- > 0) {
+                               goto more;
+                       } else {
+                               dev_err(&ftdi->udev->dev, "TIMED OUT retry limit reached\n");
+                               return -ENOMEM;
+                       }
+               } else if (retval == 0) {
+                       if (retry_on_empty-- > 0) {
+                               goto more;
+                       } else {
+                               dev_err(&ftdi->udev->dev, "empty packet retry limit reached\n");
+                               return -ENOMEM;
+                       }
+               } else {
+                       dev_err(&ftdi->udev->dev, "error = %d\n", retval);
+                       return retval;
+               }
+       }
+       return -1;
 }
 
 
 /*
-* send the long flush sequence
-*
-*/
+ * send the long flush sequence
+ *
+ */
 static int ftdi_elan_synchronize_flush(struct usb_ftdi *ftdi)
 {
-        int retval;
-        struct urb *urb;
-        char *buf;
-        int I = 257;
-        int i = 0;
-        urb = usb_alloc_urb(0, GFP_KERNEL);
-        if (!urb) {
-                dev_err(&ftdi->udev->dev, "could not alloc a urb for flush sequ"
-                        "ence\n");
-                return -ENOMEM;
-        }
-        buf = usb_alloc_coherent(ftdi->udev, I, GFP_KERNEL, &urb->transfer_dma);
-        if (!buf) {
-                dev_err(&ftdi->udev->dev, "could not get a buffer for flush seq"
-                        "uence\n");
-                usb_free_urb(urb);
-                return -ENOMEM;
-        }
-        while (I-- > 0)
-                buf[i++] = 0x55;
-        usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
-                ftdi->bulk_out_endpointAddr), buf, i,
-                ftdi_elan_write_bulk_callback, ftdi);
-        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-        retval = usb_submit_urb(urb, GFP_KERNEL);
-        if (retval) {
-                dev_err(&ftdi->udev->dev, "failed to submit urb containing the "
-                        "flush sequence\n");
-                usb_free_coherent(ftdi->udev, i, buf, urb->transfer_dma);
-                usb_free_urb(urb);
-                return -ENOMEM;
-        }
-        usb_free_urb(urb);
-        return 0;
+       int retval;
+       struct urb *urb;
+       char *buf;
+       int I = 257;
+       int i = 0;
+       urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!urb) {
+               dev_err(&ftdi->udev->dev, "could not alloc a urb for flush sequence\n");
+               return -ENOMEM;
+       }
+       buf = usb_alloc_coherent(ftdi->udev, I, GFP_KERNEL, &urb->transfer_dma);
+       if (!buf) {
+               dev_err(&ftdi->udev->dev, "could not get a buffer for flush sequence\n");
+               usb_free_urb(urb);
+               return -ENOMEM;
+       }
+       while (I-- > 0)
+               buf[i++] = 0x55;
+       usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
+                                                          ftdi->bulk_out_endpointAddr), buf, i,
+                         ftdi_elan_write_bulk_callback, ftdi);
+       urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+       retval = usb_submit_urb(urb, GFP_KERNEL);
+       if (retval) {
+               dev_err(&ftdi->udev->dev, "failed to submit urb containing the flush sequence\n");
+               usb_free_coherent(ftdi->udev, i, buf, urb->transfer_dma);
+               usb_free_urb(urb);
+               return -ENOMEM;
+       }
+       usb_free_urb(urb);
+       return 0;
 }
 
 
 /*
-* send the reset sequence
-*
-*/
+ * send the reset sequence
+ *
+ */
 static int ftdi_elan_synchronize_reset(struct usb_ftdi *ftdi)
 {
-        int retval;
-        struct urb *urb;
-        char *buf;
-        int I = 4;
-        int i = 0;
-        urb = usb_alloc_urb(0, GFP_KERNEL);
-        if (!urb) {
-                dev_err(&ftdi->udev->dev, "could not get a urb for the reset se"
-                        "quence\n");
-                return -ENOMEM;
-        }
-        buf = usb_alloc_coherent(ftdi->udev, I, GFP_KERNEL, &urb->transfer_dma);
-        if (!buf) {
-                dev_err(&ftdi->udev->dev, "could not get a buffer for the reset"
-                        " sequence\n");
-                usb_free_urb(urb);
-                return -ENOMEM;
-        }
-        buf[i++] = 0x55;
-        buf[i++] = 0xAA;
-        buf[i++] = 0x5A;
-        buf[i++] = 0xA5;
-        usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
-                ftdi->bulk_out_endpointAddr), buf, i,
-                ftdi_elan_write_bulk_callback, ftdi);
-        urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
-        retval = usb_submit_urb(urb, GFP_KERNEL);
-        if (retval) {
-                dev_err(&ftdi->udev->dev, "failed to submit urb containing the "
-                        "reset sequence\n");
-                usb_free_coherent(ftdi->udev, i, buf, urb->transfer_dma);
-                usb_free_urb(urb);
-                return -ENOMEM;
-        }
-        usb_free_urb(urb);
-        return 0;
+       int retval;
+       struct urb *urb;
+       char *buf;
+       int I = 4;
+       int i = 0;
+       urb = usb_alloc_urb(0, GFP_KERNEL);
+       if (!urb) {
+               dev_err(&ftdi->udev->dev, "could not get a urb for the reset sequence\n");
+               return -ENOMEM;
+       }
+       buf = usb_alloc_coherent(ftdi->udev, I, GFP_KERNEL, &urb->transfer_dma);
+       if (!buf) {
+               dev_err(&ftdi->udev->dev, "could not get a buffer for the reset sequence\n");
+               usb_free_urb(urb);
+               return -ENOMEM;
+       }
+       buf[i++] = 0x55;
+       buf[i++] = 0xAA;
+       buf[i++] = 0x5A;
+       buf[i++] = 0xA5;
+       usb_fill_bulk_urb(urb, ftdi->udev, usb_sndbulkpipe(ftdi->udev,
+                                                          ftdi->bulk_out_endpointAddr), buf, i,
+                         ftdi_elan_write_bulk_callback, ftdi);
+       urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
+       retval = usb_submit_urb(urb, GFP_KERNEL);
+       if (retval) {
+               dev_err(&ftdi->udev->dev, "failed to submit urb containing the reset sequence\n");
+               usb_free_coherent(ftdi->udev, i, buf, urb->transfer_dma);
+               usb_free_urb(urb);
+               return -ENOMEM;
+       }
+       usb_free_urb(urb);
+       return 0;
 }
 
 static int ftdi_elan_synchronize(struct usb_ftdi *ftdi)
 {
-        int retval;
-        int long_stop = 10;
-        int retry_on_timeout = 5;
-        int retry_on_empty = 10;
-        int err_count = 0;
-        retval = ftdi_elan_flush_input_fifo(ftdi);
-        if (retval)
-                return retval;
-        ftdi->bulk_in_left = 0;
-        ftdi->bulk_in_last = -1;
-        while (long_stop-- > 0) {
-                int read_stop;
-                int read_stuck;
-                retval = ftdi_elan_synchronize_flush(ftdi);
-                if (retval)
-                        return retval;
-                retval = ftdi_elan_flush_input_fifo(ftdi);
-                if (retval)
-                        return retval;
-              reset:retval = ftdi_elan_synchronize_reset(ftdi);
-                if (retval)
-                        return retval;
-                read_stop = 100;
-                read_stuck = 10;
-              read:{
-                        int packet_bytes = 0;
-                        retval = usb_bulk_msg(ftdi->udev,
-                                usb_rcvbulkpipe(ftdi->udev,
-                                ftdi->bulk_in_endpointAddr),
-                                ftdi->bulk_in_buffer, ftdi->bulk_in_size,
-                                &packet_bytes, 500);
-                        if (packet_bytes > 2) {
-                                char diag[30 *3 + 4];
-                                char *d = diag;
-                                int m = (sizeof(diag) - 1) / 3;
-                                char *b = ftdi->bulk_in_buffer;
-                                int bytes_read = 0;
-                                unsigned char c = 0;
-                                diag[0] = 0;
-                                while (packet_bytes-- > 0) {
-                                        c = *b++;
-                                        if (bytes_read < m) {
-                                                d += sprintf(d, " %02X", c);
-                                        } else if (bytes_read > m) {
-                                        } else
-                                                d += sprintf(d, " ..");
-                                        bytes_read += 1;
-                                        continue;
-                                }
-                                if (c == 0x7E) {
-                                        return 0;
-                                } else {
-                                        if (c == 0x55) {
-                                                goto read;
-                                        } else if (read_stop-- > 0) {
-                                                goto read;
-                                        } else {
-                                                dev_err(&ftdi->udev->dev, "retr"
-                                                        "y limit reached\n");
-                                                continue;
-                                        }
-                                }
-                        } else if (packet_bytes > 1) {
-                                unsigned char s1 = ftdi->bulk_in_buffer[0];
-                                unsigned char s2 = ftdi->bulk_in_buffer[1];
-                                if (s1 == 0x31 && s2 == 0x00) {
-                                        if (read_stuck-- > 0) {
-                                                goto read;
-                                        } else
-                                                goto reset;
-                                } else if (s1 == 0x31 && s2 == 0x60) {
-                                        if (read_stop-- > 0) {
-                                                goto read;
-                                        } else {
-                                                dev_err(&ftdi->udev->dev, "retr"
-                                                        "y limit reached\n");
-                                                continue;
-                                        }
-                                } else {
-                                        if (read_stop-- > 0) {
-                                                goto read;
-                                        } else {
-                                                dev_err(&ftdi->udev->dev, "retr"
-                                                        "y limit reached\n");
-                                                continue;
-                                        }
-                                }
-                        } else if (packet_bytes > 0) {
-                                if (read_stop-- > 0) {
-                                        goto read;
-                                } else {
-                                        dev_err(&ftdi->udev->dev, "retry limit "
-                                                "reached\n");
-                                        continue;
-                                }
-                        } else if (retval == -ETIMEDOUT) {
-                                if (retry_on_timeout-- > 0) {
-                                        goto read;
-                                } else {
-                                        dev_err(&ftdi->udev->dev, "TIMED OUT re"
-                                                "try limit reached\n");
-                                        continue;
-                                }
-                        } else if (retval == 0) {
-                                if (retry_on_empty-- > 0) {
-                                        goto read;
-                                } else {
-                                        dev_err(&ftdi->udev->dev, "empty packet"
-                                                " retry limit reached\n");
-                                        continue;
-                                }
-                        } else {
-                                err_count += 1;
-                                dev_err(&ftdi->udev->dev, "error = %d\n",
-                                        retval);
-                                if (read_stop-- > 0) {
-                                        goto read;
-                                } else {
-                                        dev_err(&ftdi->udev->dev, "retry limit "
-                                                "reached\n");
-                                        continue;
-                                }
-                        }
-                }
-        }
-        dev_err(&ftdi->udev->dev, "failed to synchronize\n");
-        return -EFAULT;
+       int retval;
+       int long_stop = 10;
+       int retry_on_timeout = 5;
+       int retry_on_empty = 10;
+       int err_count = 0;
+       retval = ftdi_elan_flush_input_fifo(ftdi);
+       if (retval)
+               return retval;
+       ftdi->bulk_in_left = 0;
+       ftdi->bulk_in_last = -1;
+       while (long_stop-- > 0) {
+               int read_stop;
+               int read_stuck;
+               retval = ftdi_elan_synchronize_flush(ftdi);
+               if (retval)
+                       return retval;
+               retval = ftdi_elan_flush_input_fifo(ftdi);
+               if (retval)
+                       return retval;
+       reset:retval = ftdi_elan_synchronize_reset(ftdi);
+               if (retval)
+                       return retval;
+               read_stop = 100;
+               read_stuck = 10;
+       read:{
+                       int packet_bytes = 0;
+                       retval = usb_bulk_msg(ftdi->udev,
+                                             usb_rcvbulkpipe(ftdi->udev,
+                                                             ftdi->bulk_in_endpointAddr),
+                                             ftdi->bulk_in_buffer, ftdi->bulk_in_size,
+                                             &packet_bytes, 500);
+                       if (packet_bytes > 2) {
+                               char diag[30 *3 + 4];
+                               char *d = diag;
+                               int m = (sizeof(diag) - 1) / 3;
+                               char *b = ftdi->bulk_in_buffer;
+                               int bytes_read = 0;
+                               unsigned char c = 0;
+                               diag[0] = 0;
+                               while (packet_bytes-- > 0) {
+                                       c = *b++;
+                                       if (bytes_read < m) {
+                                               d += sprintf(d, " %02X", c);
+                                       } else if (bytes_read > m) {
+                                       } else
+                                               d += sprintf(d, " ..");
+                                       bytes_read += 1;
+                                       continue;
+                               }
+                               if (c == 0x7E) {
+                                       return 0;
+                               } else {
+                                       if (c == 0x55) {
+                                               goto read;
+                                       } else if (read_stop-- > 0) {
+                                               goto read;
+                                       } else {
+                                               dev_err(&ftdi->udev->dev, "retry limit reached\n");
+                                               continue;
+                                       }
+                               }
+                       } else if (packet_bytes > 1) {
+                               unsigned char s1 = ftdi->bulk_in_buffer[0];
+                               unsigned char s2 = ftdi->bulk_in_buffer[1];
+                               if (s1 == 0x31 && s2 == 0x00) {
+                                       if (read_stuck-- > 0) {
+                                               goto read;
+                                       } else
+                                               goto reset;
+                               } else if (s1 == 0x31 && s2 == 0x60) {
+                                       if (read_stop-- > 0) {
+                                               goto read;
+                                       } else {
+                                               dev_err(&ftdi->udev->dev, "retry limit reached\n");
+                                               continue;
+                                       }
+                               } else {
+                                       if (read_stop-- > 0) {
+                                               goto read;
+                                       } else {
+                                               dev_err(&ftdi->udev->dev, "retry limit reached\n");
+                                               continue;
+                                       }
+                               }
+                       } else if (packet_bytes > 0) {
+                               if (read_stop-- > 0) {
+                                       goto read;
+                               } else {
+                                       dev_err(&ftdi->udev->dev, "retry limit reached\n");
+                                       continue;
+                               }
+                       } else if (retval == -ETIMEDOUT) {
+                               if (retry_on_timeout-- > 0) {
+                                       goto read;
+                               } else {
+                                       dev_err(&ftdi->udev->dev, "TIMED OUT retry limit reached\n");
+                                       continue;
+                               }
+                       } else if (retval == 0) {
+                               if (retry_on_empty-- > 0) {
+                                       goto read;
+                               } else {
+                                       dev_err(&ftdi->udev->dev, "empty packet retry limit reached\n");
+                                       continue;
+                               }
+                       } else {
+                               err_count += 1;
+                               dev_err(&ftdi->udev->dev, "error = %d\n",
+                                       retval);
+                               if (read_stop-- > 0) {
+                                       goto read;
+                               } else {
+                                       dev_err(&ftdi->udev->dev, "retry limit reached\n");
+                                       continue;
+                               }
+                       }
+               }
+       }
+       dev_err(&ftdi->udev->dev, "failed to synchronize\n");
+       return -EFAULT;
 }
 
 static int ftdi_elan_stuck_waiting(struct usb_ftdi *ftdi)
 {
-        int retry_on_empty = 10;
-        int retry_on_timeout = 5;
-        int retry_on_status = 50;
-      more:{
-                int packet_bytes = 0;
-                int retval = usb_bulk_msg(ftdi->udev,
-                        usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
-                         ftdi->bulk_in_buffer, ftdi->bulk_in_size,
-                        &packet_bytes, 1000);
-                if (packet_bytes > 2) {
-                        char diag[30 *3 + 4];
-                        char *d = diag;
-                        int m = (sizeof(diag) - 1) / 3;
-                        char *b = ftdi->bulk_in_buffer;
-                        int bytes_read = 0;
-                        diag[0] = 0;
-                        while (packet_bytes-- > 0) {
-                                char c = *b++;
-                                if (bytes_read < m) {
-                                        d += sprintf(d, " %02X",
-                                                0x000000FF & c);
-                                } else if (bytes_read > m) {
-                                } else
-                                        d += sprintf(d, " ..");
-                                bytes_read += 1;
-                                continue;
-                        }
-                        goto more;
-                } else if (packet_bytes > 1) {
-                        char s1 = ftdi->bulk_in_buffer[0];
-                        char s2 = ftdi->bulk_in_buffer[1];
-                        if (s1 == 0x31 && s2 == 0x60) {
-                                return 0;
-                        } else if (retry_on_status-- > 0) {
-                                msleep(5);
-                                goto more;
-                        } else
-                                return -EFAULT;
-                } else if (packet_bytes > 0) {
-                        char b1 = ftdi->bulk_in_buffer[0];
-                        dev_err(&ftdi->udev->dev, "only one byte flushed from F"
-                                "TDI = %02X\n", b1);
-                        if (retry_on_status-- > 0) {
-                                msleep(5);
-                                goto more;
-                        } else {
-                                dev_err(&ftdi->udev->dev, "STATUS ERROR retry l"
-                                        "imit reached\n");
-                                return -EFAULT;
-                        }
-                } else if (retval == -ETIMEDOUT) {
-                        if (retry_on_timeout-- > 0) {
-                                goto more;
-                        } else {
-                                dev_err(&ftdi->udev->dev, "TIMED OUT retry limi"
-                                        "t reached\n");
-                                return -ENOMEM;
-                        }
-                } else if (retval == 0) {
-                        if (retry_on_empty-- > 0) {
-                                goto more;
-                        } else {
-                                dev_err(&ftdi->udev->dev, "empty packet retry l"
-                                        "imit reached\n");
-                                return -ENOMEM;
-                        }
-                } else {
-                        dev_err(&ftdi->udev->dev, "error = %d\n", retval);
-                        return -ENOMEM;
-                }
-        }
-        return -1;
+       int retry_on_empty = 10;
+       int retry_on_timeout = 5;
+       int retry_on_status = 50;
+more:{
+               int packet_bytes = 0;
+               int retval = usb_bulk_msg(ftdi->udev,
+                                         usb_rcvbulkpipe(ftdi->udev, ftdi->bulk_in_endpointAddr),
+                                         ftdi->bulk_in_buffer, ftdi->bulk_in_size,
+                                         &packet_bytes, 1000);
+               if (packet_bytes > 2) {
+                       char diag[30 *3 + 4];
+                       char *d = diag;
+                       int m = (sizeof(diag) - 1) / 3;
+                       char *b = ftdi->bulk_in_buffer;
+                       int bytes_read = 0;
+                       diag[0] = 0;
+                       while (packet_bytes-- > 0) {
+                               char c = *b++;
+                               if (bytes_read < m) {
+                                       d += sprintf(d, " %02X",
+                                                    0x000000FF & c);
+                               } else if (bytes_read > m) {
+                               } else
+                                       d += sprintf(d, " ..");
+                               bytes_read += 1;
+                               continue;
+                       }
+                       goto more;
+               } else if (packet_bytes > 1) {
+                       char s1 = ftdi->bulk_in_buffer[0];
+                       char s2 = ftdi->bulk_in_buffer[1];
+                       if (s1 == 0x31 && s2 == 0x60) {
+                               return 0;
+                       } else if (retry_on_status-- > 0) {
+                               msleep(5);
+                               goto more;
+                       } else
+                               return -EFAULT;
+               } else if (packet_bytes > 0) {
+                       char b1 = ftdi->bulk_in_buffer[0];
+                       dev_err(&ftdi->udev->dev, "only one byte flushed from FTDI = %02X\n", b1);
+                       if (retry_on_status-- > 0) {
+                               msleep(5);
+                               goto more;
+                       } else {
+                               dev_err(&ftdi->udev->dev, "STATUS ERROR retry limit reached\n");
+                               return -EFAULT;
+                       }
+               } else if (retval == -ETIMEDOUT) {
+                       if (retry_on_timeout-- > 0) {
+                               goto more;
+                       } else {
+                               dev_err(&ftdi->udev->dev, "TIMED OUT retry limit reached\n");
+                               return -ENOMEM;
+                       }
+               } else if (retval == 0) {
+                       if (retry_on_empty-- > 0) {
+                               goto more;
+                       } else {
+                               dev_err(&ftdi->udev->dev, "empty packet retry limit reached\n");
+                               return -ENOMEM;
+                       }
+               } else {
+                       dev_err(&ftdi->udev->dev, "error = %d\n", retval);
+                       return -ENOMEM;
+               }
+       }
+       return -1;
 }
 
 static int ftdi_elan_checkingPCI(struct usb_ftdi *ftdi)
 {
-        int UxxxStatus = ftdi_elan_read_reg(ftdi, &ftdi->controlreg);
-        if (UxxxStatus)
-                return UxxxStatus;
-        if (ftdi->controlreg & 0x00400000) {
-                if (ftdi->card_ejected) {
-                } else {
-                        ftdi->card_ejected = 1;
-                        dev_err(&ftdi->udev->dev, "CARD EJECTED - controlreg = "
-                                "%08X\n", ftdi->controlreg);
-                }
-                return -ENODEV;
-        } else {
-                u8 fn = ftdi->function - 1;
-                int activePCIfn = fn << 8;
-                u32 pcidata;
-                u32 pciVID;
-                u32 pciPID;
-                int reg = 0;
-                UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                        &pcidata);
-                if (UxxxStatus)
-                        return UxxxStatus;
-                pciVID = pcidata & 0xFFFF;
-                pciPID = (pcidata >> 16) & 0xFFFF;
-                if (pciVID == ftdi->platform_data.vendor && pciPID ==
-                        ftdi->platform_data.device) {
-                        return 0;
-                } else {
-                        dev_err(&ftdi->udev->dev, "vendor=%04X pciVID=%04X devi"
-                                "ce=%04X pciPID=%04X\n",
-                                ftdi->platform_data.vendor, pciVID,
-                                ftdi->platform_data.device, pciPID);
-                        return -ENODEV;
-                }
-        }
+       int UxxxStatus = ftdi_elan_read_reg(ftdi, &ftdi->controlreg);
+       if (UxxxStatus)
+               return UxxxStatus;
+       if (ftdi->controlreg & 0x00400000) {
+               if (ftdi->card_ejected) {
+               } else {
+                       ftdi->card_ejected = 1;
+                       dev_err(&ftdi->udev->dev, "CARD EJECTED - controlreg = %08X\n",
+                               ftdi->controlreg);
+               }
+               return -ENODEV;
+       } else {
+               u8 fn = ftdi->function - 1;
+               int activePCIfn = fn << 8;
+               u32 pcidata;
+               u32 pciVID;
+               u32 pciPID;
+               int reg = 0;
+               UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                                  &pcidata);
+               if (UxxxStatus)
+                       return UxxxStatus;
+               pciVID = pcidata & 0xFFFF;
+               pciPID = (pcidata >> 16) & 0xFFFF;
+               if (pciVID == ftdi->platform_data.vendor && pciPID ==
+                   ftdi->platform_data.device) {
+                       return 0;
+               } else {
+                       dev_err(&ftdi->udev->dev, "vendor=%04X pciVID=%04X device=%04X pciPID=%04X\n",
+                               ftdi->platform_data.vendor, pciVID,
+                               ftdi->platform_data.device, pciPID);
+                       return -ENODEV;
+               }
+       }
 }
 
 
 #define ftdi_read_pcimem(ftdi, member, data) ftdi_elan_read_pcimem(ftdi, \
-        offsetof(struct ohci_regs, member), 0, data);
+                                                                  offsetof(struct ohci_regs, member), 0, data);
 #define ftdi_write_pcimem(ftdi, member, data) ftdi_elan_write_pcimem(ftdi, \
-        offsetof(struct ohci_regs, member), 0, data);
+                                                                    offsetof(struct ohci_regs, member), 0, data);
 
 #define OHCI_CONTROL_INIT OHCI_CTRL_CBSR
-#define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD | \
-        OHCI_INTR_WDH)
+#define OHCI_INTR_INIT (OHCI_INTR_MIE | OHCI_INTR_UE | OHCI_INTR_RD |  \
+                       OHCI_INTR_WDH)
 static int ftdi_elan_check_controller(struct usb_ftdi *ftdi, int quirk)
 {
-        int devices = 0;
-        int retval;
-        u32 hc_control;
-        int num_ports;
-        u32 control;
-        u32 rh_a = -1;
-        u32 status;
-        u32 fminterval;
-        u32 hc_fminterval;
-        u32 periodicstart;
-        u32 cmdstatus;
-        u32 roothub_a;
-        int mask = OHCI_INTR_INIT;
-        int sleep_time = 0;
-        int reset_timeout = 30;        /* ... allow extra time */
-        int temp;
-        retval = ftdi_write_pcimem(ftdi, intrdisable, OHCI_INTR_MIE);
-        if (retval)
-                return retval;
-        retval = ftdi_read_pcimem(ftdi, control, &control);
-        if (retval)
-                return retval;
-        retval = ftdi_read_pcimem(ftdi, roothub.a, &rh_a);
-        if (retval)
-                return retval;
-        num_ports = rh_a & RH_A_NDP;
-        retval = ftdi_read_pcimem(ftdi, fminterval, &hc_fminterval);
-        if (retval)
-                return retval;
-        hc_fminterval &= 0x3fff;
-        if (hc_fminterval != FI) {
-        }
-        hc_fminterval |= FSMP(hc_fminterval) << 16;
-        retval = ftdi_read_pcimem(ftdi, control, &hc_control);
-        if (retval)
-                return retval;
-        switch (hc_control & OHCI_CTRL_HCFS) {
-        case OHCI_USB_OPER:
-                sleep_time = 0;
-                break;
-        case OHCI_USB_SUSPEND:
-        case OHCI_USB_RESUME:
-                hc_control &= OHCI_CTRL_RWC;
-                hc_control |= OHCI_USB_RESUME;
-                sleep_time = 10;
-                break;
-        default:
-                hc_control &= OHCI_CTRL_RWC;
-                hc_control |= OHCI_USB_RESET;
-                sleep_time = 50;
-                break;
-        }
-        retval = ftdi_write_pcimem(ftdi, control, hc_control);
-        if (retval)
-                return retval;
-        retval = ftdi_read_pcimem(ftdi, control, &control);
-        if (retval)
-                return retval;
-        msleep(sleep_time);
-        retval = ftdi_read_pcimem(ftdi, roothub.a, &roothub_a);
-        if (retval)
-                return retval;
-        if (!(roothub_a & RH_A_NPS)) {        /* power down each port */
-                for (temp = 0; temp < num_ports; temp++) {
-                        retval = ftdi_write_pcimem(ftdi,
-                                roothub.portstatus[temp], RH_PS_LSDA);
-                        if (retval)
-                                return retval;
-                }
-        }
-        retval = ftdi_read_pcimem(ftdi, control, &control);
-        if (retval)
-                return retval;
-      retry:retval = ftdi_read_pcimem(ftdi, cmdstatus, &status);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, cmdstatus, OHCI_HCR);
-        if (retval)
-                return retval;
-      extra:{
-                retval = ftdi_read_pcimem(ftdi, cmdstatus, &status);
-                if (retval)
-                        return retval;
-                if (0 != (status & OHCI_HCR)) {
-                        if (--reset_timeout == 0) {
-                                dev_err(&ftdi->udev->dev, "USB HC reset timed o"
-                                        "ut!\n");
-                                return -ENODEV;
-                        } else {
-                                msleep(5);
-                                goto extra;
-                        }
-                }
-        }
-        if (quirk & OHCI_QUIRK_INITRESET) {
-                retval = ftdi_write_pcimem(ftdi, control, hc_control);
-                if (retval)
-                        return retval;
-                retval = ftdi_read_pcimem(ftdi, control, &control);
-                if (retval)
-                        return retval;
-        }
-        retval = ftdi_write_pcimem(ftdi, ed_controlhead, 0x00000000);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, ed_bulkhead, 0x11000000);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, hcca, 0x00000000);
-        if (retval)
-                return retval;
-        retval = ftdi_read_pcimem(ftdi, fminterval, &fminterval);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, fminterval,
-                ((fminterval & FIT) ^ FIT) | hc_fminterval);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, periodicstart,
-                ((9 *hc_fminterval) / 10) & 0x3fff);
-        if (retval)
-                return retval;
-        retval = ftdi_read_pcimem(ftdi, fminterval, &fminterval);
-        if (retval)
-                return retval;
-        retval = ftdi_read_pcimem(ftdi, periodicstart, &periodicstart);
-        if (retval)
-                return retval;
-        if (0 == (fminterval & 0x3fff0000) || 0 == periodicstart) {
-                if (!(quirk & OHCI_QUIRK_INITRESET)) {
-                        quirk |= OHCI_QUIRK_INITRESET;
-                        goto retry;
-                } else
-                        dev_err(&ftdi->udev->dev, "init err(%08x %04x)\n",
-                                fminterval, periodicstart);
-        }                        /* start controller operations */
-        hc_control &= OHCI_CTRL_RWC;
-        hc_control |= OHCI_CONTROL_INIT | OHCI_CTRL_BLE | OHCI_USB_OPER;
-        retval = ftdi_write_pcimem(ftdi, control, hc_control);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, cmdstatus, OHCI_BLF);
-        if (retval)
-                return retval;
-        retval = ftdi_read_pcimem(ftdi, cmdstatus, &cmdstatus);
-        if (retval)
-                return retval;
-        retval = ftdi_read_pcimem(ftdi, control, &control);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, roothub.status, RH_HS_DRWE);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, intrstatus, mask);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, intrdisable,
-                OHCI_INTR_MIE | OHCI_INTR_OC | OHCI_INTR_RHSC | OHCI_INTR_FNO |
-                OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_SF | OHCI_INTR_WDH |
-                OHCI_INTR_SO);
-        if (retval)
-                return retval;        /* handle root hub init quirks ... */
-        retval = ftdi_read_pcimem(ftdi, roothub.a, &roothub_a);
-        if (retval)
-                return retval;
-        roothub_a &= ~(RH_A_PSM | RH_A_OCPM);
-        if (quirk & OHCI_QUIRK_SUPERIO) {
-                roothub_a |= RH_A_NOCP;
-                roothub_a &= ~(RH_A_POTPGT | RH_A_NPS);
-                retval = ftdi_write_pcimem(ftdi, roothub.a, roothub_a);
-                if (retval)
-                        return retval;
-        } else if ((quirk & OHCI_QUIRK_AMD756) || distrust_firmware) {
-                roothub_a |= RH_A_NPS;
-                retval = ftdi_write_pcimem(ftdi, roothub.a, roothub_a);
-                if (retval)
-                        return retval;
-        }
-        retval = ftdi_write_pcimem(ftdi, roothub.status, RH_HS_LPSC);
-        if (retval)
-                return retval;
-        retval = ftdi_write_pcimem(ftdi, roothub.b,
-                (roothub_a & RH_A_NPS) ? 0 : RH_B_PPCM);
-        if (retval)
-                return retval;
-        retval = ftdi_read_pcimem(ftdi, control, &control);
-        if (retval)
-                return retval;
-        mdelay((roothub_a >> 23) & 0x1fe);
-        for (temp = 0; temp < num_ports; temp++) {
-                u32 portstatus;
-                retval = ftdi_read_pcimem(ftdi, roothub.portstatus[temp],
-                        &portstatus);
-                if (retval)
-                        return retval;
-                if (1 & portstatus)
-                        devices += 1;
-        }
-        return devices;
+       int devices = 0;
+       int retval;
+       u32 hc_control;
+       int num_ports;
+       u32 control;
+       u32 rh_a = -1;
+       u32 status;
+       u32 fminterval;
+       u32 hc_fminterval;
+       u32 periodicstart;
+       u32 cmdstatus;
+       u32 roothub_a;
+       int mask = OHCI_INTR_INIT;
+       int sleep_time = 0;
+       int reset_timeout = 30;        /* ... allow extra time */
+       int temp;
+       retval = ftdi_write_pcimem(ftdi, intrdisable, OHCI_INTR_MIE);
+       if (retval)
+               return retval;
+       retval = ftdi_read_pcimem(ftdi, control, &control);
+       if (retval)
+               return retval;
+       retval = ftdi_read_pcimem(ftdi, roothub.a, &rh_a);
+       if (retval)
+               return retval;
+       num_ports = rh_a & RH_A_NDP;
+       retval = ftdi_read_pcimem(ftdi, fminterval, &hc_fminterval);
+       if (retval)
+               return retval;
+       hc_fminterval &= 0x3fff;
+       if (hc_fminterval != FI) {
+       }
+       hc_fminterval |= FSMP(hc_fminterval) << 16;
+       retval = ftdi_read_pcimem(ftdi, control, &hc_control);
+       if (retval)
+               return retval;
+       switch (hc_control & OHCI_CTRL_HCFS) {
+       case OHCI_USB_OPER:
+               sleep_time = 0;
+               break;
+       case OHCI_USB_SUSPEND:
+       case OHCI_USB_RESUME:
+               hc_control &= OHCI_CTRL_RWC;
+               hc_control |= OHCI_USB_RESUME;
+               sleep_time = 10;
+               break;
+       default:
+               hc_control &= OHCI_CTRL_RWC;
+               hc_control |= OHCI_USB_RESET;
+               sleep_time = 50;
+               break;
+       }
+       retval = ftdi_write_pcimem(ftdi, control, hc_control);
+       if (retval)
+               return retval;
+       retval = ftdi_read_pcimem(ftdi, control, &control);
+       if (retval)
+               return retval;
+       msleep(sleep_time);
+       retval = ftdi_read_pcimem(ftdi, roothub.a, &roothub_a);
+       if (retval)
+               return retval;
+       if (!(roothub_a & RH_A_NPS)) {        /* power down each port */
+               for (temp = 0; temp < num_ports; temp++) {
+                       retval = ftdi_write_pcimem(ftdi,
+                                                  roothub.portstatus[temp], RH_PS_LSDA);
+                       if (retval)
+                               return retval;
+               }
+       }
+       retval = ftdi_read_pcimem(ftdi, control, &control);
+       if (retval)
+               return retval;
+retry:retval = ftdi_read_pcimem(ftdi, cmdstatus, &status);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, cmdstatus, OHCI_HCR);
+       if (retval)
+               return retval;
+extra:{
+               retval = ftdi_read_pcimem(ftdi, cmdstatus, &status);
+               if (retval)
+                       return retval;
+               if (0 != (status & OHCI_HCR)) {
+                       if (--reset_timeout == 0) {
+                               dev_err(&ftdi->udev->dev, "USB HC reset timed out!\n");
+                               return -ENODEV;
+                       } else {
+                               msleep(5);
+                               goto extra;
+                       }
+               }
+       }
+       if (quirk & OHCI_QUIRK_INITRESET) {
+               retval = ftdi_write_pcimem(ftdi, control, hc_control);
+               if (retval)
+                       return retval;
+               retval = ftdi_read_pcimem(ftdi, control, &control);
+               if (retval)
+                       return retval;
+       }
+       retval = ftdi_write_pcimem(ftdi, ed_controlhead, 0x00000000);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, ed_bulkhead, 0x11000000);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, hcca, 0x00000000);
+       if (retval)
+               return retval;
+       retval = ftdi_read_pcimem(ftdi, fminterval, &fminterval);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, fminterval,
+                                  ((fminterval & FIT) ^ FIT) | hc_fminterval);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, periodicstart,
+                                  ((9 *hc_fminterval) / 10) & 0x3fff);
+       if (retval)
+               return retval;
+       retval = ftdi_read_pcimem(ftdi, fminterval, &fminterval);
+       if (retval)
+               return retval;
+       retval = ftdi_read_pcimem(ftdi, periodicstart, &periodicstart);
+       if (retval)
+               return retval;
+       if (0 == (fminterval & 0x3fff0000) || 0 == periodicstart) {
+               if (!(quirk & OHCI_QUIRK_INITRESET)) {
+                       quirk |= OHCI_QUIRK_INITRESET;
+                       goto retry;
+               } else
+                       dev_err(&ftdi->udev->dev, "init err(%08x %04x)\n",
+                               fminterval, periodicstart);
+       }                        /* start controller operations */
+       hc_control &= OHCI_CTRL_RWC;
+       hc_control |= OHCI_CONTROL_INIT | OHCI_CTRL_BLE | OHCI_USB_OPER;
+       retval = ftdi_write_pcimem(ftdi, control, hc_control);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, cmdstatus, OHCI_BLF);
+       if (retval)
+               return retval;
+       retval = ftdi_read_pcimem(ftdi, cmdstatus, &cmdstatus);
+       if (retval)
+               return retval;
+       retval = ftdi_read_pcimem(ftdi, control, &control);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, roothub.status, RH_HS_DRWE);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, intrstatus, mask);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, intrdisable,
+                                  OHCI_INTR_MIE | OHCI_INTR_OC | OHCI_INTR_RHSC | OHCI_INTR_FNO |
+                                  OHCI_INTR_UE | OHCI_INTR_RD | OHCI_INTR_SF | OHCI_INTR_WDH |
+                                  OHCI_INTR_SO);
+       if (retval)
+               return retval;        /* handle root hub init quirks ... */
+       retval = ftdi_read_pcimem(ftdi, roothub.a, &roothub_a);
+       if (retval)
+               return retval;
+       roothub_a &= ~(RH_A_PSM | RH_A_OCPM);
+       if (quirk & OHCI_QUIRK_SUPERIO) {
+               roothub_a |= RH_A_NOCP;
+               roothub_a &= ~(RH_A_POTPGT | RH_A_NPS);
+               retval = ftdi_write_pcimem(ftdi, roothub.a, roothub_a);
+               if (retval)
+                       return retval;
+       } else if ((quirk & OHCI_QUIRK_AMD756) || distrust_firmware) {
+               roothub_a |= RH_A_NPS;
+               retval = ftdi_write_pcimem(ftdi, roothub.a, roothub_a);
+               if (retval)
+                       return retval;
+       }
+       retval = ftdi_write_pcimem(ftdi, roothub.status, RH_HS_LPSC);
+       if (retval)
+               return retval;
+       retval = ftdi_write_pcimem(ftdi, roothub.b,
+                                  (roothub_a & RH_A_NPS) ? 0 : RH_B_PPCM);
+       if (retval)
+               return retval;
+       retval = ftdi_read_pcimem(ftdi, control, &control);
+       if (retval)
+               return retval;
+       mdelay((roothub_a >> 23) & 0x1fe);
+       for (temp = 0; temp < num_ports; temp++) {
+               u32 portstatus;
+               retval = ftdi_read_pcimem(ftdi, roothub.portstatus[temp],
+                                         &portstatus);
+               if (retval)
+                       return retval;
+               if (1 & portstatus)
+                       devices += 1;
+       }
+       return devices;
 }
 
 static int ftdi_elan_setup_controller(struct usb_ftdi *ftdi, int fn)
 {
-        u32 latence_timer;
-        int UxxxStatus;
-        u32 pcidata;
-        int reg = 0;
-        int activePCIfn = fn << 8;
-        UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000025FL | 0x2800);
-        if (UxxxStatus)
-                return UxxxStatus;
-        reg = 16;
-        UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
-                0xFFFFFFFF);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &pcidata);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
-                0xF0000000);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &pcidata);
-        if (UxxxStatus)
-                return UxxxStatus;
-        reg = 12;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &latence_timer);
-        if (UxxxStatus)
-                return UxxxStatus;
-        latence_timer &= 0xFFFF00FF;
-        latence_timer |= 0x00001600;
-        UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
-                latence_timer);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &pcidata);
-        if (UxxxStatus)
-                return UxxxStatus;
-        reg = 4;
-        UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
-                0x06);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &pcidata);
-        if (UxxxStatus)
-                return UxxxStatus;
-        for (reg = 0; reg <= 0x54; reg += 4) {
-                UxxxStatus = ftdi_elan_read_pcimem(ftdi, reg, 0, &pcidata);
-                if (UxxxStatus)
-                        return UxxxStatus;
-        }
-        return 0;
+       u32 latence_timer;
+       int UxxxStatus;
+       u32 pcidata;
+       int reg = 0;
+       int activePCIfn = fn << 8;
+       UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000025FL | 0x2800);
+       if (UxxxStatus)
+               return UxxxStatus;
+       reg = 16;
+       UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
+                                           0xFFFFFFFF);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &pcidata);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
+                                           0xF0000000);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &pcidata);
+       if (UxxxStatus)
+               return UxxxStatus;
+       reg = 12;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &latence_timer);
+       if (UxxxStatus)
+               return UxxxStatus;
+       latence_timer &= 0xFFFF00FF;
+       latence_timer |= 0x00001600;
+       UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
+                                           latence_timer);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &pcidata);
+       if (UxxxStatus)
+               return UxxxStatus;
+       reg = 4;
+       UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
+                                           0x06);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &pcidata);
+       if (UxxxStatus)
+               return UxxxStatus;
+       for (reg = 0; reg <= 0x54; reg += 4) {
+               UxxxStatus = ftdi_elan_read_pcimem(ftdi, reg, 0, &pcidata);
+               if (UxxxStatus)
+                       return UxxxStatus;
+       }
+       return 0;
 }
 
 static int ftdi_elan_close_controller(struct usb_ftdi *ftdi, int fn)
 {
-        u32 latence_timer;
-        int UxxxStatus;
-        u32 pcidata;
-        int reg = 0;
-        int activePCIfn = fn << 8;
-        UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000025FL | 0x2800);
-        if (UxxxStatus)
-                return UxxxStatus;
-        reg = 16;
-        UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
-                0xFFFFFFFF);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &pcidata);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
-                0x00000000);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &pcidata);
-        if (UxxxStatus)
-                return UxxxStatus;
-        reg = 12;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &latence_timer);
-        if (UxxxStatus)
-                return UxxxStatus;
-        latence_timer &= 0xFFFF00FF;
-        latence_timer |= 0x00001600;
-        UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
-                latence_timer);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &pcidata);
-        if (UxxxStatus)
-                return UxxxStatus;
-        reg = 4;
-        UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
-                0x00);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                &pcidata);
-        if (UxxxStatus)
-                return UxxxStatus;
-        return 0;
+       u32 latence_timer;
+       int UxxxStatus;
+       u32 pcidata;
+       int reg = 0;
+       int activePCIfn = fn << 8;
+       UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000025FL | 0x2800);
+       if (UxxxStatus)
+               return UxxxStatus;
+       reg = 16;
+       UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
+                                           0xFFFFFFFF);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &pcidata);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0,
+                                           0x00000000);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &pcidata);
+       if (UxxxStatus)
+               return UxxxStatus;
+       reg = 12;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &latence_timer);
+       if (UxxxStatus)
+               return UxxxStatus;
+       latence_timer &= 0xFFFF00FF;
+       latence_timer |= 0x00001600;
+       UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
+                                           latence_timer);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &pcidata);
+       if (UxxxStatus)
+               return UxxxStatus;
+       reg = 4;
+       UxxxStatus = ftdi_elan_write_config(ftdi, activePCIfn | reg, 0x00,
+                                           0x00);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                          &pcidata);
+       if (UxxxStatus)
+               return UxxxStatus;
+       return 0;
 }
 
 static int ftdi_elan_found_controller(struct usb_ftdi *ftdi, int fn, int quirk)
 {
-        int result;
-        int UxxxStatus;
-        UxxxStatus = ftdi_elan_setup_controller(ftdi, fn);
-        if (UxxxStatus)
-                return UxxxStatus;
-        result = ftdi_elan_check_controller(ftdi, quirk);
-        UxxxStatus = ftdi_elan_close_controller(ftdi, fn);
-        if (UxxxStatus)
-                return UxxxStatus;
-        return result;
+       int result;
+       int UxxxStatus;
+       UxxxStatus = ftdi_elan_setup_controller(ftdi, fn);
+       if (UxxxStatus)
+               return UxxxStatus;
+       result = ftdi_elan_check_controller(ftdi, quirk);
+       UxxxStatus = ftdi_elan_close_controller(ftdi, fn);
+       if (UxxxStatus)
+               return UxxxStatus;
+       return result;
 }
 
 static int ftdi_elan_enumeratePCI(struct usb_ftdi *ftdi)
 {
-        u32 controlreg;
-        u8 sensebits;
-        int UxxxStatus;
-        UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_write_reg(ftdi, 0x00000000L);
-        if (UxxxStatus)
-                return UxxxStatus;
-        msleep(750);
-        UxxxStatus = ftdi_elan_write_reg(ftdi, 0x00000200L | 0x100);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_write_reg(ftdi, 0x00000200L | 0x500);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000020CL | 0x000);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000020DL | 0x000);
-        if (UxxxStatus)
-                return UxxxStatus;
-        msleep(250);
-        UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000020FL | 0x000);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000025FL | 0x800);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
-        if (UxxxStatus)
-                return UxxxStatus;
-        UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
-        if (UxxxStatus)
-                return UxxxStatus;
-        msleep(1000);
-        sensebits = (controlreg >> 16) & 0x000F;
-        if (0x0D == sensebits)
-                return 0;
-        else
+       u32 controlreg;
+       u8 sensebits;
+       int UxxxStatus;
+       UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_write_reg(ftdi, 0x00000000L);
+       if (UxxxStatus)
+               return UxxxStatus;
+       msleep(750);
+       UxxxStatus = ftdi_elan_write_reg(ftdi, 0x00000200L | 0x100);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_write_reg(ftdi, 0x00000200L | 0x500);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000020CL | 0x000);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000020DL | 0x000);
+       if (UxxxStatus)
+               return UxxxStatus;
+       msleep(250);
+       UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000020FL | 0x000);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_write_reg(ftdi, 0x0000025FL | 0x800);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
+       if (UxxxStatus)
+               return UxxxStatus;
+       UxxxStatus = ftdi_elan_read_reg(ftdi, &controlreg);
+       if (UxxxStatus)
+               return UxxxStatus;
+       msleep(1000);
+       sensebits = (controlreg >> 16) & 0x000F;
+       if (0x0D == sensebits)
+               return 0;
+       else
                return - ENXIO;
 }
 
 static int ftdi_elan_setupOHCI(struct usb_ftdi *ftdi)
 {
-        int UxxxStatus;
-        u32 pcidata;
-        int reg = 0;
-        u8 fn;
-        int activePCIfn = 0;
-        int max_devices = 0;
-        int controllers = 0;
-        int unrecognized = 0;
-        ftdi->function = 0;
-        for (fn = 0; (fn < 4); fn++) {
-                u32 pciVID = 0;
-                u32 pciPID = 0;
-                int devices = 0;
-                activePCIfn = fn << 8;
-                UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
-                        &pcidata);
-                if (UxxxStatus)
-                        return UxxxStatus;
-                pciVID = pcidata & 0xFFFF;
-                pciPID = (pcidata >> 16) & 0xFFFF;
-                if ((pciVID == PCI_VENDOR_ID_OPTI) && (pciPID == 0xc861)) {
-                        devices = ftdi_elan_found_controller(ftdi, fn, 0);
-                        controllers += 1;
-                } else if ((pciVID == PCI_VENDOR_ID_NEC) && (pciPID == 0x0035))
-                        {
-                        devices = ftdi_elan_found_controller(ftdi, fn, 0);
-                        controllers += 1;
-                } else if ((pciVID == PCI_VENDOR_ID_AL) && (pciPID == 0x5237)) {
-                        devices = ftdi_elan_found_controller(ftdi, fn, 0);
-                        controllers += 1;
-                } else if ((pciVID == PCI_VENDOR_ID_ATT) && (pciPID == 0x5802))
-                        {
-                        devices = ftdi_elan_found_controller(ftdi, fn, 0);
-                        controllers += 1;
-                } else if (pciVID == PCI_VENDOR_ID_AMD && pciPID == 0x740c) {
-                        devices = ftdi_elan_found_controller(ftdi, fn,
-                                OHCI_QUIRK_AMD756);
-                        controllers += 1;
-                } else if (pciVID == PCI_VENDOR_ID_COMPAQ && pciPID == 0xa0f8) {
-                        devices = ftdi_elan_found_controller(ftdi, fn,
-                                OHCI_QUIRK_ZFMICRO);
-                        controllers += 1;
-                } else if (0 == pcidata) {
-                } else
-                        unrecognized += 1;
-                if (devices > max_devices) {
-                        max_devices = devices;
-                        ftdi->function = fn + 1;
-                        ftdi->platform_data.vendor = pciVID;
-                        ftdi->platform_data.device = pciPID;
-                }
-        }
-        if (ftdi->function > 0) {
-                UxxxStatus = ftdi_elan_setup_controller(ftdi,
-                        ftdi->function - 1);
-                if (UxxxStatus)
-                        return UxxxStatus;
-                return 0;
-        } else if (controllers > 0) {
-                return -ENXIO;
-        } else if (unrecognized > 0) {
-                return -ENXIO;
-        } else {
-                ftdi->enumerated = 0;
-                return -ENXIO;
-        }
+       int UxxxStatus;
+       u32 pcidata;
+       int reg = 0;
+       u8 fn;
+       int activePCIfn = 0;
+       int max_devices = 0;
+       int controllers = 0;
+       int unrecognized = 0;
+       ftdi->function = 0;
+       for (fn = 0; (fn < 4); fn++) {
+               u32 pciVID = 0;
+               u32 pciPID = 0;
+               int devices = 0;
+               activePCIfn = fn << 8;
+               UxxxStatus = ftdi_elan_read_config(ftdi, activePCIfn | reg, 0,
+                                                  &pcidata);
+               if (UxxxStatus)
+                       return UxxxStatus;
+               pciVID = pcidata & 0xFFFF;
+               pciPID = (pcidata >> 16) & 0xFFFF;
+               if ((pciVID == PCI_VENDOR_ID_OPTI) && (pciPID == 0xc861)) {
+                       devices = ftdi_elan_found_controller(ftdi, fn, 0);
+                       controllers += 1;
+               } else if ((pciVID == PCI_VENDOR_ID_NEC) && (pciPID == 0x0035))
+               {
+                       devices = ftdi_elan_found_controller(ftdi, fn, 0);
+                       controllers += 1;
+               } else if ((pciVID == PCI_VENDOR_ID_AL) && (pciPID == 0x5237)) {
+                       devices = ftdi_elan_found_controller(ftdi, fn, 0);
+                       controllers += 1;
+               } else if ((pciVID == PCI_VENDOR_ID_ATT) && (pciPID == 0x5802))
+               {
+                       devices = ftdi_elan_found_controller(ftdi, fn, 0);
+                       controllers += 1;
+               } else if (pciVID == PCI_VENDOR_ID_AMD && pciPID == 0x740c) {
+                       devices = ftdi_elan_found_controller(ftdi, fn,
+                                                            OHCI_QUIRK_AMD756);
+                       controllers += 1;
+               } else if (pciVID == PCI_VENDOR_ID_COMPAQ && pciPID == 0xa0f8) {
+                       devices = ftdi_elan_found_controller(ftdi, fn,
+                                                            OHCI_QUIRK_ZFMICRO);
+                       controllers += 1;
+               } else if (0 == pcidata) {
+               } else
+                       unrecognized += 1;
+               if (devices > max_devices) {
+                       max_devices = devices;
+                       ftdi->function = fn + 1;
+                       ftdi->platform_data.vendor = pciVID;
+                       ftdi->platform_data.device = pciPID;
+               }
+       }
+       if (ftdi->function > 0) {
+               UxxxStatus = ftdi_elan_setup_controller(ftdi,
+                                                       ftdi->function - 1);
+               if (UxxxStatus)
+                       return UxxxStatus;
+               return 0;
+       } else if (controllers > 0) {
+               return -ENXIO;
+       } else if (unrecognized > 0) {
+               return -ENXIO;
+       } else {
+               ftdi->enumerated = 0;
+               return -ENXIO;
+       }
 }
 
 
 /*
-* we use only the first bulk-in and bulk-out endpoints
-*/
+ * we use only the first bulk-in and bulk-out endpoints
+ */
 static int ftdi_elan_probe(struct usb_interface *interface,
-        const struct usb_device_id *id)
+                          const struct usb_device_id *id)
 {
-        struct usb_host_interface *iface_desc;
-        struct usb_endpoint_descriptor *endpoint;
-        size_t buffer_size;
-        int i;
-        int retval = -ENOMEM;
-        struct usb_ftdi *ftdi;
+       struct usb_host_interface *iface_desc;
+       struct usb_endpoint_descriptor *endpoint;
+       size_t buffer_size;
+       int i;
+       int retval = -ENOMEM;
+       struct usb_ftdi *ftdi;
 
        ftdi = kzalloc(sizeof(struct usb_ftdi), GFP_KERNEL);
-       if (!ftdi) {
-                printk(KERN_ERR "Out of memory\n");
-                return -ENOMEM;
-        }
-
-        mutex_lock(&ftdi_module_lock);
-        list_add_tail(&ftdi->ftdi_list, &ftdi_static_list);
-        ftdi->sequence_num = ++ftdi_instances;
-        mutex_unlock(&ftdi_module_lock);
-        ftdi_elan_init_kref(ftdi);
+       if (!ftdi)
+               return -ENOMEM;
+
+       mutex_lock(&ftdi_module_lock);
+       list_add_tail(&ftdi->ftdi_list, &ftdi_static_list);
+       ftdi->sequence_num = ++ftdi_instances;
+       mutex_unlock(&ftdi_module_lock);
+       ftdi_elan_init_kref(ftdi);
        sema_init(&ftdi->sw_lock, 1);
-        ftdi->udev = usb_get_dev(interface_to_usbdev(interface));
-        ftdi->interface = interface;
-        mutex_init(&ftdi->u132_lock);
-        ftdi->expected = 4;
-        iface_desc = interface->cur_altsetting;
-        for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
-                endpoint = &iface_desc->endpoint[i].desc;
-                if (!ftdi->bulk_in_endpointAddr &&
+       ftdi->udev = usb_get_dev(interface_to_usbdev(interface));
+       ftdi->interface = interface;
+       mutex_init(&ftdi->u132_lock);
+       ftdi->expected = 4;
+       iface_desc = interface->cur_altsetting;
+       for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
+               endpoint = &iface_desc->endpoint[i].desc;
+               if (!ftdi->bulk_in_endpointAddr &&
                    usb_endpoint_is_bulk_in(endpoint)) {
-                        buffer_size = usb_endpoint_maxp(endpoint);
-                        ftdi->bulk_in_size = buffer_size;
-                        ftdi->bulk_in_endpointAddr = endpoint->bEndpointAddress;
-                        ftdi->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
-                        if (!ftdi->bulk_in_buffer) {
-                                dev_err(&ftdi->udev->dev, "Could not allocate b"
-                                        "ulk_in_buffer\n");
-                                retval = -ENOMEM;
-                                goto error;
-                        }
-                }
-                if (!ftdi->bulk_out_endpointAddr &&
+                       buffer_size = usb_endpoint_maxp(endpoint);
+                       ftdi->bulk_in_size = buffer_size;
+                       ftdi->bulk_in_endpointAddr = endpoint->bEndpointAddress;
+                       ftdi->bulk_in_buffer = kmalloc(buffer_size, GFP_KERNEL);
+                       if (!ftdi->bulk_in_buffer) {
+                               dev_err(&ftdi->udev->dev, "Could not allocate bulk_in_buffer\n");
+                               retval = -ENOMEM;
+                               goto error;
+                       }
+               }
+               if (!ftdi->bulk_out_endpointAddr &&
                    usb_endpoint_is_bulk_out(endpoint)) {
-                        ftdi->bulk_out_endpointAddr =
-                                endpoint->bEndpointAddress;
-                }
-        }
-        if (!(ftdi->bulk_in_endpointAddr && ftdi->bulk_out_endpointAddr)) {
-                dev_err(&ftdi->udev->dev, "Could not find both bulk-in and bulk"
-                        "-out endpoints\n");
-                retval = -ENODEV;
-                goto error;
-        }
-        dev_info(&ftdi->udev->dev, "interface %d has I=%02X O=%02X\n",
-                iface_desc->desc.bInterfaceNumber, ftdi->bulk_in_endpointAddr,
-                ftdi->bulk_out_endpointAddr);
-        usb_set_intfdata(interface, ftdi);
-        if (iface_desc->desc.bInterfaceNumber == 0 &&
-                ftdi->bulk_in_endpointAddr == 0x81 &&
-                ftdi->bulk_out_endpointAddr == 0x02) {
-                retval = usb_register_dev(interface, &ftdi_elan_jtag_class);
-                if (retval) {
-                        dev_err(&ftdi->udev->dev, "Not able to get a minor for "
-                                "this device.\n");
-                        usb_set_intfdata(interface, NULL);
-                        retval = -ENOMEM;
-                        goto error;
-                } else {
-                        ftdi->class = &ftdi_elan_jtag_class;
-                        dev_info(&ftdi->udev->dev, "USB FDTI=%p JTAG interface "
-                                "%d now attached to ftdi%d\n", ftdi,
-                                iface_desc->desc.bInterfaceNumber,
-                                interface->minor);
-                        return 0;
-                }
-        } else if (iface_desc->desc.bInterfaceNumber == 1 &&
-                ftdi->bulk_in_endpointAddr == 0x83 &&
-                ftdi->bulk_out_endpointAddr == 0x04) {
-                ftdi->class = NULL;
-                dev_info(&ftdi->udev->dev, "USB FDTI=%p ELAN interface %d now a"
-                        "ctivated\n", ftdi, iface_desc->desc.bInterfaceNumber);
-                INIT_DELAYED_WORK(&ftdi->status_work, ftdi_elan_status_work);
-                INIT_DELAYED_WORK(&ftdi->command_work, ftdi_elan_command_work);
-                INIT_DELAYED_WORK(&ftdi->respond_work, ftdi_elan_respond_work);
-                ftdi_status_queue_work(ftdi, msecs_to_jiffies(3 *1000));
-                return 0;
-        } else {
-                dev_err(&ftdi->udev->dev,
-                        "Could not find ELAN's U132 device\n");
-                retval = -ENODEV;
-                goto error;
-        }
-      error:if (ftdi) {
-                ftdi_elan_put_kref(ftdi);
-        }
-        return retval;
+                       ftdi->bulk_out_endpointAddr =
+                               endpoint->bEndpointAddress;
+               }
+       }
+       if (!(ftdi->bulk_in_endpointAddr && ftdi->bulk_out_endpointAddr)) {
+               dev_err(&ftdi->udev->dev, "Could not find both bulk-in and bulk-out endpoints\n");
+               retval = -ENODEV;
+               goto error;
+       }
+       dev_info(&ftdi->udev->dev, "interface %d has I=%02X O=%02X\n",
+                iface_desc->desc.bInterfaceNumber, ftdi->bulk_in_endpointAddr,
+                ftdi->bulk_out_endpointAddr);
+       usb_set_intfdata(interface, ftdi);
+       if (iface_desc->desc.bInterfaceNumber == 0 &&
+           ftdi->bulk_in_endpointAddr == 0x81 &&
+           ftdi->bulk_out_endpointAddr == 0x02) {
+               retval = usb_register_dev(interface, &ftdi_elan_jtag_class);
+               if (retval) {
+                       dev_err(&ftdi->udev->dev, "Not able to get a minor for this device\n");
+                       usb_set_intfdata(interface, NULL);
+                       retval = -ENOMEM;
+                       goto error;
+               } else {
+                       ftdi->class = &ftdi_elan_jtag_class;
+                       dev_info(&ftdi->udev->dev, "USB FDTI=%p JTAG interface %d now attached to ftdi%d\n",
+                                ftdi, iface_desc->desc.bInterfaceNumber,
+                                interface->minor);
+                       return 0;
+               }
+       } else if (iface_desc->desc.bInterfaceNumber == 1 &&
+                  ftdi->bulk_in_endpointAddr == 0x83 &&
+                  ftdi->bulk_out_endpointAddr == 0x04) {
+               ftdi->class = NULL;
+               dev_info(&ftdi->udev->dev, "USB FDTI=%p ELAN interface %d now activated\n",
+                        ftdi, iface_desc->desc.bInterfaceNumber);
+               INIT_DELAYED_WORK(&ftdi->status_work, ftdi_elan_status_work);
+               INIT_DELAYED_WORK(&ftdi->command_work, ftdi_elan_command_work);
+               INIT_DELAYED_WORK(&ftdi->respond_work, ftdi_elan_respond_work);
+               ftdi_status_queue_work(ftdi, msecs_to_jiffies(3 *1000));
+               return 0;
+       } else {
+               dev_err(&ftdi->udev->dev,
+                       "Could not find ELAN's U132 device\n");
+               retval = -ENODEV;
+               goto error;
+       }
+error:if (ftdi) {
+               ftdi_elan_put_kref(ftdi);
+       }
+       return retval;
 }
 
 static void ftdi_elan_disconnect(struct usb_interface *interface)
 {
-        struct usb_ftdi *ftdi = usb_get_intfdata(interface);
-        ftdi->disconnected += 1;
-        if (ftdi->class) {
-                int minor = interface->minor;
-                struct usb_class_driver *class = ftdi->class;
-                usb_set_intfdata(interface, NULL);
-                usb_deregister_dev(interface, class);
-                dev_info(&ftdi->udev->dev, "USB FTDI U132 jtag interface on min"
-                        "or %d now disconnected\n", minor);
-        } else {
-                ftdi_status_cancel_work(ftdi);
-                ftdi_command_cancel_work(ftdi);
-                ftdi_response_cancel_work(ftdi);
-                ftdi_elan_abandon_completions(ftdi);
-                ftdi_elan_abandon_targets(ftdi);
-                if (ftdi->registered) {
-                        platform_device_unregister(&ftdi->platform_dev);
-                        ftdi->synchronized = 0;
-                        ftdi->enumerated = 0;
-                        ftdi->initialized = 0;
-                        ftdi->registered = 0;
-                }
-                flush_workqueue(status_queue);
-                flush_workqueue(command_queue);
-                flush_workqueue(respond_queue);
-                ftdi->disconnected += 1;
-                usb_set_intfdata(interface, NULL);
-                dev_info(&ftdi->udev->dev, "USB FTDI U132 host controller inter"
-                        "face now disconnected\n");
-        }
-        ftdi_elan_put_kref(ftdi);
+       struct usb_ftdi *ftdi = usb_get_intfdata(interface);
+       ftdi->disconnected += 1;
+       if (ftdi->class) {
+               int minor = interface->minor;
+               struct usb_class_driver *class = ftdi->class;
+               usb_set_intfdata(interface, NULL);
+               usb_deregister_dev(interface, class);
+               dev_info(&ftdi->udev->dev, "USB FTDI U132 jtag interface on minor %d now disconnected\n",
+                        minor);
+       } else {
+               ftdi_status_cancel_work(ftdi);
+               ftdi_command_cancel_work(ftdi);
+               ftdi_response_cancel_work(ftdi);
+               ftdi_elan_abandon_completions(ftdi);
+               ftdi_elan_abandon_targets(ftdi);
+               if (ftdi->registered) {
+                       platform_device_unregister(&ftdi->platform_dev);
+                       ftdi->synchronized = 0;
+                       ftdi->enumerated = 0;
+                       ftdi->initialized = 0;
+                       ftdi->registered = 0;
+               }
+               flush_workqueue(status_queue);
+               flush_workqueue(command_queue);
+               flush_workqueue(respond_queue);
+               ftdi->disconnected += 1;
+               usb_set_intfdata(interface, NULL);
+               dev_info(&ftdi->udev->dev, "USB FTDI U132 host controller interface now disconnected\n");
+       }
+       ftdi_elan_put_kref(ftdi);
 }
 
 static struct usb_driver ftdi_elan_driver = {
-        .name = "ftdi-elan",
-        .probe = ftdi_elan_probe,
-        .disconnect = ftdi_elan_disconnect,
-        .id_table = ftdi_elan_table,
+       .name = "ftdi-elan",
+       .probe = ftdi_elan_probe,
+       .disconnect = ftdi_elan_disconnect,
+       .id_table = ftdi_elan_table,
 };
 static int __init ftdi_elan_init(void)
 {
-        int result;
-        printk(KERN_INFO "driver %s\n", ftdi_elan_driver.name);
-        mutex_init(&ftdi_module_lock);
-        INIT_LIST_HEAD(&ftdi_static_list);
-        status_queue = create_singlethread_workqueue("ftdi-status-control");
+       int result;
+       pr_info("driver %s\n", ftdi_elan_driver.name);
+       mutex_init(&ftdi_module_lock);
+       INIT_LIST_HEAD(&ftdi_static_list);
+       status_queue = create_singlethread_workqueue("ftdi-status-control");
        if (!status_queue)
                goto err_status_queue;
-        command_queue = create_singlethread_workqueue("ftdi-command-engine");
+       command_queue = create_singlethread_workqueue("ftdi-command-engine");
        if (!command_queue)
                goto err_command_queue;
-        respond_queue = create_singlethread_workqueue("ftdi-respond-engine");
+       respond_queue = create_singlethread_workqueue("ftdi-respond-engine");
        if (!respond_queue)
                goto err_respond_queue;
-        result = usb_register(&ftdi_elan_driver);
-        if (result) {
+       result = usb_register(&ftdi_elan_driver);
+       if (result) {
                destroy_workqueue(status_queue);
                destroy_workqueue(command_queue);
                destroy_workqueue(respond_queue);
-                printk(KERN_ERR "usb_register failed. Error number %d\n",
-                      result);
+               pr_err("usb_register failed. Error number %d\n", result);
        }
-        return result;
+       return result;
 
- err_respond_queue:
+err_respond_queue:
        destroy_workqueue(command_queue);
- err_command_queue:
+err_command_queue:
        destroy_workqueue(status_queue);
- err_status_queue:
-       printk(KERN_ERR "%s couldn't create workqueue\n", ftdi_elan_driver.name);
+err_status_queue:
+       pr_err("%s couldn't create workqueue\n", ftdi_elan_driver.name);
        return -ENOMEM;
 }
 
 static void __exit ftdi_elan_exit(void)
 {
-        struct usb_ftdi *ftdi;
-        struct usb_ftdi *temp;
-        usb_deregister(&ftdi_elan_driver);
-        printk(KERN_INFO "ftdi_u132 driver deregistered\n");
-        list_for_each_entry_safe(ftdi, temp, &ftdi_static_list, ftdi_list) {
-                ftdi_status_cancel_work(ftdi);
-                ftdi_command_cancel_work(ftdi);
-                ftdi_response_cancel_work(ftdi);
-        } flush_workqueue(status_queue);
-        destroy_workqueue(status_queue);
-        status_queue = NULL;
-        flush_workqueue(command_queue);
-        destroy_workqueue(command_queue);
-        command_queue = NULL;
-        flush_workqueue(respond_queue);
-        destroy_workqueue(respond_queue);
-        respond_queue = NULL;
+       struct usb_ftdi *ftdi;
+       struct usb_ftdi *temp;
+       usb_deregister(&ftdi_elan_driver);
+       pr_info("ftdi_u132 driver deregistered\n");
+       list_for_each_entry_safe(ftdi, temp, &ftdi_static_list, ftdi_list) {
+               ftdi_status_cancel_work(ftdi);
+               ftdi_command_cancel_work(ftdi);
+               ftdi_response_cancel_work(ftdi);
+       } flush_workqueue(status_queue);
+       destroy_workqueue(status_queue);
+       status_queue = NULL;
+       flush_workqueue(command_queue);
+       destroy_workqueue(command_queue);
+       command_queue = NULL;
+       flush_workqueue(respond_queue);
+       destroy_workqueue(respond_queue);
+       respond_queue = NULL;
 }
 
 
index 416e0c8..33dd6a6 100644 (file)
@@ -59,14 +59,6 @@ config KEYSTONE_USB_PHY
          interface to interact with USB 2.0 and USB 3.0 PHY that is part
          of the Keystone SOC.
 
-config MV_U3D_PHY
-       bool "Marvell USB 3.0 PHY controller Driver"
-       depends on CPU_MMP3
-       select USB_PHY
-       help
-         Enable this to support Marvell USB 3.0 phy controller for Marvell
-         SoC.
-
 config NOP_USB_XCEIV
        tristate "NOP USB Transceiver Driver"
        select USB_PHY
index f8fa719..a2d0569 100644 (file)
@@ -10,7 +10,6 @@ obj-$(CONFIG_USB_OTG_FSM)             += phy-fsm-usb.o
 obj-$(CONFIG_AB8500_USB)               += phy-ab8500-usb.o
 obj-$(CONFIG_FSL_USB2_OTG)             += phy-fsl-usb.o
 obj-$(CONFIG_ISP1301_OMAP)             += phy-isp1301-omap.o
-obj-$(CONFIG_MV_U3D_PHY)               += phy-mv-u3d-usb.o
 obj-$(CONFIG_NOP_USB_XCEIV)            += phy-generic.o
 obj-$(CONFIG_TAHVO_USB)                        += phy-tahvo.o
 obj-$(CONFIG_AM335X_CONTROL_USB)       += phy-am335x-control.o
index d03fadd..98e8340 100644 (file)
@@ -364,3 +364,4 @@ int otg_statemachine(struct otg_fsm *fsm)
        VDBG("quit statemachine, changed = %d\n", state_changed);
        return state_changed;
 }
+EXPORT_SYMBOL_GPL(otg_statemachine);
diff --git a/drivers/usb/phy/phy-mv-u3d-usb.c b/drivers/usb/phy/phy-mv-u3d-usb.c
deleted file mode 100644 (file)
index d317903..0000000
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * Copyright (C) 2011 Marvell International Ltd. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- */
-
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/clk.h>
-#include <linux/delay.h>
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/usb/otg.h>
-#include <linux/platform_data/mv_usb.h>
-
-#include "phy-mv-u3d-usb.h"
-
-/*
- * struct mv_u3d_phy - transceiver driver state
- * @phy: transceiver structure
- * @dev: The parent device supplied to the probe function
- * @clk: usb phy clock
- * @base: usb phy register memory base
- */
-struct mv_u3d_phy {
-       struct usb_phy  phy;
-       struct mv_usb_platform_data *plat;
-       struct device   *dev;
-       struct clk      *clk;
-       void __iomem    *base;
-};
-
-static u32 mv_u3d_phy_read(void __iomem *base, u32 reg)
-{
-       void __iomem *addr, *data;
-
-       addr = base;
-       data = base + 0x4;
-
-       writel_relaxed(reg, addr);
-       return readl_relaxed(data);
-}
-
-static void mv_u3d_phy_set(void __iomem *base, u32 reg, u32 value)
-{
-       void __iomem *addr, *data;
-       u32 tmp;
-
-       addr = base;
-       data = base + 0x4;
-
-       writel_relaxed(reg, addr);
-       tmp = readl_relaxed(data);
-       tmp |= value;
-       writel_relaxed(tmp, data);
-}
-
-static void mv_u3d_phy_clear(void __iomem *base, u32 reg, u32 value)
-{
-       void __iomem *addr, *data;
-       u32 tmp;
-
-       addr = base;
-       data = base + 0x4;
-
-       writel_relaxed(reg, addr);
-       tmp = readl_relaxed(data);
-       tmp &= ~value;
-       writel_relaxed(tmp, data);
-}
-
-static void mv_u3d_phy_write(void __iomem *base, u32 reg, u32 value)
-{
-       void __iomem *addr, *data;
-
-       addr = base;
-       data = base + 0x4;
-
-       writel_relaxed(reg, addr);
-       writel_relaxed(value, data);
-}
-
-static void mv_u3d_phy_shutdown(struct usb_phy *phy)
-{
-       struct mv_u3d_phy *mv_u3d_phy;
-       void __iomem *base;
-       u32 val;
-
-       mv_u3d_phy = container_of(phy, struct mv_u3d_phy, phy);
-       base = mv_u3d_phy->base;
-
-       /* Power down Reference Analog current, bit 15
-        * Power down PLL, bit 14
-        * Power down Receiver, bit 13
-        * Power down Transmitter, bit 12
-        * of USB3_POWER_PLL_CONTROL register
-        */
-       val = mv_u3d_phy_read(base, USB3_POWER_PLL_CONTROL);
-       val &= ~(USB3_POWER_PLL_CONTROL_PU);
-       mv_u3d_phy_write(base, USB3_POWER_PLL_CONTROL, val);
-
-       if (mv_u3d_phy->clk)
-               clk_disable(mv_u3d_phy->clk);
-}
-
-static int mv_u3d_phy_init(struct usb_phy *phy)
-{
-       struct mv_u3d_phy *mv_u3d_phy;
-       void __iomem *base;
-       u32 val, count;
-
-       /* enable usb3 phy */
-       mv_u3d_phy = container_of(phy, struct mv_u3d_phy, phy);
-
-       if (mv_u3d_phy->clk)
-               clk_enable(mv_u3d_phy->clk);
-
-       base = mv_u3d_phy->base;
-
-       val = mv_u3d_phy_read(base, USB3_POWER_PLL_CONTROL);
-       val &= ~(USB3_POWER_PLL_CONTROL_PU_MASK);
-       val |= 0xF << USB3_POWER_PLL_CONTROL_PU_SHIFT;
-       mv_u3d_phy_write(base, USB3_POWER_PLL_CONTROL, val);
-       udelay(100);
-
-       mv_u3d_phy_write(base, USB3_RESET_CONTROL,
-                       USB3_RESET_CONTROL_RESET_PIPE);
-       udelay(100);
-
-       mv_u3d_phy_write(base, USB3_RESET_CONTROL,
-                       USB3_RESET_CONTROL_RESET_PIPE
-                       | USB3_RESET_CONTROL_RESET_PHY);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_POWER_PLL_CONTROL);
-       val &= ~(USB3_POWER_PLL_CONTROL_REF_FREF_SEL_MASK
-               | USB3_POWER_PLL_CONTROL_PHY_MODE_MASK);
-       val |=  (USB3_PLL_25MHZ << USB3_POWER_PLL_CONTROL_REF_FREF_SEL_SHIFT)
-               | (0x5 << USB3_POWER_PLL_CONTROL_PHY_MODE_SHIFT);
-       mv_u3d_phy_write(base, USB3_POWER_PLL_CONTROL, val);
-       udelay(100);
-
-       mv_u3d_phy_clear(base, USB3_KVCO_CALI_CONTROL,
-               USB3_KVCO_CALI_CONTROL_USE_MAX_PLL_RATE_MASK);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_SQUELCH_FFE);
-       val &= ~(USB3_SQUELCH_FFE_FFE_CAP_SEL_MASK
-               | USB3_SQUELCH_FFE_FFE_RES_SEL_MASK
-               | USB3_SQUELCH_FFE_SQ_THRESH_IN_MASK);
-       val |= ((0xD << USB3_SQUELCH_FFE_FFE_CAP_SEL_SHIFT)
-               | (0x7 << USB3_SQUELCH_FFE_FFE_RES_SEL_SHIFT)
-               | (0x8 << USB3_SQUELCH_FFE_SQ_THRESH_IN_SHIFT));
-       mv_u3d_phy_write(base, USB3_SQUELCH_FFE, val);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_GEN1_SET0);
-       val &= ~USB3_GEN1_SET0_G1_TX_SLEW_CTRL_EN_MASK;
-       val |= 1 << USB3_GEN1_SET0_G1_TX_EMPH_EN_SHIFT;
-       mv_u3d_phy_write(base, USB3_GEN1_SET0, val);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_GEN2_SET0);
-       val &= ~(USB3_GEN2_SET0_G2_TX_AMP_MASK
-               | USB3_GEN2_SET0_G2_TX_EMPH_AMP_MASK
-               | USB3_GEN2_SET0_G2_TX_SLEW_CTRL_EN_MASK);
-       val |= ((0x14 << USB3_GEN2_SET0_G2_TX_AMP_SHIFT)
-               | (1 << USB3_GEN2_SET0_G2_TX_AMP_ADJ_SHIFT)
-               | (0xA << USB3_GEN2_SET0_G2_TX_EMPH_AMP_SHIFT)
-               | (1 << USB3_GEN2_SET0_G2_TX_EMPH_EN_SHIFT));
-       mv_u3d_phy_write(base, USB3_GEN2_SET0, val);
-       udelay(100);
-
-       mv_u3d_phy_read(base, USB3_TX_EMPPH);
-       val &= ~(USB3_TX_EMPPH_AMP_MASK
-               | USB3_TX_EMPPH_EN_MASK
-               | USB3_TX_EMPPH_AMP_FORCE_MASK
-               | USB3_TX_EMPPH_PAR1_MASK
-               | USB3_TX_EMPPH_PAR2_MASK);
-       val |= ((0xB << USB3_TX_EMPPH_AMP_SHIFT)
-               | (1 << USB3_TX_EMPPH_EN_SHIFT)
-               | (1 << USB3_TX_EMPPH_AMP_FORCE_SHIFT)
-               | (0x1C << USB3_TX_EMPPH_PAR1_SHIFT)
-               | (1 << USB3_TX_EMPPH_PAR2_SHIFT));
-
-       mv_u3d_phy_write(base, USB3_TX_EMPPH, val);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_GEN2_SET1);
-       val &= ~(USB3_GEN2_SET1_G2_RX_SELMUPI_MASK
-               | USB3_GEN2_SET1_G2_RX_SELMUPF_MASK
-               | USB3_GEN2_SET1_G2_RX_SELMUFI_MASK
-               | USB3_GEN2_SET1_G2_RX_SELMUFF_MASK);
-       val |= ((1 << USB3_GEN2_SET1_G2_RX_SELMUPI_SHIFT)
-               | (1 << USB3_GEN2_SET1_G2_RX_SELMUPF_SHIFT)
-               | (1 << USB3_GEN2_SET1_G2_RX_SELMUFI_SHIFT)
-               | (1 << USB3_GEN2_SET1_G2_RX_SELMUFF_SHIFT));
-       mv_u3d_phy_write(base, USB3_GEN2_SET1, val);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_DIGITAL_LOOPBACK_EN);
-       val &= ~USB3_DIGITAL_LOOPBACK_EN_SEL_BITS_MASK;
-       val |= 1 << USB3_DIGITAL_LOOPBACK_EN_SEL_BITS_SHIFT;
-       mv_u3d_phy_write(base, USB3_DIGITAL_LOOPBACK_EN, val);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_IMPEDANCE_TX_SSC);
-       val &= ~USB3_IMPEDANCE_TX_SSC_SSC_AMP_MASK;
-       val |= 0xC << USB3_IMPEDANCE_TX_SSC_SSC_AMP_SHIFT;
-       mv_u3d_phy_write(base, USB3_IMPEDANCE_TX_SSC, val);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_IMPEDANCE_CALI_CTRL);
-       val &= ~USB3_IMPEDANCE_CALI_CTRL_IMP_CAL_THR_MASK;
-       val |= 0x4 << USB3_IMPEDANCE_CALI_CTRL_IMP_CAL_THR_SHIFT;
-       mv_u3d_phy_write(base, USB3_IMPEDANCE_CALI_CTRL, val);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_PHY_ISOLATION_MODE);
-       val &= ~(USB3_PHY_ISOLATION_MODE_PHY_GEN_RX_MASK
-               | USB3_PHY_ISOLATION_MODE_PHY_GEN_TX_MASK
-               | USB3_PHY_ISOLATION_MODE_TX_DRV_IDLE_MASK);
-       val |= ((1 << USB3_PHY_ISOLATION_MODE_PHY_GEN_RX_SHIFT)
-               | (1 << USB3_PHY_ISOLATION_MODE_PHY_GEN_TX_SHIFT));
-       mv_u3d_phy_write(base, USB3_PHY_ISOLATION_MODE, val);
-       udelay(100);
-
-       val = mv_u3d_phy_read(base, USB3_TXDETRX);
-       val &= ~(USB3_TXDETRX_VTHSEL_MASK);
-       val |= 0x1 << USB3_TXDETRX_VTHSEL_SHIFT;
-       mv_u3d_phy_write(base, USB3_TXDETRX, val);
-       udelay(100);
-
-       dev_dbg(mv_u3d_phy->dev, "start calibration\n");
-
-calstart:
-       /* Perform Manual Calibration */
-       mv_u3d_phy_set(base, USB3_KVCO_CALI_CONTROL,
-               1 << USB3_KVCO_CALI_CONTROL_CAL_START_SHIFT);
-
-       mdelay(1);
-
-       count = 0;
-       while (1) {
-               val = mv_u3d_phy_read(base, USB3_KVCO_CALI_CONTROL);
-               if (val & (1 << USB3_KVCO_CALI_CONTROL_CAL_DONE_SHIFT))
-                       break;
-               else if (count > 50) {
-                       dev_dbg(mv_u3d_phy->dev, "calibration failure, retry...\n");
-                       goto calstart;
-               }
-               count++;
-               mdelay(1);
-       }
-
-       /* active PIPE interface */
-       mv_u3d_phy_write(base, USB3_PIPE_SM_CTRL,
-               1 << USB3_PIPE_SM_CTRL_PHY_INIT_DONE);
-
-       return 0;
-}
-
-static int mv_u3d_phy_probe(struct platform_device *pdev)
-{
-       struct mv_u3d_phy *mv_u3d_phy;
-       struct mv_usb_platform_data *pdata;
-       struct device *dev = &pdev->dev;
-       struct resource *res;
-       void __iomem    *phy_base;
-       int     ret;
-
-       pdata = dev_get_platdata(&pdev->dev);
-       if (!pdata) {
-               dev_err(&pdev->dev, "%s: no platform data defined\n", __func__);
-               return -EINVAL;
-       }
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       phy_base = devm_ioremap_resource(dev, res);
-       if (IS_ERR(phy_base))
-               return PTR_ERR(phy_base);
-
-       mv_u3d_phy = devm_kzalloc(dev, sizeof(*mv_u3d_phy), GFP_KERNEL);
-       if (!mv_u3d_phy)
-               return -ENOMEM;
-
-       mv_u3d_phy->dev                 = &pdev->dev;
-       mv_u3d_phy->plat                = pdata;
-       mv_u3d_phy->base                = phy_base;
-       mv_u3d_phy->phy.dev             = mv_u3d_phy->dev;
-       mv_u3d_phy->phy.label           = "mv-u3d-phy";
-       mv_u3d_phy->phy.init            = mv_u3d_phy_init;
-       mv_u3d_phy->phy.shutdown        = mv_u3d_phy_shutdown;
-
-       ret = usb_add_phy(&mv_u3d_phy->phy, USB_PHY_TYPE_USB3);
-       if (ret)
-               goto err;
-
-       if (!mv_u3d_phy->clk)
-               mv_u3d_phy->clk = clk_get(mv_u3d_phy->dev, "u3dphy");
-
-       platform_set_drvdata(pdev, mv_u3d_phy);
-
-       dev_info(&pdev->dev, "Initialized Marvell USB 3.0 PHY\n");
-err:
-       return ret;
-}
-
-static int mv_u3d_phy_remove(struct platform_device *pdev)
-{
-       struct mv_u3d_phy *mv_u3d_phy = platform_get_drvdata(pdev);
-
-       usb_remove_phy(&mv_u3d_phy->phy);
-
-       if (mv_u3d_phy->clk) {
-               clk_put(mv_u3d_phy->clk);
-               mv_u3d_phy->clk = NULL;
-       }
-
-       return 0;
-}
-
-static struct platform_driver mv_u3d_phy_driver = {
-       .probe          = mv_u3d_phy_probe,
-       .remove         = mv_u3d_phy_remove,
-       .driver         = {
-               .name   = "mv-u3d-phy",
-               .owner  = THIS_MODULE,
-       },
-};
-
-module_platform_driver(mv_u3d_phy_driver);
-MODULE_DESCRIPTION("Marvell USB 3.0 PHY controller");
-MODULE_AUTHOR("Yu Xu <yuxu@marvell.com>");
-MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:mv-u3d-phy");
diff --git a/drivers/usb/phy/phy-mv-u3d-usb.h b/drivers/usb/phy/phy-mv-u3d-usb.h
deleted file mode 100644 (file)
index 2a658cb..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2011 Marvell International Ltd. All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- */
-
-#ifndef __MV_U3D_PHY_H
-#define __MV_U3D_PHY_H
-
-#define USB3_POWER_PLL_CONTROL         0x1
-#define USB3_KVCO_CALI_CONTROL         0x2
-#define USB3_IMPEDANCE_CALI_CTRL       0x3
-#define USB3_IMPEDANCE_TX_SSC          0x4
-#define USB3_SQUELCH_FFE               0x6
-#define USB3_GEN1_SET0                 0xD
-#define USB3_GEN2_SET0                 0xF
-#define USB3_GEN2_SET1                 0x10
-#define USB3_DIGITAL_LOOPBACK_EN       0x23
-#define USB3_PHY_ISOLATION_MODE                0x26
-#define USB3_TXDETRX                   0x48
-#define USB3_TX_EMPPH                  0x5E
-#define USB3_RESET_CONTROL             0x90
-#define USB3_PIPE_SM_CTRL              0x91
-
-#define USB3_RESET_CONTROL_RESET_PIPE                  0x1
-#define USB3_RESET_CONTROL_RESET_PHY                   0x2
-
-#define USB3_POWER_PLL_CONTROL_REF_FREF_SEL_MASK       (0x1F << 0)
-#define USB3_POWER_PLL_CONTROL_REF_FREF_SEL_SHIFT      0
-#define USB3_PLL_25MHZ                                 0x2
-#define USB3_PLL_26MHZ                                 0x5
-#define USB3_POWER_PLL_CONTROL_PHY_MODE_MASK           (0x7 << 5)
-#define USB3_POWER_PLL_CONTROL_PHY_MODE_SHIFT          5
-#define USB3_POWER_PLL_CONTROL_PU_MASK                 (0xF << 12)
-#define USB3_POWER_PLL_CONTROL_PU_SHIFT                        12
-#define USB3_POWER_PLL_CONTROL_PU                      (0xF << 12)
-
-#define USB3_KVCO_CALI_CONTROL_USE_MAX_PLL_RATE_MASK   (0x1 << 12)
-#define USB3_KVCO_CALI_CONTROL_USE_MAX_PLL_RATE_SHIFT  12
-#define USB3_KVCO_CALI_CONTROL_CAL_DONE_SHIFT          14
-#define USB3_KVCO_CALI_CONTROL_CAL_START_SHIFT         15
-
-#define USB3_SQUELCH_FFE_FFE_CAP_SEL_MASK              0xF
-#define USB3_SQUELCH_FFE_FFE_CAP_SEL_SHIFT             0
-#define USB3_SQUELCH_FFE_FFE_RES_SEL_MASK              (0x7 << 4)
-#define USB3_SQUELCH_FFE_FFE_RES_SEL_SHIFT             4
-#define USB3_SQUELCH_FFE_SQ_THRESH_IN_MASK             (0x1F << 8)
-#define USB3_SQUELCH_FFE_SQ_THRESH_IN_SHIFT            8
-
-#define USB3_GEN1_SET0_G1_TX_SLEW_CTRL_EN_MASK         (0x1 << 15)
-#define USB3_GEN1_SET0_G1_TX_EMPH_EN_SHIFT             11
-
-#define USB3_GEN2_SET0_G2_TX_AMP_MASK                  (0x1F << 1)
-#define USB3_GEN2_SET0_G2_TX_AMP_SHIFT                 1
-#define USB3_GEN2_SET0_G2_TX_AMP_ADJ_SHIFT             6
-#define USB3_GEN2_SET0_G2_TX_EMPH_AMP_MASK             (0xF << 7)
-#define USB3_GEN2_SET0_G2_TX_EMPH_AMP_SHIFT            7
-#define USB3_GEN2_SET0_G2_TX_EMPH_EN_MASK              (0x1 << 11)
-#define USB3_GEN2_SET0_G2_TX_EMPH_EN_SHIFT             11
-#define USB3_GEN2_SET0_G2_TX_SLEW_CTRL_EN_MASK         (0x1 << 15)
-#define USB3_GEN2_SET0_G2_TX_SLEW_CTRL_EN_SHIFT                15
-
-#define USB3_GEN2_SET1_G2_RX_SELMUPI_MASK              (0x7 << 0)
-#define USB3_GEN2_SET1_G2_RX_SELMUPI_SHIFT             0
-#define USB3_GEN2_SET1_G2_RX_SELMUPF_MASK              (0x7 << 3)
-#define USB3_GEN2_SET1_G2_RX_SELMUPF_SHIFT             3
-#define USB3_GEN2_SET1_G2_RX_SELMUFI_MASK              (0x3 << 6)
-#define USB3_GEN2_SET1_G2_RX_SELMUFI_SHIFT             6
-#define USB3_GEN2_SET1_G2_RX_SELMUFF_MASK              (0x3 << 8)
-#define USB3_GEN2_SET1_G2_RX_SELMUFF_SHIFT             8
-
-#define USB3_DIGITAL_LOOPBACK_EN_SEL_BITS_MASK         (0x3 << 10)
-#define USB3_DIGITAL_LOOPBACK_EN_SEL_BITS_SHIFT                10
-
-#define USB3_IMPEDANCE_CALI_CTRL_IMP_CAL_THR_MASK      (0x7 << 12)
-#define USB3_IMPEDANCE_CALI_CTRL_IMP_CAL_THR_SHIFT     12
-
-#define USB3_IMPEDANCE_TX_SSC_SSC_AMP_MASK             (0x3F << 0)
-#define USB3_IMPEDANCE_TX_SSC_SSC_AMP_SHIFT            0
-
-#define USB3_PHY_ISOLATION_MODE_PHY_GEN_RX_MASK                0xF
-#define USB3_PHY_ISOLATION_MODE_PHY_GEN_RX_SHIFT       0
-#define USB3_PHY_ISOLATION_MODE_PHY_GEN_TX_MASK                (0xF << 4)
-#define USB3_PHY_ISOLATION_MODE_PHY_GEN_TX_SHIFT       4
-#define USB3_PHY_ISOLATION_MODE_TX_DRV_IDLE_MASK       (0x1 << 8)
-
-#define USB3_TXDETRX_VTHSEL_MASK                       (0x3 << 4)
-#define USB3_TXDETRX_VTHSEL_SHIFT                      4
-
-#define USB3_TX_EMPPH_AMP_MASK                         (0xF << 0)
-#define USB3_TX_EMPPH_AMP_SHIFT                                0
-#define USB3_TX_EMPPH_EN_MASK                          (0x1 << 6)
-#define USB3_TX_EMPPH_EN_SHIFT                         6
-#define USB3_TX_EMPPH_AMP_FORCE_MASK                   (0x1 << 7)
-#define USB3_TX_EMPPH_AMP_FORCE_SHIFT                  7
-#define USB3_TX_EMPPH_PAR1_MASK                                (0x1F << 8)
-#define USB3_TX_EMPPH_PAR1_SHIFT                       8
-#define USB3_TX_EMPPH_PAR2_MASK                                (0x1 << 13)
-#define USB3_TX_EMPPH_PAR2_SHIFT                       13
-
-#define USB3_PIPE_SM_CTRL_PHY_INIT_DONE                        15
-
-#endif /* __MV_U3D_PHY_H */
index 01b6a01..abda112 100644 (file)
@@ -213,7 +213,7 @@ xfs_attr_calc_size(
                 * Out of line attribute, cannot double split, but
                 * make room for the attribute value itself.
                 */
-               uint    dblocks = XFS_B_TO_FSB(mp, valuelen);
+               uint    dblocks = xfs_attr3_rmt_blocks(mp, valuelen);
                nblks += dblocks;
                nblks += XFS_NEXTENTADD_SPACE_RES(mp, dblocks, XFS_ATTR_FORK);
        }
@@ -698,11 +698,22 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
 
                trace_xfs_attr_leaf_replace(args);
 
+               /* save the attribute state for later removal*/
                args->op_flags |= XFS_DA_OP_RENAME;     /* an atomic rename */
                args->blkno2 = args->blkno;             /* set 2nd entry info*/
                args->index2 = args->index;
                args->rmtblkno2 = args->rmtblkno;
                args->rmtblkcnt2 = args->rmtblkcnt;
+               args->rmtvaluelen2 = args->rmtvaluelen;
+
+               /*
+                * clear the remote attr state now that it is saved so that the
+                * values reflect the state of the attribute we are about to
+                * add, not the attribute we just found and will remove later.
+                */
+               args->rmtblkno = 0;
+               args->rmtblkcnt = 0;
+               args->rmtvaluelen = 0;
        }
 
        /*
@@ -794,6 +805,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args)
                args->blkno = args->blkno2;
                args->rmtblkno = args->rmtblkno2;
                args->rmtblkcnt = args->rmtblkcnt2;
+               args->rmtvaluelen = args->rmtvaluelen2;
                if (args->rmtblkno) {
                        error = xfs_attr_rmtval_remove(args);
                        if (error)
@@ -999,13 +1011,22 @@ restart:
 
                trace_xfs_attr_node_replace(args);
 
+               /* save the attribute state for later removal*/
                args->op_flags |= XFS_DA_OP_RENAME;     /* atomic rename op */
                args->blkno2 = args->blkno;             /* set 2nd entry info*/
                args->index2 = args->index;
                args->rmtblkno2 = args->rmtblkno;
                args->rmtblkcnt2 = args->rmtblkcnt;
+               args->rmtvaluelen2 = args->rmtvaluelen;
+
+               /*
+                * clear the remote attr state now that it is saved so that the
+                * values reflect the state of the attribute we are about to
+                * add, not the attribute we just found and will remove later.
+                */
                args->rmtblkno = 0;
                args->rmtblkcnt = 0;
+               args->rmtvaluelen = 0;
        }
 
        retval = xfs_attr3_leaf_add(blk->bp, state->args);
@@ -1133,6 +1154,7 @@ restart:
                args->blkno = args->blkno2;
                args->rmtblkno = args->rmtblkno2;
                args->rmtblkcnt = args->rmtblkcnt2;
+               args->rmtvaluelen = args->rmtvaluelen2;
                if (args->rmtblkno) {
                        error = xfs_attr_rmtval_remove(args);
                        if (error)
index fe9587f..511c283 100644 (file)
@@ -1229,6 +1229,7 @@ xfs_attr3_leaf_add_work(
                name_rmt->valueblk = 0;
                args->rmtblkno = 1;
                args->rmtblkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen);
+               args->rmtvaluelen = args->valuelen;
        }
        xfs_trans_log_buf(args->trans, bp,
             XFS_DA_LOGRANGE(leaf, xfs_attr3_leaf_name(leaf, args->index),
@@ -2167,11 +2168,11 @@ xfs_attr3_leaf_lookup_int(
                        if (!xfs_attr_namesp_match(args->flags, entry->flags))
                                continue;
                        args->index = probe;
-                       args->valuelen = be32_to_cpu(name_rmt->valuelen);
+                       args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
                        args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
                        args->rmtblkcnt = xfs_attr3_rmt_blocks(
                                                        args->dp->i_mount,
-                                                       args->valuelen);
+                                                       args->rmtvaluelen);
                        return XFS_ERROR(EEXIST);
                }
        }
@@ -2220,19 +2221,19 @@ xfs_attr3_leaf_getvalue(
                name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
                ASSERT(name_rmt->namelen == args->namelen);
                ASSERT(memcmp(args->name, name_rmt->name, args->namelen) == 0);
-               valuelen = be32_to_cpu(name_rmt->valuelen);
+               args->rmtvaluelen = be32_to_cpu(name_rmt->valuelen);
                args->rmtblkno = be32_to_cpu(name_rmt->valueblk);
                args->rmtblkcnt = xfs_attr3_rmt_blocks(args->dp->i_mount,
-                                                      valuelen);
+                                                      args->rmtvaluelen);
                if (args->flags & ATTR_KERNOVAL) {
-                       args->valuelen = valuelen;
+                       args->valuelen = args->rmtvaluelen;
                        return 0;
                }
-               if (args->valuelen < valuelen) {
-                       args->valuelen = valuelen;
+               if (args->valuelen < args->rmtvaluelen) {
+                       args->valuelen = args->rmtvaluelen;
                        return XFS_ERROR(ERANGE);
                }
-               args->valuelen = valuelen;
+               args->valuelen = args->rmtvaluelen;
        }
        return 0;
 }
@@ -2519,7 +2520,7 @@ xfs_attr3_leaf_clearflag(
                ASSERT((entry->flags & XFS_ATTR_LOCAL) == 0);
                name_rmt = xfs_attr3_leaf_name_remote(leaf, args->index);
                name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
-               name_rmt->valuelen = cpu_to_be32(args->valuelen);
+               name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
                xfs_trans_log_buf(args->trans, bp,
                         XFS_DA_LOGRANGE(leaf, name_rmt, sizeof(*name_rmt)));
        }
@@ -2677,7 +2678,7 @@ xfs_attr3_leaf_flipflags(
                ASSERT((entry1->flags & XFS_ATTR_LOCAL) == 0);
                name_rmt = xfs_attr3_leaf_name_remote(leaf1, args->index);
                name_rmt->valueblk = cpu_to_be32(args->rmtblkno);
-               name_rmt->valuelen = cpu_to_be32(args->valuelen);
+               name_rmt->valuelen = cpu_to_be32(args->rmtvaluelen);
                xfs_trans_log_buf(args->trans, bp1,
                         XFS_DA_LOGRANGE(leaf1, name_rmt, sizeof(*name_rmt)));
        }
index 01db96f..833fe5d 100644 (file)
@@ -447,6 +447,7 @@ xfs_attr3_leaf_list_int(
                                args.dp = context->dp;
                                args.whichfork = XFS_ATTR_FORK;
                                args.valuelen = valuelen;
+                               args.rmtvaluelen = valuelen;
                                args.value = kmem_alloc(valuelen, KM_SLEEP | KM_NOFS);
                                args.rmtblkno = be32_to_cpu(name_rmt->valueblk);
                                args.rmtblkcnt = xfs_attr3_rmt_blocks(
index 6e37823..d2e6e94 100644 (file)
@@ -337,7 +337,7 @@ xfs_attr_rmtval_get(
        struct xfs_buf          *bp;
        xfs_dablk_t             lblkno = args->rmtblkno;
        __uint8_t               *dst = args->value;
-       int                     valuelen = args->valuelen;
+       int                     valuelen;
        int                     nmap;
        int                     error;
        int                     blkcnt = args->rmtblkcnt;
@@ -347,7 +347,9 @@ xfs_attr_rmtval_get(
        trace_xfs_attr_rmtval_get(args);
 
        ASSERT(!(args->flags & ATTR_KERNOVAL));
+       ASSERT(args->rmtvaluelen == args->valuelen);
 
+       valuelen = args->rmtvaluelen;
        while (valuelen > 0) {
                nmap = ATTR_RMTVALUE_MAPSIZE;
                error = xfs_bmapi_read(args->dp, (xfs_fileoff_t)lblkno,
@@ -415,7 +417,7 @@ xfs_attr_rmtval_set(
         * attributes have headers, we can't just do a straight byte to FSB
         * conversion and have to take the header space into account.
         */
-       blkcnt = xfs_attr3_rmt_blocks(mp, args->valuelen);
+       blkcnt = xfs_attr3_rmt_blocks(mp, args->rmtvaluelen);
        error = xfs_bmap_first_unused(args->trans, args->dp, blkcnt, &lfileoff,
                                                   XFS_ATTR_FORK);
        if (error)
@@ -480,7 +482,7 @@ xfs_attr_rmtval_set(
         */
        lblkno = args->rmtblkno;
        blkcnt = args->rmtblkcnt;
-       valuelen = args->valuelen;
+       valuelen = args->rmtvaluelen;
        while (valuelen > 0) {
                struct xfs_buf  *bp;
                xfs_daddr_t     dblkno;
index 6e95ea7..201c609 100644 (file)
@@ -60,10 +60,12 @@ typedef struct xfs_da_args {
        int             index;          /* index of attr of interest in blk */
        xfs_dablk_t     rmtblkno;       /* remote attr value starting blkno */
        int             rmtblkcnt;      /* remote attr value block count */
+       int             rmtvaluelen;    /* remote attr value length in bytes */
        xfs_dablk_t     blkno2;         /* blkno of 2nd attr leaf of interest */
        int             index2;         /* index of 2nd attr in blk */
        xfs_dablk_t     rmtblkno2;      /* remote attr value starting blkno */
        int             rmtblkcnt2;     /* remote attr value block count */
+       int             rmtvaluelen2;   /* remote attr value length in bytes */
        int             op_flags;       /* operation flags */
        enum xfs_dacmp  cmpresult;      /* name compare result for lookups */
 } xfs_da_args_t;
index ef1ca01..301ecbf 100644 (file)
@@ -124,15 +124,15 @@ xfs_cleanup_inode(
        xfs_dentry_to_name(&teardown, dentry, 0);
 
        xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
-       iput(inode);
 }
 
 STATIC int
-xfs_vn_mknod(
+xfs_generic_create(
        struct inode    *dir,
        struct dentry   *dentry,
        umode_t         mode,
-       dev_t           rdev)
+       dev_t           rdev,
+       bool            tmpfile)        /* unnamed file */
 {
        struct inode    *inode;
        struct xfs_inode *ip = NULL;
@@ -156,8 +156,12 @@ xfs_vn_mknod(
        if (error)
                return error;
 
-       xfs_dentry_to_name(&name, dentry, mode);
-       error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip);
+       if (!tmpfile) {
+               xfs_dentry_to_name(&name, dentry, mode);
+               error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip);
+       } else {
+               error = xfs_create_tmpfile(XFS_I(dir), dentry, mode, &ip);
+       }
        if (unlikely(error))
                goto out_free_acl;
 
@@ -180,7 +184,11 @@ xfs_vn_mknod(
        }
 #endif
 
-       d_instantiate(dentry, inode);
+       if (tmpfile)
+               d_tmpfile(dentry, inode);
+       else
+               d_instantiate(dentry, inode);
+
  out_free_acl:
        if (default_acl)
                posix_acl_release(default_acl);
@@ -189,10 +197,22 @@ xfs_vn_mknod(
        return -error;
 
  out_cleanup_inode:
-       xfs_cleanup_inode(dir, inode, dentry);
+       if (!tmpfile)
+               xfs_cleanup_inode(dir, inode, dentry);
+       iput(inode);
        goto out_free_acl;
 }
 
+STATIC int
+xfs_vn_mknod(
+       struct inode    *dir,
+       struct dentry   *dentry,
+       umode_t         mode,
+       dev_t           rdev)
+{
+       return xfs_generic_create(dir, dentry, mode, rdev, false);
+}
+
 STATIC int
 xfs_vn_create(
        struct inode    *dir,
@@ -353,6 +373,7 @@ xfs_vn_symlink(
 
  out_cleanup_inode:
        xfs_cleanup_inode(dir, inode, dentry);
+       iput(inode);
  out:
        return -error;
 }
@@ -1053,25 +1074,7 @@ xfs_vn_tmpfile(
        struct dentry   *dentry,
        umode_t         mode)
 {
-       int                     error;
-       struct xfs_inode        *ip;
-       struct inode            *inode;
-
-       error = xfs_create_tmpfile(XFS_I(dir), dentry, mode, &ip);
-       if (unlikely(error))
-               return -error;
-
-       inode = VFS_I(ip);
-
-       error = xfs_init_security(inode, dir, &dentry->d_name);
-       if (unlikely(error)) {
-               iput(inode);
-               return -error;
-       }
-
-       d_tmpfile(dentry, inode);
-
-       return 0;
+       return xfs_generic_create(dir, dentry, mode, 0, true);
 }
 
 static const struct inode_operations xfs_inode_operations = {
index 08624dc..a5f8bd9 100644 (file)
@@ -616,11 +616,13 @@ xfs_log_mount(
        int             error = 0;
        int             min_logfsbs;
 
-       if (!(mp->m_flags & XFS_MOUNT_NORECOVERY))
-               xfs_notice(mp, "Mounting Filesystem");
-       else {
+       if (!(mp->m_flags & XFS_MOUNT_NORECOVERY)) {
+               xfs_notice(mp, "Mounting V%d Filesystem",
+                          XFS_SB_VERSION_NUM(&mp->m_sb));
+       } else {
                xfs_notice(mp,
-"Mounting filesystem in no-recovery mode.  Filesystem will be inconsistent.");
+"Mounting V%d filesystem in no-recovery mode. Filesystem will be inconsistent.",
+                          XFS_SB_VERSION_NUM(&mp->m_sb));
                ASSERT(mp->m_flags & XFS_MOUNT_RDONLY);
        }
 
index 993cb19..944f3d9 100644 (file)
@@ -743,8 +743,6 @@ xfs_mountfs(
                new_size *= mp->m_sb.sb_inodesize / XFS_DINODE_MIN_SIZE;
                if (mp->m_sb.sb_inoalignmt >= XFS_B_TO_FSBT(mp, new_size))
                        mp->m_inode_cluster_size = new_size;
-               xfs_info(mp, "Using inode cluster size of %d bytes",
-                        mp->m_inode_cluster_size);
        }
 
        /*
index 0c0e41b..8baf61a 100644 (file)
@@ -201,10 +201,6 @@ xfs_mount_validate_sb(
         * write validation, we don't need to check feature masks.
         */
        if (check_version && XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5) {
-               xfs_alert(mp,
-"Version 5 superblock detected. This kernel has EXPERIMENTAL support enabled!\n"
-"Use of these features in this kernel is at your own risk!");
-
                if (xfs_sb_has_compat_feature(sbp,
                                        XFS_SB_FEAT_COMPAT_UNKNOWN)) {
                        xfs_warn(mp,
index 49376ae..6dfd64b 100644 (file)
        {0x1002, 0x983d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
        {0x1002, 0x983e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
        {0x1002, 0x983f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_KABINI|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9850, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9851, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9852, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9853, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9854, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9855, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9856, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9857, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9858, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x9859, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x985A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x985B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x985C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x985D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x985E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
+       {0x1002, 0x985F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_MULLINS|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
        {0x1002, 0x9900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
        {0x1002, 0x9901, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
        {0x1002, 0x9903, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
index 940ece4..012d58f 100644 (file)
        INTEL_VGA_DEVICE(0x0A06, info), /* ULT GT1 mobile */ \
        INTEL_VGA_DEVICE(0x0A16, info), /* ULT GT2 mobile */ \
        INTEL_VGA_DEVICE(0x0A26, info), /* ULT GT3 mobile */ \
-       INTEL_VGA_DEVICE(0x0A0E, info), /* ULT GT1 reserved */ \
-       INTEL_VGA_DEVICE(0x0A1E, info), /* ULT GT2 reserved */ \
+       INTEL_VGA_DEVICE(0x0A0E, info), /* ULX GT1 mobile */ \
+       INTEL_VGA_DEVICE(0x0A1E, info), /* ULX GT2 mobile */ \
        INTEL_VGA_DEVICE(0x0A2E, info), /* ULT GT3 reserved */ \
        INTEL_VGA_DEVICE(0x0D06, info), /* CRW GT1 mobile */ \
        INTEL_VGA_DEVICE(0x0D16, info), /* CRW GT2 mobile */ \
index 34a513a..a6a42dd 100644 (file)
@@ -12,9 +12,9 @@
 #endif
 
 #ifdef __cplusplus
-#define CPP_ASMLINKAGE extern "C" __visible
+#define CPP_ASMLINKAGE extern "C"
 #else
-#define CPP_ASMLINKAGE __visible
+#define CPP_ASMLINKAGE
 #endif
 
 #ifndef asmlinkage
index 7c36cc5..443176e 100644 (file)
@@ -45,7 +45,6 @@ struct platform_device;
 struct rtsx_slot {
        struct platform_device  *p_dev;
        void                    (*card_event)(struct platform_device *p_dev);
-       void                    (*done_transfer)(struct platform_device *p_dev);
 };
 
 #endif
index 8d6bbd6..a383597 100644 (file)
@@ -943,12 +943,6 @@ void rtsx_pci_send_cmd_no_wait(struct rtsx_pcr *pcr);
 int rtsx_pci_send_cmd(struct rtsx_pcr *pcr, int timeout);
 int rtsx_pci_transfer_data(struct rtsx_pcr *pcr, struct scatterlist *sglist,
                int num_sg, bool read, int timeout);
-int rtsx_pci_dma_map_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
-               int num_sg, bool read);
-int rtsx_pci_dma_unmap_sg(struct rtsx_pcr *pcr, struct scatterlist *sglist,
-               int num_sg, bool read);
-int rtsx_pci_dma_transfer(struct rtsx_pcr *pcr, struct scatterlist *sglist,
-               int sg_count, bool read);
 int rtsx_pci_read_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len);
 int rtsx_pci_write_ppbuf(struct rtsx_pcr *pcr, u8 *buf, int buf_len);
 int rtsx_pci_card_pull_ctl_enable(struct rtsx_pcr *pcr, int card);
index ed0b2c5..7c5cbfe 100644 (file)
@@ -80,7 +80,7 @@ DECLARE_EVENT_CLASS(module_refcnt,
 
        TP_fast_assign(
                __entry->ip     = ip;
-               __entry->refcnt = __this_cpu_read(mod->refptr->incs) + __this_cpu_read(mod->refptr->decs);
+               __entry->refcnt = __this_cpu_read(mod->refptr->incs) - __this_cpu_read(mod->refptr->decs);
                __assign_str(name, mod->name);
        ),
 
index 9c7fd4c..48655ce 100644 (file)
@@ -476,7 +476,7 @@ static void __init mm_init(void)
        vmalloc_init();
 }
 
-asmlinkage void __init start_kernel(void)
+asmlinkage __visible void __init start_kernel(void)
 {
        char * command_line;
        extern const struct kernel_param __start___param[], __stop___param[];
index 6cb20d2..019d450 100644 (file)
@@ -120,7 +120,7 @@ void context_tracking_user_enter(void)
  * instead of preempt_schedule() to exit user context if needed before
  * calling the scheduler.
  */
-asmlinkage void __sched notrace preempt_schedule_context(void)
+asmlinkage __visible void __sched notrace preempt_schedule_context(void)
 {
        enum ctx_state prev_ctx;
 
index b0e9467..d24e433 100644 (file)
@@ -4188,7 +4188,7 @@ void debug_show_held_locks(struct task_struct *task)
 }
 EXPORT_SYMBOL_GPL(debug_show_held_locks);
 
-asmlinkage void lockdep_sys_exit(void)
+asmlinkage __visible void lockdep_sys_exit(void)
 {
        struct task_struct *curr = current;
 
index 18fb7a2..1ea328a 100644 (file)
@@ -1586,7 +1586,7 @@ swsusp_alloc(struct memory_bitmap *orig_bm, struct memory_bitmap *copy_bm,
        return -ENOMEM;
 }
 
-asmlinkage int swsusp_save(void)
+asmlinkage __visible int swsusp_save(void)
 {
        unsigned int nr_pages, nr_highmem;
 
index a45b509..7228258 100644 (file)
@@ -1674,7 +1674,7 @@ EXPORT_SYMBOL(printk_emit);
  *
  * See the vsnprintf() documentation for format string extensions over C99.
  */
-asmlinkage int printk(const char *fmt, ...)
+asmlinkage __visible int printk(const char *fmt, ...)
 {
        va_list args;
        int r;
@@ -1737,7 +1737,7 @@ void early_vprintk(const char *fmt, va_list ap)
        }
 }
 
-asmlinkage void early_printk(const char *fmt, ...)
+asmlinkage __visible void early_printk(const char *fmt, ...)
 {
        va_list ap;
 
index 268a45e..d9d8ece 100644 (file)
@@ -2192,7 +2192,7 @@ static inline void post_schedule(struct rq *rq)
  * schedule_tail - first thing a freshly forked thread must call.
  * @prev: the thread we just switched away from.
  */
-asmlinkage void schedule_tail(struct task_struct *prev)
+asmlinkage __visible void schedule_tail(struct task_struct *prev)
        __releases(rq->lock)
 {
        struct rq *rq = this_rq();
@@ -2741,7 +2741,7 @@ static inline void sched_submit_work(struct task_struct *tsk)
                blk_schedule_flush_plug(tsk);
 }
 
-asmlinkage void __sched schedule(void)
+asmlinkage __visible void __sched schedule(void)
 {
        struct task_struct *tsk = current;
 
@@ -2751,7 +2751,7 @@ asmlinkage void __sched schedule(void)
 EXPORT_SYMBOL(schedule);
 
 #ifdef CONFIG_CONTEXT_TRACKING
-asmlinkage void __sched schedule_user(void)
+asmlinkage __visible void __sched schedule_user(void)
 {
        /*
         * If we come here after a random call to set_need_resched(),
@@ -2783,7 +2783,7 @@ void __sched schedule_preempt_disabled(void)
  * off of preempt_enable. Kernel preemptions off return from interrupt
  * occur there and call schedule directly.
  */
-asmlinkage void __sched notrace preempt_schedule(void)
+asmlinkage __visible void __sched notrace preempt_schedule(void)
 {
        /*
         * If there is a non-zero preempt_count or interrupts are disabled,
@@ -2813,7 +2813,7 @@ EXPORT_SYMBOL(preempt_schedule);
  * Note, that this is called and return with irqs disabled. This will
  * protect us against recursive calling from irq.
  */
-asmlinkage void __sched preempt_schedule_irq(void)
+asmlinkage __visible void __sched preempt_schedule_irq(void)
 {
        enum ctx_state prev_state;
 
index 33e4648..92f24f5 100644 (file)
@@ -223,7 +223,7 @@ static inline bool lockdep_softirq_start(void) { return false; }
 static inline void lockdep_softirq_end(bool in_hardirq) { }
 #endif
 
-asmlinkage void __do_softirq(void)
+asmlinkage __visible void __do_softirq(void)
 {
        unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
        unsigned long old_flags = current->flags;
@@ -299,7 +299,7 @@ restart:
        tsk_restore_flags(current, old_flags, PF_MEMALLOC);
 }
 
-asmlinkage void do_softirq(void)
+asmlinkage __visible void do_softirq(void)
 {
        __u32 pending;
        unsigned long flags;
index ac5b23c..6620e58 100644 (file)
@@ -188,7 +188,6 @@ static int tracepoint_add_func(struct tracepoint *tp,
                WARN_ON_ONCE(1);
                return PTR_ERR(old);
        }
-       release_probes(old);
 
        /*
         * rcu_assign_pointer has a smp_wmb() which makes sure that the new
@@ -200,6 +199,7 @@ static int tracepoint_add_func(struct tracepoint *tp,
        rcu_assign_pointer(tp->funcs, tp_funcs);
        if (!static_key_enabled(&tp->key))
                static_key_slow_inc(&tp->key);
+       release_probes(old);
        return 0;
 }
 
@@ -221,7 +221,6 @@ static int tracepoint_remove_func(struct tracepoint *tp,
                WARN_ON_ONCE(1);
                return PTR_ERR(old);
        }
-       release_probes(old);
 
        if (!tp_funcs) {
                /* Removed last function */
@@ -232,6 +231,7 @@ static int tracepoint_remove_func(struct tracepoint *tp,
                        static_key_slow_dec(&tp->key);
        }
        rcu_assign_pointer(tp->funcs, tp_funcs);
+       release_probes(old);
        return 0;
 }
 
index f23b63f..6745c62 100644 (file)
@@ -23,7 +23,7 @@ static void __dump_stack(void)
 #ifdef CONFIG_SMP
 static atomic_t dump_lock = ATOMIC_INIT(-1);
 
-asmlinkage void dump_stack(void)
+asmlinkage __visible void dump_stack(void)
 {
        int was_locked;
        int old;
@@ -55,7 +55,7 @@ retry:
        preempt_enable();
 }
 #else
-asmlinkage void dump_stack(void)
+asmlinkage __visible void dump_stack(void)
 {
        __dump_stack();
 }
index 0cb5b89..1edbb9c 100644 (file)
@@ -1127,8 +1127,10 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec,
                                            AMP_OUT_UNMUTE);
 
        eld = &per_pin->sink_eld;
-       if (!eld->monitor_present)
+       if (!eld->monitor_present) {
+               hdmi_set_channel_count(codec, per_pin->cvt_nid, channels);
                return;
+       }
 
        if (!non_pcm && per_pin->chmap_set)
                ca = hdmi_manual_channel_allocation(channels, per_pin->chmap);
index c1952c9..5f7c765 100644 (file)
@@ -4622,6 +4622,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x1028, 0x0668, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1028, 0x0669, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1028, 0x0674, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1028, 0x067e, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1028, 0x067f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1028, 0x15cc, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1028, 0x15cd, "Dell X5 Precision", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE),
index 893d5a1..c3b5b7d 100644 (file)
@@ -651,7 +651,7 @@ int snd_usb_autoresume(struct snd_usb_audio *chip)
        int err = -ENODEV;
 
        down_read(&chip->shutdown_rwsem);
-       if (chip->probing)
+       if (chip->probing && chip->in_pm)
                err = 0;
        else if (!chip->shutdown)
                err = usb_autopm_get_interface(chip->pm_intf);
@@ -663,7 +663,7 @@ int snd_usb_autoresume(struct snd_usb_audio *chip)
 void snd_usb_autosuspend(struct snd_usb_audio *chip)
 {
        down_read(&chip->shutdown_rwsem);
-       if (!chip->shutdown && !chip->probing)
+       if (!chip->shutdown && !chip->probing && !chip->in_pm)
                usb_autopm_put_interface(chip->pm_intf);
        up_read(&chip->shutdown_rwsem);
 }
@@ -695,8 +695,9 @@ static int usb_audio_suspend(struct usb_interface *intf, pm_message_t message)
                        chip->autosuspended = 1;
        }
 
-       list_for_each_entry(mixer, &chip->mixer_list, list)
-               snd_usb_mixer_suspend(mixer);
+       if (chip->num_suspended_intf == 1)
+               list_for_each_entry(mixer, &chip->mixer_list, list)
+                       snd_usb_mixer_suspend(mixer);
 
        return 0;
 }
@@ -711,6 +712,8 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
                return 0;
        if (--chip->num_suspended_intf)
                return 0;
+
+       chip->in_pm = 1;
        /*
         * ALSA leaves material resumption to user space
         * we just notify and restart the mixers
@@ -726,6 +729,7 @@ static int __usb_audio_resume(struct usb_interface *intf, bool reset_resume)
        chip->autosuspended = 0;
 
 err_out:
+       chip->in_pm = 0;
        return err;
 }
 
index 9867ab8..97acb90 100644 (file)
@@ -92,6 +92,7 @@ struct snd_usb_endpoint {
        unsigned int curframesize;      /* current packet size in frames (for capture) */
        unsigned int syncmaxsize;       /* sync endpoint packet size */
        unsigned int fill_max:1;        /* fill max packet size always */
+       unsigned int udh01_fb_quirk:1;  /* corrupted feedback data */
        unsigned int datainterval;      /* log_2 of data packet interval */
        unsigned int syncinterval;      /* P for adaptive mode, 0 otherwise */
        unsigned char silence_value;
index e70a87e..289f582 100644 (file)
@@ -471,6 +471,10 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
                        ep->syncinterval = 3;
 
                ep->syncmaxsize = le16_to_cpu(get_endpoint(alts, 1)->wMaxPacketSize);
+
+               if (chip->usb_id == USB_ID(0x0644, 0x8038) /* TEAC UD-H01 */ &&
+                   ep->syncmaxsize == 4)
+                       ep->udh01_fb_quirk = 1;
        }
 
        list_add_tail(&ep->list, &chip->ep_list);
@@ -1105,7 +1109,16 @@ void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep,
        if (f == 0)
                return;
 
-       if (unlikely(ep->freqshift == INT_MIN)) {
+       if (unlikely(sender->udh01_fb_quirk)) {
+               /*
+                * The TEAC UD-H01 firmware sometimes changes the feedback value
+                * by +/- 0x1.0000.
+                */
+               if (f < ep->freqn - 0x8000)
+                       f += 0x10000;
+               else if (f > ep->freqn + 0x8000)
+                       f -= 0x10000;
+       } else if (unlikely(ep->freqshift == INT_MIN)) {
                /*
                 * The first time we see a feedback value, determine its format
                 * by shifting it left or right until it matches the nominal
index 131336d..c62a165 100644 (file)
@@ -1501,9 +1501,8 @@ static void retire_playback_urb(struct snd_usb_substream *subs,
         * The error should be lower than 2ms since the estimate relies
         * on two reads of a counter updated every ms.
         */
-       if (printk_ratelimit() &&
-           abs(est_delay - subs->last_delay) * 1000 > runtime->rate * 2)
-               dev_dbg(&subs->dev->dev,
+       if (abs(est_delay - subs->last_delay) * 1000 > runtime->rate * 2)
+               dev_dbg_ratelimited(&subs->dev->dev,
                        "delay: estimated %d, actual %d\n",
                        est_delay, subs->last_delay);
 
index 25c4c7e..91d0380 100644 (file)
@@ -40,6 +40,7 @@ struct snd_usb_audio {
        struct rw_semaphore shutdown_rwsem;
        unsigned int shutdown:1;
        unsigned int probing:1;
+       unsigned int in_pm:1;
        unsigned int autosuspended:1;   
        unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */