diff options
31 files changed, 864 insertions, 95 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index d96e7451891f..1f02d96a5dbf 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -636,7 +636,7 @@ P: Dirk Opfer | |||
| 636 | M: dirk@opfer-online.de | 636 | M: dirk@opfer-online.de |
| 637 | S: Maintained | 637 | S: Maintained |
| 638 | 638 | ||
| 639 | ARM/PALMTX,PALMT5,PALMLD SUPPORT | 639 | ARM/PALMTX,PALMT5,PALMLD,PALMTE2 SUPPORT |
| 640 | P: Marek Vasut | 640 | P: Marek Vasut |
| 641 | M: marek.vasut@gmail.com | 641 | M: marek.vasut@gmail.com |
| 642 | W: http://hackndev.com | 642 | W: http://hackndev.com |
diff --git a/arch/arm/configs/magician_defconfig b/arch/arm/configs/magician_defconfig index 82428c2f234c..f56837f69ca7 100644 --- a/arch/arm/configs/magician_defconfig +++ b/arch/arm/configs/magician_defconfig | |||
| @@ -1183,7 +1183,11 @@ CONFIG_RTC_INTF_DEV=y | |||
| 1183 | CONFIG_RTC_DRV_SA1100=y | 1183 | CONFIG_RTC_DRV_SA1100=y |
| 1184 | # CONFIG_RTC_DRV_PXA is not set | 1184 | # CONFIG_RTC_DRV_PXA is not set |
| 1185 | # CONFIG_DMADEVICES is not set | 1185 | # CONFIG_DMADEVICES is not set |
| 1186 | # CONFIG_REGULATOR is not set | 1186 | CONFIG_REGULATOR=y |
| 1187 | # CONFIG_REGULATOR_DEBUG is not set | ||
| 1188 | # CONFIG_REGULATOR_FIXED_VOLTAGE is not set | ||
| 1189 | # CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set | ||
| 1190 | CONFIG_REGULATOR_BQ24022=y | ||
| 1187 | # CONFIG_UIO is not set | 1191 | # CONFIG_UIO is not set |
| 1188 | # CONFIG_STAGING is not set | 1192 | # CONFIG_STAGING is not set |
| 1189 | 1193 | ||
diff --git a/arch/arm/include/asm/sizes.h b/arch/arm/include/asm/sizes.h index c10d1aa4b487..ada93a8fc2ef 100644 --- a/arch/arm/include/asm/sizes.h +++ b/arch/arm/include/asm/sizes.h | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #define SZ_4K 0x00001000 | 32 | #define SZ_4K 0x00001000 |
| 33 | #define SZ_8K 0x00002000 | 33 | #define SZ_8K 0x00002000 |
| 34 | #define SZ_16K 0x00004000 | 34 | #define SZ_16K 0x00004000 |
| 35 | #define SZ_32K 0x00008000 | ||
| 35 | #define SZ_64K 0x00010000 | 36 | #define SZ_64K 0x00010000 |
| 36 | #define SZ_128K 0x00020000 | 37 | #define SZ_128K 0x00020000 |
| 37 | #define SZ_256K 0x00040000 | 38 | #define SZ_256K 0x00040000 |
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index 793fe7b25f36..e6afff849b85 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h | |||
| @@ -87,7 +87,7 @@ extern void __init at91_add_device_eth(struct at91_eth_data *data); | |||
| 87 | /* USB Host */ | 87 | /* USB Host */ |
| 88 | struct at91_usbh_data { | 88 | struct at91_usbh_data { |
| 89 | u8 ports; /* number of ports on root hub */ | 89 | u8 ports; /* number of ports on root hub */ |
| 90 | u8 vbus_pin[]; /* port power-control pin */ | 90 | u8 vbus_pin[2]; /* port power-control pin */ |
| 91 | }; | 91 | }; |
| 92 | extern void __init at91_add_device_usbh(struct at91_usbh_data *data); | 92 | extern void __init at91_add_device_usbh(struct at91_usbh_data *data); |
| 93 | 93 | ||
diff --git a/arch/arm/mach-omap1/clock.c b/arch/arm/mach-omap1/clock.c index dafe4f71d15f..336e51dc6127 100644 --- a/arch/arm/mach-omap1/clock.c +++ b/arch/arm/mach-omap1/clock.c | |||
| @@ -590,27 +590,28 @@ static void omap1_init_ext_clk(struct clk * clk) | |||
| 590 | static int omap1_clk_enable(struct clk *clk) | 590 | static int omap1_clk_enable(struct clk *clk) |
| 591 | { | 591 | { |
| 592 | int ret = 0; | 592 | int ret = 0; |
| 593 | |||
| 593 | if (clk->usecount++ == 0) { | 594 | if (clk->usecount++ == 0) { |
| 594 | if (likely(clk->parent)) { | 595 | if (clk->parent) { |
| 595 | ret = omap1_clk_enable(clk->parent); | 596 | ret = omap1_clk_enable(clk->parent); |
| 596 | 597 | if (ret) | |
| 597 | if (unlikely(ret != 0)) { | 598 | goto err; |
| 598 | clk->usecount--; | ||
| 599 | return ret; | ||
| 600 | } | ||
| 601 | 599 | ||
| 602 | if (clk->flags & CLOCK_NO_IDLE_PARENT) | 600 | if (clk->flags & CLOCK_NO_IDLE_PARENT) |
| 603 | omap1_clk_deny_idle(clk->parent); | 601 | omap1_clk_deny_idle(clk->parent); |
| 604 | } | 602 | } |
| 605 | 603 | ||
| 606 | ret = clk->ops->enable(clk); | 604 | ret = clk->ops->enable(clk); |
| 607 | 605 | if (ret) { | |
| 608 | if (unlikely(ret != 0) && clk->parent) { | 606 | if (clk->parent) |
| 609 | omap1_clk_disable(clk->parent); | 607 | omap1_clk_disable(clk->parent); |
| 610 | clk->usecount--; | 608 | goto err; |
| 611 | } | 609 | } |
| 612 | } | 610 | } |
| 611 | return ret; | ||
| 613 | 612 | ||
| 613 | err: | ||
| 614 | clk->usecount--; | ||
| 614 | return ret; | 615 | return ret; |
| 615 | } | 616 | } |
| 616 | 617 | ||
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index 96a2006cb597..3e66d9099eab 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig | |||
| @@ -343,6 +343,15 @@ config ARCH_PXA_PALM | |||
| 343 | bool "PXA based Palm PDAs" | 343 | bool "PXA based Palm PDAs" |
| 344 | select HAVE_PWM | 344 | select HAVE_PWM |
| 345 | 345 | ||
| 346 | config MACH_PALMTE2 | ||
| 347 | bool "Palm Tungsten|E2" | ||
| 348 | default y | ||
| 349 | depends on ARCH_PXA_PALM | ||
| 350 | select PXA25x | ||
| 351 | help | ||
| 352 | Say Y here if you intend to run this kernel on a Palm Tungsten|E2 | ||
| 353 | handheld computer. | ||
| 354 | |||
| 346 | config MACH_PALMT5 | 355 | config MACH_PALMT5 |
| 347 | bool "Palm Tungsten|T5" | 356 | bool "Palm Tungsten|T5" |
| 348 | default y | 357 | default y |
diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index c80e1bac4945..682dbf4e14b0 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile | |||
| @@ -57,6 +57,7 @@ obj-$(CONFIG_MACH_E740) += e740.o | |||
| 57 | obj-$(CONFIG_MACH_E750) += e750.o | 57 | obj-$(CONFIG_MACH_E750) += e750.o |
| 58 | obj-$(CONFIG_MACH_E400) += e400.o | 58 | obj-$(CONFIG_MACH_E400) += e400.o |
| 59 | obj-$(CONFIG_MACH_E800) += e800.o | 59 | obj-$(CONFIG_MACH_E800) += e800.o |
| 60 | obj-$(CONFIG_MACH_PALMTE2) += palmte2.o | ||
| 60 | obj-$(CONFIG_MACH_PALMT5) += palmt5.o | 61 | obj-$(CONFIG_MACH_PALMT5) += palmt5.o |
| 61 | obj-$(CONFIG_MACH_PALMTX) += palmtx.o | 62 | obj-$(CONFIG_MACH_PALMTX) += palmtx.o |
| 62 | obj-$(CONFIG_MACH_PALMLD) += palmld.o | 63 | obj-$(CONFIG_MACH_PALMLD) += palmld.o |
diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c index 117b5435f8d5..b50ef39eabfc 100644 --- a/arch/arm/mach-pxa/cm-x2xx.c +++ b/arch/arm/mach-pxa/cm-x2xx.c | |||
| @@ -121,7 +121,7 @@ static inline void cmx2xx_init_dm9000(void) {} | |||
| 121 | /* UCB1400 touchscreen controller */ | 121 | /* UCB1400 touchscreen controller */ |
| 122 | #if defined(CONFIG_TOUCHSCREEN_UCB1400) || defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE) | 122 | #if defined(CONFIG_TOUCHSCREEN_UCB1400) || defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE) |
| 123 | static struct platform_device cmx2xx_ts_device = { | 123 | static struct platform_device cmx2xx_ts_device = { |
| 124 | .name = "ucb1400_ts", | 124 | .name = "ucb1400_core", |
| 125 | .id = -1, | 125 | .id = -1, |
| 126 | }; | 126 | }; |
| 127 | 127 | ||
diff --git a/arch/arm/mach-pxa/colibri-pxa300.c b/arch/arm/mach-pxa/colibri-pxa300.c index 10c2eaf93230..7c9c34c19ae2 100644 --- a/arch/arm/mach-pxa/colibri-pxa300.c +++ b/arch/arm/mach-pxa/colibri-pxa300.c | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| 17 | #include <linux/gpio.h> | 17 | #include <linux/gpio.h> |
| 18 | #include <net/ax88796.h> | 18 | #include <linux/interrupt.h> |
| 19 | 19 | ||
| 20 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
| 21 | #include <asm/sizes.h> | 21 | #include <asm/sizes.h> |
| @@ -32,12 +32,13 @@ | |||
| 32 | 32 | ||
| 33 | #if defined(CONFIG_AX88796) | 33 | #if defined(CONFIG_AX88796) |
| 34 | #define COLIBRI_ETH_IRQ_GPIO mfp_to_gpio(GPIO26_GPIO) | 34 | #define COLIBRI_ETH_IRQ_GPIO mfp_to_gpio(GPIO26_GPIO) |
| 35 | |||
| 35 | /* | 36 | /* |
| 36 | * Asix AX88796 Ethernet | 37 | * Asix AX88796 Ethernet |
| 37 | */ | 38 | */ |
| 38 | static struct ax_plat_data colibri_asix_platdata = { | 39 | static struct ax_plat_data colibri_asix_platdata = { |
| 39 | .flags = AXFLG_MAC_FROMDEV, | 40 | .flags = 0, /* defined later */ |
| 40 | .wordlength = 2 | 41 | .wordlength = 2, |
| 41 | }; | 42 | }; |
| 42 | 43 | ||
| 43 | static struct resource colibri_asix_resource[] = { | 44 | static struct resource colibri_asix_resource[] = { |
| @@ -49,7 +50,7 @@ static struct resource colibri_asix_resource[] = { | |||
| 49 | [1] = { | 50 | [1] = { |
| 50 | .start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), | 51 | .start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), |
| 51 | .end = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), | 52 | .end = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), |
| 52 | .flags = IORESOURCE_IRQ | 53 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING, |
| 53 | } | 54 | } |
| 54 | }; | 55 | }; |
| 55 | 56 | ||
| @@ -70,8 +71,8 @@ static mfp_cfg_t colibri_pxa300_eth_pin_config[] __initdata = { | |||
| 70 | 71 | ||
| 71 | static void __init colibri_pxa300_init_eth(void) | 72 | static void __init colibri_pxa300_init_eth(void) |
| 72 | { | 73 | { |
| 74 | colibri_pxa3xx_init_eth(&colibri_asix_platdata); | ||
| 73 | pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa300_eth_pin_config)); | 75 | pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa300_eth_pin_config)); |
| 74 | set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING); | ||
| 75 | platform_device_register(&asix_device); | 76 | platform_device_register(&asix_device); |
| 76 | } | 77 | } |
| 77 | #else | 78 | #else |
diff --git a/arch/arm/mach-pxa/colibri-pxa320.c b/arch/arm/mach-pxa/colibri-pxa320.c index 55b74a7a6151..a18d37b3c5e6 100644 --- a/arch/arm/mach-pxa/colibri-pxa320.c +++ b/arch/arm/mach-pxa/colibri-pxa320.c | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| 16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
| 17 | #include <linux/gpio.h> | 17 | #include <linux/gpio.h> |
| 18 | #include <net/ax88796.h> | 18 | #include <linux/interrupt.h> |
| 19 | 19 | ||
| 20 | #include <asm/mach-types.h> | 20 | #include <asm/mach-types.h> |
| 21 | #include <asm/sizes.h> | 21 | #include <asm/sizes.h> |
| @@ -38,8 +38,8 @@ | |||
| 38 | * Asix AX88796 Ethernet | 38 | * Asix AX88796 Ethernet |
| 39 | */ | 39 | */ |
| 40 | static struct ax_plat_data colibri_asix_platdata = { | 40 | static struct ax_plat_data colibri_asix_platdata = { |
| 41 | .flags = AXFLG_MAC_FROMDEV, | 41 | .flags = 0, /* defined later */ |
| 42 | .wordlength = 2 | 42 | .wordlength = 2, |
| 43 | }; | 43 | }; |
| 44 | 44 | ||
| 45 | static struct resource colibri_asix_resource[] = { | 45 | static struct resource colibri_asix_resource[] = { |
| @@ -51,7 +51,7 @@ static struct resource colibri_asix_resource[] = { | |||
| 51 | [1] = { | 51 | [1] = { |
| 52 | .start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), | 52 | .start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), |
| 53 | .end = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), | 53 | .end = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), |
| 54 | .flags = IORESOURCE_IRQ | 54 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING, |
| 55 | } | 55 | } |
| 56 | }; | 56 | }; |
| 57 | 57 | ||
| @@ -72,8 +72,8 @@ static mfp_cfg_t colibri_pxa320_eth_pin_config[] __initdata = { | |||
| 72 | 72 | ||
| 73 | static void __init colibri_pxa320_init_eth(void) | 73 | static void __init colibri_pxa320_init_eth(void) |
| 74 | { | 74 | { |
| 75 | colibri_pxa3xx_init_eth(&colibri_asix_platdata); | ||
| 75 | pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa320_eth_pin_config)); | 76 | pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa320_eth_pin_config)); |
| 76 | set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING); | ||
| 77 | platform_device_register(&asix_device); | 77 | platform_device_register(&asix_device); |
| 78 | } | 78 | } |
| 79 | #else | 79 | #else |
diff --git a/arch/arm/mach-pxa/colibri-pxa3xx.c b/arch/arm/mach-pxa/colibri-pxa3xx.c index 12d0afc54aa5..ea34e34f8cd8 100644 --- a/arch/arm/mach-pxa/colibri-pxa3xx.c +++ b/arch/arm/mach-pxa/colibri-pxa3xx.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
| 15 | #include <linux/platform_device.h> | 15 | #include <linux/platform_device.h> |
| 16 | #include <linux/gpio.h> | 16 | #include <linux/gpio.h> |
| 17 | #include <linux/etherdevice.h> | ||
| 17 | #include <asm/mach-types.h> | 18 | #include <asm/mach-types.h> |
| 18 | #include <mach/hardware.h> | 19 | #include <mach/hardware.h> |
| 19 | #include <asm/sizes.h> | 20 | #include <asm/sizes.h> |
| @@ -28,6 +29,40 @@ | |||
| 28 | #include "generic.h" | 29 | #include "generic.h" |
| 29 | #include "devices.h" | 30 | #include "devices.h" |
| 30 | 31 | ||
| 32 | #if defined(CONFIG_AX88796) | ||
| 33 | #define ETHER_ADDR_LEN 6 | ||
| 34 | static u8 ether_mac_addr[ETHER_ADDR_LEN]; | ||
| 35 | |||
| 36 | void __init colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data) | ||
| 37 | { | ||
| 38 | int i; | ||
| 39 | u64 serial = ((u64) system_serial_high << 32) | system_serial_low; | ||
| 40 | |||
| 41 | /* | ||
| 42 | * If the bootloader passed in a serial boot tag, which contains a | ||
| 43 | * valid ethernet MAC, pass it to the interface. Toradex ships the | ||
| 44 | * modules with their own bootloader which provides a valid MAC | ||
| 45 | * this way. | ||
| 46 | */ | ||
| 47 | |||
| 48 | for (i = 0; i < ETHER_ADDR_LEN; i++) { | ||
| 49 | ether_mac_addr[i] = serial & 0xff; | ||
| 50 | serial >>= 8; | ||
| 51 | } | ||
| 52 | |||
| 53 | if (is_valid_ether_addr(ether_mac_addr)) { | ||
| 54 | plat_data->flags |= AXFLG_MAC_FROMPLATFORM; | ||
| 55 | plat_data->mac_addr = ether_mac_addr; | ||
| 56 | printk(KERN_INFO "%s(): taking MAC from serial boot tag\n", | ||
| 57 | __func__); | ||
| 58 | } else { | ||
| 59 | plat_data->flags |= AXFLG_MAC_FROMDEV; | ||
| 60 | printk(KERN_INFO "%s(): no valid serial boot tag found, " | ||
| 61 | "taking MAC from device\n", __func__); | ||
| 62 | } | ||
| 63 | } | ||
| 64 | #endif | ||
| 65 | |||
| 31 | #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) | 66 | #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) |
| 32 | static int mmc_detect_pin; | 67 | static int mmc_detect_pin; |
| 33 | 68 | ||
diff --git a/arch/arm/mach-pxa/csb701.c b/arch/arm/mach-pxa/csb701.c index 4a2a2952c374..5a221a49ea4d 100644 --- a/arch/arm/mach-pxa/csb701.c +++ b/arch/arm/mach-pxa/csb701.c | |||
| @@ -5,6 +5,8 @@ | |||
| 5 | #include <linux/input.h> | 5 | #include <linux/input.h> |
| 6 | #include <linux/leds.h> | 6 | #include <linux/leds.h> |
| 7 | 7 | ||
| 8 | #include <asm/mach-types.h> | ||
| 9 | |||
| 8 | static struct gpio_keys_button csb701_buttons[] = { | 10 | static struct gpio_keys_button csb701_buttons[] = { |
| 9 | { | 11 | { |
| 10 | .code = 0x7, | 12 | .code = 0x7, |
| @@ -54,6 +56,9 @@ static struct platform_device *devices[] __initdata = { | |||
| 54 | 56 | ||
| 55 | static int __init csb701_init(void) | 57 | static int __init csb701_init(void) |
| 56 | { | 58 | { |
| 59 | if (!machine_is_csb726()) | ||
| 60 | return -ENODEV; | ||
| 61 | |||
| 57 | return platform_add_devices(devices, ARRAY_SIZE(devices)); | 62 | return platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 58 | } | 63 | } |
| 59 | 64 | ||
diff --git a/arch/arm/mach-pxa/e740.c b/arch/arm/mach-pxa/e740.c index 07500a04fd8c..a36fc17f671d 100644 --- a/arch/arm/mach-pxa/e740.c +++ b/arch/arm/mach-pxa/e740.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <mach/udc.h> | 29 | #include <mach/udc.h> |
| 30 | #include <mach/irda.h> | 30 | #include <mach/irda.h> |
| 31 | #include <mach/irqs.h> | 31 | #include <mach/irqs.h> |
| 32 | #include <mach/audio.h> | ||
| 32 | 33 | ||
| 33 | #include "generic.h" | 34 | #include "generic.h" |
| 34 | #include "eseries.h" | 35 | #include "eseries.h" |
| @@ -197,6 +198,7 @@ static void __init e740_init(void) | |||
| 197 | eseries_get_tmio_gpios(); | 198 | eseries_get_tmio_gpios(); |
| 198 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 199 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 199 | pxa_set_udc_info(&e7xx_udc_mach_info); | 200 | pxa_set_udc_info(&e7xx_udc_mach_info); |
| 201 | pxa_set_ac97_info(NULL); | ||
| 200 | e7xx_irda_init(); | 202 | e7xx_irda_init(); |
| 201 | pxa_set_ficp_info(&e7xx_ficp_platform_data); | 203 | pxa_set_ficp_info(&e7xx_ficp_platform_data); |
| 202 | } | 204 | } |
diff --git a/arch/arm/mach-pxa/e750.c b/arch/arm/mach-pxa/e750.c index 6126c04e02bc..1d00110590e5 100644 --- a/arch/arm/mach-pxa/e750.c +++ b/arch/arm/mach-pxa/e750.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <mach/udc.h> | 28 | #include <mach/udc.h> |
| 29 | #include <mach/irda.h> | 29 | #include <mach/irda.h> |
| 30 | #include <mach/irqs.h> | 30 | #include <mach/irqs.h> |
| 31 | #include <mach/audio.h> | ||
| 31 | 32 | ||
| 32 | #include "generic.h" | 33 | #include "generic.h" |
| 33 | #include "eseries.h" | 34 | #include "eseries.h" |
| @@ -198,6 +199,7 @@ static void __init e750_init(void) | |||
| 198 | eseries_get_tmio_gpios(); | 199 | eseries_get_tmio_gpios(); |
| 199 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 200 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 200 | pxa_set_udc_info(&e7xx_udc_mach_info); | 201 | pxa_set_udc_info(&e7xx_udc_mach_info); |
| 202 | pxa_set_ac97_info(NULL); | ||
| 201 | e7xx_irda_init(); | 203 | e7xx_irda_init(); |
| 202 | pxa_set_ficp_info(&e7xx_ficp_platform_data); | 204 | pxa_set_ficp_info(&e7xx_ficp_platform_data); |
| 203 | } | 205 | } |
diff --git a/arch/arm/mach-pxa/e800.c b/arch/arm/mach-pxa/e800.c index 74ab09812a72..9866c7b9e784 100644 --- a/arch/arm/mach-pxa/e800.c +++ b/arch/arm/mach-pxa/e800.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <mach/eseries-gpio.h> | 27 | #include <mach/eseries-gpio.h> |
| 28 | #include <mach/udc.h> | 28 | #include <mach/udc.h> |
| 29 | #include <mach/irqs.h> | 29 | #include <mach/irqs.h> |
| 30 | #include <mach/audio.h> | ||
| 30 | 31 | ||
| 31 | #include "generic.h" | 32 | #include "generic.h" |
| 32 | #include "eseries.h" | 33 | #include "eseries.h" |
| @@ -199,6 +200,7 @@ static void __init e800_init(void) | |||
| 199 | eseries_get_tmio_gpios(); | 200 | eseries_get_tmio_gpios(); |
| 200 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 201 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
| 201 | pxa_set_udc_info(&e800_udc_mach_info); | 202 | pxa_set_udc_info(&e800_udc_mach_info); |
| 203 | pxa_set_ac97_info(NULL); | ||
| 202 | } | 204 | } |
| 203 | 205 | ||
| 204 | MACHINE_START(E800, "Toshiba e800") | 206 | MACHINE_START(E800, "Toshiba e800") |
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index 920dfb8d36da..67611dadb44e 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c | |||
| @@ -25,8 +25,10 @@ | |||
| 25 | #include <linux/regulator/machine.h> | 25 | #include <linux/regulator/machine.h> |
| 26 | #include <linux/spi/spi.h> | 26 | #include <linux/spi/spi.h> |
| 27 | #include <linux/spi/tdo24m.h> | 27 | #include <linux/spi/tdo24m.h> |
| 28 | #include <linux/spi/libertas_spi.h> | ||
| 28 | #include <linux/power_supply.h> | 29 | #include <linux/power_supply.h> |
| 29 | #include <linux/apm-emulation.h> | 30 | #include <linux/apm-emulation.h> |
| 31 | #include <linux/delay.h> | ||
| 30 | 32 | ||
| 31 | #include <media/soc_camera.h> | 33 | #include <media/soc_camera.h> |
| 32 | 34 | ||
| @@ -62,6 +64,8 @@ | |||
| 62 | #define GPIO93_CAM_RESET (93) | 64 | #define GPIO93_CAM_RESET (93) |
| 63 | #define GPIO41_ETHIRQ (41) | 65 | #define GPIO41_ETHIRQ (41) |
| 64 | #define EM_X270_ETHIRQ IRQ_GPIO(GPIO41_ETHIRQ) | 66 | #define EM_X270_ETHIRQ IRQ_GPIO(GPIO41_ETHIRQ) |
| 67 | #define GPIO115_WLAN_PWEN (115) | ||
| 68 | #define GPIO19_WLAN_STRAP (19) | ||
| 65 | 69 | ||
| 66 | static int mmc_cd; | 70 | static int mmc_cd; |
| 67 | static int nand_rb; | 71 | static int nand_rb; |
| @@ -159,8 +163,8 @@ static unsigned long common_pin_config[] = { | |||
| 159 | GPIO57_SSP1_TXD, | 163 | GPIO57_SSP1_TXD, |
| 160 | 164 | ||
| 161 | /* SSP2 */ | 165 | /* SSP2 */ |
| 162 | GPIO19_SSP2_SCLK, | 166 | GPIO19_GPIO, /* SSP2 clock is used as GPIO for Libertas pin-strap */ |
| 163 | GPIO14_SSP2_SFRM, | 167 | GPIO14_GPIO, |
| 164 | GPIO89_SSP2_TXD, | 168 | GPIO89_SSP2_TXD, |
| 165 | GPIO88_SSP2_RXD, | 169 | GPIO88_SSP2_RXD, |
| 166 | 170 | ||
| @@ -648,20 +652,86 @@ static struct tdo24m_platform_data em_x270_tdo24m_pdata = { | |||
| 648 | .model = TDO35S, | 652 | .model = TDO35S, |
| 649 | }; | 653 | }; |
| 650 | 654 | ||
| 655 | static struct pxa2xx_spi_master em_x270_spi_2_info = { | ||
| 656 | .num_chipselect = 1, | ||
| 657 | .enable_dma = 1, | ||
| 658 | }; | ||
| 659 | |||
| 660 | static struct pxa2xx_spi_chip em_x270_libertas_chip = { | ||
| 661 | .rx_threshold = 1, | ||
| 662 | .tx_threshold = 1, | ||
| 663 | .timeout = 1000, | ||
| 664 | }; | ||
| 665 | |||
| 666 | static unsigned long em_x270_libertas_pin_config[] = { | ||
| 667 | /* SSP2 */ | ||
| 668 | GPIO19_SSP2_SCLK, | ||
| 669 | GPIO14_GPIO, | ||
| 670 | GPIO89_SSP2_TXD, | ||
| 671 | GPIO88_SSP2_RXD, | ||
| 672 | }; | ||
| 673 | |||
| 674 | static int em_x270_libertas_setup(struct spi_device *spi) | ||
| 675 | { | ||
| 676 | int err = gpio_request(GPIO115_WLAN_PWEN, "WLAN PWEN"); | ||
| 677 | if (err) | ||
| 678 | return err; | ||
| 679 | |||
| 680 | gpio_direction_output(GPIO19_WLAN_STRAP, 1); | ||
| 681 | mdelay(100); | ||
| 682 | |||
| 683 | pxa2xx_mfp_config(ARRAY_AND_SIZE(em_x270_libertas_pin_config)); | ||
| 684 | |||
| 685 | gpio_direction_output(GPIO115_WLAN_PWEN, 0); | ||
| 686 | mdelay(100); | ||
| 687 | gpio_set_value(GPIO115_WLAN_PWEN, 1); | ||
| 688 | mdelay(100); | ||
| 689 | |||
| 690 | spi->bits_per_word = 16; | ||
| 691 | spi_setup(spi); | ||
| 692 | |||
| 693 | return 0; | ||
| 694 | } | ||
| 695 | |||
| 696 | static int em_x270_libertas_teardown(struct spi_device *spi) | ||
| 697 | { | ||
| 698 | gpio_set_value(GPIO115_WLAN_PWEN, 0); | ||
| 699 | gpio_free(GPIO115_WLAN_PWEN); | ||
| 700 | |||
| 701 | return 0; | ||
| 702 | } | ||
| 703 | |||
| 704 | struct libertas_spi_platform_data em_x270_libertas_pdata = { | ||
| 705 | .use_dummy_writes = 1, | ||
| 706 | .gpio_cs = 14, | ||
| 707 | .setup = em_x270_libertas_setup, | ||
| 708 | .teardown = em_x270_libertas_teardown, | ||
| 709 | }; | ||
| 710 | |||
| 651 | static struct spi_board_info em_x270_spi_devices[] __initdata = { | 711 | static struct spi_board_info em_x270_spi_devices[] __initdata = { |
| 652 | { | 712 | { |
| 653 | .modalias = "tdo24m", | 713 | .modalias = "tdo24m", |
| 654 | .max_speed_hz = 1000000, | 714 | .max_speed_hz = 1000000, |
| 655 | .bus_num = 1, | 715 | .bus_num = 1, |
| 656 | .chip_select = 0, | 716 | .chip_select = 0, |
| 657 | .controller_data = &em_x270_tdo24m_chip, | 717 | .controller_data = &em_x270_tdo24m_chip, |
| 658 | .platform_data = &em_x270_tdo24m_pdata, | 718 | .platform_data = &em_x270_tdo24m_pdata, |
| 719 | }, | ||
| 720 | { | ||
| 721 | .modalias = "libertas_spi", | ||
| 722 | .max_speed_hz = 13000000, | ||
| 723 | .bus_num = 2, | ||
| 724 | .irq = IRQ_GPIO(116), | ||
| 725 | .chip_select = 0, | ||
| 726 | .controller_data = &em_x270_libertas_chip, | ||
| 727 | .platform_data = &em_x270_libertas_pdata, | ||
| 659 | }, | 728 | }, |
| 660 | }; | 729 | }; |
| 661 | 730 | ||
| 662 | static void __init em_x270_init_spi(void) | 731 | static void __init em_x270_init_spi(void) |
| 663 | { | 732 | { |
| 664 | pxa2xx_set_spi_info(1, &em_x270_spi_info); | 733 | pxa2xx_set_spi_info(1, &em_x270_spi_info); |
| 734 | pxa2xx_set_spi_info(2, &em_x270_spi_2_info); | ||
| 665 | spi_register_board_info(ARRAY_AND_SIZE(em_x270_spi_devices)); | 735 | spi_register_board_info(ARRAY_AND_SIZE(em_x270_spi_devices)); |
| 666 | } | 736 | } |
| 667 | #else | 737 | #else |
diff --git a/arch/arm/mach-pxa/include/mach/colibri.h b/arch/arm/mach-pxa/include/mach/colibri.h index 3f2a01d6a03c..90230c6f9925 100644 --- a/arch/arm/mach-pxa/include/mach/colibri.h +++ b/arch/arm/mach-pxa/include/mach/colibri.h | |||
| @@ -1,5 +1,8 @@ | |||
| 1 | #ifndef _COLIBRI_H_ | 1 | #ifndef _COLIBRI_H_ |
| 2 | #define _COLIBRI_H_ | 2 | #define _COLIBRI_H_ |
| 3 | |||
| 4 | #include <net/ax88796.h> | ||
| 5 | |||
| 3 | /* | 6 | /* |
| 4 | * common settings for all modules | 7 | * common settings for all modules |
| 5 | */ | 8 | */ |
| @@ -16,6 +19,10 @@ extern void colibri_pxa3xx_init_lcd(int bl_pin); | |||
| 16 | static inline void colibri_pxa3xx_init_lcd(int) {} | 19 | static inline void colibri_pxa3xx_init_lcd(int) {} |
| 17 | #endif | 20 | #endif |
| 18 | 21 | ||
| 22 | #if defined(CONFIG_AX88796) | ||
| 23 | extern void colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data); | ||
| 24 | #endif | ||
| 25 | |||
| 19 | /* physical memory regions */ | 26 | /* physical memory regions */ |
| 20 | #define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */ | 27 | #define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */ |
| 21 | 28 | ||
diff --git a/arch/arm/mach-pxa/include/mach/magician.h b/arch/arm/mach-pxa/include/mach/magician.h index 82a399f3f9f2..20ef37d4a9a7 100644 --- a/arch/arm/mach-pxa/include/mach/magician.h +++ b/arch/arm/mach-pxa/include/mach/magician.h | |||
| @@ -27,7 +27,7 @@ | |||
| 27 | #define GPIO22_MAGICIAN_VIBRA_EN 22 | 27 | #define GPIO22_MAGICIAN_VIBRA_EN 22 |
| 28 | #define GPIO26_MAGICIAN_GSM_POWER 26 | 28 | #define GPIO26_MAGICIAN_GSM_POWER 26 |
| 29 | #define GPIO27_MAGICIAN_USBC_PUEN 27 | 29 | #define GPIO27_MAGICIAN_USBC_PUEN 27 |
| 30 | #define GPIO30_MAGICIAN_nCHARGE_EN 30 | 30 | #define GPIO30_MAGICIAN_BQ24022_nCHARGE_EN 30 |
| 31 | #define GPIO37_MAGICIAN_KEY_HANGUP 37 | 31 | #define GPIO37_MAGICIAN_KEY_HANGUP 37 |
| 32 | #define GPIO38_MAGICIAN_KEY_CONTACTS 38 | 32 | #define GPIO38_MAGICIAN_KEY_CONTACTS 38 |
| 33 | #define GPIO40_MAGICIAN_GSM_OUT2 40 | 33 | #define GPIO40_MAGICIAN_GSM_OUT2 40 |
| @@ -98,7 +98,7 @@ | |||
| 98 | #define EGPIO_MAGICIAN_UNKNOWN_WAVEDEV_DLL MAGICIAN_EGPIO(2, 2) | 98 | #define EGPIO_MAGICIAN_UNKNOWN_WAVEDEV_DLL MAGICIAN_EGPIO(2, 2) |
| 99 | #define EGPIO_MAGICIAN_FLASH_VPP MAGICIAN_EGPIO(2, 3) | 99 | #define EGPIO_MAGICIAN_FLASH_VPP MAGICIAN_EGPIO(2, 3) |
| 100 | #define EGPIO_MAGICIAN_BL_POWER2 MAGICIAN_EGPIO(2, 4) | 100 | #define EGPIO_MAGICIAN_BL_POWER2 MAGICIAN_EGPIO(2, 4) |
| 101 | #define EGPIO_MAGICIAN_CHARGE_EN MAGICIAN_EGPIO(2, 5) | 101 | #define EGPIO_MAGICIAN_BQ24022_ISET2 MAGICIAN_EGPIO(2, 5) |
| 102 | #define EGPIO_MAGICIAN_GSM_POWER MAGICIAN_EGPIO(2, 7) | 102 | #define EGPIO_MAGICIAN_GSM_POWER MAGICIAN_EGPIO(2, 7) |
| 103 | 103 | ||
| 104 | /* input */ | 104 | /* input */ |
diff --git a/arch/arm/mach-pxa/include/mach/palmld.h b/arch/arm/mach-pxa/include/mach/palmld.h index 7c295a48d784..fb13c82ad6dc 100644 --- a/arch/arm/mach-pxa/include/mach/palmld.h +++ b/arch/arm/mach-pxa/include/mach/palmld.h | |||
| @@ -87,6 +87,7 @@ | |||
| 87 | #define PALMLD_IDE_SIZE 0x00100000 | 87 | #define PALMLD_IDE_SIZE 0x00100000 |
| 88 | 88 | ||
| 89 | #define PALMLD_PHYS_IO_START 0x40000000 | 89 | #define PALMLD_PHYS_IO_START 0x40000000 |
| 90 | #define PALMLD_STR_BASE 0xa0200000 | ||
| 90 | 91 | ||
| 91 | /* BATTERY */ | 92 | /* BATTERY */ |
| 92 | #define PALMLD_BAT_MAX_VOLTAGE 4000 /* 4.00V maximum voltage */ | 93 | #define PALMLD_BAT_MAX_VOLTAGE 4000 /* 4.00V maximum voltage */ |
diff --git a/arch/arm/mach-pxa/include/mach/palmt5.h b/arch/arm/mach-pxa/include/mach/palmt5.h index 94db2881f048..052bfe788ada 100644 --- a/arch/arm/mach-pxa/include/mach/palmt5.h +++ b/arch/arm/mach-pxa/include/mach/palmt5.h | |||
| @@ -59,6 +59,7 @@ | |||
| 59 | /* Various addresses */ | 59 | /* Various addresses */ |
| 60 | #define PALMT5_PHYS_RAM_START 0xa0000000 | 60 | #define PALMT5_PHYS_RAM_START 0xa0000000 |
| 61 | #define PALMT5_PHYS_IO_START 0x40000000 | 61 | #define PALMT5_PHYS_IO_START 0x40000000 |
| 62 | #define PALMT5_STR_BASE 0xa0200000 | ||
| 62 | 63 | ||
| 63 | /* TOUCHSCREEN */ | 64 | /* TOUCHSCREEN */ |
| 64 | #define AC97_LINK_FRAME 21 | 65 | #define AC97_LINK_FRAME 21 |
diff --git a/arch/arm/mach-pxa/include/mach/palmte2.h b/arch/arm/mach-pxa/include/mach/palmte2.h new file mode 100644 index 000000000000..12361341f9d8 --- /dev/null +++ b/arch/arm/mach-pxa/include/mach/palmte2.h | |||
| @@ -0,0 +1,68 @@ | |||
| 1 | /* | ||
| 2 | * GPIOs and interrupts for Palm Tungsten|E2 Handheld Computer | ||
| 3 | * | ||
| 4 | * Author: | ||
| 5 | * Carlos Eduardo Medaglia Dyonisio <cadu@nerdfeliz.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | */ | ||
| 12 | |||
| 13 | #ifndef _INCLUDE_PALMTE2_H_ | ||
| 14 | #define _INCLUDE_PALMTE2_H_ | ||
| 15 | |||
| 16 | /** HERE ARE GPIOs **/ | ||
| 17 | |||
| 18 | /* GPIOs */ | ||
| 19 | #define GPIO_NR_PALMTE2_POWER_DETECT 9 | ||
| 20 | #define GPIO_NR_PALMTE2_HOTSYNC_BUTTON_N 4 | ||
| 21 | #define GPIO_NR_PALMTE2_EARPHONE_DETECT 15 | ||
| 22 | |||
| 23 | /* SD/MMC */ | ||
| 24 | #define GPIO_NR_PALMTE2_SD_DETECT_N 10 | ||
| 25 | #define GPIO_NR_PALMTE2_SD_POWER 55 | ||
| 26 | #define GPIO_NR_PALMTE2_SD_READONLY 51 | ||
| 27 | |||
| 28 | /* IRDA - disable GPIO connected to SD pin of tranceiver (TFBS4710?) ? */ | ||
| 29 | #define GPIO_NR_PALMTE2_IR_DISABLE 48 | ||
| 30 | |||
| 31 | /* USB */ | ||
| 32 | #define GPIO_NR_PALMTE2_USB_DETECT_N 35 | ||
| 33 | #define GPIO_NR_PALMTE2_USB_PULLUP 53 | ||
| 34 | |||
| 35 | /* LCD/BACKLIGHT */ | ||
| 36 | #define GPIO_NR_PALMTE2_BL_POWER 56 | ||
| 37 | #define GPIO_NR_PALMTE2_LCD_POWER 37 | ||
| 38 | |||
| 39 | /* KEYS */ | ||
| 40 | #define GPIO_NR_PALMTE2_KEY_NOTES 5 | ||
| 41 | #define GPIO_NR_PALMTE2_KEY_TASKS 7 | ||
| 42 | #define GPIO_NR_PALMTE2_KEY_CALENDAR 11 | ||
| 43 | #define GPIO_NR_PALMTE2_KEY_CONTACTS 13 | ||
| 44 | #define GPIO_NR_PALMTE2_KEY_CENTER 14 | ||
| 45 | #define GPIO_NR_PALMTE2_KEY_LEFT 19 | ||
| 46 | #define GPIO_NR_PALMTE2_KEY_RIGHT 20 | ||
| 47 | #define GPIO_NR_PALMTE2_KEY_DOWN 21 | ||
| 48 | #define GPIO_NR_PALMTE2_KEY_UP 22 | ||
| 49 | |||
| 50 | /** HERE ARE INIT VALUES **/ | ||
| 51 | |||
| 52 | /* BACKLIGHT */ | ||
| 53 | #define PALMTE2_MAX_INTENSITY 0xFE | ||
| 54 | #define PALMTE2_DEFAULT_INTENSITY 0x7E | ||
| 55 | #define PALMTE2_LIMIT_MASK 0x7F | ||
| 56 | #define PALMTE2_PRESCALER 0x3F | ||
| 57 | #define PALMTE2_PERIOD_NS 3500 | ||
| 58 | |||
| 59 | /* BATTERY */ | ||
| 60 | #define PALMTE2_BAT_MAX_VOLTAGE 4000 /* 4.00v current voltage */ | ||
| 61 | #define PALMTE2_BAT_MIN_VOLTAGE 3550 /* 3.55v critical voltage */ | ||
| 62 | #define PALMTE2_BAT_MAX_CURRENT 0 /* unknokn */ | ||
| 63 | #define PALMTE2_BAT_MIN_CURRENT 0 /* unknown */ | ||
| 64 | #define PALMTE2_BAT_MAX_CHARGE 1 /* unknown */ | ||
| 65 | #define PALMTE2_BAT_MIN_CHARGE 1 /* unknown */ | ||
| 66 | #define PALMTE2_MAX_LIFE_MINS 360 /* on-life in minutes */ | ||
| 67 | |||
| 68 | #endif | ||
diff --git a/arch/arm/mach-pxa/include/mach/palmtx.h b/arch/arm/mach-pxa/include/mach/palmtx.h index 1e8bccbda510..9f7d62fb4cbb 100644 --- a/arch/arm/mach-pxa/include/mach/palmtx.h +++ b/arch/arm/mach-pxa/include/mach/palmtx.h | |||
| @@ -78,6 +78,8 @@ | |||
| 78 | #define PALMTX_PHYS_RAM_START 0xa0000000 | 78 | #define PALMTX_PHYS_RAM_START 0xa0000000 |
| 79 | #define PALMTX_PHYS_IO_START 0x40000000 | 79 | #define PALMTX_PHYS_IO_START 0x40000000 |
| 80 | 80 | ||
| 81 | #define PALMTX_STR_BASE 0xa0200000 | ||
| 82 | |||
| 81 | #define PALMTX_PHYS_FLASH_START PXA_CS0_PHYS /* ChipSelect 0 */ | 83 | #define PALMTX_PHYS_FLASH_START PXA_CS0_PHYS /* ChipSelect 0 */ |
| 82 | #define PALMTX_PHYS_NAND_START PXA_CS1_PHYS /* ChipSelect 1 */ | 84 | #define PALMTX_PHYS_NAND_START PXA_CS1_PHYS /* ChipSelect 1 */ |
| 83 | 85 | ||
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c index deeea1c2782b..c899bbd94dc0 100644 --- a/arch/arm/mach-pxa/magician.c +++ b/arch/arm/mach-pxa/magician.c | |||
| @@ -25,6 +25,8 @@ | |||
| 25 | #include <linux/mtd/physmap.h> | 25 | #include <linux/mtd/physmap.h> |
| 26 | #include <linux/pda_power.h> | 26 | #include <linux/pda_power.h> |
| 27 | #include <linux/pwm_backlight.h> | 27 | #include <linux/pwm_backlight.h> |
| 28 | #include <linux/regulator/bq24022.h> | ||
| 29 | #include <linux/regulator/machine.h> | ||
| 28 | #include <linux/usb/gpio_vbus.h> | 30 | #include <linux/usb/gpio_vbus.h> |
| 29 | 31 | ||
| 30 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
| @@ -552,33 +554,7 @@ static struct platform_device gpio_vbus = { | |||
| 552 | 554 | ||
| 553 | static int power_supply_init(struct device *dev) | 555 | static int power_supply_init(struct device *dev) |
| 554 | { | 556 | { |
| 555 | int ret; | 557 | return gpio_request(EGPIO_MAGICIAN_CABLE_STATE_AC, "CABLE_STATE_AC"); |
| 556 | |||
| 557 | ret = gpio_request(EGPIO_MAGICIAN_CABLE_STATE_AC, "CABLE_STATE_AC"); | ||
| 558 | if (ret) | ||
| 559 | goto err_cs_ac; | ||
| 560 | ret = gpio_request(EGPIO_MAGICIAN_CABLE_STATE_USB, "CABLE_STATE_USB"); | ||
| 561 | if (ret) | ||
| 562 | goto err_cs_usb; | ||
| 563 | ret = gpio_request(EGPIO_MAGICIAN_CHARGE_EN, "CHARGE_EN"); | ||
| 564 | if (ret) | ||
| 565 | goto err_chg_en; | ||
| 566 | ret = gpio_request(GPIO30_MAGICIAN_nCHARGE_EN, "nCHARGE_EN"); | ||
| 567 | if (!ret) | ||
| 568 | ret = gpio_direction_output(GPIO30_MAGICIAN_nCHARGE_EN, 0); | ||
| 569 | if (ret) | ||
| 570 | goto err_nchg_en; | ||
| 571 | |||
| 572 | return 0; | ||
| 573 | |||
| 574 | err_nchg_en: | ||
| 575 | gpio_free(EGPIO_MAGICIAN_CHARGE_EN); | ||
| 576 | err_chg_en: | ||
| 577 | gpio_free(EGPIO_MAGICIAN_CABLE_STATE_USB); | ||
| 578 | err_cs_usb: | ||
| 579 | gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC); | ||
| 580 | err_cs_ac: | ||
| 581 | return ret; | ||
| 582 | } | 558 | } |
| 583 | 559 | ||
| 584 | static int magician_is_ac_online(void) | 560 | static int magician_is_ac_online(void) |
| @@ -586,22 +562,8 @@ static int magician_is_ac_online(void) | |||
| 586 | return gpio_get_value(EGPIO_MAGICIAN_CABLE_STATE_AC); | 562 | return gpio_get_value(EGPIO_MAGICIAN_CABLE_STATE_AC); |
| 587 | } | 563 | } |
| 588 | 564 | ||
| 589 | static int magician_is_usb_online(void) | ||
| 590 | { | ||
| 591 | return gpio_get_value(EGPIO_MAGICIAN_CABLE_STATE_USB); | ||
| 592 | } | ||
| 593 | |||
| 594 | static void magician_set_charge(int flags) | ||
| 595 | { | ||
| 596 | gpio_set_value(GPIO30_MAGICIAN_nCHARGE_EN, !flags); | ||
| 597 | gpio_set_value(EGPIO_MAGICIAN_CHARGE_EN, flags); | ||
| 598 | } | ||
| 599 | |||
| 600 | static void power_supply_exit(struct device *dev) | 565 | static void power_supply_exit(struct device *dev) |
| 601 | { | 566 | { |
| 602 | gpio_free(GPIO30_MAGICIAN_nCHARGE_EN); | ||
| 603 | gpio_free(EGPIO_MAGICIAN_CHARGE_EN); | ||
| 604 | gpio_free(EGPIO_MAGICIAN_CABLE_STATE_USB); | ||
| 605 | gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC); | 567 | gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC); |
| 606 | } | 568 | } |
| 607 | 569 | ||
| @@ -612,8 +574,6 @@ static char *magician_supplicants[] = { | |||
| 612 | static struct pda_power_pdata power_supply_info = { | 574 | static struct pda_power_pdata power_supply_info = { |
| 613 | .init = power_supply_init, | 575 | .init = power_supply_init, |
| 614 | .is_ac_online = magician_is_ac_online, | 576 | .is_ac_online = magician_is_ac_online, |
| 615 | .is_usb_online = magician_is_usb_online, | ||
| 616 | .set_charge = magician_set_charge, | ||
| 617 | .exit = power_supply_exit, | 577 | .exit = power_supply_exit, |
| 618 | .supplied_to = magician_supplicants, | 578 | .supplied_to = magician_supplicants, |
| 619 | .num_supplicants = ARRAY_SIZE(magician_supplicants), | 579 | .num_supplicants = ARRAY_SIZE(magician_supplicants), |
| @@ -646,6 +606,43 @@ static struct platform_device power_supply = { | |||
| 646 | .num_resources = ARRAY_SIZE(power_supply_resources), | 606 | .num_resources = ARRAY_SIZE(power_supply_resources), |
| 647 | }; | 607 | }; |
| 648 | 608 | ||
| 609 | /* | ||
| 610 | * Battery charger | ||
| 611 | */ | ||
| 612 | |||
| 613 | static struct regulator_consumer_supply bq24022_consumers[] = { | ||
| 614 | { | ||
| 615 | .dev = &gpio_vbus.dev, | ||
| 616 | .supply = "vbus_draw", | ||
| 617 | }, | ||
| 618 | { | ||
| 619 | .dev = &power_supply.dev, | ||
| 620 | .supply = "ac_draw", | ||
| 621 | }, | ||
| 622 | }; | ||
| 623 | |||
| 624 | static struct regulator_init_data bq24022_init_data = { | ||
| 625 | .constraints = { | ||
| 626 | .max_uA = 500000, | ||
| 627 | .valid_ops_mask = REGULATOR_CHANGE_CURRENT, | ||
| 628 | }, | ||
| 629 | .num_consumer_supplies = ARRAY_SIZE(bq24022_consumers), | ||
| 630 | .consumer_supplies = bq24022_consumers, | ||
| 631 | }; | ||
| 632 | |||
| 633 | static struct bq24022_mach_info bq24022_info = { | ||
| 634 | .gpio_nce = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN, | ||
| 635 | .gpio_iset2 = EGPIO_MAGICIAN_BQ24022_ISET2, | ||
| 636 | .init_data = &bq24022_init_data, | ||
| 637 | }; | ||
| 638 | |||
| 639 | static struct platform_device bq24022 = { | ||
| 640 | .name = "bq24022", | ||
| 641 | .id = -1, | ||
| 642 | .dev = { | ||
| 643 | .platform_data = &bq24022_info, | ||
| 644 | }, | ||
| 645 | }; | ||
| 649 | 646 | ||
| 650 | /* | 647 | /* |
| 651 | * MMC/SD | 648 | * MMC/SD |
| @@ -756,6 +753,7 @@ static struct platform_device *devices[] __initdata = { | |||
| 756 | &egpio, | 753 | &egpio, |
| 757 | &backlight, | 754 | &backlight, |
| 758 | &pasic3, | 755 | &pasic3, |
| 756 | &bq24022, | ||
| 759 | &gpio_vbus, | 757 | &gpio_vbus, |
| 760 | &power_supply, | 758 | &power_supply, |
| 761 | &strataflash, | 759 | &strataflash, |
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c index 97c93a7a285c..9203b069b35c 100644 --- a/arch/arm/mach-pxa/mioa701.c +++ b/arch/arm/mach-pxa/mioa701.c | |||
| @@ -50,6 +50,7 @@ | |||
| 50 | #include <mach/pxa27x-udc.h> | 50 | #include <mach/pxa27x-udc.h> |
| 51 | #include <mach/i2c.h> | 51 | #include <mach/i2c.h> |
| 52 | #include <mach/camera.h> | 52 | #include <mach/camera.h> |
| 53 | #include <mach/audio.h> | ||
| 53 | #include <media/soc_camera.h> | 54 | #include <media/soc_camera.h> |
| 54 | 55 | ||
| 55 | #include <mach/mioa701.h> | 56 | #include <mach/mioa701.h> |
| @@ -763,8 +764,6 @@ MIO_PARENT_DEV(mioa701_backlight, "pwm-backlight", &pxa27x_device_pwm0.dev, | |||
| 763 | &mioa701_backlight_data); | 764 | &mioa701_backlight_data); |
| 764 | MIO_SIMPLE_DEV(mioa701_led, "leds-gpio", &gpio_led_info) | 765 | MIO_SIMPLE_DEV(mioa701_led, "leds-gpio", &gpio_led_info) |
| 765 | MIO_SIMPLE_DEV(pxa2xx_pcm, "pxa2xx-pcm", NULL) | 766 | MIO_SIMPLE_DEV(pxa2xx_pcm, "pxa2xx-pcm", NULL) |
| 766 | MIO_SIMPLE_DEV(pxa2xx_ac97, "pxa2xx-ac97", NULL) | ||
| 767 | MIO_PARENT_DEV(mio_wm9713_codec, "wm9713-codec", &pxa2xx_ac97.dev, NULL) | ||
| 768 | MIO_SIMPLE_DEV(mioa701_sound, "mioa701-wm9713", NULL) | 767 | MIO_SIMPLE_DEV(mioa701_sound, "mioa701-wm9713", NULL) |
| 769 | MIO_SIMPLE_DEV(mioa701_board, "mioa701-board", NULL) | 768 | MIO_SIMPLE_DEV(mioa701_board, "mioa701-board", NULL) |
| 770 | MIO_SIMPLE_DEV(gpio_vbus, "gpio-vbus", &gpio_vbus_data); | 769 | MIO_SIMPLE_DEV(gpio_vbus, "gpio-vbus", &gpio_vbus_data); |
| @@ -774,8 +773,6 @@ static struct platform_device *devices[] __initdata = { | |||
| 774 | &mioa701_backlight, | 773 | &mioa701_backlight, |
| 775 | &mioa701_led, | 774 | &mioa701_led, |
| 776 | &pxa2xx_pcm, | 775 | &pxa2xx_pcm, |
| 777 | &pxa2xx_ac97, | ||
| 778 | &mio_wm9713_codec, | ||
| 779 | &mioa701_sound, | 776 | &mioa701_sound, |
| 780 | &power_dev, | 777 | &power_dev, |
| 781 | &strataflash, | 778 | &strataflash, |
| @@ -818,6 +815,7 @@ static void __init mioa701_machine_init(void) | |||
| 818 | pxa_set_keypad_info(&mioa701_keypad_info); | 815 | pxa_set_keypad_info(&mioa701_keypad_info); |
| 819 | wm97xx_bat_set_pdata(&mioa701_battery_data); | 816 | wm97xx_bat_set_pdata(&mioa701_battery_data); |
| 820 | pxa_set_udc_info(&mioa701_udc_info); | 817 | pxa_set_udc_info(&mioa701_udc_info); |
| 818 | pxa_set_ac97_info(NULL); | ||
| 821 | pm_power_off = mioa701_poweroff; | 819 | pm_power_off = mioa701_poweroff; |
| 822 | arm_pm_restart = mioa701_restart; | 820 | arm_pm_restart = mioa701_restart; |
| 823 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 821 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c index 8587477a9bb7..ecf5910e39d7 100644 --- a/arch/arm/mach-pxa/palmld.c +++ b/arch/arm/mach-pxa/palmld.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/gpio.h> | 24 | #include <linux/gpio.h> |
| 25 | #include <linux/wm97xx_batt.h> | 25 | #include <linux/wm97xx_batt.h> |
| 26 | #include <linux/power_supply.h> | 26 | #include <linux/power_supply.h> |
| 27 | #include <linux/sysdev.h> | ||
| 27 | 28 | ||
| 28 | #include <asm/mach-types.h> | 29 | #include <asm/mach-types.h> |
| 29 | #include <asm/mach/arch.h> | 30 | #include <asm/mach/arch.h> |
| @@ -68,10 +69,10 @@ static unsigned long palmld_pin_config[] __initdata = { | |||
| 68 | GPIO47_FICP_TXD, | 69 | GPIO47_FICP_TXD, |
| 69 | 70 | ||
| 70 | /* MATRIX KEYPAD */ | 71 | /* MATRIX KEYPAD */ |
| 71 | GPIO100_KP_MKIN_0, | 72 | GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, |
| 72 | GPIO101_KP_MKIN_1, | 73 | GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, |
| 73 | GPIO102_KP_MKIN_2, | 74 | GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, |
| 74 | GPIO97_KP_MKIN_3, | 75 | GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, |
| 75 | GPIO103_KP_MKOUT_0, | 76 | GPIO103_KP_MKOUT_0, |
| 76 | GPIO104_KP_MKOUT_1, | 77 | GPIO104_KP_MKOUT_1, |
| 77 | GPIO105_KP_MKOUT_2, | 78 | GPIO105_KP_MKOUT_2, |
| @@ -507,6 +508,33 @@ static struct pxafb_mach_info palmld_lcd_screen = { | |||
| 507 | }; | 508 | }; |
| 508 | 509 | ||
| 509 | /****************************************************************************** | 510 | /****************************************************************************** |
| 511 | * Power management - standby | ||
| 512 | ******************************************************************************/ | ||
| 513 | #ifdef CONFIG_PM | ||
| 514 | static u32 *addr __initdata; | ||
| 515 | static u32 resume[3] __initdata = { | ||
| 516 | 0xe3a00101, /* mov r0, #0x40000000 */ | ||
| 517 | 0xe380060f, /* orr r0, r0, #0x00f00000 */ | ||
| 518 | 0xe590f008, /* ldr pc, [r0, #0x08] */ | ||
| 519 | }; | ||
| 520 | |||
| 521 | static int __init palmld_pm_init(void) | ||
| 522 | { | ||
| 523 | int i; | ||
| 524 | |||
| 525 | /* this is where the bootloader jumps */ | ||
| 526 | addr = phys_to_virt(PALMLD_STR_BASE); | ||
| 527 | |||
| 528 | for (i = 0; i < 3; i++) | ||
| 529 | addr[i] = resume[i]; | ||
| 530 | |||
| 531 | return 0; | ||
| 532 | } | ||
| 533 | |||
| 534 | device_initcall(palmld_pm_init); | ||
| 535 | #endif | ||
| 536 | |||
| 537 | /****************************************************************************** | ||
| 510 | * Machine init | 538 | * Machine init |
| 511 | ******************************************************************************/ | 539 | ******************************************************************************/ |
| 512 | static struct platform_device *devices[] __initdata = { | 540 | static struct platform_device *devices[] __initdata = { |
diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c index 9521c7b33492..0680f1a575a3 100644 --- a/arch/arm/mach-pxa/palmt5.c +++ b/arch/arm/mach-pxa/palmt5.c | |||
| @@ -75,10 +75,10 @@ static unsigned long palmt5_pin_config[] __initdata = { | |||
| 75 | GPIO95_GPIO, /* usb power */ | 75 | GPIO95_GPIO, /* usb power */ |
| 76 | 76 | ||
| 77 | /* MATRIX KEYPAD */ | 77 | /* MATRIX KEYPAD */ |
| 78 | GPIO100_KP_MKIN_0, | 78 | GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, |
| 79 | GPIO101_KP_MKIN_1, | 79 | GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, |
| 80 | GPIO102_KP_MKIN_2, | 80 | GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, |
| 81 | GPIO97_KP_MKIN_3, | 81 | GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, |
| 82 | GPIO103_KP_MKOUT_0, | 82 | GPIO103_KP_MKOUT_0, |
| 83 | GPIO104_KP_MKOUT_1, | 83 | GPIO104_KP_MKOUT_1, |
| 84 | GPIO105_KP_MKOUT_2, | 84 | GPIO105_KP_MKOUT_2, |
| @@ -450,6 +450,33 @@ static struct pxafb_mach_info palmt5_lcd_screen = { | |||
| 450 | }; | 450 | }; |
| 451 | 451 | ||
| 452 | /****************************************************************************** | 452 | /****************************************************************************** |
| 453 | * Power management - standby | ||
| 454 | ******************************************************************************/ | ||
| 455 | #ifdef CONFIG_PM | ||
| 456 | static u32 *addr __initdata; | ||
| 457 | static u32 resume[3] __initdata = { | ||
| 458 | 0xe3a00101, /* mov r0, #0x40000000 */ | ||
| 459 | 0xe380060f, /* orr r0, r0, #0x00f00000 */ | ||
| 460 | 0xe590f008, /* ldr pc, [r0, #0x08] */ | ||
| 461 | }; | ||
| 462 | |||
| 463 | static int __init palmt5_pm_init(void) | ||
| 464 | { | ||
| 465 | int i; | ||
| 466 | |||
| 467 | /* this is where the bootloader jumps */ | ||
| 468 | addr = phys_to_virt(PALMT5_STR_BASE); | ||
| 469 | |||
| 470 | for (i = 0; i < 3; i++) | ||
| 471 | addr[i] = resume[i]; | ||
| 472 | |||
| 473 | return 0; | ||
| 474 | } | ||
| 475 | |||
| 476 | device_initcall(palmt5_pm_init); | ||
| 477 | #endif | ||
| 478 | |||
| 479 | /****************************************************************************** | ||
| 453 | * Machine init | 480 | * Machine init |
| 454 | ******************************************************************************/ | 481 | ******************************************************************************/ |
| 455 | static struct platform_device *devices[] __initdata = { | 482 | static struct platform_device *devices[] __initdata = { |
diff --git a/arch/arm/mach-pxa/palmte2.c b/arch/arm/mach-pxa/palmte2.c new file mode 100644 index 000000000000..43fcf2e86887 --- /dev/null +++ b/arch/arm/mach-pxa/palmte2.c | |||
| @@ -0,0 +1,466 @@ | |||
| 1 | /* | ||
| 2 | * Hardware definitions for Palm Tungsten|E2 | ||
| 3 | * | ||
| 4 | * Author: | ||
| 5 | * Carlos Eduardo Medaglia Dyonisio <cadu@nerdfeliz.com> | ||
| 6 | * | ||
| 7 | * Rewrite for mainline: | ||
| 8 | * Marek Vasut <marek.vasut@gmail.com> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License version 2 as | ||
| 12 | * published by the Free Software Foundation. | ||
| 13 | * | ||
| 14 | * (find more info at www.hackndev.com) | ||
| 15 | * | ||
| 16 | */ | ||
| 17 | |||
| 18 | #include <linux/platform_device.h> | ||
| 19 | #include <linux/delay.h> | ||
| 20 | #include <linux/irq.h> | ||
| 21 | #include <linux/gpio_keys.h> | ||
| 22 | #include <linux/input.h> | ||
| 23 | #include <linux/pda_power.h> | ||
| 24 | #include <linux/pwm_backlight.h> | ||
| 25 | #include <linux/gpio.h> | ||
| 26 | #include <linux/wm97xx_batt.h> | ||
| 27 | #include <linux/power_supply.h> | ||
| 28 | |||
| 29 | #include <asm/mach-types.h> | ||
| 30 | #include <asm/mach/arch.h> | ||
| 31 | #include <asm/mach/map.h> | ||
| 32 | |||
| 33 | #include <mach/audio.h> | ||
| 34 | #include <mach/palmte2.h> | ||
| 35 | #include <mach/mmc.h> | ||
| 36 | #include <mach/pxafb.h> | ||
| 37 | #include <mach/mfp-pxa25x.h> | ||
| 38 | #include <mach/irda.h> | ||
| 39 | #include <mach/udc.h> | ||
| 40 | |||
| 41 | #include "generic.h" | ||
| 42 | #include "devices.h" | ||
| 43 | |||
| 44 | /****************************************************************************** | ||
| 45 | * Pin configuration | ||
| 46 | ******************************************************************************/ | ||
| 47 | static unsigned long palmte2_pin_config[] __initdata = { | ||
| 48 | /* MMC */ | ||
| 49 | GPIO6_MMC_CLK, | ||
| 50 | GPIO8_MMC_CS0, | ||
| 51 | GPIO10_GPIO, /* SD detect */ | ||
| 52 | GPIO55_GPIO, /* SD power */ | ||
| 53 | GPIO51_GPIO, /* SD r/o switch */ | ||
| 54 | |||
| 55 | /* AC97 */ | ||
| 56 | GPIO28_AC97_BITCLK, | ||
| 57 | GPIO29_AC97_SDATA_IN_0, | ||
| 58 | GPIO30_AC97_SDATA_OUT, | ||
| 59 | GPIO31_AC97_SYNC, | ||
| 60 | |||
| 61 | /* PWM */ | ||
| 62 | GPIO16_PWM0_OUT, | ||
| 63 | |||
| 64 | /* USB */ | ||
| 65 | GPIO15_GPIO, /* usb detect */ | ||
| 66 | GPIO53_GPIO, /* usb power */ | ||
| 67 | |||
| 68 | /* IrDA */ | ||
| 69 | GPIO48_GPIO, /* ir disable */ | ||
| 70 | GPIO46_FICP_RXD, | ||
| 71 | GPIO47_FICP_TXD, | ||
| 72 | |||
| 73 | /* LCD */ | ||
| 74 | GPIO58_LCD_LDD_0, | ||
| 75 | GPIO59_LCD_LDD_1, | ||
| 76 | GPIO60_LCD_LDD_2, | ||
| 77 | GPIO61_LCD_LDD_3, | ||
| 78 | GPIO62_LCD_LDD_4, | ||
| 79 | GPIO63_LCD_LDD_5, | ||
| 80 | GPIO64_LCD_LDD_6, | ||
| 81 | GPIO65_LCD_LDD_7, | ||
| 82 | GPIO66_LCD_LDD_8, | ||
| 83 | GPIO67_LCD_LDD_9, | ||
| 84 | GPIO68_LCD_LDD_10, | ||
| 85 | GPIO69_LCD_LDD_11, | ||
| 86 | GPIO70_LCD_LDD_12, | ||
| 87 | GPIO71_LCD_LDD_13, | ||
| 88 | GPIO72_LCD_LDD_14, | ||
| 89 | GPIO73_LCD_LDD_15, | ||
| 90 | GPIO74_LCD_FCLK, | ||
| 91 | GPIO75_LCD_LCLK, | ||
| 92 | GPIO76_LCD_PCLK, | ||
| 93 | GPIO77_LCD_BIAS, | ||
| 94 | |||
| 95 | /* GPIO KEYS */ | ||
| 96 | GPIO5_GPIO, /* notes */ | ||
| 97 | GPIO7_GPIO, /* tasks */ | ||
| 98 | GPIO11_GPIO, /* calendar */ | ||
| 99 | GPIO13_GPIO, /* contacts */ | ||
| 100 | GPIO14_GPIO, /* center */ | ||
| 101 | GPIO19_GPIO, /* left */ | ||
| 102 | GPIO20_GPIO, /* right */ | ||
| 103 | GPIO21_GPIO, /* down */ | ||
| 104 | GPIO22_GPIO, /* up */ | ||
| 105 | |||
| 106 | /* MISC */ | ||
| 107 | GPIO1_RST, /* reset */ | ||
| 108 | GPIO4_GPIO, /* Hotsync button */ | ||
| 109 | GPIO9_GPIO, /* power detect */ | ||
| 110 | GPIO37_GPIO, /* LCD power */ | ||
| 111 | GPIO56_GPIO, /* Backlight power */ | ||
| 112 | }; | ||
| 113 | |||
| 114 | /****************************************************************************** | ||
| 115 | * SD/MMC card controller | ||
| 116 | ******************************************************************************/ | ||
| 117 | static int palmte2_mci_init(struct device *dev, | ||
| 118 | irq_handler_t palmte2_detect_int, void *data) | ||
| 119 | { | ||
| 120 | int err = 0; | ||
| 121 | |||
| 122 | /* Setup an interrupt for detecting card insert/remove events */ | ||
| 123 | err = gpio_request(GPIO_NR_PALMTE2_SD_DETECT_N, "SD IRQ"); | ||
| 124 | if (err) | ||
| 125 | goto err; | ||
| 126 | err = gpio_direction_input(GPIO_NR_PALMTE2_SD_DETECT_N); | ||
| 127 | if (err) | ||
| 128 | goto err2; | ||
| 129 | err = request_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), | ||
| 130 | palmte2_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM | | ||
| 131 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, | ||
| 132 | "SD/MMC card detect", data); | ||
| 133 | if (err) { | ||
| 134 | printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n", | ||
| 135 | __func__); | ||
| 136 | goto err2; | ||
| 137 | } | ||
| 138 | |||
| 139 | err = gpio_request(GPIO_NR_PALMTE2_SD_POWER, "SD_POWER"); | ||
| 140 | if (err) | ||
| 141 | goto err3; | ||
| 142 | err = gpio_direction_output(GPIO_NR_PALMTE2_SD_POWER, 0); | ||
| 143 | if (err) | ||
| 144 | goto err4; | ||
| 145 | |||
| 146 | err = gpio_request(GPIO_NR_PALMTE2_SD_READONLY, "SD_READONLY"); | ||
| 147 | if (err) | ||
| 148 | goto err4; | ||
| 149 | err = gpio_direction_input(GPIO_NR_PALMTE2_SD_READONLY); | ||
| 150 | if (err) | ||
| 151 | goto err5; | ||
| 152 | |||
| 153 | printk(KERN_DEBUG "%s: irq registered\n", __func__); | ||
| 154 | |||
| 155 | return 0; | ||
| 156 | |||
| 157 | err5: | ||
| 158 | gpio_free(GPIO_NR_PALMTE2_SD_READONLY); | ||
| 159 | err4: | ||
| 160 | gpio_free(GPIO_NR_PALMTE2_SD_POWER); | ||
| 161 | err3: | ||
| 162 | free_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), data); | ||
| 163 | err2: | ||
| 164 | gpio_free(GPIO_NR_PALMTE2_SD_DETECT_N); | ||
| 165 | err: | ||
| 166 | return err; | ||
| 167 | } | ||
| 168 | |||
| 169 | static void palmte2_mci_exit(struct device *dev, void *data) | ||
| 170 | { | ||
| 171 | gpio_free(GPIO_NR_PALMTE2_SD_READONLY); | ||
| 172 | gpio_free(GPIO_NR_PALMTE2_SD_POWER); | ||
| 173 | free_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), data); | ||
| 174 | gpio_free(GPIO_NR_PALMTE2_SD_DETECT_N); | ||
| 175 | } | ||
| 176 | |||
| 177 | static void palmte2_mci_power(struct device *dev, unsigned int vdd) | ||
| 178 | { | ||
| 179 | struct pxamci_platform_data *p_d = dev->platform_data; | ||
| 180 | gpio_set_value(GPIO_NR_PALMTE2_SD_POWER, p_d->ocr_mask & (1 << vdd)); | ||
| 181 | } | ||
| 182 | |||
| 183 | static int palmte2_mci_get_ro(struct device *dev) | ||
| 184 | { | ||
| 185 | return gpio_get_value(GPIO_NR_PALMTE2_SD_READONLY); | ||
| 186 | } | ||
| 187 | |||
| 188 | static struct pxamci_platform_data palmte2_mci_platform_data = { | ||
| 189 | .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, | ||
| 190 | .setpower = palmte2_mci_power, | ||
| 191 | .get_ro = palmte2_mci_get_ro, | ||
| 192 | .init = palmte2_mci_init, | ||
| 193 | .exit = palmte2_mci_exit, | ||
| 194 | }; | ||
| 195 | |||
| 196 | /****************************************************************************** | ||
| 197 | * GPIO keys | ||
| 198 | ******************************************************************************/ | ||
| 199 | static struct gpio_keys_button palmte2_pxa_buttons[] = { | ||
| 200 | {KEY_F1, GPIO_NR_PALMTE2_KEY_CONTACTS, 1, "Contacts" }, | ||
| 201 | {KEY_F2, GPIO_NR_PALMTE2_KEY_CALENDAR, 1, "Calendar" }, | ||
| 202 | {KEY_F3, GPIO_NR_PALMTE2_KEY_TASKS, 1, "Tasks" }, | ||
| 203 | {KEY_F4, GPIO_NR_PALMTE2_KEY_NOTES, 1, "Notes" }, | ||
| 204 | {KEY_ENTER, GPIO_NR_PALMTE2_KEY_CENTER, 1, "Center" }, | ||
| 205 | {KEY_LEFT, GPIO_NR_PALMTE2_KEY_LEFT, 1, "Left" }, | ||
| 206 | {KEY_RIGHT, GPIO_NR_PALMTE2_KEY_RIGHT, 1, "Right" }, | ||
| 207 | {KEY_DOWN, GPIO_NR_PALMTE2_KEY_DOWN, 1, "Down" }, | ||
| 208 | {KEY_UP, GPIO_NR_PALMTE2_KEY_UP, 1, "Up" }, | ||
| 209 | }; | ||
| 210 | |||
| 211 | static struct gpio_keys_platform_data palmte2_pxa_keys_data = { | ||
| 212 | .buttons = palmte2_pxa_buttons, | ||
| 213 | .nbuttons = ARRAY_SIZE(palmte2_pxa_buttons), | ||
| 214 | }; | ||
| 215 | |||
| 216 | static struct platform_device palmte2_pxa_keys = { | ||
| 217 | .name = "gpio-keys", | ||
| 218 | .id = -1, | ||
| 219 | .dev = { | ||
| 220 | .platform_data = &palmte2_pxa_keys_data, | ||
| 221 | }, | ||
| 222 | }; | ||
| 223 | |||
| 224 | /****************************************************************************** | ||
| 225 | * Backlight | ||
| 226 | ******************************************************************************/ | ||
| 227 | static int palmte2_backlight_init(struct device *dev) | ||
| 228 | { | ||
| 229 | int ret; | ||
| 230 | |||
| 231 | ret = gpio_request(GPIO_NR_PALMTE2_BL_POWER, "BL POWER"); | ||
| 232 | if (ret) | ||
| 233 | goto err; | ||
| 234 | ret = gpio_direction_output(GPIO_NR_PALMTE2_BL_POWER, 0); | ||
| 235 | if (ret) | ||
| 236 | goto err2; | ||
| 237 | ret = gpio_request(GPIO_NR_PALMTE2_LCD_POWER, "LCD POWER"); | ||
| 238 | if (ret) | ||
| 239 | goto err2; | ||
| 240 | ret = gpio_direction_output(GPIO_NR_PALMTE2_LCD_POWER, 0); | ||
| 241 | if (ret) | ||
| 242 | goto err3; | ||
| 243 | |||
| 244 | return 0; | ||
| 245 | err3: | ||
| 246 | gpio_free(GPIO_NR_PALMTE2_LCD_POWER); | ||
| 247 | err2: | ||
| 248 | gpio_free(GPIO_NR_PALMTE2_BL_POWER); | ||
| 249 | err: | ||
| 250 | return ret; | ||
| 251 | } | ||
| 252 | |||
| 253 | static int palmte2_backlight_notify(int brightness) | ||
| 254 | { | ||
| 255 | gpio_set_value(GPIO_NR_PALMTE2_BL_POWER, brightness); | ||
| 256 | gpio_set_value(GPIO_NR_PALMTE2_LCD_POWER, brightness); | ||
| 257 | return brightness; | ||
| 258 | } | ||
| 259 | |||
| 260 | static void palmte2_backlight_exit(struct device *dev) | ||
| 261 | { | ||
| 262 | gpio_free(GPIO_NR_PALMTE2_BL_POWER); | ||
| 263 | gpio_free(GPIO_NR_PALMTE2_LCD_POWER); | ||
| 264 | } | ||
| 265 | |||
| 266 | static struct platform_pwm_backlight_data palmte2_backlight_data = { | ||
| 267 | .pwm_id = 0, | ||
| 268 | .max_brightness = PALMTE2_MAX_INTENSITY, | ||
| 269 | .dft_brightness = PALMTE2_MAX_INTENSITY, | ||
| 270 | .pwm_period_ns = PALMTE2_PERIOD_NS, | ||
| 271 | .init = palmte2_backlight_init, | ||
| 272 | .notify = palmte2_backlight_notify, | ||
| 273 | .exit = palmte2_backlight_exit, | ||
| 274 | }; | ||
| 275 | |||
| 276 | static struct platform_device palmte2_backlight = { | ||
| 277 | .name = "pwm-backlight", | ||
| 278 | .dev = { | ||
| 279 | .parent = &pxa25x_device_pwm0.dev, | ||
| 280 | .platform_data = &palmte2_backlight_data, | ||
| 281 | }, | ||
| 282 | }; | ||
| 283 | |||
| 284 | /****************************************************************************** | ||
| 285 | * IrDA | ||
| 286 | ******************************************************************************/ | ||
| 287 | static int palmte2_irda_startup(struct device *dev) | ||
| 288 | { | ||
| 289 | int err; | ||
| 290 | err = gpio_request(GPIO_NR_PALMTE2_IR_DISABLE, "IR DISABLE"); | ||
| 291 | if (err) | ||
| 292 | goto err; | ||
| 293 | err = gpio_direction_output(GPIO_NR_PALMTE2_IR_DISABLE, 1); | ||
| 294 | if (err) | ||
| 295 | gpio_free(GPIO_NR_PALMTE2_IR_DISABLE); | ||
| 296 | err: | ||
| 297 | return err; | ||
| 298 | } | ||
| 299 | |||
| 300 | static void palmte2_irda_shutdown(struct device *dev) | ||
| 301 | { | ||
| 302 | gpio_free(GPIO_NR_PALMTE2_IR_DISABLE); | ||
| 303 | } | ||
| 304 | |||
| 305 | static void palmte2_irda_transceiver_mode(struct device *dev, int mode) | ||
| 306 | { | ||
| 307 | gpio_set_value(GPIO_NR_PALMTE2_IR_DISABLE, mode & IR_OFF); | ||
| 308 | pxa2xx_transceiver_mode(dev, mode); | ||
| 309 | } | ||
| 310 | |||
| 311 | static struct pxaficp_platform_data palmte2_ficp_platform_data = { | ||
| 312 | .startup = palmte2_irda_startup, | ||
| 313 | .shutdown = palmte2_irda_shutdown, | ||
| 314 | .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF, | ||
| 315 | .transceiver_mode = palmte2_irda_transceiver_mode, | ||
| 316 | }; | ||
| 317 | |||
| 318 | /****************************************************************************** | ||
| 319 | * UDC | ||
| 320 | ******************************************************************************/ | ||
| 321 | static struct pxa2xx_udc_mach_info palmte2_udc_info __initdata = { | ||
| 322 | .gpio_vbus = GPIO_NR_PALMTE2_USB_DETECT_N, | ||
| 323 | .gpio_vbus_inverted = 1, | ||
| 324 | .gpio_pullup = GPIO_NR_PALMTE2_USB_PULLUP, | ||
| 325 | .gpio_pullup_inverted = 0, | ||
| 326 | }; | ||
| 327 | |||
| 328 | /****************************************************************************** | ||
| 329 | * Power supply | ||
| 330 | ******************************************************************************/ | ||
| 331 | static int power_supply_init(struct device *dev) | ||
| 332 | { | ||
| 333 | int ret; | ||
| 334 | |||
| 335 | ret = gpio_request(GPIO_NR_PALMTE2_POWER_DETECT, "CABLE_STATE_AC"); | ||
| 336 | if (ret) | ||
| 337 | goto err1; | ||
| 338 | ret = gpio_direction_input(GPIO_NR_PALMTE2_POWER_DETECT); | ||
| 339 | if (ret) | ||
| 340 | goto err2; | ||
| 341 | |||
| 342 | return 0; | ||
| 343 | |||
| 344 | err2: | ||
| 345 | gpio_free(GPIO_NR_PALMTE2_POWER_DETECT); | ||
| 346 | err1: | ||
| 347 | return ret; | ||
| 348 | } | ||
| 349 | |||
| 350 | static int palmte2_is_ac_online(void) | ||
| 351 | { | ||
| 352 | return gpio_get_value(GPIO_NR_PALMTE2_POWER_DETECT); | ||
| 353 | } | ||
| 354 | |||
| 355 | static void power_supply_exit(struct device *dev) | ||
| 356 | { | ||
| 357 | gpio_free(GPIO_NR_PALMTE2_POWER_DETECT); | ||
| 358 | } | ||
| 359 | |||
| 360 | static char *palmte2_supplicants[] = { | ||
| 361 | "main-battery", | ||
| 362 | }; | ||
| 363 | |||
| 364 | static struct pda_power_pdata power_supply_info = { | ||
| 365 | .init = power_supply_init, | ||
| 366 | .is_ac_online = palmte2_is_ac_online, | ||
| 367 | .exit = power_supply_exit, | ||
| 368 | .supplied_to = palmte2_supplicants, | ||
| 369 | .num_supplicants = ARRAY_SIZE(palmte2_supplicants), | ||
| 370 | }; | ||
| 371 | |||
| 372 | static struct platform_device power_supply = { | ||
| 373 | .name = "pda-power", | ||
| 374 | .id = -1, | ||
| 375 | .dev = { | ||
| 376 | .platform_data = &power_supply_info, | ||
| 377 | }, | ||
| 378 | }; | ||
| 379 | |||
| 380 | /****************************************************************************** | ||
| 381 | * WM97xx battery | ||
| 382 | ******************************************************************************/ | ||
| 383 | static struct wm97xx_batt_info wm97xx_batt_pdata = { | ||
| 384 | .batt_aux = WM97XX_AUX_ID3, | ||
| 385 | .temp_aux = WM97XX_AUX_ID2, | ||
| 386 | .charge_gpio = -1, | ||
| 387 | .max_voltage = PALMTE2_BAT_MAX_VOLTAGE, | ||
| 388 | .min_voltage = PALMTE2_BAT_MIN_VOLTAGE, | ||
| 389 | .batt_mult = 1000, | ||
| 390 | .batt_div = 414, | ||
| 391 | .temp_mult = 1, | ||
| 392 | .temp_div = 1, | ||
| 393 | .batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO, | ||
| 394 | .batt_name = "main-batt", | ||
| 395 | }; | ||
| 396 | |||
| 397 | /****************************************************************************** | ||
| 398 | * Framebuffer | ||
| 399 | ******************************************************************************/ | ||
| 400 | static struct pxafb_mode_info palmte2_lcd_modes[] = { | ||
| 401 | { | ||
| 402 | .pixclock = 77757, | ||
| 403 | .xres = 320, | ||
| 404 | .yres = 320, | ||
| 405 | .bpp = 16, | ||
| 406 | |||
| 407 | .left_margin = 28, | ||
| 408 | .right_margin = 7, | ||
| 409 | .upper_margin = 7, | ||
| 410 | .lower_margin = 5, | ||
| 411 | |||
| 412 | .hsync_len = 4, | ||
| 413 | .vsync_len = 1, | ||
| 414 | }, | ||
| 415 | }; | ||
| 416 | |||
| 417 | static struct pxafb_mach_info palmte2_lcd_screen = { | ||
| 418 | .modes = palmte2_lcd_modes, | ||
| 419 | .num_modes = ARRAY_SIZE(palmte2_lcd_modes), | ||
| 420 | .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, | ||
| 421 | }; | ||
| 422 | |||
| 423 | /****************************************************************************** | ||
| 424 | * Machine init | ||
| 425 | ******************************************************************************/ | ||
| 426 | static struct platform_device *devices[] __initdata = { | ||
| 427 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
| 428 | &palmte2_pxa_keys, | ||
| 429 | #endif | ||
| 430 | &palmte2_backlight, | ||
| 431 | &power_supply, | ||
| 432 | }; | ||
| 433 | |||
| 434 | /* setup udc GPIOs initial state */ | ||
| 435 | static void __init palmte2_udc_init(void) | ||
| 436 | { | ||
| 437 | if (!gpio_request(GPIO_NR_PALMTE2_USB_PULLUP, "UDC Vbus")) { | ||
| 438 | gpio_direction_output(GPIO_NR_PALMTE2_USB_PULLUP, 1); | ||
| 439 | gpio_free(GPIO_NR_PALMTE2_USB_PULLUP); | ||
| 440 | } | ||
| 441 | } | ||
| 442 | |||
| 443 | static void __init palmte2_init(void) | ||
| 444 | { | ||
| 445 | pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config)); | ||
| 446 | |||
| 447 | set_pxa_fb_info(&palmte2_lcd_screen); | ||
| 448 | pxa_set_mci_info(&palmte2_mci_platform_data); | ||
| 449 | palmte2_udc_init(); | ||
| 450 | pxa_set_udc_info(&palmte2_udc_info); | ||
| 451 | pxa_set_ac97_info(NULL); | ||
| 452 | pxa_set_ficp_info(&palmte2_ficp_platform_data); | ||
| 453 | wm97xx_bat_set_pdata(&wm97xx_batt_pdata); | ||
| 454 | |||
| 455 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
| 456 | } | ||
| 457 | |||
| 458 | MACHINE_START(PALMTE2, "Palm Tungsten|E2") | ||
| 459 | .phys_io = 0x40000000, | ||
| 460 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | ||
| 461 | .boot_params = 0xa0000100, | ||
| 462 | .map_io = pxa_map_io, | ||
| 463 | .init_irq = pxa25x_init_irq, | ||
| 464 | .timer = &pxa_timer, | ||
| 465 | .init_machine = palmte2_init | ||
| 466 | MACHINE_END | ||
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c index b490c0924619..59d0c1cba556 100644 --- a/arch/arm/mach-pxa/palmtx.c +++ b/arch/arm/mach-pxa/palmtx.c | |||
| @@ -93,10 +93,10 @@ static unsigned long palmtx_pin_config[] __initdata = { | |||
| 93 | GPIO116_GPIO, /* wifi ready */ | 93 | GPIO116_GPIO, /* wifi ready */ |
| 94 | 94 | ||
| 95 | /* MATRIX KEYPAD */ | 95 | /* MATRIX KEYPAD */ |
| 96 | GPIO100_KP_MKIN_0, | 96 | GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH, |
| 97 | GPIO101_KP_MKIN_1, | 97 | GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH, |
| 98 | GPIO102_KP_MKIN_2, | 98 | GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH, |
| 99 | GPIO97_KP_MKIN_3, | 99 | GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH, |
| 100 | GPIO103_KP_MKOUT_0, | 100 | GPIO103_KP_MKOUT_0, |
| 101 | GPIO104_KP_MKOUT_1, | 101 | GPIO104_KP_MKOUT_1, |
| 102 | GPIO105_KP_MKOUT_2, | 102 | GPIO105_KP_MKOUT_2, |
| @@ -459,6 +459,33 @@ static struct pxafb_mach_info palmtx_lcd_screen = { | |||
| 459 | }; | 459 | }; |
| 460 | 460 | ||
| 461 | /****************************************************************************** | 461 | /****************************************************************************** |
| 462 | * Power management - standby | ||
| 463 | ******************************************************************************/ | ||
| 464 | #ifdef CONFIG_PM | ||
| 465 | static u32 *addr __initdata; | ||
| 466 | static u32 resume[3] __initdata = { | ||
| 467 | 0xe3a00101, /* mov r0, #0x40000000 */ | ||
| 468 | 0xe380060f, /* orr r0, r0, #0x00f00000 */ | ||
| 469 | 0xe590f008, /* ldr pc, [r0, #0x08] */ | ||
| 470 | }; | ||
| 471 | |||
| 472 | static int __init palmtx_pm_init(void) | ||
| 473 | { | ||
| 474 | int i; | ||
| 475 | |||
| 476 | /* this is where the bootloader jumps */ | ||
| 477 | addr = phys_to_virt(PALMTX_STR_BASE); | ||
| 478 | |||
| 479 | for (i = 0; i < 3; i++) | ||
| 480 | addr[i] = resume[i]; | ||
| 481 | |||
| 482 | return 0; | ||
| 483 | } | ||
| 484 | |||
| 485 | device_initcall(palmtx_pm_init); | ||
| 486 | #endif | ||
| 487 | |||
| 488 | /****************************************************************************** | ||
| 462 | * Machine init | 489 | * Machine init |
| 463 | ******************************************************************************/ | 490 | ******************************************************************************/ |
| 464 | static struct platform_device *devices[] __initdata = { | 491 | static struct platform_device *devices[] __initdata = { |
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index 6e8ade6ae339..afac5b6d3d78 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
| @@ -45,6 +45,7 @@ | |||
| 45 | #include <mach/udc.h> | 45 | #include <mach/udc.h> |
| 46 | #include <mach/tosa_bt.h> | 46 | #include <mach/tosa_bt.h> |
| 47 | #include <mach/pxa2xx_spi.h> | 47 | #include <mach/pxa2xx_spi.h> |
| 48 | #include <mach/audio.h> | ||
| 48 | 49 | ||
| 49 | #include <asm/mach/arch.h> | 50 | #include <asm/mach/arch.h> |
| 50 | #include <mach/tosa.h> | 51 | #include <mach/tosa.h> |
| @@ -914,6 +915,7 @@ static void __init tosa_init(void) | |||
| 914 | pxa_set_udc_info(&udc_info); | 915 | pxa_set_udc_info(&udc_info); |
| 915 | pxa_set_ficp_info(&tosa_ficp_platform_data); | 916 | pxa_set_ficp_info(&tosa_ficp_platform_data); |
| 916 | pxa_set_i2c_info(NULL); | 917 | pxa_set_i2c_info(NULL); |
| 918 | pxa_set_ac97_info(NULL); | ||
| 917 | platform_scoop_config = &tosa_pcmcia_config; | 919 | platform_scoop_config = &tosa_pcmcia_config; |
| 918 | 920 | ||
| 919 | pxa2xx_set_spi_info(2, &pxa_ssp_master_info); | 921 | pxa2xx_set_spi_info(2, &pxa_ssp_master_info); |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index b438fc4fb77b..e6344ece00ce 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -828,6 +828,17 @@ void __init reserve_node_zero(pg_data_t *pgdat) | |||
| 828 | BOOTMEM_DEFAULT); | 828 | BOOTMEM_DEFAULT); |
| 829 | } | 829 | } |
| 830 | 830 | ||
| 831 | if (machine_is_palmld() || machine_is_palmtx()) { | ||
| 832 | reserve_bootmem_node(pgdat, 0xa0000000, 0x1000, | ||
| 833 | BOOTMEM_EXCLUSIVE); | ||
| 834 | reserve_bootmem_node(pgdat, 0xa0200000, 0x1000, | ||
| 835 | BOOTMEM_EXCLUSIVE); | ||
| 836 | } | ||
| 837 | |||
| 838 | if (machine_is_palmt5()) | ||
| 839 | reserve_bootmem_node(pgdat, 0xa0200000, 0x1000, | ||
| 840 | BOOTMEM_EXCLUSIVE); | ||
| 841 | |||
| 831 | #ifdef CONFIG_SA1111 | 842 | #ifdef CONFIG_SA1111 |
| 832 | /* | 843 | /* |
| 833 | * Because of the SA1111 DMA bug, we want to preserve our | 844 | * Because of the SA1111 DMA bug, we want to preserve our |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 4ed228a89943..bb5e6f671578 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
| @@ -280,7 +280,7 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev) | |||
| 280 | * are always powered while this driver is active, and use | 280 | * are always powered while this driver is active, and use |
| 281 | * active-low power switches. | 281 | * active-low power switches. |
| 282 | */ | 282 | */ |
| 283 | for (i = 0; i < pdata->ports; i++) { | 283 | for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { |
| 284 | if (pdata->vbus_pin[i] <= 0) | 284 | if (pdata->vbus_pin[i] <= 0) |
| 285 | continue; | 285 | continue; |
| 286 | gpio_request(pdata->vbus_pin[i], "ohci_vbus"); | 286 | gpio_request(pdata->vbus_pin[i], "ohci_vbus"); |
| @@ -298,7 +298,7 @@ static int ohci_hcd_at91_drv_remove(struct platform_device *pdev) | |||
| 298 | int i; | 298 | int i; |
| 299 | 299 | ||
| 300 | if (pdata) { | 300 | if (pdata) { |
| 301 | for (i = 0; i < pdata->ports; i++) { | 301 | for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) { |
| 302 | if (pdata->vbus_pin[i] <= 0) | 302 | if (pdata->vbus_pin[i] <= 0) |
| 303 | continue; | 303 | continue; |
| 304 | gpio_direction_output(pdata->vbus_pin[i], 1); | 304 | gpio_direction_output(pdata->vbus_pin[i], 1); |
