Merge master.kernel.org:/home/rmk/linux-2.6-arm
* master.kernel.org:/home/rmk/linux-2.6-arm: [ARM] 5446/1: ohci-at91: Limit vbus_pin assignment to the size of the array [ARM] 5445/1: AT91: Remove flexible array from USBH platform data [ARM] 5447/1: Add SZ_32K [ARM] omap: fix omap1 clock usecount decrement bug [ARM] pxa: register AC97 controller devices [ARM] pxa/csb701: do not register devices on non-csb726 boads [ARM] pxa/colibri: get rid of set_irq_type() [ARM] pxa/colibri: provide MAC address from ATAG_SERIAL [ARM] pxa/cm-x2xx: fix ucb1400 not being registered [ARM] pxa: Add support for suspend on PalmTX, T5 and LD [ARM] pxa: PalmTE2 support for battery, UDC, IrDA and backlight [ARM] pxa: Palm Tungsten E2 basic support [ARM] pxa/em-x270: add libertas device registration [ARM] pxa/magician: Enable bq24022 regulator for gpio_vbus and pda_power
This commit is contained in:
commit
139ef17a46
@ -636,7 +636,7 @@ P: Dirk Opfer
|
||||
M: dirk@opfer-online.de
|
||||
S: Maintained
|
||||
|
||||
ARM/PALMTX,PALMT5,PALMLD SUPPORT
|
||||
ARM/PALMTX,PALMT5,PALMLD,PALMTE2 SUPPORT
|
||||
P: Marek Vasut
|
||||
M: marek.vasut@gmail.com
|
||||
W: http://hackndev.com
|
||||
|
@ -1183,7 +1183,11 @@ CONFIG_RTC_INTF_DEV=y
|
||||
CONFIG_RTC_DRV_SA1100=y
|
||||
# CONFIG_RTC_DRV_PXA is not set
|
||||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_REGULATOR is not set
|
||||
CONFIG_REGULATOR=y
|
||||
# CONFIG_REGULATOR_DEBUG is not set
|
||||
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
|
||||
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
|
||||
CONFIG_REGULATOR_BQ24022=y
|
||||
# CONFIG_UIO is not set
|
||||
# CONFIG_STAGING is not set
|
||||
|
||||
|
@ -32,6 +32,7 @@
|
||||
#define SZ_4K 0x00001000
|
||||
#define SZ_8K 0x00002000
|
||||
#define SZ_16K 0x00004000
|
||||
#define SZ_32K 0x00008000
|
||||
#define SZ_64K 0x00010000
|
||||
#define SZ_128K 0x00020000
|
||||
#define SZ_256K 0x00040000
|
||||
|
@ -87,7 +87,7 @@ extern void __init at91_add_device_eth(struct at91_eth_data *data);
|
||||
/* USB Host */
|
||||
struct at91_usbh_data {
|
||||
u8 ports; /* number of ports on root hub */
|
||||
u8 vbus_pin[]; /* port power-control pin */
|
||||
u8 vbus_pin[2]; /* port power-control pin */
|
||||
};
|
||||
extern void __init at91_add_device_usbh(struct at91_usbh_data *data);
|
||||
|
||||
|
@ -590,27 +590,28 @@ static void omap1_init_ext_clk(struct clk * clk)
|
||||
static int omap1_clk_enable(struct clk *clk)
|
||||
{
|
||||
int ret = 0;
|
||||
if (clk->usecount++ == 0) {
|
||||
if (likely(clk->parent)) {
|
||||
ret = omap1_clk_enable(clk->parent);
|
||||
|
||||
if (unlikely(ret != 0)) {
|
||||
clk->usecount--;
|
||||
return ret;
|
||||
}
|
||||
if (clk->usecount++ == 0) {
|
||||
if (clk->parent) {
|
||||
ret = omap1_clk_enable(clk->parent);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
if (clk->flags & CLOCK_NO_IDLE_PARENT)
|
||||
omap1_clk_deny_idle(clk->parent);
|
||||
}
|
||||
|
||||
ret = clk->ops->enable(clk);
|
||||
|
||||
if (unlikely(ret != 0) && clk->parent) {
|
||||
omap1_clk_disable(clk->parent);
|
||||
clk->usecount--;
|
||||
if (ret) {
|
||||
if (clk->parent)
|
||||
omap1_clk_disable(clk->parent);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
||||
err:
|
||||
clk->usecount--;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -343,6 +343,15 @@ config ARCH_PXA_PALM
|
||||
bool "PXA based Palm PDAs"
|
||||
select HAVE_PWM
|
||||
|
||||
config MACH_PALMTE2
|
||||
bool "Palm Tungsten|E2"
|
||||
default y
|
||||
depends on ARCH_PXA_PALM
|
||||
select PXA25x
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a Palm Tungsten|E2
|
||||
handheld computer.
|
||||
|
||||
config MACH_PALMT5
|
||||
bool "Palm Tungsten|T5"
|
||||
default y
|
||||
|
@ -57,6 +57,7 @@ obj-$(CONFIG_MACH_E740) += e740.o
|
||||
obj-$(CONFIG_MACH_E750) += e750.o
|
||||
obj-$(CONFIG_MACH_E400) += e400.o
|
||||
obj-$(CONFIG_MACH_E800) += e800.o
|
||||
obj-$(CONFIG_MACH_PALMTE2) += palmte2.o
|
||||
obj-$(CONFIG_MACH_PALMT5) += palmt5.o
|
||||
obj-$(CONFIG_MACH_PALMTX) += palmtx.o
|
||||
obj-$(CONFIG_MACH_PALMLD) += palmld.o
|
||||
|
@ -121,7 +121,7 @@ static inline void cmx2xx_init_dm9000(void) {}
|
||||
/* UCB1400 touchscreen controller */
|
||||
#if defined(CONFIG_TOUCHSCREEN_UCB1400) || defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
|
||||
static struct platform_device cmx2xx_ts_device = {
|
||||
.name = "ucb1400_ts",
|
||||
.name = "ucb1400_core",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <net/ax88796.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/sizes.h>
|
||||
@ -32,12 +32,13 @@
|
||||
|
||||
#if defined(CONFIG_AX88796)
|
||||
#define COLIBRI_ETH_IRQ_GPIO mfp_to_gpio(GPIO26_GPIO)
|
||||
|
||||
/*
|
||||
* Asix AX88796 Ethernet
|
||||
*/
|
||||
static struct ax_plat_data colibri_asix_platdata = {
|
||||
.flags = AXFLG_MAC_FROMDEV,
|
||||
.wordlength = 2
|
||||
.flags = 0, /* defined later */
|
||||
.wordlength = 2,
|
||||
};
|
||||
|
||||
static struct resource colibri_asix_resource[] = {
|
||||
@ -49,7 +50,7 @@ static struct resource colibri_asix_resource[] = {
|
||||
[1] = {
|
||||
.start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO),
|
||||
.end = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO),
|
||||
.flags = IORESOURCE_IRQ
|
||||
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING,
|
||||
}
|
||||
};
|
||||
|
||||
@ -70,8 +71,8 @@ static mfp_cfg_t colibri_pxa300_eth_pin_config[] __initdata = {
|
||||
|
||||
static void __init colibri_pxa300_init_eth(void)
|
||||
{
|
||||
colibri_pxa3xx_init_eth(&colibri_asix_platdata);
|
||||
pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa300_eth_pin_config));
|
||||
set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING);
|
||||
platform_device_register(&asix_device);
|
||||
}
|
||||
#else
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <net/ax88796.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/sizes.h>
|
||||
@ -38,8 +38,8 @@
|
||||
* Asix AX88796 Ethernet
|
||||
*/
|
||||
static struct ax_plat_data colibri_asix_platdata = {
|
||||
.flags = AXFLG_MAC_FROMDEV,
|
||||
.wordlength = 2
|
||||
.flags = 0, /* defined later */
|
||||
.wordlength = 2,
|
||||
};
|
||||
|
||||
static struct resource colibri_asix_resource[] = {
|
||||
@ -51,7 +51,7 @@ static struct resource colibri_asix_resource[] = {
|
||||
[1] = {
|
||||
.start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO),
|
||||
.end = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO),
|
||||
.flags = IORESOURCE_IRQ
|
||||
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING,
|
||||
}
|
||||
};
|
||||
|
||||
@ -72,8 +72,8 @@ static mfp_cfg_t colibri_pxa320_eth_pin_config[] __initdata = {
|
||||
|
||||
static void __init colibri_pxa320_init_eth(void)
|
||||
{
|
||||
colibri_pxa3xx_init_eth(&colibri_asix_platdata);
|
||||
pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa320_eth_pin_config));
|
||||
set_irq_type(gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), IRQ_TYPE_EDGE_FALLING);
|
||||
platform_device_register(&asix_device);
|
||||
}
|
||||
#else
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/sizes.h>
|
||||
@ -28,6 +29,40 @@
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
||||
#if defined(CONFIG_AX88796)
|
||||
#define ETHER_ADDR_LEN 6
|
||||
static u8 ether_mac_addr[ETHER_ADDR_LEN];
|
||||
|
||||
void __init colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data)
|
||||
{
|
||||
int i;
|
||||
u64 serial = ((u64) system_serial_high << 32) | system_serial_low;
|
||||
|
||||
/*
|
||||
* If the bootloader passed in a serial boot tag, which contains a
|
||||
* valid ethernet MAC, pass it to the interface. Toradex ships the
|
||||
* modules with their own bootloader which provides a valid MAC
|
||||
* this way.
|
||||
*/
|
||||
|
||||
for (i = 0; i < ETHER_ADDR_LEN; i++) {
|
||||
ether_mac_addr[i] = serial & 0xff;
|
||||
serial >>= 8;
|
||||
}
|
||||
|
||||
if (is_valid_ether_addr(ether_mac_addr)) {
|
||||
plat_data->flags |= AXFLG_MAC_FROMPLATFORM;
|
||||
plat_data->mac_addr = ether_mac_addr;
|
||||
printk(KERN_INFO "%s(): taking MAC from serial boot tag\n",
|
||||
__func__);
|
||||
} else {
|
||||
plat_data->flags |= AXFLG_MAC_FROMDEV;
|
||||
printk(KERN_INFO "%s(): no valid serial boot tag found, "
|
||||
"taking MAC from device\n", __func__);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
|
||||
static int mmc_detect_pin;
|
||||
|
||||
|
@ -5,6 +5,8 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
static struct gpio_keys_button csb701_buttons[] = {
|
||||
{
|
||||
.code = 0x7,
|
||||
@ -54,6 +56,9 @@ static struct platform_device *devices[] __initdata = {
|
||||
|
||||
static int __init csb701_init(void)
|
||||
{
|
||||
if (!machine_is_csb726())
|
||||
return -ENODEV;
|
||||
|
||||
return platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include <mach/udc.h>
|
||||
#include <mach/irda.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/audio.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "eseries.h"
|
||||
@ -197,6 +198,7 @@ static void __init e740_init(void)
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
e7xx_irda_init();
|
||||
pxa_set_ficp_info(&e7xx_ficp_platform_data);
|
||||
}
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <mach/udc.h>
|
||||
#include <mach/irda.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/audio.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "eseries.h"
|
||||
@ -198,6 +199,7 @@ static void __init e750_init(void)
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
e7xx_irda_init();
|
||||
pxa_set_ficp_info(&e7xx_ficp_platform_data);
|
||||
}
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <mach/eseries-gpio.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/audio.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "eseries.h"
|
||||
@ -199,6 +200,7 @@ static void __init e800_init(void)
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
pxa_set_udc_info(&e800_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
}
|
||||
|
||||
MACHINE_START(E800, "Toshiba e800")
|
||||
|
@ -25,8 +25,10 @@
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/tdo24m.h>
|
||||
#include <linux/spi/libertas_spi.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/apm-emulation.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <media/soc_camera.h>
|
||||
|
||||
@ -62,6 +64,8 @@
|
||||
#define GPIO93_CAM_RESET (93)
|
||||
#define GPIO41_ETHIRQ (41)
|
||||
#define EM_X270_ETHIRQ IRQ_GPIO(GPIO41_ETHIRQ)
|
||||
#define GPIO115_WLAN_PWEN (115)
|
||||
#define GPIO19_WLAN_STRAP (19)
|
||||
|
||||
static int mmc_cd;
|
||||
static int nand_rb;
|
||||
@ -159,8 +163,8 @@ static unsigned long common_pin_config[] = {
|
||||
GPIO57_SSP1_TXD,
|
||||
|
||||
/* SSP2 */
|
||||
GPIO19_SSP2_SCLK,
|
||||
GPIO14_SSP2_SFRM,
|
||||
GPIO19_GPIO, /* SSP2 clock is used as GPIO for Libertas pin-strap */
|
||||
GPIO14_GPIO,
|
||||
GPIO89_SSP2_TXD,
|
||||
GPIO88_SSP2_RXD,
|
||||
|
||||
@ -648,20 +652,86 @@ static struct tdo24m_platform_data em_x270_tdo24m_pdata = {
|
||||
.model = TDO35S,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master em_x270_spi_2_info = {
|
||||
.num_chipselect = 1,
|
||||
.enable_dma = 1,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_chip em_x270_libertas_chip = {
|
||||
.rx_threshold = 1,
|
||||
.tx_threshold = 1,
|
||||
.timeout = 1000,
|
||||
};
|
||||
|
||||
static unsigned long em_x270_libertas_pin_config[] = {
|
||||
/* SSP2 */
|
||||
GPIO19_SSP2_SCLK,
|
||||
GPIO14_GPIO,
|
||||
GPIO89_SSP2_TXD,
|
||||
GPIO88_SSP2_RXD,
|
||||
};
|
||||
|
||||
static int em_x270_libertas_setup(struct spi_device *spi)
|
||||
{
|
||||
int err = gpio_request(GPIO115_WLAN_PWEN, "WLAN PWEN");
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
gpio_direction_output(GPIO19_WLAN_STRAP, 1);
|
||||
mdelay(100);
|
||||
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(em_x270_libertas_pin_config));
|
||||
|
||||
gpio_direction_output(GPIO115_WLAN_PWEN, 0);
|
||||
mdelay(100);
|
||||
gpio_set_value(GPIO115_WLAN_PWEN, 1);
|
||||
mdelay(100);
|
||||
|
||||
spi->bits_per_word = 16;
|
||||
spi_setup(spi);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int em_x270_libertas_teardown(struct spi_device *spi)
|
||||
{
|
||||
gpio_set_value(GPIO115_WLAN_PWEN, 0);
|
||||
gpio_free(GPIO115_WLAN_PWEN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct libertas_spi_platform_data em_x270_libertas_pdata = {
|
||||
.use_dummy_writes = 1,
|
||||
.gpio_cs = 14,
|
||||
.setup = em_x270_libertas_setup,
|
||||
.teardown = em_x270_libertas_teardown,
|
||||
};
|
||||
|
||||
static struct spi_board_info em_x270_spi_devices[] __initdata = {
|
||||
{
|
||||
.modalias = "tdo24m",
|
||||
.max_speed_hz = 1000000,
|
||||
.bus_num = 1,
|
||||
.chip_select = 0,
|
||||
.controller_data = &em_x270_tdo24m_chip,
|
||||
.platform_data = &em_x270_tdo24m_pdata,
|
||||
.modalias = "tdo24m",
|
||||
.max_speed_hz = 1000000,
|
||||
.bus_num = 1,
|
||||
.chip_select = 0,
|
||||
.controller_data = &em_x270_tdo24m_chip,
|
||||
.platform_data = &em_x270_tdo24m_pdata,
|
||||
},
|
||||
{
|
||||
.modalias = "libertas_spi",
|
||||
.max_speed_hz = 13000000,
|
||||
.bus_num = 2,
|
||||
.irq = IRQ_GPIO(116),
|
||||
.chip_select = 0,
|
||||
.controller_data = &em_x270_libertas_chip,
|
||||
.platform_data = &em_x270_libertas_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init em_x270_init_spi(void)
|
||||
{
|
||||
pxa2xx_set_spi_info(1, &em_x270_spi_info);
|
||||
pxa2xx_set_spi_info(2, &em_x270_spi_2_info);
|
||||
spi_register_board_info(ARRAY_AND_SIZE(em_x270_spi_devices));
|
||||
}
|
||||
#else
|
||||
|
@ -1,5 +1,8 @@
|
||||
#ifndef _COLIBRI_H_
|
||||
#define _COLIBRI_H_
|
||||
|
||||
#include <net/ax88796.h>
|
||||
|
||||
/*
|
||||
* common settings for all modules
|
||||
*/
|
||||
@ -16,6 +19,10 @@ extern void colibri_pxa3xx_init_lcd(int bl_pin);
|
||||
static inline void colibri_pxa3xx_init_lcd(int) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_AX88796)
|
||||
extern void colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data);
|
||||
#endif
|
||||
|
||||
/* physical memory regions */
|
||||
#define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */
|
||||
|
||||
|
@ -27,7 +27,7 @@
|
||||
#define GPIO22_MAGICIAN_VIBRA_EN 22
|
||||
#define GPIO26_MAGICIAN_GSM_POWER 26
|
||||
#define GPIO27_MAGICIAN_USBC_PUEN 27
|
||||
#define GPIO30_MAGICIAN_nCHARGE_EN 30
|
||||
#define GPIO30_MAGICIAN_BQ24022_nCHARGE_EN 30
|
||||
#define GPIO37_MAGICIAN_KEY_HANGUP 37
|
||||
#define GPIO38_MAGICIAN_KEY_CONTACTS 38
|
||||
#define GPIO40_MAGICIAN_GSM_OUT2 40
|
||||
@ -98,7 +98,7 @@
|
||||
#define EGPIO_MAGICIAN_UNKNOWN_WAVEDEV_DLL MAGICIAN_EGPIO(2, 2)
|
||||
#define EGPIO_MAGICIAN_FLASH_VPP MAGICIAN_EGPIO(2, 3)
|
||||
#define EGPIO_MAGICIAN_BL_POWER2 MAGICIAN_EGPIO(2, 4)
|
||||
#define EGPIO_MAGICIAN_CHARGE_EN MAGICIAN_EGPIO(2, 5)
|
||||
#define EGPIO_MAGICIAN_BQ24022_ISET2 MAGICIAN_EGPIO(2, 5)
|
||||
#define EGPIO_MAGICIAN_GSM_POWER MAGICIAN_EGPIO(2, 7)
|
||||
|
||||
/* input */
|
||||
|
@ -87,6 +87,7 @@
|
||||
#define PALMLD_IDE_SIZE 0x00100000
|
||||
|
||||
#define PALMLD_PHYS_IO_START 0x40000000
|
||||
#define PALMLD_STR_BASE 0xa0200000
|
||||
|
||||
/* BATTERY */
|
||||
#define PALMLD_BAT_MAX_VOLTAGE 4000 /* 4.00V maximum voltage */
|
||||
|
@ -59,6 +59,7 @@
|
||||
/* Various addresses */
|
||||
#define PALMT5_PHYS_RAM_START 0xa0000000
|
||||
#define PALMT5_PHYS_IO_START 0x40000000
|
||||
#define PALMT5_STR_BASE 0xa0200000
|
||||
|
||||
/* TOUCHSCREEN */
|
||||
#define AC97_LINK_FRAME 21
|
||||
|
68
arch/arm/mach-pxa/include/mach/palmte2.h
Normal file
68
arch/arm/mach-pxa/include/mach/palmte2.h
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* GPIOs and interrupts for Palm Tungsten|E2 Handheld Computer
|
||||
*
|
||||
* Author:
|
||||
* Carlos Eduardo Medaglia Dyonisio <cadu@nerdfeliz.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _INCLUDE_PALMTE2_H_
|
||||
#define _INCLUDE_PALMTE2_H_
|
||||
|
||||
/** HERE ARE GPIOs **/
|
||||
|
||||
/* GPIOs */
|
||||
#define GPIO_NR_PALMTE2_POWER_DETECT 9
|
||||
#define GPIO_NR_PALMTE2_HOTSYNC_BUTTON_N 4
|
||||
#define GPIO_NR_PALMTE2_EARPHONE_DETECT 15
|
||||
|
||||
/* SD/MMC */
|
||||
#define GPIO_NR_PALMTE2_SD_DETECT_N 10
|
||||
#define GPIO_NR_PALMTE2_SD_POWER 55
|
||||
#define GPIO_NR_PALMTE2_SD_READONLY 51
|
||||
|
||||
/* IRDA - disable GPIO connected to SD pin of tranceiver (TFBS4710?) ? */
|
||||
#define GPIO_NR_PALMTE2_IR_DISABLE 48
|
||||
|
||||
/* USB */
|
||||
#define GPIO_NR_PALMTE2_USB_DETECT_N 35
|
||||
#define GPIO_NR_PALMTE2_USB_PULLUP 53
|
||||
|
||||
/* LCD/BACKLIGHT */
|
||||
#define GPIO_NR_PALMTE2_BL_POWER 56
|
||||
#define GPIO_NR_PALMTE2_LCD_POWER 37
|
||||
|
||||
/* KEYS */
|
||||
#define GPIO_NR_PALMTE2_KEY_NOTES 5
|
||||
#define GPIO_NR_PALMTE2_KEY_TASKS 7
|
||||
#define GPIO_NR_PALMTE2_KEY_CALENDAR 11
|
||||
#define GPIO_NR_PALMTE2_KEY_CONTACTS 13
|
||||
#define GPIO_NR_PALMTE2_KEY_CENTER 14
|
||||
#define GPIO_NR_PALMTE2_KEY_LEFT 19
|
||||
#define GPIO_NR_PALMTE2_KEY_RIGHT 20
|
||||
#define GPIO_NR_PALMTE2_KEY_DOWN 21
|
||||
#define GPIO_NR_PALMTE2_KEY_UP 22
|
||||
|
||||
/** HERE ARE INIT VALUES **/
|
||||
|
||||
/* BACKLIGHT */
|
||||
#define PALMTE2_MAX_INTENSITY 0xFE
|
||||
#define PALMTE2_DEFAULT_INTENSITY 0x7E
|
||||
#define PALMTE2_LIMIT_MASK 0x7F
|
||||
#define PALMTE2_PRESCALER 0x3F
|
||||
#define PALMTE2_PERIOD_NS 3500
|
||||
|
||||
/* BATTERY */
|
||||
#define PALMTE2_BAT_MAX_VOLTAGE 4000 /* 4.00v current voltage */
|
||||
#define PALMTE2_BAT_MIN_VOLTAGE 3550 /* 3.55v critical voltage */
|
||||
#define PALMTE2_BAT_MAX_CURRENT 0 /* unknokn */
|
||||
#define PALMTE2_BAT_MIN_CURRENT 0 /* unknown */
|
||||
#define PALMTE2_BAT_MAX_CHARGE 1 /* unknown */
|
||||
#define PALMTE2_BAT_MIN_CHARGE 1 /* unknown */
|
||||
#define PALMTE2_MAX_LIFE_MINS 360 /* on-life in minutes */
|
||||
|
||||
#endif
|
@ -78,6 +78,8 @@
|
||||
#define PALMTX_PHYS_RAM_START 0xa0000000
|
||||
#define PALMTX_PHYS_IO_START 0x40000000
|
||||
|
||||
#define PALMTX_STR_BASE 0xa0200000
|
||||
|
||||
#define PALMTX_PHYS_FLASH_START PXA_CS0_PHYS /* ChipSelect 0 */
|
||||
#define PALMTX_PHYS_NAND_START PXA_CS1_PHYS /* ChipSelect 1 */
|
||||
|
||||
|
@ -25,6 +25,8 @@
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/regulator/bq24022.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
@ -552,33 +554,7 @@ static struct platform_device gpio_vbus = {
|
||||
|
||||
static int power_supply_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(EGPIO_MAGICIAN_CABLE_STATE_AC, "CABLE_STATE_AC");
|
||||
if (ret)
|
||||
goto err_cs_ac;
|
||||
ret = gpio_request(EGPIO_MAGICIAN_CABLE_STATE_USB, "CABLE_STATE_USB");
|
||||
if (ret)
|
||||
goto err_cs_usb;
|
||||
ret = gpio_request(EGPIO_MAGICIAN_CHARGE_EN, "CHARGE_EN");
|
||||
if (ret)
|
||||
goto err_chg_en;
|
||||
ret = gpio_request(GPIO30_MAGICIAN_nCHARGE_EN, "nCHARGE_EN");
|
||||
if (!ret)
|
||||
ret = gpio_direction_output(GPIO30_MAGICIAN_nCHARGE_EN, 0);
|
||||
if (ret)
|
||||
goto err_nchg_en;
|
||||
|
||||
return 0;
|
||||
|
||||
err_nchg_en:
|
||||
gpio_free(EGPIO_MAGICIAN_CHARGE_EN);
|
||||
err_chg_en:
|
||||
gpio_free(EGPIO_MAGICIAN_CABLE_STATE_USB);
|
||||
err_cs_usb:
|
||||
gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC);
|
||||
err_cs_ac:
|
||||
return ret;
|
||||
return gpio_request(EGPIO_MAGICIAN_CABLE_STATE_AC, "CABLE_STATE_AC");
|
||||
}
|
||||
|
||||
static int magician_is_ac_online(void)
|
||||
@ -586,22 +562,8 @@ static int magician_is_ac_online(void)
|
||||
return gpio_get_value(EGPIO_MAGICIAN_CABLE_STATE_AC);
|
||||
}
|
||||
|
||||
static int magician_is_usb_online(void)
|
||||
{
|
||||
return gpio_get_value(EGPIO_MAGICIAN_CABLE_STATE_USB);
|
||||
}
|
||||
|
||||
static void magician_set_charge(int flags)
|
||||
{
|
||||
gpio_set_value(GPIO30_MAGICIAN_nCHARGE_EN, !flags);
|
||||
gpio_set_value(EGPIO_MAGICIAN_CHARGE_EN, flags);
|
||||
}
|
||||
|
||||
static void power_supply_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO30_MAGICIAN_nCHARGE_EN);
|
||||
gpio_free(EGPIO_MAGICIAN_CHARGE_EN);
|
||||
gpio_free(EGPIO_MAGICIAN_CABLE_STATE_USB);
|
||||
gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC);
|
||||
}
|
||||
|
||||
@ -612,8 +574,6 @@ static char *magician_supplicants[] = {
|
||||
static struct pda_power_pdata power_supply_info = {
|
||||
.init = power_supply_init,
|
||||
.is_ac_online = magician_is_ac_online,
|
||||
.is_usb_online = magician_is_usb_online,
|
||||
.set_charge = magician_set_charge,
|
||||
.exit = power_supply_exit,
|
||||
.supplied_to = magician_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(magician_supplicants),
|
||||
@ -646,6 +606,43 @@ static struct platform_device power_supply = {
|
||||
.num_resources = ARRAY_SIZE(power_supply_resources),
|
||||
};
|
||||
|
||||
/*
|
||||
* Battery charger
|
||||
*/
|
||||
|
||||
static struct regulator_consumer_supply bq24022_consumers[] = {
|
||||
{
|
||||
.dev = &gpio_vbus.dev,
|
||||
.supply = "vbus_draw",
|
||||
},
|
||||
{
|
||||
.dev = &power_supply.dev,
|
||||
.supply = "ac_draw",
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data bq24022_init_data = {
|
||||
.constraints = {
|
||||
.max_uA = 500000,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_CURRENT,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(bq24022_consumers),
|
||||
.consumer_supplies = bq24022_consumers,
|
||||
};
|
||||
|
||||
static struct bq24022_mach_info bq24022_info = {
|
||||
.gpio_nce = GPIO30_MAGICIAN_BQ24022_nCHARGE_EN,
|
||||
.gpio_iset2 = EGPIO_MAGICIAN_BQ24022_ISET2,
|
||||
.init_data = &bq24022_init_data,
|
||||
};
|
||||
|
||||
static struct platform_device bq24022 = {
|
||||
.name = "bq24022",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &bq24022_info,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* MMC/SD
|
||||
@ -756,6 +753,7 @@ static struct platform_device *devices[] __initdata = {
|
||||
&egpio,
|
||||
&backlight,
|
||||
&pasic3,
|
||||
&bq24022,
|
||||
&gpio_vbus,
|
||||
&power_supply,
|
||||
&strataflash,
|
||||
|
@ -50,6 +50,7 @@
|
||||
#include <mach/pxa27x-udc.h>
|
||||
#include <mach/i2c.h>
|
||||
#include <mach/camera.h>
|
||||
#include <mach/audio.h>
|
||||
#include <media/soc_camera.h>
|
||||
|
||||
#include <mach/mioa701.h>
|
||||
@ -763,8 +764,6 @@ MIO_PARENT_DEV(mioa701_backlight, "pwm-backlight", &pxa27x_device_pwm0.dev,
|
||||
&mioa701_backlight_data);
|
||||
MIO_SIMPLE_DEV(mioa701_led, "leds-gpio", &gpio_led_info)
|
||||
MIO_SIMPLE_DEV(pxa2xx_pcm, "pxa2xx-pcm", NULL)
|
||||
MIO_SIMPLE_DEV(pxa2xx_ac97, "pxa2xx-ac97", NULL)
|
||||
MIO_PARENT_DEV(mio_wm9713_codec, "wm9713-codec", &pxa2xx_ac97.dev, NULL)
|
||||
MIO_SIMPLE_DEV(mioa701_sound, "mioa701-wm9713", NULL)
|
||||
MIO_SIMPLE_DEV(mioa701_board, "mioa701-board", NULL)
|
||||
MIO_SIMPLE_DEV(gpio_vbus, "gpio-vbus", &gpio_vbus_data);
|
||||
@ -774,8 +773,6 @@ static struct platform_device *devices[] __initdata = {
|
||||
&mioa701_backlight,
|
||||
&mioa701_led,
|
||||
&pxa2xx_pcm,
|
||||
&pxa2xx_ac97,
|
||||
&mio_wm9713_codec,
|
||||
&mioa701_sound,
|
||||
&power_dev,
|
||||
&strataflash,
|
||||
@ -818,6 +815,7 @@ static void __init mioa701_machine_init(void)
|
||||
pxa_set_keypad_info(&mioa701_keypad_info);
|
||||
wm97xx_bat_set_pdata(&mioa701_battery_data);
|
||||
pxa_set_udc_info(&mioa701_udc_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
pm_power_off = mioa701_poweroff;
|
||||
arm_pm_restart = mioa701_restart;
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/sysdev.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -68,10 +69,10 @@ static unsigned long palmld_pin_config[] __initdata = {
|
||||
GPIO47_FICP_TXD,
|
||||
|
||||
/* MATRIX KEYPAD */
|
||||
GPIO100_KP_MKIN_0,
|
||||
GPIO101_KP_MKIN_1,
|
||||
GPIO102_KP_MKIN_2,
|
||||
GPIO97_KP_MKIN_3,
|
||||
GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO103_KP_MKOUT_0,
|
||||
GPIO104_KP_MKOUT_1,
|
||||
GPIO105_KP_MKOUT_2,
|
||||
@ -506,6 +507,33 @@ static struct pxafb_mach_info palmld_lcd_screen = {
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power management - standby
|
||||
******************************************************************************/
|
||||
#ifdef CONFIG_PM
|
||||
static u32 *addr __initdata;
|
||||
static u32 resume[3] __initdata = {
|
||||
0xe3a00101, /* mov r0, #0x40000000 */
|
||||
0xe380060f, /* orr r0, r0, #0x00f00000 */
|
||||
0xe590f008, /* ldr pc, [r0, #0x08] */
|
||||
};
|
||||
|
||||
static int __init palmld_pm_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* this is where the bootloader jumps */
|
||||
addr = phys_to_virt(PALMLD_STR_BASE);
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
addr[i] = resume[i];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(palmld_pm_init);
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
|
@ -75,10 +75,10 @@ static unsigned long palmt5_pin_config[] __initdata = {
|
||||
GPIO95_GPIO, /* usb power */
|
||||
|
||||
/* MATRIX KEYPAD */
|
||||
GPIO100_KP_MKIN_0,
|
||||
GPIO101_KP_MKIN_1,
|
||||
GPIO102_KP_MKIN_2,
|
||||
GPIO97_KP_MKIN_3,
|
||||
GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO103_KP_MKOUT_0,
|
||||
GPIO104_KP_MKOUT_1,
|
||||
GPIO105_KP_MKOUT_2,
|
||||
@ -449,6 +449,33 @@ static struct pxafb_mach_info palmt5_lcd_screen = {
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power management - standby
|
||||
******************************************************************************/
|
||||
#ifdef CONFIG_PM
|
||||
static u32 *addr __initdata;
|
||||
static u32 resume[3] __initdata = {
|
||||
0xe3a00101, /* mov r0, #0x40000000 */
|
||||
0xe380060f, /* orr r0, r0, #0x00f00000 */
|
||||
0xe590f008, /* ldr pc, [r0, #0x08] */
|
||||
};
|
||||
|
||||
static int __init palmt5_pm_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* this is where the bootloader jumps */
|
||||
addr = phys_to_virt(PALMT5_STR_BASE);
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
addr[i] = resume[i];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(palmt5_pm_init);
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
|
466
arch/arm/mach-pxa/palmte2.c
Normal file
466
arch/arm/mach-pxa/palmte2.c
Normal file
@ -0,0 +1,466 @@
|
||||
/*
|
||||
* Hardware definitions for Palm Tungsten|E2
|
||||
*
|
||||
* Author:
|
||||
* Carlos Eduardo Medaglia Dyonisio <cadu@nerdfeliz.com>
|
||||
*
|
||||
* Rewrite for mainline:
|
||||
* Marek Vasut <marek.vasut@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* (find more info at www.hackndev.com)
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/power_supply.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/audio.h>
|
||||
#include <mach/palmte2.h>
|
||||
#include <mach/mmc.h>
|
||||
#include <mach/pxafb.h>
|
||||
#include <mach/mfp-pxa25x.h>
|
||||
#include <mach/irda.h>
|
||||
#include <mach/udc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
||||
/******************************************************************************
|
||||
* Pin configuration
|
||||
******************************************************************************/
|
||||
static unsigned long palmte2_pin_config[] __initdata = {
|
||||
/* MMC */
|
||||
GPIO6_MMC_CLK,
|
||||
GPIO8_MMC_CS0,
|
||||
GPIO10_GPIO, /* SD detect */
|
||||
GPIO55_GPIO, /* SD power */
|
||||
GPIO51_GPIO, /* SD r/o switch */
|
||||
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
|
||||
/* PWM */
|
||||
GPIO16_PWM0_OUT,
|
||||
|
||||
/* USB */
|
||||
GPIO15_GPIO, /* usb detect */
|
||||
GPIO53_GPIO, /* usb power */
|
||||
|
||||
/* IrDA */
|
||||
GPIO48_GPIO, /* ir disable */
|
||||
GPIO46_FICP_RXD,
|
||||
GPIO47_FICP_TXD,
|
||||
|
||||
/* LCD */
|
||||
GPIO58_LCD_LDD_0,
|
||||
GPIO59_LCD_LDD_1,
|
||||
GPIO60_LCD_LDD_2,
|
||||
GPIO61_LCD_LDD_3,
|
||||
GPIO62_LCD_LDD_4,
|
||||
GPIO63_LCD_LDD_5,
|
||||
GPIO64_LCD_LDD_6,
|
||||
GPIO65_LCD_LDD_7,
|
||||
GPIO66_LCD_LDD_8,
|
||||
GPIO67_LCD_LDD_9,
|
||||
GPIO68_LCD_LDD_10,
|
||||
GPIO69_LCD_LDD_11,
|
||||
GPIO70_LCD_LDD_12,
|
||||
GPIO71_LCD_LDD_13,
|
||||
GPIO72_LCD_LDD_14,
|
||||
GPIO73_LCD_LDD_15,
|
||||
GPIO74_LCD_FCLK,
|
||||
GPIO75_LCD_LCLK,
|
||||
GPIO76_LCD_PCLK,
|
||||
GPIO77_LCD_BIAS,
|
||||
|
||||
/* GPIO KEYS */
|
||||
GPIO5_GPIO, /* notes */
|
||||
GPIO7_GPIO, /* tasks */
|
||||
GPIO11_GPIO, /* calendar */
|
||||
GPIO13_GPIO, /* contacts */
|
||||
GPIO14_GPIO, /* center */
|
||||
GPIO19_GPIO, /* left */
|
||||
GPIO20_GPIO, /* right */
|
||||
GPIO21_GPIO, /* down */
|
||||
GPIO22_GPIO, /* up */
|
||||
|
||||
/* MISC */
|
||||
GPIO1_RST, /* reset */
|
||||
GPIO4_GPIO, /* Hotsync button */
|
||||
GPIO9_GPIO, /* power detect */
|
||||
GPIO37_GPIO, /* LCD power */
|
||||
GPIO56_GPIO, /* Backlight power */
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
static int palmte2_mci_init(struct device *dev,
|
||||
irq_handler_t palmte2_detect_int, void *data)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
/* Setup an interrupt for detecting card insert/remove events */
|
||||
err = gpio_request(GPIO_NR_PALMTE2_SD_DETECT_N, "SD IRQ");
|
||||
if (err)
|
||||
goto err;
|
||||
err = gpio_direction_input(GPIO_NR_PALMTE2_SD_DETECT_N);
|
||||
if (err)
|
||||
goto err2;
|
||||
err = request_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N),
|
||||
palmte2_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
|
||||
IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
|
||||
"SD/MMC card detect", data);
|
||||
if (err) {
|
||||
printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n",
|
||||
__func__);
|
||||
goto err2;
|
||||
}
|
||||
|
||||
err = gpio_request(GPIO_NR_PALMTE2_SD_POWER, "SD_POWER");
|
||||
if (err)
|
||||
goto err3;
|
||||
err = gpio_direction_output(GPIO_NR_PALMTE2_SD_POWER, 0);
|
||||
if (err)
|
||||
goto err4;
|
||||
|
||||
err = gpio_request(GPIO_NR_PALMTE2_SD_READONLY, "SD_READONLY");
|
||||
if (err)
|
||||
goto err4;
|
||||
err = gpio_direction_input(GPIO_NR_PALMTE2_SD_READONLY);
|
||||
if (err)
|
||||
goto err5;
|
||||
|
||||
printk(KERN_DEBUG "%s: irq registered\n", __func__);
|
||||
|
||||
return 0;
|
||||
|
||||
err5:
|
||||
gpio_free(GPIO_NR_PALMTE2_SD_READONLY);
|
||||
err4:
|
||||
gpio_free(GPIO_NR_PALMTE2_SD_POWER);
|
||||
err3:
|
||||
free_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), data);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMTE2_SD_DETECT_N);
|
||||
err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void palmte2_mci_exit(struct device *dev, void *data)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMTE2_SD_READONLY);
|
||||
gpio_free(GPIO_NR_PALMTE2_SD_POWER);
|
||||
free_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), data);
|
||||
gpio_free(GPIO_NR_PALMTE2_SD_DETECT_N);
|
||||
}
|
||||
|
||||
static void palmte2_mci_power(struct device *dev, unsigned int vdd)
|
||||
{
|
||||
struct pxamci_platform_data *p_d = dev->platform_data;
|
||||
gpio_set_value(GPIO_NR_PALMTE2_SD_POWER, p_d->ocr_mask & (1 << vdd));
|
||||
}
|
||||
|
||||
static int palmte2_mci_get_ro(struct device *dev)
|
||||
{
|
||||
return gpio_get_value(GPIO_NR_PALMTE2_SD_READONLY);
|
||||
}
|
||||
|
||||
static struct pxamci_platform_data palmte2_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.setpower = palmte2_mci_power,
|
||||
.get_ro = palmte2_mci_get_ro,
|
||||
.init = palmte2_mci_init,
|
||||
.exit = palmte2_mci_exit,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keys
|
||||
******************************************************************************/
|
||||
static struct gpio_keys_button palmte2_pxa_buttons[] = {
|
||||
{KEY_F1, GPIO_NR_PALMTE2_KEY_CONTACTS, 1, "Contacts" },
|
||||
{KEY_F2, GPIO_NR_PALMTE2_KEY_CALENDAR, 1, "Calendar" },
|
||||
{KEY_F3, GPIO_NR_PALMTE2_KEY_TASKS, 1, "Tasks" },
|
||||
{KEY_F4, GPIO_NR_PALMTE2_KEY_NOTES, 1, "Notes" },
|
||||
{KEY_ENTER, GPIO_NR_PALMTE2_KEY_CENTER, 1, "Center" },
|
||||
{KEY_LEFT, GPIO_NR_PALMTE2_KEY_LEFT, 1, "Left" },
|
||||
{KEY_RIGHT, GPIO_NR_PALMTE2_KEY_RIGHT, 1, "Right" },
|
||||
{KEY_DOWN, GPIO_NR_PALMTE2_KEY_DOWN, 1, "Down" },
|
||||
{KEY_UP, GPIO_NR_PALMTE2_KEY_UP, 1, "Up" },
|
||||
};
|
||||
|
||||
static struct gpio_keys_platform_data palmte2_pxa_keys_data = {
|
||||
.buttons = palmte2_pxa_buttons,
|
||||
.nbuttons = ARRAY_SIZE(palmte2_pxa_buttons),
|
||||
};
|
||||
|
||||
static struct platform_device palmte2_pxa_keys = {
|
||||
.name = "gpio-keys",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palmte2_pxa_keys_data,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
static int palmte2_backlight_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMTE2_BL_POWER, "BL POWER");
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMTE2_BL_POWER, 0);
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_request(GPIO_NR_PALMTE2_LCD_POWER, "LCD POWER");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMTE2_LCD_POWER, 0);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(GPIO_NR_PALMTE2_LCD_POWER);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMTE2_BL_POWER);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int palmte2_backlight_notify(int brightness)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_PALMTE2_BL_POWER, brightness);
|
||||
gpio_set_value(GPIO_NR_PALMTE2_LCD_POWER, brightness);
|
||||
return brightness;
|
||||
}
|
||||
|
||||
static void palmte2_backlight_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMTE2_BL_POWER);
|
||||
gpio_free(GPIO_NR_PALMTE2_LCD_POWER);
|
||||
}
|
||||
|
||||
static struct platform_pwm_backlight_data palmte2_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = PALMTE2_MAX_INTENSITY,
|
||||
.dft_brightness = PALMTE2_MAX_INTENSITY,
|
||||
.pwm_period_ns = PALMTE2_PERIOD_NS,
|
||||
.init = palmte2_backlight_init,
|
||||
.notify = palmte2_backlight_notify,
|
||||
.exit = palmte2_backlight_exit,
|
||||
};
|
||||
|
||||
static struct platform_device palmte2_backlight = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.parent = &pxa25x_device_pwm0.dev,
|
||||
.platform_data = &palmte2_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* IrDA
|
||||
******************************************************************************/
|
||||
static int palmte2_irda_startup(struct device *dev)
|
||||
{
|
||||
int err;
|
||||
err = gpio_request(GPIO_NR_PALMTE2_IR_DISABLE, "IR DISABLE");
|
||||
if (err)
|
||||
goto err;
|
||||
err = gpio_direction_output(GPIO_NR_PALMTE2_IR_DISABLE, 1);
|
||||
if (err)
|
||||
gpio_free(GPIO_NR_PALMTE2_IR_DISABLE);
|
||||
err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void palmte2_irda_shutdown(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMTE2_IR_DISABLE);
|
||||
}
|
||||
|
||||
static void palmte2_irda_transceiver_mode(struct device *dev, int mode)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_PALMTE2_IR_DISABLE, mode & IR_OFF);
|
||||
pxa2xx_transceiver_mode(dev, mode);
|
||||
}
|
||||
|
||||
static struct pxaficp_platform_data palmte2_ficp_platform_data = {
|
||||
.startup = palmte2_irda_startup,
|
||||
.shutdown = palmte2_irda_shutdown,
|
||||
.transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
|
||||
.transceiver_mode = palmte2_irda_transceiver_mode,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* UDC
|
||||
******************************************************************************/
|
||||
static struct pxa2xx_udc_mach_info palmte2_udc_info __initdata = {
|
||||
.gpio_vbus = GPIO_NR_PALMTE2_USB_DETECT_N,
|
||||
.gpio_vbus_inverted = 1,
|
||||
.gpio_pullup = GPIO_NR_PALMTE2_USB_PULLUP,
|
||||
.gpio_pullup_inverted = 0,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power supply
|
||||
******************************************************************************/
|
||||
static int power_supply_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMTE2_POWER_DETECT, "CABLE_STATE_AC");
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = gpio_direction_input(GPIO_NR_PALMTE2_POWER_DETECT);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMTE2_POWER_DETECT);
|
||||
err1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int palmte2_is_ac_online(void)
|
||||
{
|
||||
return gpio_get_value(GPIO_NR_PALMTE2_POWER_DETECT);
|
||||
}
|
||||
|
||||
static void power_supply_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMTE2_POWER_DETECT);
|
||||
}
|
||||
|
||||
static char *palmte2_supplicants[] = {
|
||||
"main-battery",
|
||||
};
|
||||
|
||||
static struct pda_power_pdata power_supply_info = {
|
||||
.init = power_supply_init,
|
||||
.is_ac_online = palmte2_is_ac_online,
|
||||
.exit = power_supply_exit,
|
||||
.supplied_to = palmte2_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(palmte2_supplicants),
|
||||
};
|
||||
|
||||
static struct platform_device power_supply = {
|
||||
.name = "pda-power",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &power_supply_info,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* WM97xx battery
|
||||
******************************************************************************/
|
||||
static struct wm97xx_batt_info wm97xx_batt_pdata = {
|
||||
.batt_aux = WM97XX_AUX_ID3,
|
||||
.temp_aux = WM97XX_AUX_ID2,
|
||||
.charge_gpio = -1,
|
||||
.max_voltage = PALMTE2_BAT_MAX_VOLTAGE,
|
||||
.min_voltage = PALMTE2_BAT_MIN_VOLTAGE,
|
||||
.batt_mult = 1000,
|
||||
.batt_div = 414,
|
||||
.temp_mult = 1,
|
||||
.temp_div = 1,
|
||||
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO,
|
||||
.batt_name = "main-batt",
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
static struct pxafb_mode_info palmte2_lcd_modes[] = {
|
||||
{
|
||||
.pixclock = 77757,
|
||||
.xres = 320,
|
||||
.yres = 320,
|
||||
.bpp = 16,
|
||||
|
||||
.left_margin = 28,
|
||||
.right_margin = 7,
|
||||
.upper_margin = 7,
|
||||
.lower_margin = 5,
|
||||
|
||||
.hsync_len = 4,
|
||||
.vsync_len = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info palmte2_lcd_screen = {
|
||||
.modes = palmte2_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(palmte2_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
&palmte2_pxa_keys,
|
||||
#endif
|
||||
&palmte2_backlight,
|
||||
&power_supply,
|
||||
};
|
||||
|
||||
/* setup udc GPIOs initial state */
|
||||
static void __init palmte2_udc_init(void)
|
||||
{
|
||||
if (!gpio_request(GPIO_NR_PALMTE2_USB_PULLUP, "UDC Vbus")) {
|
||||
gpio_direction_output(GPIO_NR_PALMTE2_USB_PULLUP, 1);
|
||||
gpio_free(GPIO_NR_PALMTE2_USB_PULLUP);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init palmte2_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config));
|
||||
|
||||
set_pxa_fb_info(&palmte2_lcd_screen);
|
||||
pxa_set_mci_info(&palmte2_mci_platform_data);
|
||||
palmte2_udc_init();
|
||||
pxa_set_udc_info(&palmte2_udc_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ficp_info(&palmte2_ficp_platform_data);
|
||||
wm97xx_bat_set_pdata(&wm97xx_batt_pdata);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
MACHINE_START(PALMTE2, "Palm Tungsten|E2")
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.timer = &pxa_timer,
|
||||
.init_machine = palmte2_init
|
||||
MACHINE_END
|
@ -93,10 +93,10 @@ static unsigned long palmtx_pin_config[] __initdata = {
|
||||
GPIO116_GPIO, /* wifi ready */
|
||||
|
||||
/* MATRIX KEYPAD */
|
||||
GPIO100_KP_MKIN_0,
|
||||
GPIO101_KP_MKIN_1,
|
||||
GPIO102_KP_MKIN_2,
|
||||
GPIO97_KP_MKIN_3,
|
||||
GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
|
||||
GPIO103_KP_MKOUT_0,
|
||||
GPIO104_KP_MKOUT_1,
|
||||
GPIO105_KP_MKOUT_2,
|
||||
@ -458,6 +458,33 @@ static struct pxafb_mach_info palmtx_lcd_screen = {
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power management - standby
|
||||
******************************************************************************/
|
||||
#ifdef CONFIG_PM
|
||||
static u32 *addr __initdata;
|
||||
static u32 resume[3] __initdata = {
|
||||
0xe3a00101, /* mov r0, #0x40000000 */
|
||||
0xe380060f, /* orr r0, r0, #0x00f00000 */
|
||||
0xe590f008, /* ldr pc, [r0, #0x08] */
|
||||
};
|
||||
|
||||
static int __init palmtx_pm_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* this is where the bootloader jumps */
|
||||
addr = phys_to_virt(PALMTX_STR_BASE);
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
addr[i] = resume[i];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(palmtx_pm_init);
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include <mach/udc.h>
|
||||
#include <mach/tosa_bt.h>
|
||||
#include <mach/pxa2xx_spi.h>
|
||||
#include <mach/audio.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <mach/tosa.h>
|
||||
@ -914,6 +915,7 @@ static void __init tosa_init(void)
|
||||
pxa_set_udc_info(&udc_info);
|
||||
pxa_set_ficp_info(&tosa_ficp_platform_data);
|
||||
pxa_set_i2c_info(NULL);
|
||||
pxa_set_ac97_info(NULL);
|
||||
platform_scoop_config = &tosa_pcmcia_config;
|
||||
|
||||
pxa2xx_set_spi_info(2, &pxa_ssp_master_info);
|
||||
|
@ -828,6 +828,17 @@ void __init reserve_node_zero(pg_data_t *pgdat)
|
||||
BOOTMEM_DEFAULT);
|
||||
}
|
||||
|
||||
if (machine_is_palmld() || machine_is_palmtx()) {
|
||||
reserve_bootmem_node(pgdat, 0xa0000000, 0x1000,
|
||||
BOOTMEM_EXCLUSIVE);
|
||||
reserve_bootmem_node(pgdat, 0xa0200000, 0x1000,
|
||||
BOOTMEM_EXCLUSIVE);
|
||||
}
|
||||
|
||||
if (machine_is_palmt5())
|
||||
reserve_bootmem_node(pgdat, 0xa0200000, 0x1000,
|
||||
BOOTMEM_EXCLUSIVE);
|
||||
|
||||
#ifdef CONFIG_SA1111
|
||||
/*
|
||||
* Because of the SA1111 DMA bug, we want to preserve our
|
||||
|
@ -280,7 +280,7 @@ static int ohci_hcd_at91_drv_probe(struct platform_device *pdev)
|
||||
* are always powered while this driver is active, and use
|
||||
* active-low power switches.
|
||||
*/
|
||||
for (i = 0; i < pdata->ports; i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) {
|
||||
if (pdata->vbus_pin[i] <= 0)
|
||||
continue;
|
||||
gpio_request(pdata->vbus_pin[i], "ohci_vbus");
|
||||
@ -298,7 +298,7 @@ static int ohci_hcd_at91_drv_remove(struct platform_device *pdev)
|
||||
int i;
|
||||
|
||||
if (pdata) {
|
||||
for (i = 0; i < pdata->ports; i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(pdata->vbus_pin); i++) {
|
||||
if (pdata->vbus_pin[i] <= 0)
|
||||
continue;
|
||||
gpio_direction_output(pdata->vbus_pin[i], 1);
|
||||
|
Loading…
Reference in New Issue
Block a user