Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm
Linus Torvalds [Mon, 15 Oct 2007 23:08:50 +0000 (16:08 -0700)]
* 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm: (95 commits)
  [ARM] 4578/1: CM-x270: PCMCIA support
  [ARM] 4577/1: ITE 8152 PCI bridge support
  [ARM] 4576/1: CM-X270 machine support
  [ARM] pxa: Avoid pxa_gpio_mode() in gpio_direction_{in,out}put()
  [ARM] pxa: move pxa_set_mode() from pxa2xx_mainstone.c to mainstone.c
  [ARM] pxa: move pxa_set_mode() from pxa2xx_lubbock.c to lubbock.c
  [ARM] pxa: Make cpu_is_pxaXXX dependent on configuration symbols
  [ARM] pxa: PXA3xx base support
  [NET] smc91x: fix PXA DMA support code
  [SERIAL] Fix console initialisation ordering
  [ARM] pxa: tidy up arch/arm/mach-pxa/Makefile
  [ARM] Update arch/arm/Kconfig for drivers/Kconfig changes
  [ARM] 4600/1: fix kernel build failure with build-id-supporting binutils
  [ARM] 4599/1: Preserve ATAG list for use with kexec (2.6.23)
  [ARM] Rename consistent_sync() as dma_cache_maint()
  [ARM] 4572/1: ep93xx: add cirrus logic edb9307 support
  [ARM] 4596/1: S3C2412: Correct IRQs for SDI+CF and add decoding support
  [ARM] 4595/1: ns9xxx: define registers as void __iomem * instead of volatile u32
  [ARM] 4594/1: ns9xxx: use the new gpio functions
  [ARM] 4593/1: ns9xxx: implement generic clockevents
  ...

1  2 
arch/arm/mach-omap1/board-h2.c
arch/arm/mach-omap1/board-h3.c
arch/arm/mach-omap1/board-osk.c
drivers/pcmcia/pxa2xx_mainstone.c
drivers/usb/gadget/pxa2xx_udc.c
include/linux/pci_ids.h

   */
  
  #include <linux/kernel.h>
 -#include <linux/init.h>
  #include <linux/platform_device.h>
  #include <linux/delay.h>
 +#include <linux/i2c.h>
  #include <linux/mtd/mtd.h>
  #include <linux/mtd/nand.h>
  #include <linux/mtd/partitions.h>
  #include <linux/input.h>
 -#include <linux/workqueue.h>
  
  #include <asm/hardware.h>
 +#include <asm/gpio.h>
 +
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/flash.h>
  #include <asm/mach/map.h>
  
 -#include <asm/arch/gpio.h>
 +#include <asm/arch/tps65010.h>
  #include <asm/arch/mux.h>
  #include <asm/arch/tc.h>
  #include <asm/arch/irda.h>
@@@ -140,6 -139,66 +140,66 @@@ static struct platform_device h2_nor_de
        .resource       = &h2_nor_resource,
  };
  
+ #if 0 /* REVISIT: Enable when nand_platform_data is applied */
+ static struct mtd_partition h2_nand_partitions[] = {
+ #if 0
+       /* REVISIT:  enable these partitions if you make NAND BOOT
+        * work on your H2 (rev C or newer); published versions of
+        * x-load only support P2 and H3.
+        */
+       {
+               .name           = "xloader",
+               .offset         = 0,
+               .size           = 64 * 1024,
+               .mask_flags     = MTD_WRITEABLE,        /* force read-only */
+       },
+       {
+               .name           = "bootloader",
+               .offset         = MTDPART_OFS_APPEND,
+               .size           = 256 * 1024,
+               .mask_flags     = MTD_WRITEABLE,        /* force read-only */
+       },
+       {
+               .name           = "params",
+               .offset         = MTDPART_OFS_APPEND,
+               .size           = 192 * 1024,
+       },
+       {
+               .name           = "kernel",
+               .offset         = MTDPART_OFS_APPEND,
+               .size           = 2 * SZ_1M,
+       },
+ #endif
+       {
+               .name           = "filesystem",
+               .size           = MTDPART_SIZ_FULL,
+               .offset         = MTDPART_OFS_APPEND,
+       },
+ };
+ /* dip switches control NAND chip access:  8 bit, 16 bit, or neither */
+ static struct nand_platform_data h2_nand_data = {
+       .options        = NAND_SAMSUNG_LP_OPTIONS,
+       .parts          = h2_nand_partitions,
+       .nr_parts       = ARRAY_SIZE(h2_nand_partitions),
+ };
+ static struct resource h2_nand_resource = {
+       .flags          = IORESOURCE_MEM,
+ };
+ static struct platform_device h2_nand_device = {
+       .name           = "omapnand",
+       .id             = 0,
+       .dev            = {
+               .platform_data  = &h2_nand_data,
+       },
+       .num_resources  = 1,
+       .resource       = &h2_nand_resource,
+ };
+ #endif
  static struct resource h2_smc91x_resources[] = {
        [0] = {
                .start  = OMAP1610_ETHR_START,          /* Physical */
@@@ -219,11 -278,15 +279,15 @@@ static struct resource h2_irda_resource
                .flags  = IORESOURCE_IRQ,
        },
  };
+ static u64 irda_dmamask = 0xffffffff;
  static struct platform_device h2_irda_device = {
        .name           = "omapirda",
        .id             = 0,
        .dev            = {
                .platform_data  = &h2_irda_data,
+               .dma_mask       = &irda_dmamask,
        },
        .num_resources  = ARRAY_SIZE(h2_irda_resources),
        .resource       = h2_irda_resources,
@@@ -271,6 -334,7 +335,7 @@@ static struct platform_device h2_mcbsp1
  
  static struct platform_device *h2_devices[] __initdata = {
        &h2_nor_device,
+       //&h2_nand_device,
        &h2_smc91x_device,
        &h2_irda_device,
        &h2_kp_device,
        &h2_mcbsp1_device,
  };
  
 +static struct i2c_board_info __initdata h2_i2c_board_info[] = {
 +      {
 +              I2C_BOARD_INFO("tps65010", 0x48),
 +              .type           = "tps65010",
 +              .irq            = OMAP_GPIO_IRQ(58),
 +      },
 +      /* TODO when driver support is ready:
 +       *  - isp1301 OTG transceiver
 +       *  - optional ov9640 camera sensor at 0x30
 +       *  - pcf9754 for aGPS control
 +       *  - ... etc
 +       */
 +};
 +
  static void __init h2_init_smc91x(void)
  {
        if ((omap_request_gpio(0)) < 0) {
@@@ -348,6 -398,13 +413,13 @@@ static struct omap_board_config_kernel 
        { OMAP_TAG_LCD,         &h2_lcd_config },
  };
  
+ #define H2_NAND_RB_GPIO_PIN   62
+ static int h2_nand_dev_ready(struct nand_platform_data *data)
+ {
+       return omap_get_gpio_datain(H2_NAND_RB_GPIO_PIN);
+ }
  static void __init h2_init(void)
  {
        /* Here we assume the NOR boot config:  NOR on CS3 (possibly swapped
        h2_nor_resource.end = h2_nor_resource.start = omap_cs3_phys();
        h2_nor_resource.end += SZ_32M - 1;
  
+ #if 0 /* REVISIT: Enable when nand_platform_data is applied */
+       h2_nand_resource.end = h2_nand_resource.start = OMAP_CS2B_PHYS;
+       h2_nand_resource.end += SZ_4K - 1;
+       if (!(omap_request_gpio(H2_NAND_RB_GPIO_PIN)))
+               h2_nand_data.dev_ready = h2_nand_dev_ready;
+ #endif
        omap_cfg_reg(L3_1610_FLASH_CS2B_OE);
        omap_cfg_reg(M8_1610_FLASH_CS2B_WE);
  
        omap_board_config = h2_config;
        omap_board_config_size = ARRAY_SIZE(h2_config);
        omap_serial_init();
 +
 +      /* irq for tps65010 chip */
 +      omap_cfg_reg(W4_GPIO58);
 +      if (gpio_request(58, "tps65010") == 0)
 +              gpio_direction_input(58);
 +
 +      i2c_register_board_info(1, h2_i2c_board_info,
 +                      ARRAY_SIZE(h2_i2c_board_info));
  }
  
  static void __init h2_map_io(void)
        omap1_map_common_io();
  }
  
 +#ifdef CONFIG_TPS65010
 +static int __init h2_tps_init(void)
 +{
 +      if (!machine_is_omap_h2())
 +              return 0;
 +
 +      /* gpio3 for SD, gpio4 for VDD_DSP */
 +      /* FIXME send power to DSP iff it's configured */
 +
 +      /* Enable LOW_PWR */
 +      tps65010_set_low_pwr(ON);
 +      return 0;
 +}
 +fs_initcall(h2_tps_init);
 +#endif
 +
  MACHINE_START(OMAP_H2, "TI-H2")
        /* Maintainer: Imre Deak <imre.deak@nokia.com> */
        .phys_io        = 0xfff00000,
@@@ -21,7 -21,6 +21,7 @@@
  #include <linux/platform_device.h>
  #include <linux/errno.h>
  #include <linux/workqueue.h>
 +#include <linux/i2c.h>
  #include <linux/mtd/mtd.h>
  #include <linux/mtd/nand.h>
  #include <linux/mtd/partitions.h>
  #include <asm/setup.h>
  #include <asm/page.h>
  #include <asm/hardware.h>
 +#include <asm/gpio.h>
 +
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/flash.h>
  #include <asm/mach/map.h>
  
 -#include <asm/arch/gpio.h>
 +#include <asm/arch/tps65010.h>
  #include <asm/arch/gpioexpander.h>
  #include <asm/arch/irqs.h>
  #include <asm/arch/mux.h>
@@@ -47,6 -44,8 +47,8 @@@
  #include <asm/arch/keypad.h>
  #include <asm/arch/dma.h>
  #include <asm/arch/common.h>
+ #include <asm/arch/mcbsp.h>
+ #include <asm/arch/omap-alsa.h>
  
  extern int omap_gpio_init(void);
  
@@@ -354,11 -353,14 +356,14 @@@ static struct resource h3_irda_resource
        },
  };
  
+ static u64 irda_dmamask = 0xffffffff;
  static struct platform_device h3_irda_device = {
        .name           = "omapirda",
        .id             = 0,
        .dev            = {
                .platform_data  = &h3_irda_data,
+               .dma_mask       = &irda_dmamask,
        },
        .num_resources  = ARRAY_SIZE(h3_irda_resources),
        .resource       = h3_irda_resources,
@@@ -369,6 -371,41 +374,41 @@@ static struct platform_device h3_lcd_de
        .id             = -1,
  };
  
+ static struct omap_mcbsp_reg_cfg mcbsp_regs = {
+       .spcr2 = FREE | FRST | GRST | XRST | XINTM(3),
+       .spcr1 = RINTM(3) | RRST,
+       .rcr2  = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) |
+                 RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(1),
+       .rcr1  = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16),
+       .xcr2  = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) |
+                 XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG,
+       .xcr1  = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16),
+       .srgr1 = FWID(15),
+       .srgr2 = GSYNC | CLKSP | FSGM | FPER(31),
+       .pcr0  = CLKRM | SCLKME | FSXP | FSRP | CLKXP | CLKRP,
+       //.pcr0 = CLKXP | CLKRP,        /* mcbsp: slave */
+ };
+ static struct omap_alsa_codec_config alsa_config = {
+       .name                   = "H3 TSC2101",
+       .mcbsp_regs_alsa        = &mcbsp_regs,
+       .codec_configure_dev    = NULL, // tsc2101_configure,
+       .codec_set_samplerate   = NULL, // tsc2101_set_samplerate,
+       .codec_clock_setup      = NULL, // tsc2101_clock_setup,
+       .codec_clock_on         = NULL, // tsc2101_clock_on,
+       .codec_clock_off        = NULL, // tsc2101_clock_off,
+       .get_default_samplerate = NULL, // tsc2101_get_default_samplerate,
+ };
+ static struct platform_device h3_mcbsp1_device = {
+       .name   = "omap_alsa_mcbsp",
+       .id     = 1,
+       .dev = {
+               .platform_data  = &alsa_config,
+       },
+ };
  static struct platform_device *devices[] __initdata = {
        &nor_device,
        &nand_device,
        &h3_irda_device,
        &h3_kp_device,
        &h3_lcd_device,
+       &h3_mcbsp1_device,
  };
  
  static struct omap_usb_config h3_usb_config __initdata = {
@@@ -416,19 -454,6 +457,19 @@@ static struct omap_board_config_kernel 
        { OMAP_TAG_LCD,         &h3_lcd_config },
  };
  
 +static struct i2c_board_info __initdata h3_i2c_board_info[] = {
 +      {
 +              I2C_BOARD_INFO("tps65010", 0x48),
 +              .type           = "tps65013",
 +              /* .irq         = OMAP_GPIO_IRQ(??), */
 +      },
 +      /* TODO when driver support is ready:
 +       *  - isp1301 OTG transceiver
 +       *  - optional ov9640 camera sensor at 0x30
 +       *  - ...
 +       */
 +};
 +
  #define H3_NAND_RB_GPIO_PIN   10
  
  static int nand_dev_ready(struct nand_platform_data *data)
@@@ -462,10 -487,6 +503,10 @@@ static void __init h3_init(void
        omap_board_config = h3_config;
        omap_board_config_size = ARRAY_SIZE(h3_config);
        omap_serial_init();
 +
 +      /* FIXME setup irq for tps65013 chip */
 +      i2c_register_board_info(1, h3_i2c_board_info,
 +                      ARRAY_SIZE(h3_i2c_board_info));
  }
  
  static void __init h3_init_smc91x(void)
@@@ -490,23 -511,6 +531,23 @@@ static void __init h3_map_io(void
        omap1_map_common_io();
  }
  
 +#ifdef CONFIG_TPS65010
 +static int __init h3_tps_init(void)
 +{
 +      if (!machine_is_omap_h3())
 +              return 0;
 +
 +      /* gpio4 for SD, gpio3 for VDD_DSP */
 +      /* FIXME send power to DSP iff it's configured */
 +
 +      /* Enable LOW_PWR */
 +      tps65013_set_low_pwr(ON);
 +
 +      return 0;
 +}
 +fs_initcall(h3_tps_init);
 +#endif
 +
  MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")
        /* Maintainer: Texas Instruments, Inc. */
        .phys_io        = 0xfff00000,
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/platform_device.h>
+ #include <linux/interrupt.h>
  #include <linux/irq.h>
  #include <linux/interrupt.h>
 +#include <linux/i2c.h>
  
  #include <linux/mtd/mtd.h>
  #include <linux/mtd/partitions.h>
  
  #include <asm/hardware.h>
 +#include <asm/gpio.h>
 +
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
  #include <asm/mach/map.h>
  #include <asm/mach/flash.h>
  
 -#include <asm/arch/gpio.h>
  #include <asm/arch/usb.h>
 +#include <asm/arch/tps65010.h>
  #include <asm/arch/mux.h>
  #include <asm/arch/tc.h>
  #include <asm/arch/common.h>
@@@ -182,19 -180,6 +183,19 @@@ static struct platform_device *osk5912_
        &osk5912_mcbsp1_device,
  };
  
 +static struct i2c_board_info __initdata osk_i2c_board_info[] = {
 +      {
 +              I2C_BOARD_INFO("tps65010", 0x48),
 +              .type           = "tps65010",
 +              .irq            = OMAP_GPIO_IRQ(OMAP_MPUIO(1)),
 +      },
 +      /* TODO when driver support is ready:
 +       *  - aic23 audio chip at 0x1a
 +       *  - on Mistral, 24c04 eeprom at 0x50
 +       *  - optionally on Mistral, ov9640 camera sensor at 0x30
 +       */
 +};
 +
  static void __init osk_init_smc91x(void)
  {
        if ((omap_request_gpio(0)) < 0) {
@@@ -308,6 -293,18 +309,18 @@@ static struct platform_device osk5912_k
        .resource       = osk5912_kp_resources,
  };
  
+ static struct omap_backlight_config mistral_bl_data = {
+       .default_intensity      = 0xa0,
+ };
+ static struct platform_device mistral_bl_device = {
+       .name           = "omap-bl",
+       .id             = -1,
+       .dev            = {
+               .platform_data = &mistral_bl_data,
+       },
+ };
  static struct platform_device osk5912_lcd_device = {
        .name           = "lcd_osk",
        .id             = -1,
  
  static struct platform_device *mistral_devices[] __initdata = {
        &osk5912_kp_device,
+       &mistral_bl_device,
        &osk5912_lcd_device,
  };
  
@@@ -358,6 -356,38 +372,38 @@@ static void __init osk_mistral_init(voi
         * can't talk to the ads or even the i2c eeprom.
         */
  
+       /* parallel camera interface */
+       omap_cfg_reg(J15_1610_CAM_LCLK);
+       omap_cfg_reg(J18_1610_CAM_D7);
+       omap_cfg_reg(J19_1610_CAM_D6);
+       omap_cfg_reg(J14_1610_CAM_D5);
+       omap_cfg_reg(K18_1610_CAM_D4);
+       omap_cfg_reg(K19_1610_CAM_D3);
+       omap_cfg_reg(K15_1610_CAM_D2);
+       omap_cfg_reg(K14_1610_CAM_D1);
+       omap_cfg_reg(L19_1610_CAM_D0);
+       omap_cfg_reg(L18_1610_CAM_VS);
+       omap_cfg_reg(L15_1610_CAM_HS);
+       omap_cfg_reg(M19_1610_CAM_RSTZ);
+       omap_cfg_reg(Y15_1610_CAM_OUTCLK);
+       /* serial camera interface */
+       omap_cfg_reg(H19_1610_CAM_EXCLK);
+       omap_cfg_reg(W13_1610_CCP_CLKM);
+       omap_cfg_reg(Y12_1610_CCP_CLKP);
+       /* CCP_DATAM CONFLICTS WITH UART1.TX (and serial console) */
+       // omap_cfg_reg(Y14_1610_CCP_DATAM);
+       omap_cfg_reg(W14_1610_CCP_DATAP);
+       /* CAM_PWDN */
+       if (omap_request_gpio(11) == 0) {
+               omap_cfg_reg(N20_1610_GPIO11);
+               omap_set_gpio_direction(11, 0 /* out */);
+               omap_set_gpio_dataout(11, 0 /* off */);
+       } else
+               pr_debug("OSK+Mistral: CAM_PWDN is awol\n");
        // omap_cfg_reg(P19_1610_GPIO6);        // BUSY
        omap_cfg_reg(P20_1610_GPIO4);   // PENIRQ
        set_irq_type(OMAP_GPIO_IRQ(4), IRQT_FALLING);
        } else
                printk(KERN_ERR "OSK+Mistral: wakeup button is awol\n");
  
+       /* LCD:  backlight, and power; power controls other devices on the
+        * board, like the touchscreen, EEPROM, and wakeup (!) switch.
+        */
+       omap_cfg_reg(PWL);
+       if (omap_request_gpio(2) == 0) {
+               omap_set_gpio_direction(2, 0 /* out */);
+               omap_set_gpio_dataout(2, 1 /* on */);
+       }
        platform_add_devices(mistral_devices, ARRAY_SIZE(mistral_devices));
  }
  #else
@@@ -413,14 -452,6 +468,14 @@@ static void __init osk_init(void
        omap_board_config_size = ARRAY_SIZE(osk_config);
        USB_TRANSCEIVER_CTRL_REG |= (3 << 1);
  
 +      /* irq for tps65010 chip */
 +      /* bootloader effectively does:  omap_cfg_reg(U19_1610_MPUIO1); */
 +      if (gpio_request(OMAP_MPUIO(1), "tps65010") == 0)
 +              gpio_direction_input(OMAP_MPUIO(1));
 +
 +      i2c_register_board_info(1, osk_i2c_board_info,
 +                      ARRAY_SIZE(osk_i2c_board_info));
 +
        omap_serial_init();
        osk_mistral_init();
  }
@@@ -430,44 -461,6 +485,44 @@@ static void __init osk_map_io(void
        omap1_map_common_io();
  }
  
 +#ifdef CONFIG_TPS65010
 +static int __init osk_tps_init(void)
 +{
 +      if (!machine_is_omap_osk())
 +              return 0;
 +
 +      /* Let LED1 (D9) blink */
 +      tps65010_set_led(LED1, BLINK);
 +
 +      /* Disable LED 2 (D2) */
 +      tps65010_set_led(LED2, OFF);
 +
 +      /* Set GPIO 1 HIGH to disable VBUS power supply;
 +       * OHCI driver powers it up/down as needed.
 +       */
 +      tps65010_set_gpio_out_value(GPIO1, HIGH);
 +
 +      /* Set GPIO 2 low to turn on LED D3 */
 +      tps65010_set_gpio_out_value(GPIO2, HIGH);
 +
 +      /* Set GPIO 3 low to take ethernet out of reset */
 +      tps65010_set_gpio_out_value(GPIO3, LOW);
 +
 +      /* gpio4 for VDD_DSP */
 +      /* FIXME send power to DSP iff it's configured */
 +
 +      /* Enable LOW_PWR */
 +      tps65010_set_low_pwr(ON);
 +
 +      /* Switch VLDO2 to 3.0V for AIC23 */
 +      tps65010_config_vregs1(TPS_LDO2_ENABLE | TPS_VLDO2_3_0V
 +                      | TPS_LDO1_ENABLE);
 +
 +      return 0;
 +}
 +fs_initcall(osk_tps_init);
 +#endif
 +
  MACHINE_START(OMAP_OSK, "TI-OSK")
        /* Maintainer: Dirk Behme <dirk.behme@de.bosch.com> */
        .phys_io        = 0xfff00000,
@@@ -43,24 -43,6 +43,6 @@@ static int mst_pcmcia_hw_init(struct so
         * Setup default state of GPIO outputs
         * before we enable them as outputs.
         */
-       GPSR(GPIO48_nPOE) =
-               GPIO_bit(GPIO48_nPOE) |
-               GPIO_bit(GPIO49_nPWE) |
-               GPIO_bit(GPIO50_nPIOR) |
-               GPIO_bit(GPIO51_nPIOW) |
-               GPIO_bit(GPIO85_nPCE_1) |
-               GPIO_bit(GPIO54_nPCE_2);
-       pxa_gpio_mode(GPIO48_nPOE_MD);
-       pxa_gpio_mode(GPIO49_nPWE_MD);
-       pxa_gpio_mode(GPIO50_nPIOR_MD);
-       pxa_gpio_mode(GPIO51_nPIOW_MD);
-       pxa_gpio_mode(GPIO85_nPCE_1_MD);
-       pxa_gpio_mode(GPIO54_nPCE_2_MD);
-       pxa_gpio_mode(GPIO79_pSKTSEL_MD);
-       pxa_gpio_mode(GPIO55_nPREG_MD);
-       pxa_gpio_mode(GPIO56_nPWAIT_MD);
-       pxa_gpio_mode(GPIO57_nIOIS16_MD);
  
        skt->irq = (skt->nr == 0) ? MAINSTONE_S0_IRQ : MAINSTONE_S1_IRQ;
        return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
@@@ -175,6 -157,7 +157,6 @@@ static int __init mst_pcmcia_init(void
        if (!mst_pcmcia_device)
                return -ENOMEM;
  
 -      mst_pcmcia_device->dev.uevent_suppress = 0;
        mst_pcmcia_device->dev.platform_data = &mst_pcmcia_ops;
  
        ret = platform_device_add(mst_pcmcia_device);
@@@ -194,4 -177,3 +176,4 @@@ fs_initcall(mst_pcmcia_init)
  module_exit(mst_pcmcia_exit);
  
  MODULE_LICENSE("GPL");
 +MODULE_ALIAS("platform:pxa2xx-pcmcia");
@@@ -43,6 -43,8 +43,8 @@@
  #include <linux/platform_device.h>
  #include <linux/dma-mapping.h>
  #include <linux/irq.h>
+ #include <linux/clk.h>
+ #include <linux/err.h>
  
  #include <asm/byteorder.h>
  #include <asm/dma.h>
@@@ -54,7 -56,7 +56,7 @@@
  #include <asm/hardware.h>
  
  #include <linux/usb/ch9.h>
 -#include <linux/usb_gadget.h>
 +#include <linux/usb/gadget.h>
  
  #include <asm/mach/udc_pxa2xx.h>
  
@@@ -1157,7 -1159,7 +1159,7 @@@ static void udc_disable(struct pxa2xx_u
  
  #ifdef        CONFIG_ARCH_PXA
          /* Disable clock for USB device */
-       pxa_set_cken(CKEN_USB, 0);
+       clk_disable(dev->clk);
  #endif
  
        ep0_idle (dev);
@@@ -1202,8 -1204,7 +1204,7 @@@ static void udc_enable (struct pxa2xx_u
  
  #ifdef        CONFIG_ARCH_PXA
          /* Enable clock for USB device */
-       pxa_set_cken(CKEN_USB, 1);
-       udelay(5);
+       clk_enable(dev->clk);
  #endif
  
        /* try to clear these bits before we enable the udc */
@@@ -2137,6 -2138,14 +2138,14 @@@ static int __init pxa2xx_udc_probe(stru
        if (irq < 0)
                return -ENODEV;
  
+ #ifdef        CONFIG_ARCH_PXA
+       dev->clk = clk_get(&pdev->dev, "UDCCLK");
+       if (IS_ERR(dev->clk)) {
+               retval = PTR_ERR(dev->clk);
+               goto err_clk;
+       }
+ #endif
        pr_debug("%s: IRQ %d%s%s\n", driver_name, irq,
                dev->has_cfr ? "" : " (!cfr)",
                SIZE_STR "(pio)"
                        dev_dbg(&pdev->dev,
                                "can't get vbus gpio %d, err: %d\n",
                                dev->mach->gpio_vbus, retval);
-                       return -EBUSY;
+                       goto err_gpio_vbus;
                }
                gpio_direction_input(dev->mach->gpio_vbus);
                vbus_irq = gpio_to_irq(dev->mach->gpio_vbus);
-               set_irq_type(vbus_irq, IRQT_BOTHEDGE);
        } else
                vbus_irq = 0;
  
                        dev_dbg(&pdev->dev,
                                "can't get pullup gpio %d, err: %d\n",
                                dev->mach->gpio_pullup, retval);
-                       if (dev->mach->gpio_vbus)
-                               gpio_free(dev->mach->gpio_vbus);
-                       return -EBUSY;
+                       goto err_gpio_pullup;
                }
                gpio_direction_output(dev->mach->gpio_pullup, 0);
        }
        if (retval != 0) {
                printk(KERN_ERR "%s: can't get irq %d, err %d\n",
                        driver_name, irq, retval);
-               if (dev->mach->gpio_pullup)
-                       gpio_free(dev->mach->gpio_pullup);
-               if (dev->mach->gpio_vbus)
-                       gpio_free(dev->mach->gpio_vbus);
-               return -EBUSY;
+               goto err_irq1;
        }
        dev->got_irq = 1;
  
                        printk(KERN_ERR "%s: can't get irq %i, err %d\n",
                                driver_name, LUBBOCK_USB_DISC_IRQ, retval);
  lubbock_fail0:
-                       free_irq(irq, dev);
-                       if (dev->mach->gpio_pullup)
-                               gpio_free(dev->mach->gpio_pullup);
-                       if (dev->mach->gpio_vbus)
-                               gpio_free(dev->mach->gpio_vbus);
-                       return -EBUSY;
+                       goto err_irq_lub;
                }
                retval = request_irq(LUBBOCK_USB_IRQ,
                                lubbock_vbus_irq,
  #endif
        if (vbus_irq) {
                retval = request_irq(vbus_irq, udc_vbus_irq,
-                               IRQF_DISABLED | IRQF_SAMPLE_RANDOM,
+                               IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
+                               IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
                                driver_name, dev);
                if (retval != 0) {
                        printk(KERN_ERR "%s: can't get irq %i, err %d\n",
                                driver_name, vbus_irq, retval);
-                       free_irq(irq, dev);
-                       if (dev->mach->gpio_pullup)
-                               gpio_free(dev->mach->gpio_pullup);
-                       if (dev->mach->gpio_vbus)
-                               gpio_free(dev->mach->gpio_vbus);
-                       return -EBUSY;
+                       goto err_vbus_irq;
                }
        }
        create_proc_files();
  
        return 0;
+  err_vbus_irq:
+ #ifdef        CONFIG_ARCH_LUBBOCK
+       free_irq(LUBBOCK_USB_DISC_IRQ, dev);
+  err_irq_lub:
+ #endif
+       free_irq(irq, dev);
+  err_irq1:
+       if (dev->mach->gpio_pullup)
+               gpio_free(dev->mach->gpio_pullup);
+  err_gpio_pullup:
+       if (dev->mach->gpio_vbus)
+               gpio_free(dev->mach->gpio_vbus);
+  err_gpio_vbus:
+ #ifdef        CONFIG_ARCH_PXA
+       clk_put(dev->clk);
+  err_clk:
+ #endif
+       return retval;
  }
  
  static void pxa2xx_udc_shutdown(struct platform_device *_dev)
@@@ -2284,6 -2296,10 +2296,10 @@@ static int __exit pxa2xx_udc_remove(str
        if (dev->mach->gpio_pullup)
                gpio_free(dev->mach->gpio_pullup);
  
+ #ifdef        CONFIG_ARCH_PXA
+       clk_put(dev->clk);
+ #endif
        platform_set_drvdata(pdev, NULL);
        the_controller = NULL;
        return 0;
diff --combined include/linux/pci_ids.h
  #define PCI_DEVICE_ID_UMC_UM8886BF    0x673a
  #define PCI_DEVICE_ID_UMC_UM8886A     0x886a
  
 +#define PCI_VENDOR_ID_PICOPOWER               0x1066
 +#define PCI_DEVICE_ID_PICOPOWER_PT86C523      0x0002
 +#define PCI_DEVICE_ID_PICOPOWER_PT86C523BBP   0x8002
  
  #define PCI_VENDOR_ID_MYLEX           0x1069
  #define PCI_DEVICE_ID_MYLEX_DAC960_P  0x0001
  #define PCI_DEVICE_ID_TOSHIBA_TC86C001_MISC   0x0108
  #define PCI_DEVICE_ID_TOSHIBA_SPIDER_NET 0x01b3
  
 +#define PCI_VENDOR_ID_ATTO            0x117c
 +
  #define PCI_VENDOR_ID_RICOH           0x1180
  #define PCI_DEVICE_ID_RICOH_RL5C465   0x0465
  #define PCI_DEVICE_ID_RICOH_RL5C466   0x0466
  #define PCI_DEVICE_ID_ITE_8211                0x8211
  #define PCI_DEVICE_ID_ITE_8212                0x8212
  #define PCI_DEVICE_ID_ITE_8213                0x8213
+ #define PCI_DEVICE_ID_ITE_8152                0x8152
  #define PCI_DEVICE_ID_ITE_8872                0x8872
  #define PCI_DEVICE_ID_ITE_IT8330G_0   0xe886
  
  #define PCI_DEVICE_ID_ARECA_1130      0x1130
  #define PCI_DEVICE_ID_ARECA_1160      0x1160
  #define PCI_DEVICE_ID_ARECA_1170      0x1170
 +#define PCI_DEVICE_ID_ARECA_1200      0x1200
 +#define PCI_DEVICE_ID_ARECA_1201      0x1201
 +#define PCI_DEVICE_ID_ARECA_1202      0x1202
  #define PCI_DEVICE_ID_ARECA_1210      0x1210
  #define PCI_DEVICE_ID_ARECA_1220      0x1220
  #define PCI_DEVICE_ID_ARECA_1230      0x1230
  #define PCI_DEVICE_ID_INTEL_82801EB_5 0x24d5
  #define PCI_DEVICE_ID_INTEL_82801EB_6 0x24d6
  #define PCI_DEVICE_ID_INTEL_82801EB_11        0x24db
 +#define PCI_DEVICE_ID_INTEL_82801EB_12        0x24dc
  #define PCI_DEVICE_ID_INTEL_82801EB_13        0x24dd
  #define PCI_DEVICE_ID_INTEL_ESB_1     0x25a1
  #define PCI_DEVICE_ID_INTEL_ESB_2     0x25a2