Commit 89de3820 authored by Russell King's avatar Russell King Committed by Russell King
parents 3ef48fac 80748fb8
...@@ -636,7 +636,7 @@ P: Dirk Opfer ...@@ -636,7 +636,7 @@ P: Dirk Opfer
M: dirk@opfer-online.de M: dirk@opfer-online.de
S: Maintained S: Maintained
ARM/PALMTX,PALMT5,PALMLD SUPPORT ARM/PALMTX,PALMT5,PALMLD,PALMTE2 SUPPORT
P: Marek Vasut P: Marek Vasut
M: marek.vasut@gmail.com M: marek.vasut@gmail.com
W: http://hackndev.com W: http://hackndev.com
......
...@@ -1183,7 +1183,11 @@ CONFIG_RTC_INTF_DEV=y ...@@ -1183,7 +1183,11 @@ CONFIG_RTC_INTF_DEV=y
CONFIG_RTC_DRV_SA1100=y CONFIG_RTC_DRV_SA1100=y
# CONFIG_RTC_DRV_PXA is not set # CONFIG_RTC_DRV_PXA is not set
# CONFIG_DMADEVICES 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_UIO is not set
# CONFIG_STAGING is not set # CONFIG_STAGING is not set
......
...@@ -343,6 +343,15 @@ config ARCH_PXA_PALM ...@@ -343,6 +343,15 @@ config ARCH_PXA_PALM
bool "PXA based Palm PDAs" bool "PXA based Palm PDAs"
select HAVE_PWM 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 config MACH_PALMT5
bool "Palm Tungsten|T5" bool "Palm Tungsten|T5"
default y default y
......
...@@ -57,6 +57,7 @@ obj-$(CONFIG_MACH_E740) += e740.o ...@@ -57,6 +57,7 @@ obj-$(CONFIG_MACH_E740) += e740.o
obj-$(CONFIG_MACH_E750) += e750.o obj-$(CONFIG_MACH_E750) += e750.o
obj-$(CONFIG_MACH_E400) += e400.o obj-$(CONFIG_MACH_E400) += e400.o
obj-$(CONFIG_MACH_E800) += e800.o obj-$(CONFIG_MACH_E800) += e800.o
obj-$(CONFIG_MACH_PALMTE2) += palmte2.o
obj-$(CONFIG_MACH_PALMT5) += palmt5.o obj-$(CONFIG_MACH_PALMT5) += palmt5.o
obj-$(CONFIG_MACH_PALMTX) += palmtx.o obj-$(CONFIG_MACH_PALMTX) += palmtx.o
obj-$(CONFIG_MACH_PALMLD) += palmld.o obj-$(CONFIG_MACH_PALMLD) += palmld.o
......
...@@ -121,7 +121,7 @@ static inline void cmx2xx_init_dm9000(void) {} ...@@ -121,7 +121,7 @@ static inline void cmx2xx_init_dm9000(void) {}
/* UCB1400 touchscreen controller */ /* UCB1400 touchscreen controller */
#if defined(CONFIG_TOUCHSCREEN_UCB1400) || defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE) #if defined(CONFIG_TOUCHSCREEN_UCB1400) || defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
static struct platform_device cmx2xx_ts_device = { static struct platform_device cmx2xx_ts_device = {
.name = "ucb1400_ts", .name = "ucb1400_core",
.id = -1, .id = -1,
}; };
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <net/ax88796.h> #include <linux/interrupt.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/sizes.h> #include <asm/sizes.h>
...@@ -32,12 +32,13 @@ ...@@ -32,12 +32,13 @@
#if defined(CONFIG_AX88796) #if defined(CONFIG_AX88796)
#define COLIBRI_ETH_IRQ_GPIO mfp_to_gpio(GPIO26_GPIO) #define COLIBRI_ETH_IRQ_GPIO mfp_to_gpio(GPIO26_GPIO)
/* /*
* Asix AX88796 Ethernet * Asix AX88796 Ethernet
*/ */
static struct ax_plat_data colibri_asix_platdata = { static struct ax_plat_data colibri_asix_platdata = {
.flags = AXFLG_MAC_FROMDEV, .flags = 0, /* defined later */
.wordlength = 2 .wordlength = 2,
}; };
static struct resource colibri_asix_resource[] = { static struct resource colibri_asix_resource[] = {
...@@ -49,7 +50,7 @@ static struct resource colibri_asix_resource[] = { ...@@ -49,7 +50,7 @@ static struct resource colibri_asix_resource[] = {
[1] = { [1] = {
.start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), .start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO),
.end = 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 = { ...@@ -70,8 +71,8 @@ static mfp_cfg_t colibri_pxa300_eth_pin_config[] __initdata = {
static void __init colibri_pxa300_init_eth(void) 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)); 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); platform_device_register(&asix_device);
} }
#else #else
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <net/ax88796.h> #include <linux/interrupt.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/sizes.h> #include <asm/sizes.h>
...@@ -38,8 +38,8 @@ ...@@ -38,8 +38,8 @@
* Asix AX88796 Ethernet * Asix AX88796 Ethernet
*/ */
static struct ax_plat_data colibri_asix_platdata = { static struct ax_plat_data colibri_asix_platdata = {
.flags = AXFLG_MAC_FROMDEV, .flags = 0, /* defined later */
.wordlength = 2 .wordlength = 2,
}; };
static struct resource colibri_asix_resource[] = { static struct resource colibri_asix_resource[] = {
...@@ -51,7 +51,7 @@ static struct resource colibri_asix_resource[] = { ...@@ -51,7 +51,7 @@ static struct resource colibri_asix_resource[] = {
[1] = { [1] = {
.start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO), .start = gpio_to_irq(COLIBRI_ETH_IRQ_GPIO),
.end = 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 = { ...@@ -72,8 +72,8 @@ static mfp_cfg_t colibri_pxa320_eth_pin_config[] __initdata = {
static void __init colibri_pxa320_init_eth(void) 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)); 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); platform_device_register(&asix_device);
} }
#else #else
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/etherdevice.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/sizes.h> #include <asm/sizes.h>
...@@ -28,6 +29,40 @@ ...@@ -28,6 +29,40 @@
#include "generic.h" #include "generic.h"
#include "devices.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) #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
static int mmc_detect_pin; static int mmc_detect_pin;
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#include <linux/input.h> #include <linux/input.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <asm/mach-types.h>
static struct gpio_keys_button csb701_buttons[] = { static struct gpio_keys_button csb701_buttons[] = {
{ {
.code = 0x7, .code = 0x7,
...@@ -54,6 +56,9 @@ static struct platform_device *devices[] __initdata = { ...@@ -54,6 +56,9 @@ static struct platform_device *devices[] __initdata = {
static int __init csb701_init(void) static int __init csb701_init(void)
{ {
if (!machine_is_csb726())
return -ENODEV;
return platform_add_devices(devices, ARRAY_SIZE(devices)); return platform_add_devices(devices, ARRAY_SIZE(devices));
} }
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <mach/audio.h>
#include "generic.h" #include "generic.h"
#include "eseries.h" #include "eseries.h"
...@@ -197,6 +198,7 @@ static void __init e740_init(void) ...@@ -197,6 +198,7 @@ static void __init e740_init(void)
eseries_get_tmio_gpios(); eseries_get_tmio_gpios();
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
pxa_set_udc_info(&e7xx_udc_mach_info); pxa_set_udc_info(&e7xx_udc_mach_info);
pxa_set_ac97_info(NULL);
e7xx_irda_init(); e7xx_irda_init();
pxa_set_ficp_info(&e7xx_ficp_platform_data); pxa_set_ficp_info(&e7xx_ficp_platform_data);
} }
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <mach/audio.h>
#include "generic.h" #include "generic.h"
#include "eseries.h" #include "eseries.h"
...@@ -198,6 +199,7 @@ static void __init e750_init(void) ...@@ -198,6 +199,7 @@ static void __init e750_init(void)
eseries_get_tmio_gpios(); eseries_get_tmio_gpios();
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
pxa_set_udc_info(&e7xx_udc_mach_info); pxa_set_udc_info(&e7xx_udc_mach_info);
pxa_set_ac97_info(NULL);
e7xx_irda_init(); e7xx_irda_init();
pxa_set_ficp_info(&e7xx_ficp_platform_data); pxa_set_ficp_info(&e7xx_ficp_platform_data);
} }
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <mach/eseries-gpio.h> #include <mach/eseries-gpio.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/irqs.h> #include <mach/irqs.h>
#include <mach/audio.h>
#include "generic.h" #include "generic.h"
#include "eseries.h" #include "eseries.h"
...@@ -199,6 +200,7 @@ static void __init e800_init(void) ...@@ -199,6 +200,7 @@ static void __init e800_init(void)
eseries_get_tmio_gpios(); eseries_get_tmio_gpios();
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
pxa_set_udc_info(&e800_udc_mach_info); pxa_set_udc_info(&e800_udc_mach_info);
pxa_set_ac97_info(NULL);
} }
MACHINE_START(E800, "Toshiba e800") MACHINE_START(E800, "Toshiba e800")
......
...@@ -25,8 +25,10 @@ ...@@ -25,8 +25,10 @@
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/tdo24m.h> #include <linux/spi/tdo24m.h>
#include <linux/spi/libertas_spi.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/apm-emulation.h> #include <linux/apm-emulation.h>
#include <linux/delay.h>
#include <media/soc_camera.h> #include <media/soc_camera.h>
...@@ -62,6 +64,8 @@ ...@@ -62,6 +64,8 @@
#define GPIO93_CAM_RESET (93) #define GPIO93_CAM_RESET (93)
#define GPIO41_ETHIRQ (41) #define GPIO41_ETHIRQ (41)
#define EM_X270_ETHIRQ IRQ_GPIO(GPIO41_ETHIRQ) #define EM_X270_ETHIRQ IRQ_GPIO(GPIO41_ETHIRQ)
#define GPIO115_WLAN_PWEN (115)
#define GPIO19_WLAN_STRAP (19)
static int mmc_cd; static int mmc_cd;
static int nand_rb; static int nand_rb;
...@@ -159,8 +163,8 @@ static unsigned long common_pin_config[] = { ...@@ -159,8 +163,8 @@ static unsigned long common_pin_config[] = {
GPIO57_SSP1_TXD, GPIO57_SSP1_TXD,
/* SSP2 */ /* SSP2 */
GPIO19_SSP2_SCLK, GPIO19_GPIO, /* SSP2 clock is used as GPIO for Libertas pin-strap */
GPIO14_SSP2_SFRM, GPIO14_GPIO,
GPIO89_SSP2_TXD, GPIO89_SSP2_TXD,
GPIO88_SSP2_RXD, GPIO88_SSP2_RXD,
...@@ -648,20 +652,86 @@ static struct tdo24m_platform_data em_x270_tdo24m_pdata = { ...@@ -648,20 +652,86 @@ static struct tdo24m_platform_data em_x270_tdo24m_pdata = {
.model = TDO35S, .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 = { static struct spi_board_info em_x270_spi_devices[] __initdata = {
{ {
.modalias = "tdo24m", .modalias = "tdo24m",
.max_speed_hz = 1000000, .max_speed_hz = 1000000,
.bus_num = 1, .bus_num = 1,
.chip_select = 0, .chip_select = 0,
.controller_data = &em_x270_tdo24m_chip, .controller_data = &em_x270_tdo24m_chip,
.platform_data = &em_x270_tdo24m_pdata, .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) static void __init em_x270_init_spi(void)
{ {
pxa2xx_set_spi_info(1, &em_x270_spi_info); 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)); spi_register_board_info(ARRAY_AND_SIZE(em_x270_spi_devices));
} }
#else #else
......
#ifndef _COLIBRI_H_ #ifndef _COLIBRI_H_
#define _COLIBRI_H_ #define _COLIBRI_H_
#include <net/ax88796.h>
/* /*
* common settings for all modules * common settings for all modules
*/ */
...@@ -16,6 +19,10 @@ extern void colibri_pxa3xx_init_lcd(int bl_pin); ...@@ -16,6 +19,10 @@ extern void colibri_pxa3xx_init_lcd(int bl_pin);
static inline void colibri_pxa3xx_init_lcd(int) {} static inline void colibri_pxa3xx_init_lcd(int) {}
#endif #endif
#if defined(CONFIG_AX88796)
extern void colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data);
#endif
/* physical memory regions */ /* physical memory regions */
#define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */ #define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#define GPIO22_MAGICIAN_VIBRA_EN 22 #define GPIO22_MAGICIAN_VIBRA_EN 22
#define GPIO26_MAGICIAN_GSM_POWER 26 #define GPIO26_MAGICIAN_GSM_POWER 26
#define GPIO27_MAGICIAN_USBC_PUEN 27 #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 GPIO37_MAGICIAN_KEY_HANGUP 37
#define GPIO38_MAGICIAN_KEY_CONTACTS 38 #define GPIO38_MAGICIAN_KEY_CONTACTS 38
#define GPIO40_MAGICIAN_GSM_OUT2 40 #define GPIO40_MAGICIAN_GSM_OUT2 40
...@@ -98,7 +98,7 @@ ...@@ -98,7 +98,7 @@
#define EGPIO_MAGICIAN_UNKNOWN_WAVEDEV_DLL MAGICIAN_EGPIO(2, 2) #define EGPIO_MAGICIAN_UNKNOWN_WAVEDEV_DLL MAGICIAN_EGPIO(2, 2)
#define EGPIO_MAGICIAN_FLASH_VPP MAGICIAN_EGPIO(2, 3) #define EGPIO_MAGICIAN_FLASH_VPP MAGICIAN_EGPIO(2, 3)
#define EGPIO_MAGICIAN_BL_POWER2 MAGICIAN_EGPIO(2, 4) #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) #define EGPIO_MAGICIAN_GSM_POWER MAGICIAN_EGPIO(2, 7)
/* input */ /* input */
......
...@@ -87,6 +87,7 @@ ...@@ -87,6 +87,7 @@
#define PALMLD_IDE_SIZE 0x00100000 #define PALMLD_IDE_SIZE 0x00100000
#define PALMLD_PHYS_IO_START 0x40000000 #define PALMLD_PHYS_IO_START 0x40000000
#define PALMLD_STR_BASE 0xa0200000
/* BATTERY */ /* BATTERY */
#define PALMLD_BAT_MAX_VOLTAGE 4000 /* 4.00V maximum voltage */ #define PALMLD_BAT_MAX_VOLTAGE 4000 /* 4.00V maximum voltage */
......
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
/* Various addresses */ /* Various addresses */
#define PALMT5_PHYS_RAM_START 0xa0000000 #define PALMT5_PHYS_RAM_START 0xa0000000
#define PALMT5_PHYS_IO_START 0x40000000 #define PALMT5_PHYS_IO_START 0x40000000
#define PALMT5_STR_BASE 0xa0200000
/* TOUCHSCREEN */ /* TOUCHSCREEN */
#define AC97_LINK_FRAME 21 #define AC97_LINK_FRAME 21
......
/*
* 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 @@ ...@@ -78,6 +78,8 @@
#define PALMTX_PHYS_RAM_START 0xa0000000 #define PALMTX_PHYS_RAM_START 0xa0000000
#define PALMTX_PHYS_IO_START 0x40000000 #define PALMTX_PHYS_IO_START 0x40000000
#define PALMTX_STR_BASE 0xa0200000
#define PALMTX_PHYS_FLASH_START PXA_CS0_PHYS /* ChipSelect 0 */ #define PALMTX_PHYS_FLASH_START PXA_CS0_PHYS /* ChipSelect 0 */
#define PALMTX_PHYS_NAND_START PXA_CS1_PHYS /* ChipSelect 1 */ #define PALMTX_PHYS_NAND_START PXA_CS1_PHYS /* ChipSelect 1 */
......
...@@ -25,6 +25,8 @@ ...@@ -25,6 +25,8 @@
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/pda_power.h> #include <linux/pda_power.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/regulator/bq24022.h>
#include <linux/regulator/machine.h>
#include <linux/usb/gpio_vbus.h> #include <linux/usb/gpio_vbus.h>
#include <mach/hardware.h> #include <mach/hardware.h>
...@@ -552,33 +554,7 @@ static struct platform_device gpio_vbus = { ...@@ -552,33 +554,7 @@ static struct platform_device gpio_vbus = {
static int power_supply_init(struct device *dev) static int power_supply_init(struct device *dev)
{ {
int ret; return gpio_request(EGPIO_MAGICIAN_CABLE_STATE_AC, "CABLE_STATE_AC");
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;
} }
static int magician_is_ac_online(void) static int magician_is_ac_online(void)
...@@ -586,22 +562,8 @@ 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); 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) 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); gpio_free(EGPIO_MAGICIAN_CABLE_STATE_AC);
} }
...@@ -612,8 +574,6 @@ static char *magician_supplicants[] = { ...@@ -612,8 +574,6 @@ static char *magician_supplicants[] = {
static struct pda_power_pdata power_supply_info = { static struct pda_power_pdata power_supply_info = {
.init = power_supply_init, .init = power_supply_init,
.is_ac_online = magician_is_ac_online, .is_ac_online = magician_is_ac_online,
.is_usb_online = magician_is_usb_online,
.set_charge = magician_set_charge,
.exit = power_supply_exit, .exit = power_supply_exit,
.supplied_to = magician_supplicants, .supplied_to = magician_supplicants,
.num_supplicants = ARRAY_SIZE(magician_supplicants), .num_supplicants = ARRAY_SIZE(magician_supplicants),
...@@ -646,6 +606,43 @@ static struct platform_device power_supply = { ...@@ -646,6 +606,43 @@ static struct platform_device power_supply = {
.num_resources = ARRAY_SIZE(power_supply_resources), .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 * MMC/SD
...@@ -756,6 +753,7 @@ static struct platform_device *devices[] __initdata = { ...@@ -756,6 +753,7 @@ static struct platform_device *devices[] __initdata = {
&egpio, &egpio,
&backlight, &backlight,
&pasic3, &pasic3,
&bq24022,
&gpio_vbus, &gpio_vbus,
&power_supply, &power_supply,
&strataflash, &strataflash,
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <mach/pxa27x-udc.h> #include <mach/pxa27x-udc.h>
#include <mach/i2c.h> #include <mach/i2c.h>
#include <mach/camera.h> #include <mach/camera.h>
#include <mach/audio.h>
#include <media/soc_camera.h> #include <media/soc_camera.h>
#include <mach/mioa701.h> #include <mach/mioa701.h>
...@@ -763,8 +764,6 @@ MIO_PARENT_DEV(mioa701_backlight, "pwm-backlight", &pxa27x_device_pwm0.dev, ...@@ -763,8 +764,6 @@ MIO_PARENT_DEV(mioa701_backlight, "pwm-backlight", &pxa27x_device_pwm0.dev,
&mioa701_backlight_data); &mioa701_backlight_data);
MIO_SIMPLE_DEV(mioa701_led, "leds-gpio", &gpio_led_info) MIO_SIMPLE_DEV(mioa701_led, "leds-gpio", &gpio_led_info)
MIO_SIMPLE_DEV(pxa2xx_pcm, "pxa2xx-pcm", NULL) 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_sound, "mioa701-wm9713", NULL)
MIO_SIMPLE_DEV(mioa701_board, "mioa701-board", NULL) MIO_SIMPLE_DEV(mioa701_board, "mioa701-board", NULL)
MIO_SIMPLE_DEV(gpio_vbus, "gpio-vbus", &gpio_vbus_data); MIO_SIMPLE_DEV(gpio_vbus, "gpio-vbus", &gpio_vbus_data);
...@@ -774,8 +773,6 @@ static struct platform_device *devices[] __initdata = { ...@@ -774,8 +773,6 @@ static struct platform_device *devices[] __initdata = {
&mioa701_backlight, &mioa701_backlight,
&mioa701_led, &mioa701_led,
&pxa2xx_pcm, &pxa2xx_pcm,
&pxa2xx_ac97,
&mio_wm9713_codec,
&mioa701_sound, &mioa701_sound,
&power_dev, &power_dev,
&strataflash, &strataflash,
...@@ -818,6 +815,7 @@ static void __init mioa701_machine_init(void) ...@@ -818,6 +815,7 @@ static void __init mioa701_machine_init(void)
pxa_set_keypad_info(&mioa701_keypad_info); pxa_set_keypad_info(&mioa701_keypad_info);
wm97xx_bat_set_pdata(&mioa701_battery_data); wm97xx_bat_set_pdata(&mioa701_battery_data);
pxa_set_udc_info(&mioa701_udc_info); pxa_set_udc_info(&mioa701_udc_info);
pxa_set_ac97_info(NULL);
pm_power_off = mioa701_poweroff; pm_power_off = mioa701_poweroff;
arm_pm_restart = mioa701_restart; arm_pm_restart = mioa701_restart;
platform_add_devices(devices, ARRAY_SIZE(devices)); platform_add_devices(devices, ARRAY_SIZE(devices));
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/wm97xx_batt.h> #include <linux/wm97xx_batt.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/sysdev.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -68,10 +69,10 @@ static unsigned long palmld_pin_config[] __initdata = { ...@@ -68,10 +69,10 @@ static unsigned long palmld_pin_config[] __initdata = {
GPIO47_FICP_TXD, GPIO47_FICP_TXD,
/* MATRIX KEYPAD */ /* MATRIX KEYPAD */
GPIO100_KP_MKIN_0, GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
GPIO101_KP_MKIN_1, GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
GPIO102_KP_MKIN_2, GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
GPIO97_KP_MKIN_3, GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
GPIO103_KP_MKOUT_0, GPIO103_KP_MKOUT_0,
GPIO104_KP_MKOUT_1, GPIO104_KP_MKOUT_1,
GPIO105_KP_MKOUT_2, GPIO105_KP_MKOUT_2,
...@@ -506,6 +507,33 @@ static struct pxafb_mach_info palmld_lcd_screen = { ...@@ -506,6 +507,33 @@ static struct pxafb_mach_info palmld_lcd_screen = {
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, .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 * Machine init
******************************************************************************/ ******************************************************************************/
......
...@@ -75,10 +75,10 @@ static unsigned long palmt5_pin_config[] __initdata = { ...@@ -75,10 +75,10 @@ static unsigned long palmt5_pin_config[] __initdata = {
GPIO95_GPIO, /* usb power */ GPIO95_GPIO, /* usb power */
/* MATRIX KEYPAD */ /* MATRIX KEYPAD */
GPIO100_KP_MKIN_0, GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
GPIO101_KP_MKIN_1, GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
GPIO102_KP_MKIN_2, GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
GPIO97_KP_MKIN_3, GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
GPIO103_KP_MKOUT_0, GPIO103_KP_MKOUT_0,
GPIO104_KP_MKOUT_1, GPIO104_KP_MKOUT_1,
GPIO105_KP_MKOUT_2, GPIO105_KP_MKOUT_2,
...@@ -449,6 +449,33 @@ static struct pxafb_mach_info palmt5_lcd_screen = { ...@@ -449,6 +449,33 @@ static struct pxafb_mach_info palmt5_lcd_screen = {
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, .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 * Machine init
******************************************************************************/ ******************************************************************************/
......
This diff is collapsed.
...@@ -93,10 +93,10 @@ static unsigned long palmtx_pin_config[] __initdata = { ...@@ -93,10 +93,10 @@ static unsigned long palmtx_pin_config[] __initdata = {
GPIO116_GPIO, /* wifi ready */ GPIO116_GPIO, /* wifi ready */
/* MATRIX KEYPAD */ /* MATRIX KEYPAD */
GPIO100_KP_MKIN_0, GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
GPIO101_KP_MKIN_1, GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
GPIO102_KP_MKIN_2, GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
GPIO97_KP_MKIN_3, GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
GPIO103_KP_MKOUT_0, GPIO103_KP_MKOUT_0,
GPIO104_KP_MKOUT_1, GPIO104_KP_MKOUT_1,
GPIO105_KP_MKOUT_2, GPIO105_KP_MKOUT_2,
...@@ -458,6 +458,33 @@ static struct pxafb_mach_info palmtx_lcd_screen = { ...@@ -458,6 +458,33 @@ static struct pxafb_mach_info palmtx_lcd_screen = {
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, .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 * Machine init
******************************************************************************/ ******************************************************************************/
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/tosa_bt.h> #include <mach/tosa_bt.h>
#include <mach/pxa2xx_spi.h> #include <mach/pxa2xx_spi.h>
#include <mach/audio.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <mach/tosa.h> #include <mach/tosa.h>
...@@ -914,6 +915,7 @@ static void __init tosa_init(void) ...@@ -914,6 +915,7 @@ static void __init tosa_init(void)
pxa_set_udc_info(&udc_info); pxa_set_udc_info(&udc_info);
pxa_set_ficp_info(&tosa_ficp_platform_data); pxa_set_ficp_info(&tosa_ficp_platform_data);
pxa_set_i2c_info(NULL); pxa_set_i2c_info(NULL);
pxa_set_ac97_info(NULL);
platform_scoop_config = &tosa_pcmcia_config; platform_scoop_config = &tosa_pcmcia_config;
pxa2xx_set_spi_info(2, &pxa_ssp_master_info); pxa2xx_set_spi_info(2, &pxa_ssp_master_info);
......
...@@ -828,6 +828,17 @@ void __init reserve_node_zero(pg_data_t *pgdat) ...@@ -828,6 +828,17 @@ void __init reserve_node_zero(pg_data_t *pgdat)
BOOTMEM_DEFAULT); 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 #ifdef CONFIG_SA1111
/* /*
* Because of the SA1111 DMA bug, we want to preserve our * Because of the SA1111 DMA bug, we want to preserve our
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment