Merge branch 'devel' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into devel-stable
Conflicts: arch/arm/mach-pxa/palmt5.c arch/arm/mach-pxa/palmtreo.c
This commit is contained in:
commit
f165eb77f4
|
@ -693,6 +693,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/kristoffer/linux-hpc.git
|
|||
F: arch/arm/mach-sa1100/jornada720.c
|
||||
F: arch/arm/mach-sa1100/include/mach/jornada720.h
|
||||
|
||||
ARM/INCOME PXA270 SUPPORT
|
||||
M: Marek Vasut <marek.vasut@gmail.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: arch/arm/mach-pxa/income.c
|
||||
F: arch/arm/mach-pxa/include/mach-pxa/income.h
|
||||
|
||||
ARM/INTEL IOP32X ARM ARCHITECTURE
|
||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
M: Dan Williams <dan.j.williams@intel.com>
|
||||
|
|
|
@ -33,7 +33,7 @@ ifeq ($(CONFIG_CPU_XSCALE),y)
|
|||
OBJS += head-xscale.o
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PXA_SHARPSL),y)
|
||||
ifeq ($(CONFIG_PXA_SHARPSL_DETECT_MACH_ID),y)
|
||||
OBJS += head-sharpsl.o
|
||||
endif
|
||||
|
||||
|
|
|
@ -263,14 +263,6 @@ static int it8152_pci_platform_notify_remove(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int dma_needs_bounce(struct device *dev, dma_addr_t dma_addr, size_t size)
|
||||
{
|
||||
dev_dbg(dev, "%s: dma_addr %08x, size %08x\n",
|
||||
__func__, dma_addr, size);
|
||||
return (dev->bus == &pci_bus_type) &&
|
||||
((dma_addr + size - PHYS_OFFSET) >= SZ_64M);
|
||||
}
|
||||
|
||||
int __init it8152_pci_setup(int nr, struct pci_sys_data *sys)
|
||||
{
|
||||
it8152_io.start = IT8152_IO_BASE + 0x12000;
|
||||
|
|
|
@ -298,7 +298,15 @@ extern void dmabounce_unregister_dev(struct device *);
|
|||
* DMA access and 1 if the buffer needs to be bounced.
|
||||
*
|
||||
*/
|
||||
#ifdef CONFIG_SA1111
|
||||
extern int dma_needs_bounce(struct device*, dma_addr_t, size_t);
|
||||
#else
|
||||
static inline int dma_needs_bounce(struct device *dev, dma_addr_t addr,
|
||||
size_t size)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The DMA API, implemented by dmabounce.c. See below for descriptions.
|
||||
|
|
|
@ -22,18 +22,23 @@
|
|||
#define SCOOP_GPWR 0x24
|
||||
#define SCOOP_GPRR 0x28
|
||||
|
||||
#define SCOOP_GPCR_PA22 ( 1 << 12 )
|
||||
#define SCOOP_GPCR_PA21 ( 1 << 11 )
|
||||
#define SCOOP_GPCR_PA20 ( 1 << 10 )
|
||||
#define SCOOP_GPCR_PA19 ( 1 << 9 )
|
||||
#define SCOOP_GPCR_PA18 ( 1 << 8 )
|
||||
#define SCOOP_GPCR_PA17 ( 1 << 7 )
|
||||
#define SCOOP_GPCR_PA16 ( 1 << 6 )
|
||||
#define SCOOP_GPCR_PA15 ( 1 << 5 )
|
||||
#define SCOOP_GPCR_PA14 ( 1 << 4 )
|
||||
#define SCOOP_GPCR_PA13 ( 1 << 3 )
|
||||
#define SCOOP_GPCR_PA12 ( 1 << 2 )
|
||||
#define SCOOP_GPCR_PA11 ( 1 << 1 )
|
||||
#define SCOOP_CPR_OUT (1 << 7)
|
||||
#define SCOOP_CPR_SD_3V (1 << 2)
|
||||
#define SCOOP_CPR_CF_XV (1 << 1)
|
||||
#define SCOOP_CPR_CF_3V (1 << 0)
|
||||
|
||||
#define SCOOP_GPCR_PA22 (1 << 12)
|
||||
#define SCOOP_GPCR_PA21 (1 << 11)
|
||||
#define SCOOP_GPCR_PA20 (1 << 10)
|
||||
#define SCOOP_GPCR_PA19 (1 << 9)
|
||||
#define SCOOP_GPCR_PA18 (1 << 8)
|
||||
#define SCOOP_GPCR_PA17 (1 << 7)
|
||||
#define SCOOP_GPCR_PA16 (1 << 6)
|
||||
#define SCOOP_GPCR_PA15 (1 << 5)
|
||||
#define SCOOP_GPCR_PA14 (1 << 4)
|
||||
#define SCOOP_GPCR_PA13 (1 << 3)
|
||||
#define SCOOP_GPCR_PA12 (1 << 2)
|
||||
#define SCOOP_GPCR_PA11 (1 << 1)
|
||||
|
||||
struct scoop_config {
|
||||
unsigned short io_out;
|
||||
|
|
|
@ -150,9 +150,8 @@ static void __init common_init(void)
|
|||
|
||||
MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform")
|
||||
.phys_io = APB_PHYS_BASE,
|
||||
.boot_params = 0x00000100,
|
||||
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
|
||||
.map_io = pxa_map_io,
|
||||
.map_io = mmp_map_io,
|
||||
.init_irq = pxa168_init_irq,
|
||||
.timer = &pxa168_timer,
|
||||
.init_machine = common_init,
|
||||
|
@ -160,9 +159,8 @@ MACHINE_END
|
|||
|
||||
MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform")
|
||||
.phys_io = APB_PHYS_BASE,
|
||||
.boot_params = 0x00000100,
|
||||
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
|
||||
.map_io = pxa_map_io,
|
||||
.map_io = mmp_map_io,
|
||||
.init_irq = pxa168_init_irq,
|
||||
.timer = &pxa168_timer,
|
||||
.init_machine = common_init,
|
||||
|
|
|
@ -42,9 +42,8 @@ static void __init avengers_lite_init(void)
|
|||
|
||||
MACHINE_START(AVENGERS_LITE, "PXA168 Avengers lite Development Platform")
|
||||
.phys_io = APB_PHYS_BASE,
|
||||
.boot_params = 0x00000100,
|
||||
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
|
||||
.map_io = pxa_map_io,
|
||||
.map_io = mmp_map_io,
|
||||
.init_irq = pxa168_init_irq,
|
||||
.timer = &pxa168_timer,
|
||||
.init_machine = avengers_lite_init,
|
||||
|
|
|
@ -31,7 +31,7 @@ static struct map_desc standard_io_desc[] __initdata = {
|
|||
},
|
||||
};
|
||||
|
||||
void __init pxa_map_io(void)
|
||||
void __init mmp_map_io(void)
|
||||
{
|
||||
iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc));
|
||||
}
|
||||
|
|
|
@ -3,15 +3,6 @@
|
|||
struct sys_timer;
|
||||
|
||||
extern void timer_init(int irq);
|
||||
extern void mmp2_clear_pmic_int(void);
|
||||
|
||||
extern struct sys_timer pxa168_timer;
|
||||
extern struct sys_timer pxa910_timer;
|
||||
extern struct sys_timer mmp2_timer;
|
||||
extern void __init pxa168_init_irq(void);
|
||||
extern void __init pxa910_init_irq(void);
|
||||
extern void __init mmp2_init_icu(void);
|
||||
extern void __init mmp2_init_irq(void);
|
||||
|
||||
extern void __init icu_init_irq(void);
|
||||
extern void __init pxa_map_io(void);
|
||||
extern void __init mmp_map_io(void);
|
||||
|
|
|
@ -114,9 +114,8 @@ static void __init flint_init(void)
|
|||
|
||||
MACHINE_START(FLINT, "Flint Development Platform")
|
||||
.phys_io = APB_PHYS_BASE,
|
||||
.boot_params = 0x00000100,
|
||||
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
|
||||
.map_io = pxa_map_io,
|
||||
.map_io = mmp_map_io,
|
||||
.init_irq = mmp2_init_irq,
|
||||
.timer = &mmp2_timer,
|
||||
.init_machine = flint_init,
|
||||
|
|
|
@ -1,3 +1,6 @@
|
|||
#ifndef __MACH_DEVICE_H
|
||||
#define __MACH_DEVICE_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define MAX_RESOURCE_DMA 2
|
||||
|
@ -47,3 +50,4 @@ struct pxa_device_desc mmp2_device_##_name __initdata = { \
|
|||
}
|
||||
|
||||
extern int pxa_register_device(struct pxa_device_desc *, void *, size_t);
|
||||
#endif /* __MACH_DEVICE_H */
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
#ifndef __ASM_MACH_MMP2_H
|
||||
#define __ASM_MACH_MMP2_H
|
||||
|
||||
struct sys_timer;
|
||||
|
||||
extern struct sys_timer mmp2_timer;
|
||||
extern void __init mmp2_init_icu(void);
|
||||
extern void __init mmp2_init_irq(void);
|
||||
extern void mmp2_clear_pmic_int(void);
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <mach/devices.h>
|
||||
#include <plat/i2c.h>
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
#ifndef __ASM_MACH_PXA168_H
|
||||
#define __ASM_MACH_PXA168_H
|
||||
|
||||
struct sys_timer;
|
||||
|
||||
extern struct sys_timer pxa168_timer;
|
||||
extern void __init pxa168_init_irq(void);
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <mach/devices.h>
|
||||
#include <plat/i2c.h>
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
#ifndef __ASM_MACH_PXA910_H
|
||||
#define __ASM_MACH_PXA910_H
|
||||
|
||||
struct sys_timer;
|
||||
|
||||
extern struct sys_timer pxa910_timer;
|
||||
extern void __init pxa910_init_irq(void);
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <mach/devices.h>
|
||||
#include <plat/i2c.h>
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/io.h>
|
||||
|
||||
#include <mach/regs-icu.h>
|
||||
#include <mach/mmp2.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
|
|
|
@ -135,9 +135,8 @@ static void __init jasper_init(void)
|
|||
|
||||
MACHINE_START(MARVELL_JASPER, "Jasper Development Platform")
|
||||
.phys_io = APB_PHYS_BASE,
|
||||
.boot_params = 0x00000100,
|
||||
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
|
||||
.map_io = pxa_map_io,
|
||||
.map_io = mmp_map_io,
|
||||
.init_irq = mmp2_init_irq,
|
||||
.timer = &mmp2_timer,
|
||||
.init_machine = jasper_init,
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
|
||||
#include <asm/hardware/cache-tauros2.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
#include <mach/addr-map.h>
|
||||
#include <mach/regs-apbc.h>
|
||||
#include <mach/regs-apmu.h>
|
||||
|
@ -26,6 +27,7 @@
|
|||
#include <mach/mfp.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/devices.h>
|
||||
#include <mach/mmp2.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "clock.h"
|
||||
|
@ -158,6 +160,26 @@ static int __init mmp2_init(void)
|
|||
}
|
||||
postcore_initcall(mmp2_init);
|
||||
|
||||
static void __init mmp2_timer_init(void)
|
||||
{
|
||||
unsigned long clk_rst;
|
||||
|
||||
__raw_writel(APBC_APBCLK | APBC_RST, APBC_MMP2_TIMERS);
|
||||
|
||||
/*
|
||||
* enable bus/functional clock, enable 6.5MHz (divider 4),
|
||||
* release reset
|
||||
*/
|
||||
clk_rst = APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(1);
|
||||
__raw_writel(clk_rst, APBC_MMP2_TIMERS);
|
||||
|
||||
timer_init(IRQ_MMP2_TIMER1);
|
||||
}
|
||||
|
||||
struct sys_timer mmp2_timer = {
|
||||
.init = mmp2_timer_init,
|
||||
};
|
||||
|
||||
/* on-chip devices */
|
||||
MMP2_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4030000, 0x30, 4, 5);
|
||||
MMP2_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4017000, 0x30, 20, 21);
|
||||
|
|
|
@ -100,9 +100,8 @@ static void __init tavorevb_init(void)
|
|||
|
||||
MACHINE_START(TAVOREVB, "PXA910 Evaluation Board (aka TavorEVB)")
|
||||
.phys_io = APB_PHYS_BASE,
|
||||
.boot_params = 0x00000100,
|
||||
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
|
||||
.map_io = pxa_map_io,
|
||||
.map_io = mmp_map_io,
|
||||
.init_irq = pxa910_init_irq,
|
||||
.timer = &pxa910_timer,
|
||||
.init_machine = tavorevb_init,
|
||||
|
|
|
@ -200,24 +200,3 @@ void __init timer_init(int irq)
|
|||
clocksource_register(&cksrc);
|
||||
clockevents_register_device(&ckevt);
|
||||
}
|
||||
|
||||
static void __init mmp2_timer_init(void)
|
||||
{
|
||||
unsigned long clk_rst;
|
||||
|
||||
__raw_writel(APBC_APBCLK | APBC_RST, APBC_MMP2_TIMERS);
|
||||
|
||||
/*
|
||||
* enable bus/functional clock, enable 6.5MHz (divider 4),
|
||||
* release reset
|
||||
*/
|
||||
clk_rst = APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(1);
|
||||
__raw_writel(clk_rst, APBC_MMP2_TIMERS);
|
||||
|
||||
timer_init(IRQ_MMP2_TIMER1);
|
||||
}
|
||||
|
||||
struct sys_timer mmp2_timer = {
|
||||
.init = mmp2_timer_init,
|
||||
};
|
||||
|
||||
|
|
|
@ -123,9 +123,8 @@ static void __init ttc_dkb_init(void)
|
|||
|
||||
MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform")
|
||||
.phys_io = APB_PHYS_BASE,
|
||||
.boot_params = 0x00000100,
|
||||
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
|
||||
.map_io = pxa_map_io,
|
||||
.map_io = mmp_map_io,
|
||||
.init_irq = pxa910_init_irq,
|
||||
.timer = &pxa910_timer,
|
||||
.init_machine = ttc_dkb_init,
|
||||
|
|
|
@ -238,6 +238,17 @@ config MACH_COLIBRI
|
|||
bool "Toradex Colibri PXA270"
|
||||
select PXA27x
|
||||
|
||||
config MACH_COLIBRI_PXA270_EVALBOARD
|
||||
bool "Toradex Colibri Evaluation Carrier Board support (PXA270)"
|
||||
depends on MACH_COLIBRI
|
||||
|
||||
config MACH_COLIBRI_PXA270_INCOME
|
||||
bool "Income s.r.o. PXA270 SBC"
|
||||
depends on MACH_COLIBRI
|
||||
select PXA27x
|
||||
select HAVE_PWM
|
||||
select PXA_HAVE_BOARD_IRQS
|
||||
|
||||
config MACH_COLIBRI300
|
||||
bool "Toradex Colibri PXA300/310"
|
||||
select PXA3xx
|
||||
|
@ -336,6 +347,9 @@ config ARCH_PXA_PALM
|
|||
bool "PXA based Palm PDAs"
|
||||
select HAVE_PWM
|
||||
|
||||
config MACH_PALM27X
|
||||
bool
|
||||
|
||||
config MACH_PALMTE2
|
||||
bool "Palm Tungsten|E2"
|
||||
default y
|
||||
|
@ -360,6 +374,7 @@ config MACH_PALMT5
|
|||
depends on ARCH_PXA_PALM
|
||||
select PXA27x
|
||||
select IWMMXT
|
||||
select MACH_PALM27X
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a Palm Tungsten|T5
|
||||
handheld computer.
|
||||
|
@ -370,6 +385,7 @@ config MACH_PALMTX
|
|||
depends on ARCH_PXA_PALM
|
||||
select PXA27x
|
||||
select IWMMXT
|
||||
select MACH_PALM27X
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a Palm T|X
|
||||
handheld computer.
|
||||
|
@ -380,6 +396,7 @@ config MACH_PALMZ72
|
|||
depends on ARCH_PXA_PALM
|
||||
select PXA27x
|
||||
select IWMMXT
|
||||
select MACH_PALM27X
|
||||
help
|
||||
Say Y here if you intend to run this kernel on Palm Zire 72
|
||||
handheld computer.
|
||||
|
@ -390,6 +407,7 @@ config MACH_PALMLD
|
|||
depends on ARCH_PXA_PALM
|
||||
select PXA27x
|
||||
select IWMMXT
|
||||
select MACH_PALM27X
|
||||
help
|
||||
Say Y here if you intend to run this kernel on a Palm LifeDrive
|
||||
handheld computer.
|
||||
|
@ -447,16 +465,13 @@ config PXA_SHARPSL
|
|||
SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa)
|
||||
handheld computer.
|
||||
|
||||
config SHARPSL_PM
|
||||
bool
|
||||
select APM_EMULATION
|
||||
select SHARPSL_PM_MAX1111
|
||||
|
||||
config SHARPSL_PM_MAX1111
|
||||
bool
|
||||
depends on !CORGI_SSP_DEPRECATED
|
||||
select HWMON
|
||||
select SENSORS_MAX1111
|
||||
config PXA_SHARPSL_DETECT_MACH_ID
|
||||
bool "Detect machine ID at run-time in the decompressor"
|
||||
depends on PXA_SHARPSL
|
||||
help
|
||||
Say Y here if you want the zImage decompressor to detect
|
||||
the Zaurus machine ID at run-time. For latest kexec-based
|
||||
boot loader, this is not necessary.
|
||||
|
||||
config MACH_POODLE
|
||||
bool "Enable Sharp SL-5600 (Poodle) Support"
|
||||
|
@ -510,6 +525,25 @@ config MACH_TOSA
|
|||
select PXA25x
|
||||
select PXA_HAVE_BOARD_IRQS
|
||||
|
||||
config TOSA_BT
|
||||
tristate "Control the state of built-in bluetooth chip on Sharp SL-6000"
|
||||
depends on MACH_TOSA
|
||||
select RFKILL
|
||||
help
|
||||
This is a simple driver that is able to control
|
||||
the state of built in bluetooth chip on tosa.
|
||||
|
||||
config TOSA_USE_EXT_KEYCODES
|
||||
bool "Tosa keyboard: use extended keycodes"
|
||||
depends on MACH_TOSA
|
||||
default n
|
||||
help
|
||||
Say Y here to enable the tosa keyboard driver to generate extended
|
||||
(>= 127) keycodes. Be aware, that they can't be correctly interpreted
|
||||
by either console keyboard driver or by Kdrive keybd driver.
|
||||
|
||||
Say Y only if you know, what you are doing!
|
||||
|
||||
config MACH_ICONTROL
|
||||
bool "TMT iControl/SafeTCam based on the MXM-8x10 CoM"
|
||||
select CPU_PXA320
|
||||
|
@ -648,25 +682,15 @@ config PXA_SHARP_Cxx00
|
|||
help
|
||||
Enable common support for Sharp Cxx00 models
|
||||
|
||||
config TOSA_BT
|
||||
tristate "Control the state of built-in bluetooth chip on Sharp SL-6000"
|
||||
depends on MACH_TOSA
|
||||
select RFKILL
|
||||
help
|
||||
This is a simple driver that is able to control
|
||||
the state of built in bluetooth chip on tosa.
|
||||
|
||||
config TOSA_USE_EXT_KEYCODES
|
||||
bool "Tosa keyboard: use extended keycodes"
|
||||
depends on MACH_TOSA
|
||||
default n
|
||||
help
|
||||
Say Y here to enable the tosa keyboard driver to generate extended
|
||||
(>= 127) keycodes. Be aware, that they can't be correctly interpreted
|
||||
by either console keyboard driver or by Kdrive keybd driver.
|
||||
|
||||
Say Y only if you know, what you are doing!
|
||||
config SHARPSL_PM
|
||||
bool
|
||||
select APM_EMULATION
|
||||
select SHARPSL_PM_MAX1111
|
||||
|
||||
config SHARPSL_PM_MAX1111
|
||||
bool
|
||||
select HWMON
|
||||
select SENSORS_MAX1111
|
||||
|
||||
config PXA_HAVE_BOARD_IRQS
|
||||
bool
|
||||
|
|
|
@ -51,14 +51,16 @@ obj-$(CONFIG_MACH_CAPC7117) += capc7117.o mxm8x10.o
|
|||
obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o
|
||||
obj-$(CONFIG_GUMSTIX_AM200EPD) += am200epd.o
|
||||
obj-$(CONFIG_GUMSTIX_AM300EPD) += am300epd.o
|
||||
obj-$(CONFIG_MACH_INTELMOTE2) += imote2.o
|
||||
obj-$(CONFIG_MACH_INTELMOTE2) += stargate2.o
|
||||
obj-$(CONFIG_MACH_STARGATE2) += stargate2.o
|
||||
obj-$(CONFIG_MACH_XCEP) += xcep.o
|
||||
obj-$(CONFIG_MACH_TRIZEPS4) += trizeps4.o
|
||||
obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o
|
||||
obj-$(CONFIG_MACH_PCM027) += pcm027.o
|
||||
obj-$(CONFIG_MACH_PCM990_BASEBOARD) += pcm990-baseboard.o
|
||||
obj-$(CONFIG_MACH_COLIBRI) += colibri-pxa270.o
|
||||
obj-$(CONFIG_MACH_COLIBRI) += colibri-pxa270.o
|
||||
obj-$(CONFIG_MACH_COLIBRI_PXA270_EVALBOARD) += colibri-pxa270-evalboard.o
|
||||
obj-$(CONFIG_MACH_COLIBRI_PXA270_INCOME) += colibri-pxa270-income.o
|
||||
obj-$(CONFIG_MACH_COLIBRI300) += colibri-pxa3xx.o colibri-pxa300.o
|
||||
obj-$(CONFIG_MACH_COLIBRI320) += colibri-pxa3xx.o colibri-pxa320.o
|
||||
obj-$(CONFIG_MACH_VPAC270) += vpac270.o
|
||||
|
@ -73,6 +75,7 @@ obj-$(CONFIG_PXA_EZX) += ezx.o
|
|||
obj-$(CONFIG_MACH_MP900C) += mp900.o
|
||||
obj-$(CONFIG_MACH_PALMTE2) += palmte2.o
|
||||
obj-$(CONFIG_MACH_PALMTC) += palmtc.o
|
||||
obj-$(CONFIG_MACH_PALM27X) += palm27x.o
|
||||
obj-$(CONFIG_MACH_PALMT5) += palmt5.o
|
||||
obj-$(CONFIG_MACH_PALMTX) += palmtx.o
|
||||
obj-$(CONFIG_MACH_PALMZ72) += palmz72.o
|
||||
|
@ -84,12 +87,6 @@ obj-$(CONFIG_MACH_POODLE) += poodle.o
|
|||
obj-$(CONFIG_MACH_TOSA) += tosa.o
|
||||
obj-$(CONFIG_MACH_ICONTROL) += icontrol.o mxm8x10.o
|
||||
obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o
|
||||
obj-$(CONFIG_MACH_E330) += e330.o
|
||||
obj-$(CONFIG_MACH_E350) += e350.o
|
||||
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_RAUMFELD_RC) += raumfeld.o
|
||||
obj-$(CONFIG_MACH_RAUMFELD_CONNECTOR) += raumfeld.o
|
||||
obj-$(CONFIG_MACH_RAUMFELD_SPEAKER) += raumfeld.o
|
||||
|
|
|
@ -22,9 +22,14 @@
|
|||
#include <linux/fb.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/ucb1400.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/i2c/pcf857x.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/regulator/max1586.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
@ -51,6 +56,59 @@
|
|||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
||||
/******************************************************************************
|
||||
* Pin configuration
|
||||
******************************************************************************/
|
||||
static unsigned long balloon3_pin_config[] __initdata = {
|
||||
/* Select BTUART 'COM1/ttyS0' as IO option for pins 42/43/44/45 */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
GPIO45_BTUART_RTS,
|
||||
|
||||
/* Reset, configured as GPIO wakeup source */
|
||||
GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,
|
||||
|
||||
/* LEDs */
|
||||
GPIO9_GPIO, /* NAND activity LED */
|
||||
GPIO10_GPIO, /* Heartbeat LED */
|
||||
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
GPIO113_AC97_nRESET,
|
||||
GPIO95_GPIO,
|
||||
|
||||
/* MMC */
|
||||
GPIO32_MMC_CLK,
|
||||
GPIO92_MMC_DAT_0,
|
||||
GPIO109_MMC_DAT_1,
|
||||
GPIO110_MMC_DAT_2,
|
||||
GPIO111_MMC_DAT_3,
|
||||
GPIO112_MMC_CMD,
|
||||
|
||||
/* USB Host */
|
||||
GPIO88_USBH1_PWR,
|
||||
GPIO89_USBH1_PEN,
|
||||
|
||||
/* PC Card */
|
||||
GPIO48_nPOE,
|
||||
GPIO49_nPWE,
|
||||
GPIO50_nPIOR,
|
||||
GPIO51_nPIOW,
|
||||
GPIO85_nPCE_1,
|
||||
GPIO54_nPCE_2,
|
||||
GPIO79_PSKTSEL,
|
||||
GPIO55_nPREG,
|
||||
GPIO56_nPWAIT,
|
||||
GPIO57_nIOIS16,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Compatibility: Parameter parsing
|
||||
******************************************************************************/
|
||||
static unsigned long balloon3_irq_enabled;
|
||||
|
||||
static unsigned long balloon3_features_present =
|
||||
|
@ -73,6 +131,321 @@ int __init parse_balloon3_features(char *arg)
|
|||
}
|
||||
early_param("balloon3_features", parse_balloon3_features);
|
||||
|
||||
/******************************************************************************
|
||||
* NOR Flash
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||
static struct mtd_partition balloon3_nor_partitions[] = {
|
||||
{
|
||||
.name = "Flash",
|
||||
.offset = 0x00000000,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
}
|
||||
};
|
||||
|
||||
static struct physmap_flash_data balloon3_flash_data[] = {
|
||||
{
|
||||
.width = 2, /* bankwidth in bytes */
|
||||
.parts = balloon3_nor_partitions,
|
||||
.nr_parts = ARRAY_SIZE(balloon3_nor_partitions)
|
||||
}
|
||||
};
|
||||
|
||||
static struct resource balloon3_flash_resource = {
|
||||
.start = PXA_CS0_PHYS,
|
||||
.end = PXA_CS0_PHYS + SZ_64M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct platform_device balloon3_flash = {
|
||||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.resource = &balloon3_flash_resource,
|
||||
.num_resources = 1,
|
||||
.dev = {
|
||||
.platform_data = balloon3_flash_data,
|
||||
},
|
||||
};
|
||||
static void __init balloon3_nor_init(void)
|
||||
{
|
||||
platform_device_register(&balloon3_flash);
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_nor_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Audio and Touchscreen
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_TOUCHSCREEN_UCB1400) || \
|
||||
defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
|
||||
static struct ucb1400_pdata vpac270_ucb1400_pdata = {
|
||||
.irq = IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ),
|
||||
};
|
||||
|
||||
|
||||
static struct platform_device balloon3_ucb1400_device = {
|
||||
.name = "ucb1400_core",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &vpac270_ucb1400_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init balloon3_ts_init(void)
|
||||
{
|
||||
if (!balloon3_has(BALLOON3_FEATURE_AUDIO))
|
||||
return;
|
||||
|
||||
pxa_set_ac97_info(NULL);
|
||||
platform_device_register(&balloon3_ucb1400_device);
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_ts_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
|
||||
static struct pxafb_mode_info balloon3_lcd_modes[] = {
|
||||
{
|
||||
.pixclock = 38000,
|
||||
.xres = 480,
|
||||
.yres = 640,
|
||||
.bpp = 16,
|
||||
.hsync_len = 8,
|
||||
.left_margin = 8,
|
||||
.right_margin = 8,
|
||||
.vsync_len = 2,
|
||||
.upper_margin = 4,
|
||||
.lower_margin = 5,
|
||||
.sync = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info balloon3_lcd_screen = {
|
||||
.modes = balloon3_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(balloon3_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
static void balloon3_backlight_power(int on)
|
||||
{
|
||||
gpio_set_value(BALLOON3_GPIO_RUN_BACKLIGHT, on);
|
||||
}
|
||||
|
||||
static void __init balloon3_lcd_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!balloon3_has(BALLOON3_FEATURE_TOPPOLY))
|
||||
return;
|
||||
|
||||
ret = gpio_request(BALLOON3_GPIO_RUN_BACKLIGHT, "BKL-ON");
|
||||
if (ret) {
|
||||
pr_err("Requesting BKL-ON GPIO failed!\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = gpio_direction_output(BALLOON3_GPIO_RUN_BACKLIGHT, 1);
|
||||
if (ret) {
|
||||
pr_err("Setting BKL-ON GPIO direction failed!\n");
|
||||
goto err2;
|
||||
}
|
||||
|
||||
balloon3_lcd_screen.pxafb_backlight_power = balloon3_backlight_power;
|
||||
set_pxa_fb_info(&balloon3_lcd_screen);
|
||||
return;
|
||||
|
||||
err2:
|
||||
gpio_free(BALLOON3_GPIO_RUN_BACKLIGHT);
|
||||
err:
|
||||
return;
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_lcd_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
|
||||
static struct pxamci_platform_data balloon3_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.gpio_card_detect = -1,
|
||||
.gpio_card_ro = -1,
|
||||
.gpio_power = -1,
|
||||
.detect_delay_ms = 200,
|
||||
};
|
||||
|
||||
static void __init balloon3_mmc_init(void)
|
||||
{
|
||||
pxa_set_mci_info(&balloon3_mci_platform_data);
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_mmc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* USB Gadget
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_USB_GADGET_PXA27X)||defined(CONFIG_USB_GADGET_PXA27X_MODULE)
|
||||
static void balloon3_udc_command(int cmd)
|
||||
{
|
||||
if (cmd == PXA2XX_UDC_CMD_CONNECT)
|
||||
UP2OCR |= UP2OCR_DPPUE | UP2OCR_DPPUBE;
|
||||
else if (cmd == PXA2XX_UDC_CMD_DISCONNECT)
|
||||
UP2OCR &= ~UP2OCR_DPPUE;
|
||||
}
|
||||
|
||||
static int balloon3_udc_is_connected(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static struct pxa2xx_udc_mach_info balloon3_udc_info __initdata = {
|
||||
.udc_command = balloon3_udc_command,
|
||||
.udc_is_connected = balloon3_udc_is_connected,
|
||||
.gpio_pullup = -1,
|
||||
};
|
||||
|
||||
static void __init balloon3_udc_init(void)
|
||||
{
|
||||
pxa_set_udc_info(&balloon3_udc_info);
|
||||
platform_device_register(&balloon3_gpio_vbus);
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_udc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* IrDA
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
|
||||
static struct pxaficp_platform_data balloon3_ficp_platform_data = {
|
||||
.transceiver_cap = IR_FIRMODE | IR_SIRMODE | IR_OFF,
|
||||
};
|
||||
|
||||
static void __init balloon3_irda_init(void)
|
||||
{
|
||||
pxa_set_ficp_info(&balloon3_ficp_platform_data);
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_irda_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* USB Host
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
static struct pxaohci_platform_data balloon3_ohci_info = {
|
||||
.port_mode = PMM_PERPORT_MODE,
|
||||
.flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW,
|
||||
};
|
||||
|
||||
static void __init balloon3_uhc_init(void)
|
||||
{
|
||||
if (!balloon3_has(BALLOON3_FEATURE_OHCI))
|
||||
return;
|
||||
pxa_set_ohci_info(&balloon3_ohci_info);
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_uhc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* LEDs
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
struct gpio_led balloon3_gpio_leds[] = {
|
||||
{
|
||||
.name = "balloon3:green:idle",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = BALLOON3_GPIO_LED_IDLE,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "balloon3:green:nand",
|
||||
.default_trigger = "nand-disk",
|
||||
.gpio = BALLOON3_GPIO_LED_NAND,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data balloon3_gpio_led_info = {
|
||||
.leds = balloon3_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(balloon3_gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device balloon3_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &balloon3_gpio_led_info,
|
||||
}
|
||||
};
|
||||
|
||||
struct gpio_led balloon3_pcf_gpio_leds[] = {
|
||||
{
|
||||
.name = "balloon3:green:led0",
|
||||
.gpio = BALLOON3_PCF_GPIO_LED0,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "balloon3:green:led1",
|
||||
.gpio = BALLOON3_PCF_GPIO_LED1,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "balloon3:orange:led2",
|
||||
.gpio = BALLOON3_PCF_GPIO_LED2,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "balloon3:orange:led3",
|
||||
.gpio = BALLOON3_PCF_GPIO_LED3,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "balloon3:orange:led4",
|
||||
.gpio = BALLOON3_PCF_GPIO_LED4,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "balloon3:orange:led5",
|
||||
.gpio = BALLOON3_PCF_GPIO_LED5,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "balloon3:red:led6",
|
||||
.gpio = BALLOON3_PCF_GPIO_LED6,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "balloon3:red:led7",
|
||||
.gpio = BALLOON3_PCF_GPIO_LED7,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data balloon3_pcf_gpio_led_info = {
|
||||
.leds = balloon3_pcf_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(balloon3_pcf_gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device balloon3_pcf_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &balloon3_pcf_gpio_led_info,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init balloon3_leds_init(void)
|
||||
{
|
||||
platform_device_register(&balloon3_leds);
|
||||
platform_device_register(&balloon3_pcf_leds);
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_leds_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* FPGA IRQ
|
||||
******************************************************************************/
|
||||
static void balloon3_mask_irq(unsigned int irq)
|
||||
{
|
||||
int balloon3_irq = (irq - BALLOON3_IRQ(0));
|
||||
|
@ -98,7 +471,6 @@ static void balloon3_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|||
{
|
||||
unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
|
||||
balloon3_irq_enabled;
|
||||
|
||||
do {
|
||||
/* clear useless edge notification */
|
||||
if (desc->chip->ack)
|
||||
|
@ -132,201 +504,259 @@ static void __init balloon3_init_irq(void)
|
|||
"enabled\n", __func__, BALLOON3_AUX_NIRQ);
|
||||
}
|
||||
|
||||
static unsigned long balloon3_ac97_pin_config[] = {
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
GPIO113_AC97_nRESET,
|
||||
/******************************************************************************
|
||||
* GPIO expander
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_GPIO_PCF857X) || defined(CONFIG_GPIO_PCF857X_MODULE)
|
||||
static struct pcf857x_platform_data balloon3_pcf857x_pdata = {
|
||||
.gpio_base = BALLOON3_PCF_GPIO_BASE,
|
||||
.n_latch = 0,
|
||||
.setup = NULL,
|
||||
.teardown = NULL,
|
||||
.context = NULL,
|
||||
};
|
||||
|
||||
static void balloon3_backlight_power(int on)
|
||||
{
|
||||
pr_debug("%s: power is %s\n", __func__, on ? "on" : "off");
|
||||
gpio_set_value(BALLOON3_GPIO_RUN_BACKLIGHT, on);
|
||||
}
|
||||
|
||||
static unsigned long balloon3_lcd_pin_config[] = {
|
||||
/* LCD - 16bpp Active TFT */
|
||||
GPIOxx_LCD_TFT_16BPP,
|
||||
|
||||
GPIO99_GPIO, /* Backlight */
|
||||
};
|
||||
|
||||
static struct pxafb_mode_info balloon3_lcd_modes[] = {
|
||||
static struct i2c_board_info __initdata balloon3_i2c_devs[] = {
|
||||
{
|
||||
.pixclock = 38000,
|
||||
.xres = 480,
|
||||
.yres = 640,
|
||||
.bpp = 16,
|
||||
.hsync_len = 8,
|
||||
.left_margin = 8,
|
||||
.right_margin = 8,
|
||||
.vsync_len = 2,
|
||||
.upper_margin = 4,
|
||||
.lower_margin = 5,
|
||||
.sync = 0,
|
||||
I2C_BOARD_INFO("pcf8574a", 0x38),
|
||||
.platform_data = &balloon3_pcf857x_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info balloon3_pxafb_info = {
|
||||
.modes = balloon3_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(balloon3_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
.pxafb_backlight_power = balloon3_backlight_power,
|
||||
};
|
||||
|
||||
static unsigned long balloon3_mmc_pin_config[] = {
|
||||
GPIO32_MMC_CLK,
|
||||
GPIO92_MMC_DAT_0,
|
||||
GPIO109_MMC_DAT_1,
|
||||
GPIO110_MMC_DAT_2,
|
||||
GPIO111_MMC_DAT_3,
|
||||
GPIO112_MMC_CMD,
|
||||
};
|
||||
|
||||
static void balloon3_mci_setpower(struct device *dev, unsigned int vdd)
|
||||
static void __init balloon3_i2c_init(void)
|
||||
{
|
||||
struct pxamci_platform_data *p_d = dev->platform_data;
|
||||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(balloon3_i2c_devs));
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_i2c_init(void) {}
|
||||
#endif
|
||||
|
||||
if ((1 << vdd) & p_d->ocr_mask) {
|
||||
pr_debug("%s: on\n", __func__);
|
||||
/* FIXME something to prod here? */
|
||||
} else {
|
||||
pr_debug("%s: off\n", __func__);
|
||||
/* FIXME something to prod here? */
|
||||
/******************************************************************************
|
||||
* NAND
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MTD_NAND_PLATFORM)||defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
|
||||
static uint16_t balloon3_ctl =
|
||||
BALLOON3_NAND_CONTROL_FLCE0 | BALLOON3_NAND_CONTROL_FLCE1 |
|
||||
BALLOON3_NAND_CONTROL_FLCE2 | BALLOON3_NAND_CONTROL_FLCE3 |
|
||||
BALLOON3_NAND_CONTROL_FLWP;
|
||||
|
||||
static void balloon3_nand_cmd_ctl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
|
||||
{
|
||||
struct nand_chip *this = mtd->priv;
|
||||
|
||||
if (ctrl & NAND_CTRL_CHANGE) {
|
||||
if (ctrl & NAND_CLE)
|
||||
balloon3_ctl |= BALLOON3_NAND_CONTROL_FLCLE;
|
||||
else
|
||||
balloon3_ctl &= ~BALLOON3_NAND_CONTROL_FLCLE;
|
||||
|
||||
if (ctrl & NAND_ALE)
|
||||
balloon3_ctl |= BALLOON3_NAND_CONTROL_FLALE;
|
||||
else
|
||||
balloon3_ctl &= ~BALLOON3_NAND_CONTROL_FLALE;
|
||||
|
||||
__raw_writel(balloon3_ctl, BALLOON3_NAND_CONTROL_REG);
|
||||
}
|
||||
|
||||
if (cmd != NAND_CMD_NONE)
|
||||
writeb(cmd, this->IO_ADDR_W);
|
||||
}
|
||||
|
||||
static struct pxamci_platform_data balloon3_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
|
||||
.setpower = balloon3_mci_setpower,
|
||||
static void balloon3_nand_select_chip(struct mtd_info *mtd, int chip)
|
||||
{
|
||||
if (chip < 0 || chip > 3)
|
||||
return;
|
||||
|
||||
balloon3_ctl |= BALLOON3_NAND_CONTROL_FLCE0 |
|
||||
BALLOON3_NAND_CONTROL_FLCE1 |
|
||||
BALLOON3_NAND_CONTROL_FLCE2 |
|
||||
BALLOON3_NAND_CONTROL_FLCE3;
|
||||
|
||||
/* Deassert correct nCE line */
|
||||
balloon3_ctl &= ~(BALLOON3_NAND_CONTROL_FLCE0 << chip);
|
||||
|
||||
__raw_writew(balloon3_ctl, BALLOON3_NAND_CONTROL_REG);
|
||||
}
|
||||
|
||||
static int balloon3_nand_probe(struct platform_device *pdev)
|
||||
{
|
||||
void __iomem *temp_map;
|
||||
uint16_t ver;
|
||||
int ret;
|
||||
|
||||
__raw_writew(BALLOON3_NAND_CONTROL2_16BIT, BALLOON3_NAND_CONTROL2_REG);
|
||||
|
||||
ver = __raw_readw(BALLOON3_FPGA_VER);
|
||||
if (ver > 0x0201)
|
||||
pr_warn("The FPGA code, version 0x%04x, is newer than rel-0.3. "
|
||||
"NAND support might be broken in this version!", ver);
|
||||
|
||||
/* Power up the NAND chips */
|
||||
ret = gpio_request(BALLOON3_GPIO_RUN_NAND, "NAND");
|
||||
if (ret)
|
||||
goto err1;
|
||||
|
||||
ret = gpio_direction_output(BALLOON3_GPIO_RUN_NAND, 1);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
gpio_set_value(BALLOON3_GPIO_RUN_NAND, 1);
|
||||
|
||||
/* Deassert all nCE lines and write protect line */
|
||||
__raw_writel(balloon3_ctl, BALLOON3_NAND_CONTROL_REG);
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
gpio_free(BALLOON3_GPIO_RUN_NAND);
|
||||
err1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void balloon3_nand_remove(struct platform_device *pdev)
|
||||
{
|
||||
/* Power down the NAND chips */
|
||||
gpio_set_value(BALLOON3_GPIO_RUN_NAND, 0);
|
||||
gpio_free(BALLOON3_GPIO_RUN_NAND);
|
||||
}
|
||||
|
||||
static struct mtd_partition balloon3_partition_info[] = {
|
||||
[0] = {
|
||||
.name = "Boot",
|
||||
.offset = 0,
|
||||
.size = SZ_4M,
|
||||
},
|
||||
[1] = {
|
||||
.name = "RootFS",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = MTDPART_SIZ_FULL
|
||||
},
|
||||
};
|
||||
|
||||
static int balloon3_udc_is_connected(void)
|
||||
{
|
||||
pr_debug("%s: udc connected\n", __func__);
|
||||
return 1;
|
||||
}
|
||||
static const char *balloon3_part_probes[] = { "cmdlinepart", NULL };
|
||||
|
||||
static void balloon3_udc_command(int cmd)
|
||||
{
|
||||
switch (cmd) {
|
||||
case PXA2XX_UDC_CMD_CONNECT:
|
||||
UP2OCR |= (UP2OCR_DPPUE + UP2OCR_DPPUBE);
|
||||
pr_debug("%s: connect\n", __func__);
|
||||
break;
|
||||
case PXA2XX_UDC_CMD_DISCONNECT:
|
||||
UP2OCR &= ~UP2OCR_DPPUE;
|
||||
pr_debug("%s: disconnect\n", __func__);
|
||||
break;
|
||||
struct platform_nand_data balloon3_nand_pdata = {
|
||||
.chip = {
|
||||
.nr_chips = 4,
|
||||
.chip_offset = 0,
|
||||
.nr_partitions = ARRAY_SIZE(balloon3_partition_info),
|
||||
.partitions = balloon3_partition_info,
|
||||
.chip_delay = 50,
|
||||
.part_probe_types = balloon3_part_probes,
|
||||
},
|
||||
.ctrl = {
|
||||
.hwcontrol = 0,
|
||||
.dev_ready = 0,
|
||||
.select_chip = balloon3_nand_select_chip,
|
||||
.cmd_ctrl = balloon3_nand_cmd_ctl,
|
||||
.probe = balloon3_nand_probe,
|
||||
.remove = balloon3_nand_remove,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource balloon3_nand_resource[] = {
|
||||
[0] = {
|
||||
.start = BALLOON3_NAND_BASE,
|
||||
.end = BALLOON3_NAND_BASE + 0x4,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device balloon3_nand = {
|
||||
.name = "gen_nand",
|
||||
.num_resources = ARRAY_SIZE(balloon3_nand_resource),
|
||||
.resource = balloon3_nand_resource,
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &balloon3_nand_pdata,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init balloon3_nand_init(void)
|
||||
{
|
||||
platform_device_register(&balloon3_nand);
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_nand_init(void) {}
|
||||
#endif
|
||||
|
||||
static struct pxa2xx_udc_mach_info balloon3_udc_info = {
|
||||
.udc_is_connected = balloon3_udc_is_connected,
|
||||
.udc_command = balloon3_udc_command,
|
||||
};
|
||||
|
||||
static struct pxaficp_platform_data balloon3_ficp_platform_data = {
|
||||
.transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
|
||||
};
|
||||
|
||||
static unsigned long balloon3_ohci_pin_config[] = {
|
||||
GPIO88_USBH1_PWR,
|
||||
GPIO89_USBH1_PEN,
|
||||
};
|
||||
|
||||
static struct pxaohci_platform_data balloon3_ohci_platform_data = {
|
||||
.port_mode = PMM_PERPORT_MODE,
|
||||
.flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW,
|
||||
};
|
||||
|
||||
static unsigned long balloon3_pin_config[] __initdata = {
|
||||
/* Select BTUART 'COM1/ttyS0' as IO option for pins 42/43/44/45 */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
GPIO45_BTUART_RTS,
|
||||
|
||||
/* Wakeup GPIO */
|
||||
GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,
|
||||
|
||||
/* NAND & IDLE LED GPIOs */
|
||||
GPIO9_GPIO,
|
||||
GPIO10_GPIO,
|
||||
};
|
||||
|
||||
static struct gpio_led balloon3_gpio_leds[] = {
|
||||
/******************************************************************************
|
||||
* Core power regulator
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_REGULATOR_MAX1586) || \
|
||||
defined(CONFIG_REGULATOR_MAX1586_MODULE)
|
||||
static struct regulator_consumer_supply balloon3_max1587a_consumers[] = {
|
||||
{
|
||||
.name = "balloon3:green:idle",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = BALLOON3_GPIO_LED_IDLE,
|
||||
.active_low = 1,
|
||||
.supply = "vcc_core",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data balloon3_max1587a_v3_info = {
|
||||
.constraints = {
|
||||
.name = "vcc_core range",
|
||||
.min_uV = 900000,
|
||||
.max_uV = 1705000,
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
},
|
||||
.consumer_supplies = balloon3_max1587a_consumers,
|
||||
.num_consumer_supplies = ARRAY_SIZE(balloon3_max1587a_consumers),
|
||||
};
|
||||
|
||||
static struct max1586_subdev_data balloon3_max1587a_subdevs[] = {
|
||||
{
|
||||
.name = "balloon3:green:nand",
|
||||
.default_trigger = "nand-disk",
|
||||
.gpio = BALLOON3_GPIO_LED_NAND,
|
||||
.active_low = 1,
|
||||
.name = "vcc_core",
|
||||
.id = MAX1586_V3,
|
||||
.platform_data = &balloon3_max1587a_v3_info,
|
||||
}
|
||||
};
|
||||
|
||||
static struct max1586_platform_data balloon3_max1587a_info = {
|
||||
.subdevs = balloon3_max1587a_subdevs,
|
||||
.num_subdevs = ARRAY_SIZE(balloon3_max1587a_subdevs),
|
||||
.v3_gain = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata balloon3_pi2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("max1586", 0x14),
|
||||
.platform_data = &balloon3_max1587a_info,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data balloon3_gpio_leds_platform_data = {
|
||||
.leds = balloon3_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(balloon3_gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device balloon3led_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &balloon3_gpio_leds_platform_data,
|
||||
},
|
||||
};
|
||||
static void __init balloon3_pmic_init(void)
|
||||
{
|
||||
pxa27x_set_i2c_power_info(NULL);
|
||||
i2c_register_board_info(1, ARRAY_AND_SIZE(balloon3_pi2c_board_info));
|
||||
}
|
||||
#else
|
||||
static inline void balloon3_pmic_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
static void __init balloon3_init(void)
|
||||
{
|
||||
pr_info("Initialising Balloon3\n");
|
||||
|
||||
/* system bus arbiter setting
|
||||
* - Core_Park
|
||||
* - LCD_wt:DMA_wt:CORE_Wt = 2:3:4
|
||||
*/
|
||||
ARB_CNTRL = ARB_CORE_PARK | 0x234;
|
||||
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config));
|
||||
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
pxa_set_i2c_info(NULL);
|
||||
if (balloon3_has(BALLOON3_FEATURE_AUDIO)) {
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_ac97_pin_config));
|
||||
pxa_set_ac97_info(NULL);
|
||||
}
|
||||
|
||||
if (balloon3_has(BALLOON3_FEATURE_TOPPOLY)) {
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_lcd_pin_config));
|
||||
gpio_request(BALLOON3_GPIO_RUN_BACKLIGHT,
|
||||
"LCD Backlight Power");
|
||||
gpio_direction_output(BALLOON3_GPIO_RUN_BACKLIGHT, 1);
|
||||
set_pxa_fb_info(&balloon3_pxafb_info);
|
||||
}
|
||||
|
||||
if (balloon3_has(BALLOON3_FEATURE_MMC)) {
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_mmc_pin_config));
|
||||
pxa_set_mci_info(&balloon3_mci_platform_data);
|
||||
}
|
||||
pxa_set_ficp_info(&balloon3_ficp_platform_data);
|
||||
if (balloon3_has(BALLOON3_FEATURE_OHCI)) {
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_ohci_pin_config));
|
||||
pxa_set_ohci_info(&balloon3_ohci_platform_data);
|
||||
}
|
||||
pxa_set_udc_info(&balloon3_udc_info);
|
||||
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config));
|
||||
|
||||
platform_device_register(&balloon3led_device);
|
||||
balloon3_i2c_init();
|
||||
balloon3_irda_init();
|
||||
balloon3_lcd_init();
|
||||
balloon3_leds_init();
|
||||
balloon3_mmc_init();
|
||||
balloon3_nand_init();
|
||||
balloon3_nor_init();
|
||||
balloon3_pmic_init();
|
||||
balloon3_ts_init();
|
||||
balloon3_udc_init();
|
||||
balloon3_uhc_init();
|
||||
}
|
||||
|
||||
static struct map_desc balloon3_io_desc[] __initdata = {
|
||||
|
|
|
@ -689,6 +689,7 @@ static void __init cm_x300_init_da9030(void)
|
|||
{
|
||||
pxa3xx_set_i2c_power_info(&cm_x300_pwr_i2c_info);
|
||||
i2c_register_board_info(1, &cm_x300_pmic_info, 1);
|
||||
set_irq_wake(IRQ_WAKEUP0, 1);
|
||||
}
|
||||
|
||||
static void __init cm_x300_init_wi2wi(void)
|
||||
|
@ -745,9 +746,10 @@ static void __init cm_x300_init(void)
|
|||
{
|
||||
cm_x300_init_mfp();
|
||||
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
if (cpu_is_pxa300())
|
||||
pxa_set_ffuart_info(NULL);
|
||||
|
||||
cm_x300_init_da9030();
|
||||
cm_x300_init_dm9000();
|
||||
|
|
|
@ -0,0 +1,111 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-pxa/colibri-pxa270-evalboard.c
|
||||
*
|
||||
* Support for Toradex PXA270 based Colibri Evaluation Carrier Board
|
||||
* Daniel Mack <daniel@caiaq.de>
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include <mach/pxa27x.h>
|
||||
#include <mach/colibri.h>
|
||||
#include <mach/mmc.h>
|
||||
#include <mach/ohci.h>
|
||||
#include <mach/pxa27x-udc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
||||
/******************************************************************************
|
||||
* Pin configuration
|
||||
******************************************************************************/
|
||||
static mfp_cfg_t colibri_pxa270_evalboard_pin_config[] __initdata = {
|
||||
/* MMC */
|
||||
GPIO32_MMC_CLK,
|
||||
GPIO92_MMC_DAT_0,
|
||||
GPIO109_MMC_DAT_1,
|
||||
GPIO110_MMC_DAT_2,
|
||||
GPIO111_MMC_DAT_3,
|
||||
GPIO112_MMC_CMD,
|
||||
GPIO0_GPIO, /* SD detect */
|
||||
|
||||
/* FFUART */
|
||||
GPIO39_FFUART_TXD,
|
||||
GPIO34_FFUART_RXD,
|
||||
|
||||
/* UHC */
|
||||
GPIO88_USBH1_PWR,
|
||||
GPIO89_USBH1_PEN,
|
||||
GPIO119_USBH2_PWR,
|
||||
GPIO120_USBH2_PEN,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
|
||||
static struct pxamci_platform_data colibri_pxa270_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.gpio_power = -1,
|
||||
.gpio_card_detect = GPIO0_COLIBRI_PXA270_SD_DETECT,
|
||||
.gpio_card_ro = -1,
|
||||
.detect_delay_ms = 200,
|
||||
};
|
||||
|
||||
static void __init colibri_pxa270_mmc_init(void)
|
||||
{
|
||||
pxa_set_mci_info(&colibri_pxa270_mci_platform_data);
|
||||
}
|
||||
#else
|
||||
static inline void colibri_pxa270_mmc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* USB Host
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
static int colibri_pxa270_ohci_init(struct device *dev)
|
||||
{
|
||||
UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct pxaohci_platform_data colibri_pxa270_ohci_info = {
|
||||
.port_mode = PMM_PERPORT_MODE,
|
||||
.flags = ENABLE_PORT1 | ENABLE_PORT2 |
|
||||
POWER_CONTROL_LOW | POWER_SENSE_LOW,
|
||||
.init = colibri_pxa270_ohci_init,
|
||||
};
|
||||
|
||||
static void __init colibri_pxa270_uhc_init(void)
|
||||
{
|
||||
pxa_set_ohci_info(&colibri_pxa270_ohci_info);
|
||||
}
|
||||
#else
|
||||
static inline void colibri_pxa270_uhc_init(void) {}
|
||||
#endif
|
||||
|
||||
void __init colibri_pxa270_evalboard_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_evalboard_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
colibri_pxa270_mmc_init();
|
||||
colibri_pxa270_uhc_init();
|
||||
}
|
||||
|
|
@ -0,0 +1,272 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-pxa/income.c
|
||||
*
|
||||
* Support for Income s.r.o. SH-Dmaster PXA270 SBC
|
||||
*
|
||||
* Copyright (C) 2010
|
||||
* Marek Vasut <marek.vasut@gmail.com>
|
||||
* Pavel Revak <palo@bielyvlk.sk>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/sysdev.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/mmc.h>
|
||||
#include <mach/ohci.h>
|
||||
#include <mach/pxa27x.h>
|
||||
#include <mach/pxa27x-udc.h>
|
||||
#include <mach/pxafb.h>
|
||||
|
||||
#include <plat/i2c.h>
|
||||
|
||||
#include "devices.h"
|
||||
#include "generic.h"
|
||||
|
||||
#define GPIO114_INCOME_ETH_IRQ (114)
|
||||
#define GPIO0_INCOME_SD_DETECT (0)
|
||||
#define GPIO0_INCOME_SD_RO (1)
|
||||
#define GPIO54_INCOME_LED_A (54)
|
||||
#define GPIO55_INCOME_LED_B (55)
|
||||
#define GPIO113_INCOME_TS_IRQ (113)
|
||||
|
||||
/******************************************************************************
|
||||
* Pin configuration
|
||||
******************************************************************************/
|
||||
static mfp_cfg_t income_pin_config[] __initdata = {
|
||||
/* MMC */
|
||||
GPIO32_MMC_CLK,
|
||||
GPIO92_MMC_DAT_0,
|
||||
GPIO109_MMC_DAT_1,
|
||||
GPIO110_MMC_DAT_2,
|
||||
GPIO111_MMC_DAT_3,
|
||||
GPIO112_MMC_CMD,
|
||||
GPIO0_GPIO, /* SD detect */
|
||||
GPIO1_GPIO, /* SD read-only */
|
||||
|
||||
/* FFUART */
|
||||
GPIO39_FFUART_TXD,
|
||||
GPIO34_FFUART_RXD,
|
||||
|
||||
/* BFUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO45_BTUART_RTS,
|
||||
|
||||
/* STUART */
|
||||
GPIO46_STUART_RXD,
|
||||
GPIO47_STUART_TXD,
|
||||
|
||||
/* UHC */
|
||||
GPIO88_USBH1_PWR,
|
||||
GPIO89_USBH1_PEN,
|
||||
|
||||
/* LCD */
|
||||
GPIOxx_LCD_TFT_16BPP,
|
||||
|
||||
/* PWM */
|
||||
GPIO16_PWM0_OUT,
|
||||
|
||||
/* I2C */
|
||||
GPIO117_I2C_SCL,
|
||||
GPIO118_I2C_SDA,
|
||||
|
||||
/* LED */
|
||||
GPIO54_GPIO, /* LED A */
|
||||
GPIO55_GPIO, /* LED B */
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
|
||||
static struct pxamci_platform_data income_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.gpio_power = -1,
|
||||
.gpio_card_detect = GPIO0_INCOME_SD_DETECT,
|
||||
.gpio_card_ro = GPIO0_INCOME_SD_RO,
|
||||
.detect_delay_ms = 200,
|
||||
};
|
||||
|
||||
static void __init income_mmc_init(void)
|
||||
{
|
||||
pxa_set_mci_info(&income_mci_platform_data);
|
||||
}
|
||||
#else
|
||||
static inline void income_mmc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* USB Host
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
static struct pxaohci_platform_data income_ohci_info = {
|
||||
.port_mode = PMM_PERPORT_MODE,
|
||||
.flags = ENABLE_PORT1 | POWER_CONTROL_LOW | POWER_SENSE_LOW,
|
||||
};
|
||||
|
||||
static void __init income_uhc_init(void)
|
||||
{
|
||||
pxa_set_ohci_info(&income_ohci_info);
|
||||
}
|
||||
#else
|
||||
static inline void income_uhc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* LED
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
struct gpio_led income_gpio_leds[] = {
|
||||
{
|
||||
.name = "income:green:leda",
|
||||
.default_trigger = "none",
|
||||
.gpio = GPIO54_INCOME_LED_A,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "income:green:ledb",
|
||||
.default_trigger = "none",
|
||||
.gpio = GPIO55_INCOME_LED_B,
|
||||
.active_low = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data income_gpio_led_info = {
|
||||
.leds = income_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(income_gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device income_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &income_gpio_led_info,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init income_led_init(void)
|
||||
{
|
||||
platform_device_register(&income_leds);
|
||||
}
|
||||
#else
|
||||
static inline void income_led_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* I2C
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
|
||||
static struct i2c_board_info __initdata income_i2c_devs[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("ds1340", 0x68),
|
||||
}, {
|
||||
I2C_BOARD_INFO("lm75", 0x4f),
|
||||
},
|
||||
};
|
||||
|
||||
static void __init income_i2c_init(void)
|
||||
{
|
||||
pxa_set_i2c_info(NULL);
|
||||
pxa27x_set_i2c_power_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(income_i2c_devs));
|
||||
}
|
||||
#else
|
||||
static inline void income_i2c_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
|
||||
static struct pxafb_mode_info income_lcd_modes[] = {
|
||||
{
|
||||
.pixclock = 144700,
|
||||
.xres = 320,
|
||||
.yres = 240,
|
||||
.bpp = 32,
|
||||
.depth = 18,
|
||||
|
||||
.left_margin = 10,
|
||||
.right_margin = 10,
|
||||
.upper_margin = 7,
|
||||
.lower_margin = 8,
|
||||
|
||||
.hsync_len = 20,
|
||||
.vsync_len = 2,
|
||||
|
||||
.sync = FB_SYNC_VERT_HIGH_ACT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info income_lcd_screen = {
|
||||
.modes = income_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(income_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_18BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
static void __init income_lcd_init(void)
|
||||
{
|
||||
set_pxa_fb_info(&income_lcd_screen);
|
||||
}
|
||||
#else
|
||||
static inline void income_lcd_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM__MODULE)
|
||||
static struct platform_pwm_backlight_data income_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 0x3ff,
|
||||
.dft_brightness = 0x1ff,
|
||||
.pwm_period_ns = 1000000,
|
||||
};
|
||||
|
||||
static struct platform_device income_backlight = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.parent = &pxa27x_device_pwm0.dev,
|
||||
.platform_data = &income_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init income_pwm_init(void)
|
||||
{
|
||||
platform_device_register(&income_backlight);
|
||||
}
|
||||
#else
|
||||
static inline void income_pwm_init(void) {}
|
||||
#endif
|
||||
|
||||
void __init colibri_pxa270_income_boardinit(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(income_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
income_mmc_init();
|
||||
income_uhc_init();
|
||||
income_led_init();
|
||||
income_i2c_init();
|
||||
income_lcd_init();
|
||||
income_pwm_init();
|
||||
}
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
*
|
||||
* Support for Toradex PXA270 based Colibri module
|
||||
* Daniel Mack <daniel@caiaq.de>
|
||||
* 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
|
||||
|
@ -10,49 +11,55 @@
|
|||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/sizes.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/ucb1400.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/sizes.h>
|
||||
|
||||
#include <mach/pxa27x.h>
|
||||
#include <mach/audio.h>
|
||||
#include <mach/colibri.h>
|
||||
#include <mach/pxa27x.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
#include "generic.h"
|
||||
|
||||
/*
|
||||
* GPIO configuration
|
||||
*/
|
||||
/******************************************************************************
|
||||
* Pin configuration
|
||||
******************************************************************************/
|
||||
static mfp_cfg_t colibri_pxa270_pin_config[] __initdata = {
|
||||
/* Ethernet */
|
||||
GPIO78_nCS_2, /* Ethernet CS */
|
||||
GPIO114_GPIO, /* Ethernet IRQ */
|
||||
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
GPIO95_AC97_nRESET,
|
||||
GPIO98_AC97_SYSCLK,
|
||||
GPIO113_GPIO, /* Touchscreen IRQ */
|
||||
};
|
||||
|
||||
/*
|
||||
* NOR flash
|
||||
*/
|
||||
/******************************************************************************
|
||||
* NOR Flash
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||
static struct mtd_partition colibri_partitions[] = {
|
||||
{
|
||||
.name = "Bootloader",
|
||||
.offset = 0x00000000,
|
||||
.size = 0x00040000,
|
||||
.mask_flags = MTD_WRITEABLE /* force read-only */
|
||||
.mask_flags = MTD_WRITEABLE /* force read-only */
|
||||
}, {
|
||||
.name = "Kernel",
|
||||
.offset = 0x00040000,
|
||||
|
@ -90,50 +97,113 @@ static struct platform_device colibri_pxa270_flash_device = {
|
|||
.num_resources = 1,
|
||||
};
|
||||
|
||||
/*
|
||||
* DM9000 Ethernet
|
||||
*/
|
||||
#if defined(CONFIG_DM9000)
|
||||
static struct resource dm9000_resources[] = {
|
||||
[0] = {
|
||||
.start = COLIBRI_PXA270_ETH_PHYS,
|
||||
.end = COLIBRI_PXA270_ETH_PHYS + 3,
|
||||
static void __init colibri_pxa270_nor_init(void)
|
||||
{
|
||||
platform_device_register(&colibri_pxa270_flash_device);
|
||||
}
|
||||
#else
|
||||
static inline void colibri_pxa270_nor_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Ethernet
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
|
||||
static struct resource colibri_pxa270_dm9000_resources[] = {
|
||||
{
|
||||
.start = PXA_CS2_PHYS,
|
||||
.end = PXA_CS2_PHYS + 3,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = COLIBRI_PXA270_ETH_PHYS + 4,
|
||||
.end = COLIBRI_PXA270_ETH_PHYS + 4 + 500,
|
||||
{
|
||||
.start = PXA_CS2_PHYS + 4,
|
||||
.end = PXA_CS2_PHYS + 4 + 500,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[2] = {
|
||||
.start = COLIBRI_PXA270_ETH_IRQ,
|
||||
.end = COLIBRI_PXA270_ETH_IRQ,
|
||||
{
|
||||
.start = gpio_to_irq(GPIO114_COLIBRI_PXA270_ETH_IRQ),
|
||||
.end = gpio_to_irq(GPIO114_COLIBRI_PXA270_ETH_IRQ),
|
||||
.flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device dm9000_device = {
|
||||
static struct platform_device colibri_pxa270_dm9000_device = {
|
||||
.name = "dm9000",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(dm9000_resources),
|
||||
.resource = dm9000_resources,
|
||||
.num_resources = ARRAY_SIZE(colibri_pxa270_dm9000_resources),
|
||||
.resource = colibri_pxa270_dm9000_resources,
|
||||
};
|
||||
#endif /* CONFIG_DM9000 */
|
||||
|
||||
static struct platform_device *colibri_pxa270_devices[] __initdata = {
|
||||
&colibri_pxa270_flash_device,
|
||||
#if defined(CONFIG_DM9000)
|
||||
&dm9000_device,
|
||||
static void __init colibri_pxa270_eth_init(void)
|
||||
{
|
||||
platform_device_register(&colibri_pxa270_dm9000_device);
|
||||
}
|
||||
#else
|
||||
static inline void colibri_pxa270_eth_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Audio and Touchscreen
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_TOUCHSCREEN_UCB1400) || \
|
||||
defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
|
||||
static pxa2xx_audio_ops_t colibri_pxa270_ac97_pdata = {
|
||||
.reset_gpio = 95,
|
||||
};
|
||||
|
||||
static struct ucb1400_pdata colibri_pxa270_ucb1400_pdata = {
|
||||
.irq = gpio_to_irq(GPIO113_COLIBRI_PXA270_TS_IRQ),
|
||||
};
|
||||
|
||||
static struct platform_device colibri_pxa270_ucb1400_device = {
|
||||
.name = "ucb1400_core",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &colibri_pxa270_ucb1400_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init colibri_pxa270_tsc_init(void)
|
||||
{
|
||||
pxa_set_ac97_info(&colibri_pxa270_ac97_pdata);
|
||||
platform_device_register(&colibri_pxa270_ucb1400_device);
|
||||
}
|
||||
#else
|
||||
static inline void colibri_pxa270_tsc_init(void) {}
|
||||
#endif
|
||||
|
||||
static int colibri_pxa270_baseboard;
|
||||
core_param(colibri_pxa270_baseboard, colibri_pxa270_baseboard, int, 0444);
|
||||
|
||||
static void __init colibri_pxa270_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
platform_add_devices(ARRAY_AND_SIZE(colibri_pxa270_devices));
|
||||
|
||||
colibri_pxa270_nor_init();
|
||||
colibri_pxa270_eth_init();
|
||||
colibri_pxa270_tsc_init();
|
||||
|
||||
switch (colibri_pxa270_baseboard) {
|
||||
case COLIBRI_PXA270_EVALBOARD:
|
||||
colibri_pxa270_evalboard_init();
|
||||
break;
|
||||
case COLIBRI_PXA270_INCOME:
|
||||
colibri_pxa270_income_boardinit();
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "Illegal colibri_pxa270_baseboard type %d\n",
|
||||
colibri_pxa270_baseboard);
|
||||
}
|
||||
}
|
||||
|
||||
/* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either
|
||||
* with the INCOME mach type or with COLIBRI and the kernel parameter
|
||||
* "colibri_pxa270_baseboard=1"
|
||||
*/
|
||||
static void __init colibri_pxa270_income_init(void)
|
||||
{
|
||||
colibri_pxa270_baseboard = COLIBRI_PXA270_INCOME;
|
||||
colibri_pxa270_init();
|
||||
}
|
||||
|
||||
MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
|
||||
|
@ -146,3 +216,13 @@ MACHINE_START(COLIBRI, "Toradex Colibri PXA270")
|
|||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(INCOME, "Income s.r.o. SH-Dmaster PXA270 SBC")
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.init_machine = colibri_pxa270_income_init,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa27x_init_irq,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/sizes.h>
|
||||
|
@ -28,6 +29,8 @@
|
|||
#include <mach/pxafb.h>
|
||||
#include <mach/ohci.h>
|
||||
#include <mach/audio.h>
|
||||
#include <mach/pxa27x-udc.h>
|
||||
#include <mach/udc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
@ -101,6 +104,42 @@ void __init colibri_pxa320_init_ohci(void)
|
|||
static inline void colibri_pxa320_init_ohci(void) {}
|
||||
#endif /* CONFIG_USB_OHCI_HCD || CONFIG_USB_OHCI_HCD_MODULE */
|
||||
|
||||
#if defined(CONFIG_USB_GADGET_PXA27X)||defined(CONFIG_USB_GADGET_PXA27X_MODULE)
|
||||
static struct gpio_vbus_mach_info colibri_pxa320_gpio_vbus_info = {
|
||||
.gpio_vbus = mfp_to_gpio(MFP_PIN_GPIO96),
|
||||
.gpio_pullup = -1,
|
||||
};
|
||||
|
||||
static struct platform_device colibri_pxa320_gpio_vbus = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &colibri_pxa320_gpio_vbus_info,
|
||||
},
|
||||
};
|
||||
|
||||
static void colibri_pxa320_udc_command(int cmd)
|
||||
{
|
||||
if (cmd == PXA2XX_UDC_CMD_CONNECT)
|
||||
UP2OCR = UP2OCR_HXOE | UP2OCR_DPPUE;
|
||||
else if (cmd == PXA2XX_UDC_CMD_DISCONNECT)
|
||||
UP2OCR = UP2OCR_HXOE;
|
||||
}
|
||||
|
||||
static struct pxa2xx_udc_mach_info colibri_pxa320_udc_info __initdata = {
|
||||
.udc_command = colibri_pxa320_udc_command,
|
||||
.gpio_pullup = -1,
|
||||
};
|
||||
|
||||
static void __init colibri_pxa320_init_udc(void)
|
||||
{
|
||||
pxa_set_udc_info(&colibri_pxa320_udc_info);
|
||||
platform_device_register(&colibri_pxa320_gpio_vbus);
|
||||
}
|
||||
#else
|
||||
static inline void colibri_pxa320_init_udc(void) {}
|
||||
#endif
|
||||
|
||||
static mfp_cfg_t colibri_pxa320_mmc_pin_config[] __initdata = {
|
||||
GPIO22_MMC1_CLK,
|
||||
GPIO23_MMC1_CMD,
|
||||
|
@ -212,6 +251,7 @@ void __init colibri_pxa320_init(void)
|
|||
colibri_pxa3xx_init_mmc(ARRAY_AND_SIZE(colibri_pxa320_mmc_pin_config),
|
||||
mfp_to_gpio(MFP_PIN_GPIO28));
|
||||
colibri_pxa320_init_uart();
|
||||
colibri_pxa320_init_udc();
|
||||
}
|
||||
|
||||
MACHINE_START(COLIBRI320, "Toradex Colibri PXA320")
|
||||
|
|
|
@ -50,14 +50,13 @@
|
|||
#include <mach/udc.h>
|
||||
#include <mach/pxa2xx_spi.h>
|
||||
#include <mach/corgi.h>
|
||||
#include <mach/sharpsl.h>
|
||||
#include <mach/sharpsl_pm.h>
|
||||
|
||||
#include <asm/mach/sharpsl_param.h>
|
||||
#include <asm/hardware/scoop.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
#include "sharpsl.h"
|
||||
|
||||
static unsigned long corgi_pin_config[] __initdata = {
|
||||
/* Static Memory I/O */
|
||||
|
@ -185,8 +184,6 @@ static struct scoop_pcmcia_config corgi_pcmcia_config = {
|
|||
.num_devs = 1,
|
||||
};
|
||||
|
||||
EXPORT_SYMBOL(corgiscoop_device);
|
||||
|
||||
static struct w100_mem_info corgi_fb_mem = {
|
||||
.ext_cntl = 0x00040003,
|
||||
.sdram_mode_reg = 0x00650021,
|
||||
|
|
|
@ -23,12 +23,11 @@
|
|||
#include <asm/mach-types.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include <mach/sharpsl.h>
|
||||
#include <mach/corgi.h>
|
||||
#include <mach/pxa2xx-regs.h>
|
||||
#include <mach/sharpsl_pm.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "sharpsl.h"
|
||||
|
||||
#define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */
|
||||
#define SHARPSL_CHARGE_ON_TEMP 0xe0 /* 2.9V */
|
||||
|
@ -134,11 +133,11 @@ unsigned long corgipm_read_devdata(int type)
|
|||
case SHARPSL_STATUS_ACIN:
|
||||
return ((GPLR(CORGI_GPIO_AC_IN) & GPIO_bit(CORGI_GPIO_AC_IN)) != 0);
|
||||
case SHARPSL_STATUS_LOCK:
|
||||
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock);
|
||||
return gpio_get_value(sharpsl_pm.machinfo->gpio_batlock);
|
||||
case SHARPSL_STATUS_CHRGFULL:
|
||||
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull);
|
||||
return gpio_get_value(sharpsl_pm.machinfo->gpio_batfull);
|
||||
case SHARPSL_STATUS_FATAL:
|
||||
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal);
|
||||
return gpio_get_value(sharpsl_pm.machinfo->gpio_fatal);
|
||||
case SHARPSL_ACIN_VOLT:
|
||||
return sharpsl_pm_pxa_read_max1111(MAX1111_ACIN_VOLT);
|
||||
case SHARPSL_BATT_TEMP:
|
||||
|
@ -165,8 +164,6 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
|
|||
.should_wakeup = corgi_should_wakeup,
|
||||
#if defined(CONFIG_LCD_CORGI)
|
||||
.backlight_limit = corgi_lcd_limit_intensity,
|
||||
#elif defined(CONFIG_BACKLIGHT_CORGI)
|
||||
.backlight_limit = corgibl_limit_intensity,
|
||||
#endif
|
||||
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
|
||||
.charge_on_temp = SHARPSL_CHARGE_ON_TEMP,
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/pmu.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/pxafb.h>
|
||||
#include <mach/mmc.h>
|
||||
|
@ -31,6 +32,19 @@ void __init pxa_register_device(struct platform_device *dev, void *data)
|
|||
dev_err(&dev->dev, "unable to register device: %d\n", ret);
|
||||
}
|
||||
|
||||
static struct resource pxa_resource_pmu = {
|
||||
.start = IRQ_PMU,
|
||||
.end = IRQ_PMU,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
};
|
||||
|
||||
struct platform_device pxa_device_pmu = {
|
||||
.name = "arm-pmu",
|
||||
.id = ARM_PMU_DEVICE_CPU,
|
||||
.resource = &pxa_resource_pmu,
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
static struct resource pxamci_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x41100000,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
extern struct platform_device pxa_device_pmu;
|
||||
extern struct platform_device pxa_device_mci;
|
||||
extern struct platform_device pxa3xx_device_mci2;
|
||||
extern struct platform_device pxa3xx_device_mci3;
|
||||
|
|
|
@ -1,78 +0,0 @@
|
|||
/*
|
||||
* Hardware definitions for the Toshiba e330 PDAs
|
||||
*
|
||||
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
|
||||
*
|
||||
* This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/tc6387xb.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/pxa25x.h>
|
||||
#include <mach/eseries-gpio.h>
|
||||
#include <mach/udc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "eseries.h"
|
||||
#include "clock.h"
|
||||
|
||||
/* -------------------- e330 tc6387xb parameters -------------------- */
|
||||
|
||||
static struct tc6387xb_platform_data e330_tc6387xb_info = {
|
||||
.enable = &eseries_tmio_enable,
|
||||
.disable = &eseries_tmio_disable,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
};
|
||||
|
||||
static struct platform_device e330_tc6387xb_device = {
|
||||
.name = "tc6387xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e330_tc6387xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&e330_tc6387xb_device,
|
||||
};
|
||||
|
||||
static void __init e330_init(void)
|
||||
{
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
eseries_register_clks();
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
}
|
||||
|
||||
MACHINE_START(E330, "Toshiba e330")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e330_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
/*
|
||||
* Hardware definitions for the Toshiba e350 PDAs
|
||||
*
|
||||
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
|
||||
*
|
||||
* This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/t7l66xb.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/pxa25x.h>
|
||||
#include <mach/eseries-gpio.h>
|
||||
#include <mach/udc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "eseries.h"
|
||||
#include "clock.h"
|
||||
|
||||
/* -------------------- e350 t7l66xb parameters -------------------- */
|
||||
|
||||
static struct t7l66xb_platform_data e350_t7l66xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
};
|
||||
|
||||
static struct platform_device e350_t7l66xb_device = {
|
||||
.name = "t7l66xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e350_t7l66xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&e350_t7l66xb_device,
|
||||
};
|
||||
|
||||
static void __init e350_init(void)
|
||||
{
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
eseries_register_clks();
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
}
|
||||
|
||||
MACHINE_START(E350, "Toshiba e350")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e350_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
|
@ -1,155 +0,0 @@
|
|||
/*
|
||||
* Hardware definitions for the Toshiba eseries PDAs
|
||||
*
|
||||
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
|
||||
*
|
||||
* This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/t7l66xb.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/pxa25x.h>
|
||||
#include <mach/eseries-gpio.h>
|
||||
#include <mach/pxafb.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "eseries.h"
|
||||
#include "clock.h"
|
||||
|
||||
/* ------------------------ E400 LCD definitions ------------------------ */
|
||||
|
||||
static struct pxafb_mode_info e400_pxafb_mode_info = {
|
||||
.pixclock = 140703,
|
||||
.xres = 240,
|
||||
.yres = 320,
|
||||
.bpp = 16,
|
||||
.hsync_len = 4,
|
||||
.left_margin = 28,
|
||||
.right_margin = 8,
|
||||
.vsync_len = 3,
|
||||
.upper_margin = 5,
|
||||
.lower_margin = 6,
|
||||
.sync = 0,
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info e400_pxafb_mach_info = {
|
||||
.modes = &e400_pxafb_mode_info,
|
||||
.num_modes = 1,
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP,
|
||||
.lccr3 = 0,
|
||||
.pxafb_backlight_power = NULL,
|
||||
};
|
||||
|
||||
/* ------------------------ E400 MFP config ----------------------------- */
|
||||
|
||||
static unsigned long e400_pin_config[] __initdata = {
|
||||
/* Chip selects */
|
||||
GPIO15_nCS_1, /* CS1 - Flash */
|
||||
GPIO80_nCS_4, /* CS4 - TMIO */
|
||||
|
||||
/* Clocks */
|
||||
GPIO12_32KHz,
|
||||
|
||||
/* BTUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
|
||||
/* TMIO controller */
|
||||
GPIO19_GPIO, /* t7l66xb #PCLR */
|
||||
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
|
||||
|
||||
/* wakeup */
|
||||
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static struct mtd_partition partition_a = {
|
||||
.name = "Internal NAND flash",
|
||||
.offset = 0,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
};
|
||||
|
||||
static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
|
||||
|
||||
static struct nand_bbt_descr e400_t7l66xb_nand_bbt = {
|
||||
.options = 0,
|
||||
.offs = 4,
|
||||
.len = 2,
|
||||
.pattern = scan_ff_pattern
|
||||
};
|
||||
|
||||
static struct tmio_nand_data e400_t7l66xb_nand_config = {
|
||||
.num_partitions = 1,
|
||||
.partition = &partition_a,
|
||||
.badblock_pattern = &e400_t7l66xb_nand_bbt,
|
||||
};
|
||||
|
||||
static struct t7l66xb_platform_data e400_t7l66xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
|
||||
.nand_data = &e400_t7l66xb_nand_config,
|
||||
};
|
||||
|
||||
static struct platform_device e400_t7l66xb_device = {
|
||||
.name = "t7l66xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e400_t7l66xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&e400_t7l66xb_device,
|
||||
};
|
||||
|
||||
static void __init e400_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
/* Fixme - e400 may have a switched clock */
|
||||
eseries_register_clks();
|
||||
eseries_get_tmio_gpios();
|
||||
set_pxa_fb_info(&e400_pxafb_mach_info);
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
}
|
||||
|
||||
MACHINE_START(E400, "Toshiba e400")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e400_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
|
@ -1,225 +0,0 @@
|
|||
/*
|
||||
* Hardware definitions for the Toshiba eseries PDAs
|
||||
*
|
||||
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
|
||||
*
|
||||
* This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mfd/t7l66xb.h>
|
||||
|
||||
#include <video/w100fb.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/pxa25x.h>
|
||||
#include <mach/eseries-gpio.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/irda.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/audio.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "eseries.h"
|
||||
#include "clock.h"
|
||||
#include "devices.h"
|
||||
|
||||
/* ------------------------ e740 video support --------------------------- */
|
||||
|
||||
static struct w100_gen_regs e740_lcd_regs = {
|
||||
.lcd_format = 0x00008023,
|
||||
.lcdd_cntl1 = 0x0f000000,
|
||||
.lcdd_cntl2 = 0x0003ffff,
|
||||
.genlcd_cntl1 = 0x00ffff03,
|
||||
.genlcd_cntl2 = 0x003c0f03,
|
||||
.genlcd_cntl3 = 0x000143aa,
|
||||
};
|
||||
|
||||
static struct w100_mode e740_lcd_mode = {
|
||||
.xres = 240,
|
||||
.yres = 320,
|
||||
.left_margin = 20,
|
||||
.right_margin = 28,
|
||||
.upper_margin = 9,
|
||||
.lower_margin = 8,
|
||||
.crtc_ss = 0x80140013,
|
||||
.crtc_ls = 0x81150110,
|
||||
.crtc_gs = 0x80050005,
|
||||
.crtc_vpos_gs = 0x000a0009,
|
||||
.crtc_rev = 0x0040010a,
|
||||
.crtc_dclk = 0xa906000a,
|
||||
.crtc_gclk = 0x80050108,
|
||||
.crtc_goe = 0x80050108,
|
||||
.pll_freq = 57,
|
||||
.pixclk_divider = 4,
|
||||
.pixclk_divider_rotated = 4,
|
||||
.pixclk_src = CLK_SRC_XTAL,
|
||||
.sysclk_divider = 1,
|
||||
.sysclk_src = CLK_SRC_PLL,
|
||||
.crtc_ps1_active = 0x41060010,
|
||||
};
|
||||
|
||||
static struct w100_gpio_regs e740_w100_gpio_info = {
|
||||
.init_data1 = 0x21002103,
|
||||
.gpio_dir1 = 0xffffdeff,
|
||||
.gpio_oe1 = 0x03c00643,
|
||||
.init_data2 = 0x003f003f,
|
||||
.gpio_dir2 = 0xffffffff,
|
||||
.gpio_oe2 = 0x000000ff,
|
||||
};
|
||||
|
||||
static struct w100fb_mach_info e740_fb_info = {
|
||||
.modelist = &e740_lcd_mode,
|
||||
.num_modes = 1,
|
||||
.regs = &e740_lcd_regs,
|
||||
.gpio = &e740_w100_gpio_info,
|
||||
.xtal_freq = 14318000,
|
||||
.xtal_dbl = 1,
|
||||
};
|
||||
|
||||
static struct resource e740_fb_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x0c000000,
|
||||
.end = 0x0cffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device e740_fb_device = {
|
||||
.name = "w100fb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e740_fb_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(e740_fb_resources),
|
||||
.resource = e740_fb_resources,
|
||||
};
|
||||
|
||||
/* --------------------------- MFP Pin config -------------------------- */
|
||||
|
||||
static unsigned long e740_pin_config[] __initdata = {
|
||||
/* Chip selects */
|
||||
GPIO15_nCS_1, /* CS1 - Flash */
|
||||
GPIO79_nCS_3, /* CS3 - IMAGEON */
|
||||
GPIO80_nCS_4, /* CS4 - TMIO */
|
||||
|
||||
/* Clocks */
|
||||
GPIO12_32KHz,
|
||||
|
||||
/* BTUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
|
||||
/* TMIO controller */
|
||||
GPIO19_GPIO, /* t7l66xb #PCLR */
|
||||
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
|
||||
|
||||
/* UDC */
|
||||
GPIO13_GPIO,
|
||||
GPIO3_GPIO,
|
||||
|
||||
/* IrDA */
|
||||
GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
|
||||
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
|
||||
/* Audio power control */
|
||||
GPIO16_GPIO, /* AC97 codec AVDD2 supply (analogue power) */
|
||||
GPIO40_GPIO, /* Mic amp power */
|
||||
GPIO41_GPIO, /* Headphone amp power */
|
||||
|
||||
/* PC Card */
|
||||
GPIO8_GPIO, /* CD0 */
|
||||
GPIO44_GPIO, /* CD1 */
|
||||
GPIO11_GPIO, /* IRQ0 */
|
||||
GPIO6_GPIO, /* IRQ1 */
|
||||
GPIO27_GPIO, /* RST0 */
|
||||
GPIO24_GPIO, /* RST1 */
|
||||
GPIO20_GPIO, /* PWR0 */
|
||||
GPIO23_GPIO, /* PWR1 */
|
||||
GPIO48_nPOE,
|
||||
GPIO49_nPWE,
|
||||
GPIO50_nPIOR,
|
||||
GPIO51_nPIOW,
|
||||
GPIO52_nPCE_1,
|
||||
GPIO53_nPCE_2,
|
||||
GPIO54_nPSKTSEL,
|
||||
GPIO55_nPREG,
|
||||
GPIO56_nPWAIT,
|
||||
GPIO57_nIOIS16,
|
||||
|
||||
/* wakeup */
|
||||
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
|
||||
};
|
||||
|
||||
/* -------------------- e740 t7l66xb parameters -------------------- */
|
||||
|
||||
static struct t7l66xb_platform_data e740_t7l66xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
};
|
||||
|
||||
static struct platform_device e740_t7l66xb_device = {
|
||||
.name = "t7l66xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e740_t7l66xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&e740_fb_device,
|
||||
&e740_t7l66xb_device,
|
||||
};
|
||||
|
||||
static void __init e740_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
eseries_register_clks();
|
||||
clk_add_alias("CLK_CK48M", e740_t7l66xb_device.name,
|
||||
"UDCCLK", &pxa25x_device_udc.dev),
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ficp_info(&e7xx_ficp_platform_data);
|
||||
}
|
||||
|
||||
MACHINE_START(E740, "Toshiba e740")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e740_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
|
@ -1,226 +0,0 @@
|
|||
/*
|
||||
* Hardware definitions for the Toshiba eseries PDAs
|
||||
*
|
||||
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
|
||||
*
|
||||
* This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/mfd/tc6393xb.h>
|
||||
|
||||
#include <video/w100fb.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/pxa25x.h>
|
||||
#include <mach/eseries-gpio.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/irda.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/audio.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "eseries.h"
|
||||
#include "clock.h"
|
||||
|
||||
/* ---------------------- E750 LCD definitions -------------------- */
|
||||
|
||||
static struct w100_gen_regs e750_lcd_regs = {
|
||||
.lcd_format = 0x00008003,
|
||||
.lcdd_cntl1 = 0x00000000,
|
||||
.lcdd_cntl2 = 0x0003ffff,
|
||||
.genlcd_cntl1 = 0x00fff003,
|
||||
.genlcd_cntl2 = 0x003c0f03,
|
||||
.genlcd_cntl3 = 0x000143aa,
|
||||
};
|
||||
|
||||
static struct w100_mode e750_lcd_mode = {
|
||||
.xres = 240,
|
||||
.yres = 320,
|
||||
.left_margin = 21,
|
||||
.right_margin = 22,
|
||||
.upper_margin = 5,
|
||||
.lower_margin = 4,
|
||||
.crtc_ss = 0x80150014,
|
||||
.crtc_ls = 0x8014000d,
|
||||
.crtc_gs = 0xc1000005,
|
||||
.crtc_vpos_gs = 0x00020147,
|
||||
.crtc_rev = 0x0040010a,
|
||||
.crtc_dclk = 0xa1700030,
|
||||
.crtc_gclk = 0x80cc0015,
|
||||
.crtc_goe = 0x80cc0015,
|
||||
.crtc_ps1_active = 0x61060017,
|
||||
.pll_freq = 57,
|
||||
.pixclk_divider = 4,
|
||||
.pixclk_divider_rotated = 4,
|
||||
.pixclk_src = CLK_SRC_XTAL,
|
||||
.sysclk_divider = 1,
|
||||
.sysclk_src = CLK_SRC_PLL,
|
||||
};
|
||||
|
||||
static struct w100_gpio_regs e750_w100_gpio_info = {
|
||||
.init_data1 = 0x01192f1b,
|
||||
.gpio_dir1 = 0xd5ffdeff,
|
||||
.gpio_oe1 = 0x000020bf,
|
||||
.init_data2 = 0x010f010f,
|
||||
.gpio_dir2 = 0xffffffff,
|
||||
.gpio_oe2 = 0x000001cf,
|
||||
};
|
||||
|
||||
static struct w100fb_mach_info e750_fb_info = {
|
||||
.modelist = &e750_lcd_mode,
|
||||
.num_modes = 1,
|
||||
.regs = &e750_lcd_regs,
|
||||
.gpio = &e750_w100_gpio_info,
|
||||
.xtal_freq = 14318000,
|
||||
.xtal_dbl = 1,
|
||||
};
|
||||
|
||||
static struct resource e750_fb_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x0c000000,
|
||||
.end = 0x0cffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device e750_fb_device = {
|
||||
.name = "w100fb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e750_fb_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(e750_fb_resources),
|
||||
.resource = e750_fb_resources,
|
||||
};
|
||||
|
||||
/* -------------------- e750 MFP parameters -------------------- */
|
||||
|
||||
static unsigned long e750_pin_config[] __initdata = {
|
||||
/* Chip selects */
|
||||
GPIO15_nCS_1, /* CS1 - Flash */
|
||||
GPIO79_nCS_3, /* CS3 - IMAGEON */
|
||||
GPIO80_nCS_4, /* CS4 - TMIO */
|
||||
|
||||
/* Clocks */
|
||||
GPIO11_3_6MHz,
|
||||
|
||||
/* BTUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
|
||||
/* TMIO controller */
|
||||
GPIO19_GPIO, /* t7l66xb #PCLR */
|
||||
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
|
||||
|
||||
/* UDC */
|
||||
GPIO13_GPIO,
|
||||
GPIO3_GPIO,
|
||||
|
||||
/* IrDA */
|
||||
GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
|
||||
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
|
||||
/* Audio power control */
|
||||
GPIO4_GPIO, /* Headphone amp power */
|
||||
GPIO7_GPIO, /* Speaker amp power */
|
||||
GPIO37_GPIO, /* Headphone detect */
|
||||
|
||||
/* PC Card */
|
||||
GPIO8_GPIO, /* CD0 */
|
||||
GPIO44_GPIO, /* CD1 */
|
||||
GPIO11_GPIO, /* IRQ0 */
|
||||
GPIO6_GPIO, /* IRQ1 */
|
||||
GPIO27_GPIO, /* RST0 */
|
||||
GPIO24_GPIO, /* RST1 */
|
||||
GPIO20_GPIO, /* PWR0 */
|
||||
GPIO23_GPIO, /* PWR1 */
|
||||
GPIO48_nPOE,
|
||||
GPIO49_nPWE,
|
||||
GPIO50_nPIOR,
|
||||
GPIO51_nPIOW,
|
||||
GPIO52_nPCE_1,
|
||||
GPIO53_nPCE_2,
|
||||
GPIO54_nPSKTSEL,
|
||||
GPIO55_nPREG,
|
||||
GPIO56_nPWAIT,
|
||||
GPIO57_nIOIS16,
|
||||
|
||||
/* wakeup */
|
||||
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
|
||||
};
|
||||
|
||||
/* ----------------- e750 tc6393xb parameters ------------------ */
|
||||
|
||||
static struct tc6393xb_platform_data e750_tc6393xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.scr_pll2cr = 0x0cc1,
|
||||
.scr_gper = 0,
|
||||
.gpio_base = -1,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.disable = &eseries_tmio_disable,
|
||||
};
|
||||
|
||||
static struct platform_device e750_tc6393xb_device = {
|
||||
.name = "tc6393xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e750_tc6393xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&e750_fb_device,
|
||||
&e750_tc6393xb_device,
|
||||
};
|
||||
|
||||
static void __init e750_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e750_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
clk_add_alias("CLK_CK3P6MI", e750_tc6393xb_device.name,
|
||||
"GPIO11_CLK", NULL),
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ficp_info(&e7xx_ficp_platform_data);
|
||||
}
|
||||
|
||||
MACHINE_START(E750, "Toshiba e750")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e750_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
|
@ -1,229 +0,0 @@
|
|||
/*
|
||||
* Hardware definitions for the Toshiba eseries PDAs
|
||||
*
|
||||
* Copyright (c) 2003 Ian Molton <spyro@f2s.com>
|
||||
*
|
||||
* This file is licensed under
|
||||
* the terms of the GNU General Public License version 2. This program
|
||||
* is licensed "as is" without any warranty of any kind, whether express
|
||||
* or implied.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/mfd/tc6393xb.h>
|
||||
|
||||
#include <video/w100fb.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/pxa25x.h>
|
||||
#include <mach/eseries-gpio.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/irqs.h>
|
||||
#include <mach/audio.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "eseries.h"
|
||||
#include "clock.h"
|
||||
|
||||
/* ------------------------ e800 LCD definitions ------------------------- */
|
||||
|
||||
static unsigned long e800_pin_config[] __initdata = {
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
};
|
||||
|
||||
static struct w100_gen_regs e800_lcd_regs = {
|
||||
.lcd_format = 0x00008003,
|
||||
.lcdd_cntl1 = 0x02a00000,
|
||||
.lcdd_cntl2 = 0x0003ffff,
|
||||
.genlcd_cntl1 = 0x000ff2a3,
|
||||
.genlcd_cntl2 = 0x000002a3,
|
||||
.genlcd_cntl3 = 0x000102aa,
|
||||
};
|
||||
|
||||
static struct w100_mode e800_lcd_mode[2] = {
|
||||
[0] = {
|
||||
.xres = 480,
|
||||
.yres = 640,
|
||||
.left_margin = 52,
|
||||
.right_margin = 148,
|
||||
.upper_margin = 2,
|
||||
.lower_margin = 6,
|
||||
.crtc_ss = 0x80350034,
|
||||
.crtc_ls = 0x802b0026,
|
||||
.crtc_gs = 0x80160016,
|
||||
.crtc_vpos_gs = 0x00020003,
|
||||
.crtc_rev = 0x0040001d,
|
||||
.crtc_dclk = 0xe0000000,
|
||||
.crtc_gclk = 0x82a50049,
|
||||
.crtc_goe = 0x80ee001c,
|
||||
.crtc_ps1_active = 0x00000000,
|
||||
.pll_freq = 128,
|
||||
.pixclk_divider = 4,
|
||||
.pixclk_divider_rotated = 6,
|
||||
.pixclk_src = CLK_SRC_PLL,
|
||||
.sysclk_divider = 0,
|
||||
.sysclk_src = CLK_SRC_PLL,
|
||||
},
|
||||
[1] = {
|
||||
.xres = 240,
|
||||
.yres = 320,
|
||||
.left_margin = 15,
|
||||
.right_margin = 88,
|
||||
.upper_margin = 0,
|
||||
.lower_margin = 7,
|
||||
.crtc_ss = 0xd010000f,
|
||||
.crtc_ls = 0x80070003,
|
||||
.crtc_gs = 0x80000000,
|
||||
.crtc_vpos_gs = 0x01460147,
|
||||
.crtc_rev = 0x00400003,
|
||||
.crtc_dclk = 0xa1700030,
|
||||
.crtc_gclk = 0x814b0008,
|
||||
.crtc_goe = 0x80cc0015,
|
||||
.crtc_ps1_active = 0x00000000,
|
||||
.pll_freq = 100,
|
||||
.pixclk_divider = 6, /* Wince uses 14 which gives a */
|
||||
.pixclk_divider_rotated = 6, /* 7MHz Pclk. We use a 14MHz one */
|
||||
.pixclk_src = CLK_SRC_PLL,
|
||||
.sysclk_divider = 0,
|
||||
.sysclk_src = CLK_SRC_PLL,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static struct w100_gpio_regs e800_w100_gpio_info = {
|
||||
.init_data1 = 0xc13fc019,
|
||||
.gpio_dir1 = 0x3e40df7f,
|
||||
.gpio_oe1 = 0x003c3000,
|
||||
.init_data2 = 0x00000000,
|
||||
.gpio_dir2 = 0x00000000,
|
||||
.gpio_oe2 = 0x00000000,
|
||||
};
|
||||
|
||||
static struct w100_mem_info e800_w100_mem_info = {
|
||||
.ext_cntl = 0x09640011,
|
||||
.sdram_mode_reg = 0x00600021,
|
||||
.ext_timing_cntl = 0x10001545,
|
||||
.io_cntl = 0x7ddd7333,
|
||||
.size = 0x1fffff,
|
||||
};
|
||||
|
||||
static void e800_tg_change(struct w100fb_par *par)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
tmp = w100fb_gpio_read(W100_GPIO_PORT_A);
|
||||
if (par->mode->xres == 480)
|
||||
tmp |= 0x100;
|
||||
else
|
||||
tmp &= ~0x100;
|
||||
w100fb_gpio_write(W100_GPIO_PORT_A, tmp);
|
||||
}
|
||||
|
||||
static struct w100_tg_info e800_tg_info = {
|
||||
.change = e800_tg_change,
|
||||
};
|
||||
|
||||
static struct w100fb_mach_info e800_fb_info = {
|
||||
.modelist = e800_lcd_mode,
|
||||
.num_modes = 2,
|
||||
.regs = &e800_lcd_regs,
|
||||
.gpio = &e800_w100_gpio_info,
|
||||
.mem = &e800_w100_mem_info,
|
||||
.tg = &e800_tg_info,
|
||||
.xtal_freq = 16000000,
|
||||
};
|
||||
|
||||
static struct resource e800_fb_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x0c000000,
|
||||
.end = 0x0cffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device e800_fb_device = {
|
||||
.name = "w100fb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e800_fb_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(e800_fb_resources),
|
||||
.resource = e800_fb_resources,
|
||||
};
|
||||
|
||||
/* --------------------------- UDC definitions --------------------------- */
|
||||
|
||||
static struct pxa2xx_udc_mach_info e800_udc_mach_info = {
|
||||
.gpio_vbus = GPIO_E800_USB_DISC,
|
||||
.gpio_pullup = GPIO_E800_USB_PULLUP,
|
||||
.gpio_pullup_inverted = 1
|
||||
};
|
||||
|
||||
/* ----------------- e800 tc6393xb parameters ------------------ */
|
||||
|
||||
static struct tc6393xb_platform_data e800_tc6393xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.scr_pll2cr = 0x0cc1,
|
||||
.scr_gper = 0,
|
||||
.gpio_base = -1,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.disable = &eseries_tmio_disable,
|
||||
};
|
||||
|
||||
static struct platform_device e800_tc6393xb_device = {
|
||||
.name = "tc6393xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e800_tc6393xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&e800_fb_device,
|
||||
&e800_tc6393xb_device,
|
||||
};
|
||||
|
||||
static void __init e800_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e800_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
clk_add_alias("CLK_CK3P6MI", e800_tc6393xb_device.name,
|
||||
"GPIO11_CLK", NULL),
|
||||
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")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e800_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
|
|
@ -15,6 +15,13 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/tc6387xb.h>
|
||||
#include <linux/mfd/tc6393xb.h>
|
||||
#include <linux/mfd/t7l66xb.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <video/w100fb.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -22,9 +29,12 @@
|
|||
|
||||
#include <mach/pxa25x.h>
|
||||
#include <mach/eseries-gpio.h>
|
||||
#include <mach/audio.h>
|
||||
#include <mach/pxafb.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/irda.h>
|
||||
|
||||
#include "devices.h"
|
||||
#include "generic.h"
|
||||
#include "clock.h"
|
||||
|
||||
|
@ -130,3 +140,802 @@ void eseries_register_clks(void)
|
|||
clkdev_add_table(eseries_clkregs, ARRAY_SIZE(eseries_clkregs));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MACH_E330
|
||||
/* -------------------- e330 tc6387xb parameters -------------------- */
|
||||
|
||||
static struct tc6387xb_platform_data e330_tc6387xb_info = {
|
||||
.enable = &eseries_tmio_enable,
|
||||
.disable = &eseries_tmio_disable,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
};
|
||||
|
||||
static struct platform_device e330_tc6387xb_device = {
|
||||
.name = "tc6387xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e330_tc6387xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *e330_devices[] __initdata = {
|
||||
&e330_tc6387xb_device,
|
||||
};
|
||||
|
||||
static void __init e330_init(void)
|
||||
{
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
eseries_register_clks();
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e330_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
}
|
||||
|
||||
MACHINE_START(E330, "Toshiba e330")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e330_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E350
|
||||
/* -------------------- e350 t7l66xb parameters -------------------- */
|
||||
|
||||
static struct t7l66xb_platform_data e350_t7l66xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
};
|
||||
|
||||
static struct platform_device e350_t7l66xb_device = {
|
||||
.name = "t7l66xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e350_t7l66xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *e350_devices[] __initdata = {
|
||||
&e350_t7l66xb_device,
|
||||
};
|
||||
|
||||
static void __init e350_init(void)
|
||||
{
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
eseries_register_clks();
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e350_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
}
|
||||
|
||||
MACHINE_START(E350, "Toshiba e350")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e350_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E400
|
||||
/* ------------------------ E400 LCD definitions ------------------------ */
|
||||
|
||||
static struct pxafb_mode_info e400_pxafb_mode_info = {
|
||||
.pixclock = 140703,
|
||||
.xres = 240,
|
||||
.yres = 320,
|
||||
.bpp = 16,
|
||||
.hsync_len = 4,
|
||||
.left_margin = 28,
|
||||
.right_margin = 8,
|
||||
.vsync_len = 3,
|
||||
.upper_margin = 5,
|
||||
.lower_margin = 6,
|
||||
.sync = 0,
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info e400_pxafb_mach_info = {
|
||||
.modes = &e400_pxafb_mode_info,
|
||||
.num_modes = 1,
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP,
|
||||
.lccr3 = 0,
|
||||
.pxafb_backlight_power = NULL,
|
||||
};
|
||||
|
||||
/* ------------------------ E400 MFP config ----------------------------- */
|
||||
|
||||
static unsigned long e400_pin_config[] __initdata = {
|
||||
/* Chip selects */
|
||||
GPIO15_nCS_1, /* CS1 - Flash */
|
||||
GPIO80_nCS_4, /* CS4 - TMIO */
|
||||
|
||||
/* Clocks */
|
||||
GPIO12_32KHz,
|
||||
|
||||
/* BTUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
|
||||
/* TMIO controller */
|
||||
GPIO19_GPIO, /* t7l66xb #PCLR */
|
||||
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
|
||||
|
||||
/* wakeup */
|
||||
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static struct mtd_partition partition_a = {
|
||||
.name = "Internal NAND flash",
|
||||
.offset = 0,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
};
|
||||
|
||||
static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
|
||||
|
||||
static struct nand_bbt_descr e400_t7l66xb_nand_bbt = {
|
||||
.options = 0,
|
||||
.offs = 4,
|
||||
.len = 2,
|
||||
.pattern = scan_ff_pattern
|
||||
};
|
||||
|
||||
static struct tmio_nand_data e400_t7l66xb_nand_config = {
|
||||
.num_partitions = 1,
|
||||
.partition = &partition_a,
|
||||
.badblock_pattern = &e400_t7l66xb_nand_bbt,
|
||||
};
|
||||
|
||||
static struct t7l66xb_platform_data e400_t7l66xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
|
||||
.nand_data = &e400_t7l66xb_nand_config,
|
||||
};
|
||||
|
||||
static struct platform_device e400_t7l66xb_device = {
|
||||
.name = "t7l66xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e400_t7l66xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ---------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *e400_devices[] __initdata = {
|
||||
&e400_t7l66xb_device,
|
||||
};
|
||||
|
||||
static void __init e400_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
/* Fixme - e400 may have a switched clock */
|
||||
eseries_register_clks();
|
||||
eseries_get_tmio_gpios();
|
||||
set_pxa_fb_info(&e400_pxafb_mach_info);
|
||||
platform_add_devices(ARRAY_AND_SIZE(e400_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
}
|
||||
|
||||
MACHINE_START(E400, "Toshiba e400")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e400_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E740
|
||||
/* ------------------------ e740 video support --------------------------- */
|
||||
|
||||
static struct w100_gen_regs e740_lcd_regs = {
|
||||
.lcd_format = 0x00008023,
|
||||
.lcdd_cntl1 = 0x0f000000,
|
||||
.lcdd_cntl2 = 0x0003ffff,
|
||||
.genlcd_cntl1 = 0x00ffff03,
|
||||
.genlcd_cntl2 = 0x003c0f03,
|
||||
.genlcd_cntl3 = 0x000143aa,
|
||||
};
|
||||
|
||||
static struct w100_mode e740_lcd_mode = {
|
||||
.xres = 240,
|
||||
.yres = 320,
|
||||
.left_margin = 20,
|
||||
.right_margin = 28,
|
||||
.upper_margin = 9,
|
||||
.lower_margin = 8,
|
||||
.crtc_ss = 0x80140013,
|
||||
.crtc_ls = 0x81150110,
|
||||
.crtc_gs = 0x80050005,
|
||||
.crtc_vpos_gs = 0x000a0009,
|
||||
.crtc_rev = 0x0040010a,
|
||||
.crtc_dclk = 0xa906000a,
|
||||
.crtc_gclk = 0x80050108,
|
||||
.crtc_goe = 0x80050108,
|
||||
.pll_freq = 57,
|
||||
.pixclk_divider = 4,
|
||||
.pixclk_divider_rotated = 4,
|
||||
.pixclk_src = CLK_SRC_XTAL,
|
||||
.sysclk_divider = 1,
|
||||
.sysclk_src = CLK_SRC_PLL,
|
||||
.crtc_ps1_active = 0x41060010,
|
||||
};
|
||||
|
||||
static struct w100_gpio_regs e740_w100_gpio_info = {
|
||||
.init_data1 = 0x21002103,
|
||||
.gpio_dir1 = 0xffffdeff,
|
||||
.gpio_oe1 = 0x03c00643,
|
||||
.init_data2 = 0x003f003f,
|
||||
.gpio_dir2 = 0xffffffff,
|
||||
.gpio_oe2 = 0x000000ff,
|
||||
};
|
||||
|
||||
static struct w100fb_mach_info e740_fb_info = {
|
||||
.modelist = &e740_lcd_mode,
|
||||
.num_modes = 1,
|
||||
.regs = &e740_lcd_regs,
|
||||
.gpio = &e740_w100_gpio_info,
|
||||
.xtal_freq = 14318000,
|
||||
.xtal_dbl = 1,
|
||||
};
|
||||
|
||||
static struct resource e740_fb_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x0c000000,
|
||||
.end = 0x0cffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device e740_fb_device = {
|
||||
.name = "w100fb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e740_fb_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(e740_fb_resources),
|
||||
.resource = e740_fb_resources,
|
||||
};
|
||||
|
||||
/* --------------------------- MFP Pin config -------------------------- */
|
||||
|
||||
static unsigned long e740_pin_config[] __initdata = {
|
||||
/* Chip selects */
|
||||
GPIO15_nCS_1, /* CS1 - Flash */
|
||||
GPIO79_nCS_3, /* CS3 - IMAGEON */
|
||||
GPIO80_nCS_4, /* CS4 - TMIO */
|
||||
|
||||
/* Clocks */
|
||||
GPIO12_32KHz,
|
||||
|
||||
/* BTUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
|
||||
/* TMIO controller */
|
||||
GPIO19_GPIO, /* t7l66xb #PCLR */
|
||||
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
|
||||
|
||||
/* UDC */
|
||||
GPIO13_GPIO,
|
||||
GPIO3_GPIO,
|
||||
|
||||
/* IrDA */
|
||||
GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
|
||||
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
|
||||
/* Audio power control */
|
||||
GPIO16_GPIO, /* AC97 codec AVDD2 supply (analogue power) */
|
||||
GPIO40_GPIO, /* Mic amp power */
|
||||
GPIO41_GPIO, /* Headphone amp power */
|
||||
|
||||
/* PC Card */
|
||||
GPIO8_GPIO, /* CD0 */
|
||||
GPIO44_GPIO, /* CD1 */
|
||||
GPIO11_GPIO, /* IRQ0 */
|
||||
GPIO6_GPIO, /* IRQ1 */
|
||||
GPIO27_GPIO, /* RST0 */
|
||||
GPIO24_GPIO, /* RST1 */
|
||||
GPIO20_GPIO, /* PWR0 */
|
||||
GPIO23_GPIO, /* PWR1 */
|
||||
GPIO48_nPOE,
|
||||
GPIO49_nPWE,
|
||||
GPIO50_nPIOR,
|
||||
GPIO51_nPIOW,
|
||||
GPIO52_nPCE_1,
|
||||
GPIO53_nPCE_2,
|
||||
GPIO54_nPSKTSEL,
|
||||
GPIO55_nPREG,
|
||||
GPIO56_nPWAIT,
|
||||
GPIO57_nIOIS16,
|
||||
|
||||
/* wakeup */
|
||||
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
|
||||
};
|
||||
|
||||
/* -------------------- e740 t7l66xb parameters -------------------- */
|
||||
|
||||
static struct t7l66xb_platform_data e740_t7l66xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
};
|
||||
|
||||
static struct platform_device e740_t7l66xb_device = {
|
||||
.name = "t7l66xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e740_t7l66xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *e740_devices[] __initdata = {
|
||||
&e740_fb_device,
|
||||
&e740_t7l66xb_device,
|
||||
};
|
||||
|
||||
static void __init e740_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
eseries_register_clks();
|
||||
clk_add_alias("CLK_CK48M", e740_t7l66xb_device.name,
|
||||
"UDCCLK", &pxa25x_device_udc.dev),
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e740_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ficp_info(&e7xx_ficp_platform_data);
|
||||
}
|
||||
|
||||
MACHINE_START(E740, "Toshiba e740")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e740_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E750
|
||||
/* ---------------------- E750 LCD definitions -------------------- */
|
||||
|
||||
static struct w100_gen_regs e750_lcd_regs = {
|
||||
.lcd_format = 0x00008003,
|
||||
.lcdd_cntl1 = 0x00000000,
|
||||
.lcdd_cntl2 = 0x0003ffff,
|
||||
.genlcd_cntl1 = 0x00fff003,
|
||||
.genlcd_cntl2 = 0x003c0f03,
|
||||
.genlcd_cntl3 = 0x000143aa,
|
||||
};
|
||||
|
||||
static struct w100_mode e750_lcd_mode = {
|
||||
.xres = 240,
|
||||
.yres = 320,
|
||||
.left_margin = 21,
|
||||
.right_margin = 22,
|
||||
.upper_margin = 5,
|
||||
.lower_margin = 4,
|
||||
.crtc_ss = 0x80150014,
|
||||
.crtc_ls = 0x8014000d,
|
||||
.crtc_gs = 0xc1000005,
|
||||
.crtc_vpos_gs = 0x00020147,
|
||||
.crtc_rev = 0x0040010a,
|
||||
.crtc_dclk = 0xa1700030,
|
||||
.crtc_gclk = 0x80cc0015,
|
||||
.crtc_goe = 0x80cc0015,
|
||||
.crtc_ps1_active = 0x61060017,
|
||||
.pll_freq = 57,
|
||||
.pixclk_divider = 4,
|
||||
.pixclk_divider_rotated = 4,
|
||||
.pixclk_src = CLK_SRC_XTAL,
|
||||
.sysclk_divider = 1,
|
||||
.sysclk_src = CLK_SRC_PLL,
|
||||
};
|
||||
|
||||
static struct w100_gpio_regs e750_w100_gpio_info = {
|
||||
.init_data1 = 0x01192f1b,
|
||||
.gpio_dir1 = 0xd5ffdeff,
|
||||
.gpio_oe1 = 0x000020bf,
|
||||
.init_data2 = 0x010f010f,
|
||||
.gpio_dir2 = 0xffffffff,
|
||||
.gpio_oe2 = 0x000001cf,
|
||||
};
|
||||
|
||||
static struct w100fb_mach_info e750_fb_info = {
|
||||
.modelist = &e750_lcd_mode,
|
||||
.num_modes = 1,
|
||||
.regs = &e750_lcd_regs,
|
||||
.gpio = &e750_w100_gpio_info,
|
||||
.xtal_freq = 14318000,
|
||||
.xtal_dbl = 1,
|
||||
};
|
||||
|
||||
static struct resource e750_fb_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x0c000000,
|
||||
.end = 0x0cffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device e750_fb_device = {
|
||||
.name = "w100fb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e750_fb_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(e750_fb_resources),
|
||||
.resource = e750_fb_resources,
|
||||
};
|
||||
|
||||
/* -------------------- e750 MFP parameters -------------------- */
|
||||
|
||||
static unsigned long e750_pin_config[] __initdata = {
|
||||
/* Chip selects */
|
||||
GPIO15_nCS_1, /* CS1 - Flash */
|
||||
GPIO79_nCS_3, /* CS3 - IMAGEON */
|
||||
GPIO80_nCS_4, /* CS4 - TMIO */
|
||||
|
||||
/* Clocks */
|
||||
GPIO11_3_6MHz,
|
||||
|
||||
/* BTUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
|
||||
/* TMIO controller */
|
||||
GPIO19_GPIO, /* t7l66xb #PCLR */
|
||||
GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */
|
||||
|
||||
/* UDC */
|
||||
GPIO13_GPIO,
|
||||
GPIO3_GPIO,
|
||||
|
||||
/* IrDA */
|
||||
GPIO38_GPIO | MFP_LPM_DRIVE_HIGH,
|
||||
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
|
||||
/* Audio power control */
|
||||
GPIO4_GPIO, /* Headphone amp power */
|
||||
GPIO7_GPIO, /* Speaker amp power */
|
||||
GPIO37_GPIO, /* Headphone detect */
|
||||
|
||||
/* PC Card */
|
||||
GPIO8_GPIO, /* CD0 */
|
||||
GPIO44_GPIO, /* CD1 */
|
||||
GPIO11_GPIO, /* IRQ0 */
|
||||
GPIO6_GPIO, /* IRQ1 */
|
||||
GPIO27_GPIO, /* RST0 */
|
||||
GPIO24_GPIO, /* RST1 */
|
||||
GPIO20_GPIO, /* PWR0 */
|
||||
GPIO23_GPIO, /* PWR1 */
|
||||
GPIO48_nPOE,
|
||||
GPIO49_nPWE,
|
||||
GPIO50_nPIOR,
|
||||
GPIO51_nPIOW,
|
||||
GPIO52_nPCE_1,
|
||||
GPIO53_nPCE_2,
|
||||
GPIO54_nPSKTSEL,
|
||||
GPIO55_nPREG,
|
||||
GPIO56_nPWAIT,
|
||||
GPIO57_nIOIS16,
|
||||
|
||||
/* wakeup */
|
||||
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
|
||||
};
|
||||
|
||||
/* ----------------- e750 tc6393xb parameters ------------------ */
|
||||
|
||||
static struct tc6393xb_platform_data e750_tc6393xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.scr_pll2cr = 0x0cc1,
|
||||
.scr_gper = 0,
|
||||
.gpio_base = -1,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.disable = &eseries_tmio_disable,
|
||||
};
|
||||
|
||||
static struct platform_device e750_tc6393xb_device = {
|
||||
.name = "tc6393xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e750_tc6393xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *e750_devices[] __initdata = {
|
||||
&e750_fb_device,
|
||||
&e750_tc6393xb_device,
|
||||
};
|
||||
|
||||
static void __init e750_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e750_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
clk_add_alias("CLK_CK3P6MI", e750_tc6393xb_device.name,
|
||||
"GPIO11_CLK", NULL),
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e750_devices));
|
||||
pxa_set_udc_info(&e7xx_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ficp_info(&e7xx_ficp_platform_data);
|
||||
}
|
||||
|
||||
MACHINE_START(E750, "Toshiba e750")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e750_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E800
|
||||
/* ------------------------ e800 LCD definitions ------------------------- */
|
||||
|
||||
static unsigned long e800_pin_config[] __initdata = {
|
||||
/* AC97 */
|
||||
GPIO28_AC97_BITCLK,
|
||||
GPIO29_AC97_SDATA_IN_0,
|
||||
GPIO30_AC97_SDATA_OUT,
|
||||
GPIO31_AC97_SYNC,
|
||||
};
|
||||
|
||||
static struct w100_gen_regs e800_lcd_regs = {
|
||||
.lcd_format = 0x00008003,
|
||||
.lcdd_cntl1 = 0x02a00000,
|
||||
.lcdd_cntl2 = 0x0003ffff,
|
||||
.genlcd_cntl1 = 0x000ff2a3,
|
||||
.genlcd_cntl2 = 0x000002a3,
|
||||
.genlcd_cntl3 = 0x000102aa,
|
||||
};
|
||||
|
||||
static struct w100_mode e800_lcd_mode[2] = {
|
||||
[0] = {
|
||||
.xres = 480,
|
||||
.yres = 640,
|
||||
.left_margin = 52,
|
||||
.right_margin = 148,
|
||||
.upper_margin = 2,
|
||||
.lower_margin = 6,
|
||||
.crtc_ss = 0x80350034,
|
||||
.crtc_ls = 0x802b0026,
|
||||
.crtc_gs = 0x80160016,
|
||||
.crtc_vpos_gs = 0x00020003,
|
||||
.crtc_rev = 0x0040001d,
|
||||
.crtc_dclk = 0xe0000000,
|
||||
.crtc_gclk = 0x82a50049,
|
||||
.crtc_goe = 0x80ee001c,
|
||||
.crtc_ps1_active = 0x00000000,
|
||||
.pll_freq = 128,
|
||||
.pixclk_divider = 4,
|
||||
.pixclk_divider_rotated = 6,
|
||||
.pixclk_src = CLK_SRC_PLL,
|
||||
.sysclk_divider = 0,
|
||||
.sysclk_src = CLK_SRC_PLL,
|
||||
},
|
||||
[1] = {
|
||||
.xres = 240,
|
||||
.yres = 320,
|
||||
.left_margin = 15,
|
||||
.right_margin = 88,
|
||||
.upper_margin = 0,
|
||||
.lower_margin = 7,
|
||||
.crtc_ss = 0xd010000f,
|
||||
.crtc_ls = 0x80070003,
|
||||
.crtc_gs = 0x80000000,
|
||||
.crtc_vpos_gs = 0x01460147,
|
||||
.crtc_rev = 0x00400003,
|
||||
.crtc_dclk = 0xa1700030,
|
||||
.crtc_gclk = 0x814b0008,
|
||||
.crtc_goe = 0x80cc0015,
|
||||
.crtc_ps1_active = 0x00000000,
|
||||
.pll_freq = 100,
|
||||
.pixclk_divider = 6, /* Wince uses 14 which gives a */
|
||||
.pixclk_divider_rotated = 6, /* 7MHz Pclk. We use a 14MHz one */
|
||||
.pixclk_src = CLK_SRC_PLL,
|
||||
.sysclk_divider = 0,
|
||||
.sysclk_src = CLK_SRC_PLL,
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static struct w100_gpio_regs e800_w100_gpio_info = {
|
||||
.init_data1 = 0xc13fc019,
|
||||
.gpio_dir1 = 0x3e40df7f,
|
||||
.gpio_oe1 = 0x003c3000,
|
||||
.init_data2 = 0x00000000,
|
||||
.gpio_dir2 = 0x00000000,
|
||||
.gpio_oe2 = 0x00000000,
|
||||
};
|
||||
|
||||
static struct w100_mem_info e800_w100_mem_info = {
|
||||
.ext_cntl = 0x09640011,
|
||||
.sdram_mode_reg = 0x00600021,
|
||||
.ext_timing_cntl = 0x10001545,
|
||||
.io_cntl = 0x7ddd7333,
|
||||
.size = 0x1fffff,
|
||||
};
|
||||
|
||||
static void e800_tg_change(struct w100fb_par *par)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
tmp = w100fb_gpio_read(W100_GPIO_PORT_A);
|
||||
if (par->mode->xres == 480)
|
||||
tmp |= 0x100;
|
||||
else
|
||||
tmp &= ~0x100;
|
||||
w100fb_gpio_write(W100_GPIO_PORT_A, tmp);
|
||||
}
|
||||
|
||||
static struct w100_tg_info e800_tg_info = {
|
||||
.change = e800_tg_change,
|
||||
};
|
||||
|
||||
static struct w100fb_mach_info e800_fb_info = {
|
||||
.modelist = e800_lcd_mode,
|
||||
.num_modes = 2,
|
||||
.regs = &e800_lcd_regs,
|
||||
.gpio = &e800_w100_gpio_info,
|
||||
.mem = &e800_w100_mem_info,
|
||||
.tg = &e800_tg_info,
|
||||
.xtal_freq = 16000000,
|
||||
};
|
||||
|
||||
static struct resource e800_fb_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x0c000000,
|
||||
.end = 0x0cffffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device e800_fb_device = {
|
||||
.name = "w100fb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e800_fb_info,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(e800_fb_resources),
|
||||
.resource = e800_fb_resources,
|
||||
};
|
||||
|
||||
/* --------------------------- UDC definitions --------------------------- */
|
||||
|
||||
static struct pxa2xx_udc_mach_info e800_udc_mach_info = {
|
||||
.gpio_vbus = GPIO_E800_USB_DISC,
|
||||
.gpio_pullup = GPIO_E800_USB_PULLUP,
|
||||
.gpio_pullup_inverted = 1
|
||||
};
|
||||
|
||||
/* ----------------- e800 tc6393xb parameters ------------------ */
|
||||
|
||||
static struct tc6393xb_platform_data e800_tc6393xb_info = {
|
||||
.irq_base = IRQ_BOARD_START,
|
||||
.scr_pll2cr = 0x0cc1,
|
||||
.scr_gper = 0,
|
||||
.gpio_base = -1,
|
||||
.suspend = &eseries_tmio_suspend,
|
||||
.resume = &eseries_tmio_resume,
|
||||
.enable = &eseries_tmio_enable,
|
||||
.disable = &eseries_tmio_disable,
|
||||
};
|
||||
|
||||
static struct platform_device e800_tc6393xb_device = {
|
||||
.name = "tc6393xb",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &e800_tc6393xb_info,
|
||||
},
|
||||
.num_resources = 2,
|
||||
.resource = eseries_tmio_resources,
|
||||
};
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static struct platform_device *e800_devices[] __initdata = {
|
||||
&e800_fb_device,
|
||||
&e800_tc6393xb_device,
|
||||
};
|
||||
|
||||
static void __init e800_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e800_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
clk_add_alias("CLK_CK3P6MI", e800_tc6393xb_device.name,
|
||||
"GPIO11_CLK", NULL),
|
||||
eseries_get_tmio_gpios();
|
||||
platform_add_devices(ARRAY_AND_SIZE(e800_devices));
|
||||
pxa_set_udc_info(&e800_udc_mach_info);
|
||||
pxa_set_ac97_info(NULL);
|
||||
}
|
||||
|
||||
MACHINE_START(E800, "Toshiba e800")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e800_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
|
|
@ -1,590 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-pxa/imote2.c
|
||||
*
|
||||
* Author: Ed C. Epp
|
||||
* Created: Nov 05, 2002
|
||||
* Copyright: Intel Corp.
|
||||
*
|
||||
* Modified 2008: Jonathan Cameron
|
||||
*
|
||||
* The Imote2 is a wireless sensor node platform sold
|
||||
* by Crossbow (www.xbow.com).
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/mfd/da903x.h>
|
||||
#include <linux/sht15.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#include <mach/pxa27x.h>
|
||||
#include <plat/i2c.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/mmc.h>
|
||||
#include <mach/pxa2xx_spi.h>
|
||||
#include <mach/pxa27x-udc.h>
|
||||
|
||||
#include "devices.h"
|
||||
#include "generic.h"
|
||||
|
||||
static unsigned long imote2_pin_config[] __initdata = {
|
||||
|
||||
/* Device Identification for wakeup*/
|
||||
GPIO102_GPIO,
|
||||
|
||||
/* Button */
|
||||
GPIO91_GPIO,
|
||||
|
||||
/* DA9030 */
|
||||
GPIO1_GPIO,
|
||||
|
||||
/* MMC */
|
||||
GPIO32_MMC_CLK,
|
||||
GPIO112_MMC_CMD,
|
||||
GPIO92_MMC_DAT_0,
|
||||
GPIO109_MMC_DAT_1,
|
||||
GPIO110_MMC_DAT_2,
|
||||
GPIO111_MMC_DAT_3,
|
||||
|
||||
/* 802.15.4 radio - driver out of mainline */
|
||||
GPIO22_GPIO, /* CC_RSTN */
|
||||
GPIO114_GPIO, /* CC_FIFO */
|
||||
GPIO116_GPIO, /* CC_CCA */
|
||||
GPIO0_GPIO, /* CC_FIFOP */
|
||||
GPIO16_GPIO, /* CCSFD */
|
||||
GPIO115_GPIO, /* Power enable */
|
||||
|
||||
/* I2C */
|
||||
GPIO117_I2C_SCL,
|
||||
GPIO118_I2C_SDA,
|
||||
|
||||
/* SSP 3 - 802.15.4 radio */
|
||||
GPIO39_GPIO, /* Chip Select */
|
||||
GPIO34_SSP3_SCLK,
|
||||
GPIO35_SSP3_TXD,
|
||||
GPIO41_SSP3_RXD,
|
||||
|
||||
/* SSP 2 - to daughter boards */
|
||||
GPIO37_GPIO, /* Chip Select */
|
||||
GPIO36_SSP2_SCLK,
|
||||
GPIO38_SSP2_TXD,
|
||||
GPIO11_SSP2_RXD,
|
||||
|
||||
/* SSP 1 - to daughter boards */
|
||||
GPIO24_GPIO, /* Chip Select */
|
||||
GPIO23_SSP1_SCLK,
|
||||
GPIO25_SSP1_TXD,
|
||||
GPIO26_SSP1_RXD,
|
||||
|
||||
/* BTUART Basic Connector*/
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
GPIO45_BTUART_RTS,
|
||||
|
||||
/* STUART Serial console via debug board*/
|
||||
GPIO46_STUART_RXD,
|
||||
GPIO47_STUART_TXD,
|
||||
|
||||
/* Basic sensor board */
|
||||
GPIO96_GPIO, /* accelerometer interrupt */
|
||||
GPIO99_GPIO, /* ADC interrupt */
|
||||
|
||||
/* SHT15 */
|
||||
GPIO100_GPIO,
|
||||
GPIO98_GPIO,
|
||||
|
||||
/* Connector pins specified as gpios */
|
||||
GPIO94_GPIO, /* large basic connector pin 14 */
|
||||
GPIO10_GPIO, /* large basic connector pin 23 */
|
||||
|
||||
/* LEDS */
|
||||
GPIO103_GPIO, /* red led */
|
||||
GPIO104_GPIO, /* green led */
|
||||
GPIO105_GPIO, /* blue led */
|
||||
};
|
||||
|
||||
static struct sht15_platform_data platform_data_sht15 = {
|
||||
.gpio_data = 100,
|
||||
.gpio_sck = 98,
|
||||
};
|
||||
|
||||
static struct platform_device sht15 = {
|
||||
.name = "sht15",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &platform_data_sht15,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply imote2_sensor_3_con[] = {
|
||||
{
|
||||
.dev = &sht15.dev,
|
||||
.supply = "vcc",
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led imote2_led_pins[] = {
|
||||
{
|
||||
.name = "imote2:red",
|
||||
.gpio = 103,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "imote2:green",
|
||||
.gpio = 104,
|
||||
.active_low = 1,
|
||||
}, {
|
||||
.name = "imote2:blue",
|
||||
.gpio = 105,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data imote2_led_data = {
|
||||
.num_leds = ARRAY_SIZE(imote2_led_pins),
|
||||
.leds = imote2_led_pins,
|
||||
};
|
||||
|
||||
static struct platform_device imote2_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &imote2_led_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* Reverse engineered partly from Platformx drivers */
|
||||
enum imote2_ldos{
|
||||
vcc_vref,
|
||||
vcc_cc2420,
|
||||
vcc_mica,
|
||||
vcc_bt,
|
||||
/* The two voltages available to sensor boards */
|
||||
vcc_sensor_1_8,
|
||||
vcc_sensor_3,
|
||||
|
||||
vcc_sram_ext, /* directly connected to the pxa271 */
|
||||
vcc_pxa_pll,
|
||||
vcc_pxa_usim, /* Reference voltage for certain gpios */
|
||||
vcc_pxa_mem,
|
||||
vcc_pxa_flash,
|
||||
vcc_pxa_core, /*Dc-Dc buck not yet supported */
|
||||
vcc_lcd,
|
||||
vcc_bb,
|
||||
vcc_bbio,
|
||||
vcc_io, /* cc2420 802.15.4 radio and pxa vcc_io ?*/
|
||||
};
|
||||
|
||||
/* The values of the various regulator constraints are obviously dependent
|
||||
* on exactly what is wired to each ldo. Unfortunately this information is
|
||||
* not generally available. More information has been requested from Xbow
|
||||
* but as of yet they haven't been forthcoming.
|
||||
*
|
||||
* Some of these are clearly Stargate 2 related (no way of plugging
|
||||
* in an lcd on the IM2 for example!).
|
||||
*/
|
||||
static struct regulator_init_data imote2_ldo_init_data[] = {
|
||||
[vcc_bbio] = {
|
||||
.constraints = { /* board default 1.8V */
|
||||
.name = "vcc_bbio",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
},
|
||||
},
|
||||
[vcc_bb] = {
|
||||
.constraints = { /* board default 2.8V */
|
||||
.name = "vcc_bb",
|
||||
.min_uV = 2700000,
|
||||
.max_uV = 3000000,
|
||||
},
|
||||
},
|
||||
[vcc_pxa_flash] = {
|
||||
.constraints = {/* default is 1.8V */
|
||||
.name = "vcc_pxa_flash",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
},
|
||||
},
|
||||
[vcc_cc2420] = { /* also vcc_io */
|
||||
.constraints = {
|
||||
/* board default is 2.8V */
|
||||
.name = "vcc_cc2420",
|
||||
.min_uV = 2700000,
|
||||
.max_uV = 3300000,
|
||||
},
|
||||
},
|
||||
[vcc_vref] = { /* Reference for what? */
|
||||
.constraints = { /* default 1.8V */
|
||||
.name = "vcc_vref",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
},
|
||||
},
|
||||
[vcc_sram_ext] = {
|
||||
.constraints = { /* default 2.8V */
|
||||
.name = "vcc_sram_ext",
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
},
|
||||
},
|
||||
[vcc_mica] = {
|
||||
.constraints = { /* default 2.8V */
|
||||
.name = "vcc_mica",
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
},
|
||||
},
|
||||
[vcc_bt] = {
|
||||
.constraints = { /* default 2.8V */
|
||||
.name = "vcc_bt",
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 2800000,
|
||||
},
|
||||
},
|
||||
[vcc_lcd] = {
|
||||
.constraints = { /* default 2.8V */
|
||||
.name = "vcc_lcd",
|
||||
.min_uV = 2700000,
|
||||
.max_uV = 3300000,
|
||||
},
|
||||
},
|
||||
[vcc_io] = { /* Same or higher than everything
|
||||
* bar vccbat and vccusb */
|
||||
.constraints = { /* default 2.8V */
|
||||
.name = "vcc_io",
|
||||
.min_uV = 2692000,
|
||||
.max_uV = 3300000,
|
||||
},
|
||||
},
|
||||
[vcc_sensor_1_8] = {
|
||||
.constraints = { /* default 1.8V */
|
||||
.name = "vcc_sensor_1_8",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
},
|
||||
},
|
||||
[vcc_sensor_3] = { /* curiously default 2.8V */
|
||||
.constraints = {
|
||||
.name = "vcc_sensor_3",
|
||||
.min_uV = 2800000,
|
||||
.max_uV = 3000000,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(imote2_sensor_3_con),
|
||||
.consumer_supplies = imote2_sensor_3_con,
|
||||
},
|
||||
[vcc_pxa_pll] = { /* 1.17V - 1.43V, default 1.3V*/
|
||||
.constraints = {
|
||||
.name = "vcc_pxa_pll",
|
||||
.min_uV = 1170000,
|
||||
.max_uV = 1430000,
|
||||
},
|
||||
},
|
||||
[vcc_pxa_usim] = {
|
||||
.constraints = { /* default 1.8V */
|
||||
.name = "vcc_pxa_usim",
|
||||
.min_uV = 1710000,
|
||||
.max_uV = 2160000,
|
||||
},
|
||||
},
|
||||
[vcc_pxa_mem] = {
|
||||
.constraints = { /* default 1.8V */
|
||||
.name = "vcc_pxa_mem",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct da903x_subdev_info imote2_da9030_subdevs[] = {
|
||||
{
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO2,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_bbio],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO3,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_bb],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO4,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_pxa_flash],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO5,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_cc2420],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO6,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_vref],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO7,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_sram_ext],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO8,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_mica],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO9,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_bt],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO10,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_sensor_1_8],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO11,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_sensor_3],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO12,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_lcd],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO15,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_pxa_pll],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO17,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_pxa_usim],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO18,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_io],
|
||||
}, {
|
||||
.name = "da903x-regulator",
|
||||
.id = DA9030_ID_LDO19,
|
||||
.platform_data = &imote2_ldo_init_data[vcc_pxa_mem],
|
||||
},
|
||||
};
|
||||
|
||||
static struct da903x_platform_data imote2_da9030_pdata = {
|
||||
.num_subdevs = ARRAY_SIZE(imote2_da9030_subdevs),
|
||||
.subdevs = imote2_da9030_subdevs,
|
||||
};
|
||||
|
||||
/* As the the imote2 doesn't currently have a conventional SD slot
|
||||
* there is no option to hotplug cards, making all this rather simple
|
||||
*/
|
||||
static int imote2_mci_get_ro(struct device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Rather simple case as hotplugging not possible */
|
||||
static struct pxamci_platform_data imote2_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* default anyway */
|
||||
.get_ro = imote2_mci_get_ro,
|
||||
.gpio_card_detect = -1,
|
||||
.gpio_card_ro = -1,
|
||||
.gpio_power = -1,
|
||||
};
|
||||
|
||||
static struct mtd_partition imote2flash_partitions[] = {
|
||||
{
|
||||
.name = "Bootloader",
|
||||
.size = 0x00040000,
|
||||
.offset = 0,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
}, {
|
||||
.name = "Kernel",
|
||||
.size = 0x00200000,
|
||||
.offset = 0x00040000,
|
||||
.mask_flags = 0,
|
||||
}, {
|
||||
.name = "Filesystem",
|
||||
.size = 0x01DC0000,
|
||||
.offset = 0x00240000,
|
||||
.mask_flags = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource flash_resources = {
|
||||
.start = PXA_CS0_PHYS,
|
||||
.end = PXA_CS0_PHYS + SZ_32M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct flash_platform_data imote2_flash_data = {
|
||||
.map_name = "cfi_probe",
|
||||
.parts = imote2flash_partitions,
|
||||
.nr_parts = ARRAY_SIZE(imote2flash_partitions),
|
||||
.name = "PXA27xOnChipROM",
|
||||
.width = 2,
|
||||
};
|
||||
|
||||
static struct platform_device imote2_flash_device = {
|
||||
.name = "pxa2xx-flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &imote2_flash_data,
|
||||
},
|
||||
.resource = &flash_resources,
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
/* Some of the drivers here are out of kernel at the moment (parts of IIO)
|
||||
* and it may be a while before they are in the mainline.
|
||||
*/
|
||||
static struct i2c_board_info __initdata imote2_i2c_board_info[] = {
|
||||
{ /* UCAM sensor board */
|
||||
.type = "max1239",
|
||||
.addr = 0x35,
|
||||
}, { /* ITS400 Sensor board only */
|
||||
.type = "max1363",
|
||||
.addr = 0x34,
|
||||
/* Through a nand gate - Also beware, on V2 sensor board the
|
||||
* pull up resistors are missing.
|
||||
*/
|
||||
.irq = IRQ_GPIO(99),
|
||||
}, { /* ITS400 Sensor board only */
|
||||
.type = "tsl2561",
|
||||
.addr = 0x49,
|
||||
/* Through a nand gate - Also beware, on V2 sensor board the
|
||||
* pull up resistors are missing.
|
||||
*/
|
||||
.irq = IRQ_GPIO(99),
|
||||
}, { /* ITS400 Sensor board only */
|
||||
.type = "tmp175",
|
||||
.addr = 0x4A,
|
||||
.irq = IRQ_GPIO(96),
|
||||
}, { /* IMB400 Multimedia board */
|
||||
.type = "wm8940",
|
||||
.addr = 0x1A,
|
||||
},
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata imote2_pwr_i2c_board_info[] = {
|
||||
{
|
||||
.type = "da9030",
|
||||
.addr = 0x49,
|
||||
.platform_data = &imote2_da9030_pdata,
|
||||
.irq = gpio_to_irq(1),
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_0_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_1_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_master pxa_ssp_master_2_info = {
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_chip staccel_chip_info = {
|
||||
.tx_threshold = 8,
|
||||
.rx_threshold = 8,
|
||||
.dma_burst_size = 8,
|
||||
.timeout = 235,
|
||||
.gpio_cs = 24,
|
||||
};
|
||||
|
||||
static struct pxa2xx_spi_chip cc2420_info = {
|
||||
.tx_threshold = 8,
|
||||
.rx_threshold = 8,
|
||||
.dma_burst_size = 8,
|
||||
.timeout = 235,
|
||||
.gpio_cs = 39,
|
||||
};
|
||||
|
||||
static struct spi_board_info spi_board_info[] __initdata = {
|
||||
{ /* Driver in IIO */
|
||||
.modalias = "lis3l02dq",
|
||||
.max_speed_hz = 8000000,/* 8MHz max spi frequency at 3V */
|
||||
.bus_num = 1,
|
||||
.chip_select = 0,
|
||||
.controller_data = &staccel_chip_info,
|
||||
.irq = IRQ_GPIO(96),
|
||||
}, { /* Driver out of kernel as it needs considerable rewriting */
|
||||
.modalias = "cc2420",
|
||||
.max_speed_hz = 6500000,
|
||||
.bus_num = 3,
|
||||
.chip_select = 0,
|
||||
.controller_data = &cc2420_info,
|
||||
},
|
||||
};
|
||||
|
||||
static void im2_udc_command(int cmd)
|
||||
{
|
||||
switch (cmd) {
|
||||
case PXA2XX_UDC_CMD_CONNECT:
|
||||
UP2OCR |= UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE;
|
||||
break;
|
||||
case PXA2XX_UDC_CMD_DISCONNECT:
|
||||
UP2OCR &= ~(UP2OCR_HXOE | UP2OCR_DPPUE | UP2OCR_DPPUBE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct pxa2xx_udc_mach_info imote2_udc_info __initdata = {
|
||||
.udc_command = im2_udc_command,
|
||||
};
|
||||
|
||||
static struct platform_device *imote2_devices[] = {
|
||||
&imote2_flash_device,
|
||||
&imote2_leds,
|
||||
&sht15,
|
||||
};
|
||||
|
||||
static struct i2c_pxa_platform_data i2c_pwr_pdata = {
|
||||
.fast_mode = 1,
|
||||
};
|
||||
|
||||
static struct i2c_pxa_platform_data i2c_pdata = {
|
||||
.fast_mode = 1,
|
||||
};
|
||||
|
||||
static void __init imote2_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(imote2_pin_config));
|
||||
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
platform_add_devices(imote2_devices, ARRAY_SIZE(imote2_devices));
|
||||
|
||||
pxa2xx_set_spi_info(1, &pxa_ssp_master_0_info);
|
||||
pxa2xx_set_spi_info(2, &pxa_ssp_master_1_info);
|
||||
pxa2xx_set_spi_info(3, &pxa_ssp_master_2_info);
|
||||
|
||||
spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
|
||||
|
||||
i2c_register_board_info(0, imote2_i2c_board_info,
|
||||
ARRAY_SIZE(imote2_i2c_board_info));
|
||||
i2c_register_board_info(1, imote2_pwr_i2c_board_info,
|
||||
ARRAY_SIZE(imote2_pwr_i2c_board_info));
|
||||
|
||||
pxa27x_set_i2c_power_info(&i2c_pwr_pdata);
|
||||
pxa_set_i2c_info(&i2c_pdata);
|
||||
|
||||
pxa_set_mci_info(&imote2_mci_platform_data);
|
||||
pxa_set_udc_info(&imote2_udc_info);
|
||||
}
|
||||
|
||||
MACHINE_START(INTELMOTE2, "IMOTE 2")
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa27x_init_irq,
|
||||
.timer = &pxa_timer,
|
||||
.init_machine = imote2_init,
|
||||
.boot_params = 0xA0000100,
|
||||
MACHINE_END
|
|
@ -26,21 +26,55 @@ enum balloon3_features {
|
|||
#define BALLOON3_FPGA_VIRT (0xf1000000) /* as per balloon2 */
|
||||
#define BALLOON3_FPGA_LENGTH 0x01000000
|
||||
|
||||
/* FPGA/CPLD registers */
|
||||
#define BALLOON3_PCMCIA0_REG (BALLOON3_FPGA_VIRT + 0x00e00008)
|
||||
/* fixme - same for now */
|
||||
#define BALLOON3_PCMCIA1_REG (BALLOON3_FPGA_VIRT + 0x00e00008)
|
||||
#define BALLOON3_NANDIO_IO_REG (BALLOON3_FPGA_VIRT + 0x00e00000)
|
||||
/* FPGA / CPLD registers for CF socket */
|
||||
#define BALLOON3_CF_STATUS_REG (BALLOON3_FPGA_VIRT + 0x00e00008)
|
||||
#define BALLOON3_CF_CONTROL_REG (BALLOON3_FPGA_VIRT + 0x00e00008)
|
||||
/* FPGA / CPLD version register */
|
||||
#define BALLOON3_FPGA_VER (BALLOON3_FPGA_VIRT + 0x00e0001c)
|
||||
/* FPGA / CPLD registers for NAND flash */
|
||||
#define BALLOON3_NAND_BASE (PXA_CS4_PHYS + 0x00e00000)
|
||||
#define BALLOON3_NAND_IO_REG (BALLOON3_FPGA_VIRT + 0x00e00000)
|
||||
#define BALLOON3_NAND_CONTROL2_REG (BALLOON3_FPGA_VIRT + 0x00e00010)
|
||||
#define BALLOON3_NAND_STAT_REG (BALLOON3_FPGA_VIRT + 0x00e00010)
|
||||
#define BALLOON3_NAND_CONTROL_REG (BALLOON3_FPGA_VIRT + 0x00e00014)
|
||||
|
||||
/* fpga/cpld interrupt control register */
|
||||
#define BALLOON3_INT_CONTROL_REG (BALLOON3_FPGA_VIRT + 0x00e0000C)
|
||||
#define BALLOON3_NANDIO_CTL2_REG (BALLOON3_FPGA_VIRT + 0x00e00010)
|
||||
#define BALLOON3_NANDIO_CTL_REG (BALLOON3_FPGA_VIRT + 0x00e00014)
|
||||
#define BALLOON3_VERSION_REG (BALLOON3_FPGA_VIRT + 0x00e0001c)
|
||||
|
||||
#define BALLOON3_SAMOSA_ADDR_REG (BALLOON3_FPGA_VIRT + 0x00c00000)
|
||||
#define BALLOON3_SAMOSA_DATA_REG (BALLOON3_FPGA_VIRT + 0x00c00004)
|
||||
#define BALLOON3_SAMOSA_STATUS_REG (BALLOON3_FPGA_VIRT + 0x00c0001c)
|
||||
|
||||
/* CF Status Register bits (read-only) bits */
|
||||
#define BALLOON3_CF_nIRQ (1 << 0)
|
||||
#define BALLOON3_CF_nSTSCHG_BVD1 (1 << 1)
|
||||
|
||||
/* CF Control Set Register bits / CF Control Clear Register bits (write-only) */
|
||||
#define BALLOON3_CF_RESET (1 << 0)
|
||||
#define BALLOON3_CF_ENABLE (1 << 1)
|
||||
#define BALLOON3_CF_ADD_ENABLE (1 << 2)
|
||||
|
||||
/* CF Interrupt sources */
|
||||
#define BALLOON3_BP_CF_NRDY_IRQ BALLOON3_IRQ(0)
|
||||
#define BALLOON3_BP_NSTSCHG_IRQ BALLOON3_IRQ(1)
|
||||
|
||||
/* NAND Control register */
|
||||
#define BALLOON3_NAND_CONTROL_FLWP (1 << 7)
|
||||
#define BALLOON3_NAND_CONTROL_FLSE (1 << 6)
|
||||
#define BALLOON3_NAND_CONTROL_FLCE3 (1 << 5)
|
||||
#define BALLOON3_NAND_CONTROL_FLCE2 (1 << 4)
|
||||
#define BALLOON3_NAND_CONTROL_FLCE1 (1 << 3)
|
||||
#define BALLOON3_NAND_CONTROL_FLCE0 (1 << 2)
|
||||
#define BALLOON3_NAND_CONTROL_FLALE (1 << 1)
|
||||
#define BALLOON3_NAND_CONTROL_FLCLE (1 << 0)
|
||||
|
||||
/* NAND Status register */
|
||||
#define BALLOON3_NAND_STAT_RNB (1 << 0)
|
||||
|
||||
/* NAND Control2 register */
|
||||
#define BALLOON3_NAND_CONTROL2_16BIT (1 << 0)
|
||||
|
||||
/* GPIOs for irqs */
|
||||
#define BALLOON3_GPIO_AUX_NIRQ (94)
|
||||
#define BALLOON3_GPIO_CODEC_IRQ (95)
|
||||
|
@ -54,20 +88,24 @@ enum balloon3_features {
|
|||
|
||||
#define BALLOON3_GPIO_S0_CD (105)
|
||||
|
||||
/* NAND */
|
||||
#define BALLOON3_GPIO_RUN_NAND (102)
|
||||
|
||||
/* PCF8574A Leds */
|
||||
#define BALLOON3_PCF_GPIO_BASE 160
|
||||
#define BALLOON3_PCF_GPIO_LED0 (BALLOON3_PCF_GPIO_BASE + 0)
|
||||
#define BALLOON3_PCF_GPIO_LED1 (BALLOON3_PCF_GPIO_BASE + 1)
|
||||
#define BALLOON3_PCF_GPIO_LED2 (BALLOON3_PCF_GPIO_BASE + 2)
|
||||
#define BALLOON3_PCF_GPIO_LED3 (BALLOON3_PCF_GPIO_BASE + 3)
|
||||
#define BALLOON3_PCF_GPIO_LED4 (BALLOON3_PCF_GPIO_BASE + 4)
|
||||
#define BALLOON3_PCF_GPIO_LED5 (BALLOON3_PCF_GPIO_BASE + 5)
|
||||
#define BALLOON3_PCF_GPIO_LED6 (BALLOON3_PCF_GPIO_BASE + 6)
|
||||
#define BALLOON3_PCF_GPIO_LED7 (BALLOON3_PCF_GPIO_BASE + 7)
|
||||
|
||||
/* FPGA Interrupt Mask/Acknowledge Register */
|
||||
#define BALLOON3_INT_S0_IRQ (1 << 0) /* PCMCIA 0 IRQ */
|
||||
#define BALLOON3_INT_S0_STSCHG (1 << 1) /* PCMCIA 0 status changed */
|
||||
|
||||
/* CF Status Register */
|
||||
#define BALLOON3_PCMCIA_nIRQ (1 << 0) /* IRQ / ready signal */
|
||||
#define BALLOON3_PCMCIA_nSTSCHG_BVD1 (1 << 1)
|
||||
/* VDD sense / card status changed */
|
||||
|
||||
/* CF control register (write) */
|
||||
#define BALLOON3_PCMCIA_RESET (1 << 0) /* Card reset signal */
|
||||
#define BALLOON3_PCMCIA_ENABLE (1 << 1)
|
||||
#define BALLOON3_PCMCIA_ADD_ENABLE (1 << 2)
|
||||
|
||||
/* CPLD (and FPGA) interface definitions */
|
||||
#define CPLD_LCD0_DATA_SET 0x00
|
||||
#define CPLD_LCD0_DATA_CLR 0x10
|
||||
|
@ -132,9 +170,6 @@ enum balloon3_features {
|
|||
/* Balloon3 Interrupts */
|
||||
#define BALLOON3_IRQ(x) (IRQ_BOARD_START + (x))
|
||||
|
||||
#define BALLOON3_BP_CF_NRDY_IRQ BALLOON3_IRQ(0)
|
||||
#define BALLOON3_BP_NSTSCHG_IRQ BALLOON3_IRQ(1)
|
||||
|
||||
#define BALLOON3_AUX_NIRQ IRQ_GPIO(BALLOON3_GPIO_AUX_NIRQ)
|
||||
#define BALLOON3_CODEC_IRQ IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ)
|
||||
#define BALLOON3_S0_CD_IRQ IRQ_GPIO(BALLOON3_GPIO_S0_CD)
|
||||
|
|
|
@ -4,6 +4,27 @@
|
|||
#include <net/ax88796.h>
|
||||
#include <mach/mfp.h>
|
||||
|
||||
/*
|
||||
* base board glue for PXA270 module
|
||||
*/
|
||||
|
||||
enum {
|
||||
COLIBRI_PXA270_EVALBOARD = 0,
|
||||
COLIBRI_PXA270_INCOME,
|
||||
};
|
||||
|
||||
#if defined(CONFIG_MACH_COLIBRI_PXA270_EVALBOARD)
|
||||
extern void colibri_pxa270_evalboard_init(void);
|
||||
#else
|
||||
static inline void colibri_pxa270_evalboard_init(void) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MACH_COLIBRI_PXA270_INCOME)
|
||||
extern void colibri_pxa270_income_boardinit(void);
|
||||
#else
|
||||
static inline void colibri_pxa270_income_boardinit(void) {}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* common settings for all modules
|
||||
*/
|
||||
|
@ -33,13 +54,10 @@ static inline void colibri_pxa3xx_init_nand(void) {}
|
|||
/* physical memory regions */
|
||||
#define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */
|
||||
|
||||
/* definitions for Colibri PXA270 */
|
||||
|
||||
#define COLIBRI_PXA270_FLASH_PHYS (PXA_CS0_PHYS) /* Flash region */
|
||||
#define COLIBRI_PXA270_ETH_PHYS (PXA_CS2_PHYS) /* Ethernet */
|
||||
#define COLIBRI_PXA270_ETH_IRQ_GPIO 114
|
||||
#define COLIBRI_PXA270_ETH_IRQ \
|
||||
gpio_to_irq(mfp_to_gpio(COLIBRI_PXA270_ETH_IRQ_GPIO))
|
||||
/* GPIO definitions for Colibri PXA270 */
|
||||
#define GPIO114_COLIBRI_PXA270_ETH_IRQ 114
|
||||
#define GPIO0_COLIBRI_PXA270_SD_DETECT 0
|
||||
#define GPIO113_COLIBRI_PXA270_TS_IRQ 113
|
||||
|
||||
#endif /* _COLIBRI_H_ */
|
||||
|
||||
|
|
|
@ -109,10 +109,5 @@
|
|||
#define CORGI_GPIO_BACKLIGHT_CONT (CORGI_SCOOP_GPIO_BASE + 7)
|
||||
#define CORGI_GPIO_MIC_BIAS (CORGI_SCOOP_GPIO_BASE + 8)
|
||||
|
||||
/*
|
||||
* Shared data structures
|
||||
*/
|
||||
extern struct platform_device corgiscoop_device;
|
||||
|
||||
#endif /* __ASM_ARCH_CORGI_H */
|
||||
|
||||
|
|
|
@ -14,25 +14,15 @@
|
|||
|
||||
/*
|
||||
GPIOn - Input from MAX823 (or equiv), normalizing USB +5V into a clean
|
||||
interrupt signal for determining cable presence. On the original gumstix,
|
||||
this is GPIO81, and GPIO83 needs to be defined as well. On the gumstix F,
|
||||
interrupt signal for determining cable presence. On the gumstix F,
|
||||
this moves to GPIO17 and GPIO37. */
|
||||
|
||||
/* GPIOx - Connects to USB D+ and used as a pull-up after GPIOn
|
||||
has detected a cable insertion; driven low otherwise. */
|
||||
|
||||
#ifdef CONFIG_ARCH_GUMSTIX_ORIG
|
||||
|
||||
#define GPIO_GUMSTIX_USB_GPIOn 81
|
||||
#define GPIO_GUMSTIX_USB_GPIOx 83
|
||||
|
||||
#else
|
||||
|
||||
#define GPIO_GUMSTIX_USB_GPIOn 35
|
||||
#define GPIO_GUMSTIX_USB_GPIOx 41
|
||||
|
||||
#endif
|
||||
|
||||
/* usb state change */
|
||||
#define GUMSTIX_USB_INTR_IRQ IRQ_GPIO(GPIO_GUMSTIX_USB_GPIOn)
|
||||
|
||||
|
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* Common functions for Palm LD, T5, TX, Z72
|
||||
*
|
||||
* Copyright (C) 2010
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
#ifndef __INCLUDE_MACH_PALM27X__
|
||||
#define __INCLUDE_MACH_PALM27X__
|
||||
|
||||
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
|
||||
extern void __init palm27x_mmc_init(int detect, int ro, int power,
|
||||
int power_inverted);
|
||||
#else
|
||||
static inline void palm27x_mmc_init(int detect, int ro, int power,
|
||||
int power_inverted)
|
||||
{}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SUSPEND)
|
||||
extern void __init palm27x_pm_init(unsigned long str_base);
|
||||
#else
|
||||
static inline void palm27x_pm_init(unsigned long str_base) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
|
||||
extern struct pxafb_mode_info palm_320x480_lcd_mode;
|
||||
extern struct pxafb_mode_info palm_320x320_lcd_mode;
|
||||
extern struct pxafb_mode_info palm_320x320_new_lcd_mode;
|
||||
extern void __init palm27x_lcd_init(int power,
|
||||
struct pxafb_mode_info *mode);
|
||||
#else
|
||||
static inline void palm27x_lcd_init(int power, struct pxafb_mode_info *mode) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_GADGET_PXA27X) || \
|
||||
defined(CONFIG_USB_GADGET_PXA27X_MODULE)
|
||||
extern void __init palm27x_udc_init(int vbus, int pullup,
|
||||
int vbus_inverted);
|
||||
#else
|
||||
static inline void palm27x_udc_init(int vbus, int pullup, int vbus_inverted) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
|
||||
extern void __init palm27x_irda_init(int pwdn);
|
||||
#else
|
||||
static inline void palm27x_irda_init(int pwdn) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_TOUCHSCREEN_WM97XX) || \
|
||||
defined(CONFIG_TOUCHSCREEN_WM97XX_MODULE)
|
||||
extern void __init palm27x_ac97_init(int minv, int maxv, int jack,
|
||||
int reset);
|
||||
#else
|
||||
static inline void palm27x_ac97_init(int minv, int maxv, int jack, int reset) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
|
||||
extern void __init palm27x_pwm_init(int bl, int lcd);
|
||||
#else
|
||||
static inline void palm27x_pwm_init(int bl, int lcd) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PDA_POWER) || defined(CONFIG_PDA_POWER_MODULE)
|
||||
extern void __init palm27x_power_init(int ac, int usb);
|
||||
#else
|
||||
static inline void palm27x_power_init(int ac, int usb) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_REGULATOR_MAX1586) || \
|
||||
defined(CONFIG_REGULATOR_MAX1586_MODULE)
|
||||
extern void __init palm27x_pmic_init(void);
|
||||
#else
|
||||
static inline void palm27x_pmic_init(void) {}
|
||||
#endif
|
||||
|
||||
#endif /* __INCLUDE_MACH_PALM27X__ */
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Generic PXA PATA driver
|
||||
*
|
||||
* Copyright (C) 2010 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 as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef __MACH_PATA_PXA_H__
|
||||
#define __MACH_PATA_PXA_H__
|
||||
|
||||
struct pata_pxa_pdata {
|
||||
/* PXA DMA DREQ<0:2> pin */
|
||||
uint32_t dma_dreq;
|
||||
/* Register shift */
|
||||
uint32_t reg_shift;
|
||||
/* IRQ flags */
|
||||
uint32_t irq_flags;
|
||||
};
|
||||
|
||||
#endif /* __MACH_PATA_PXA_H__ */
|
|
@ -1,35 +0,0 @@
|
|||
/*
|
||||
* SharpSL SSP Driver
|
||||
*/
|
||||
|
||||
unsigned long corgi_ssp_ads7846_putget(unsigned long);
|
||||
unsigned long corgi_ssp_ads7846_get(void);
|
||||
void corgi_ssp_ads7846_put(unsigned long data);
|
||||
void corgi_ssp_ads7846_lock(void);
|
||||
void corgi_ssp_ads7846_unlock(void);
|
||||
void corgi_ssp_lcdtg_send (unsigned char adrs, unsigned char data);
|
||||
void corgi_ssp_blduty_set(int duty);
|
||||
int corgi_ssp_max1111_get(unsigned long data);
|
||||
|
||||
/*
|
||||
* SharpSL Touchscreen Driver
|
||||
*/
|
||||
|
||||
struct corgits_machinfo {
|
||||
unsigned long (*get_hsync_invperiod)(void);
|
||||
void (*put_hsync)(void);
|
||||
void (*wait_hsync)(void);
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* SharpSL Backlight
|
||||
*/
|
||||
extern void corgibl_limit_intensity(int limit);
|
||||
extern void corgi_lcd_limit_intensity(int limit);
|
||||
|
||||
|
||||
/*
|
||||
* SharpSL Battery/PM Driver
|
||||
*/
|
||||
extern void sharpsl_battery_kick(void);
|
|
@ -93,6 +93,8 @@ struct sharpsl_pm_status {
|
|||
|
||||
extern struct sharpsl_pm_status sharpsl_pm;
|
||||
|
||||
extern struct battery_thresh sharpsl_battery_levels_acin[];
|
||||
extern struct battery_thresh sharpsl_battery_levels_noac[];
|
||||
|
||||
#define SHARPSL_LED_ERROR 2
|
||||
#define SHARPSL_LED_ON 1
|
||||
|
@ -101,4 +103,11 @@ extern struct sharpsl_pm_status sharpsl_pm;
|
|||
void sharpsl_battery_kick(void);
|
||||
void sharpsl_pm_led(int val);
|
||||
|
||||
/* MAX1111 Channel Definitions */
|
||||
#define MAX1111_BATT_VOLT 4u
|
||||
#define MAX1111_BATT_TEMP 2u
|
||||
#define MAX1111_ACIN_VOLT 6u
|
||||
int sharpsl_pm_pxa_read_max1111(int channel);
|
||||
|
||||
void corgi_lcd_limit_intensity(int limit);
|
||||
#endif
|
||||
|
|
|
@ -185,7 +185,5 @@
|
|||
/*
|
||||
* Shared data structures
|
||||
*/
|
||||
extern struct platform_device spitzscoop_device;
|
||||
extern struct platform_device spitzscoop2_device;
|
||||
extern struct platform_device spitzssp_device;
|
||||
extern struct sharpsl_charger_machinfo spitz_pm_machinfo;
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/pda_power.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/wm97xx.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
#include <linux/regulator/max1586.h>
|
||||
|
@ -636,7 +636,7 @@ static struct platform_device power_dev = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct wm97xx_batt_info mioa701_battery_data = {
|
||||
static struct wm97xx_batt_pdata mioa701_battery_data = {
|
||||
.batt_aux = WM97XX_AUX_ID1,
|
||||
.temp_aux = -1,
|
||||
.charge_gpio = -1,
|
||||
|
@ -648,6 +648,10 @@ static struct wm97xx_batt_info mioa701_battery_data = {
|
|||
.batt_name = "mioa701_battery",
|
||||
};
|
||||
|
||||
static struct wm97xx_pdata mioa701_wm97xx_pdata = {
|
||||
.batt_pdata = &mioa701_battery_data,
|
||||
};
|
||||
|
||||
/*
|
||||
* Voltage regulation
|
||||
*/
|
||||
|
@ -716,6 +720,7 @@ struct i2c_pxa_platform_data i2c_pdata = {
|
|||
|
||||
static pxa2xx_audio_ops_t mioa701_ac97_info = {
|
||||
.reset_gpio = 95,
|
||||
.codec_pdata = { &mioa701_wm97xx_pdata, },
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -794,7 +799,6 @@ static void __init mioa701_machine_init(void)
|
|||
set_pxa_fb_info(&mioa701_pxafb_info);
|
||||
pxa_set_mci_info(&mioa701_mci_info);
|
||||
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(&mioa701_ac97_info);
|
||||
pm_power_off = mioa701_poweroff;
|
||||
|
|
|
@ -0,0 +1,477 @@
|
|||
/*
|
||||
* Common code for Palm LD, T5, TX, Z72
|
||||
*
|
||||
* Copyright (C) 2010
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#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.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
#include <linux/regulator/max1586.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <mach/pxa27x.h>
|
||||
#include <mach/audio.h>
|
||||
#include <mach/mmc.h>
|
||||
#include <mach/pxafb.h>
|
||||
#include <mach/irda.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/palmasoc.h>
|
||||
#include <mach/palm27x.h>
|
||||
|
||||
#include <plat/i2c.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
|
||||
static struct pxamci_platform_data palm27x_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.detect_delay_ms = 200,
|
||||
};
|
||||
|
||||
void __init palm27x_mmc_init(int detect, int ro, int power,
|
||||
int power_inverted)
|
||||
{
|
||||
palm27x_mci_platform_data.gpio_card_detect = detect;
|
||||
palm27x_mci_platform_data.gpio_card_ro = ro;
|
||||
palm27x_mci_platform_data.gpio_power = power;
|
||||
palm27x_mci_platform_data.gpio_power_invert = power_inverted;
|
||||
|
||||
pxa_set_mci_info(&palm27x_mci_platform_data);
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Power management - standby
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_SUSPEND)
|
||||
void __init palm27x_pm_init(unsigned long str_base)
|
||||
{
|
||||
static const unsigned long resume[] = {
|
||||
0xe3a00101, /* mov r0, #0x40000000 */
|
||||
0xe380060f, /* orr r0, r0, #0x00f00000 */
|
||||
0xe590f008, /* ldr pc, [r0, #0x08] */
|
||||
};
|
||||
|
||||
/*
|
||||
* Copy the bootloader.
|
||||
* NOTE: PalmZ72 uses a different wakeup method!
|
||||
*/
|
||||
memcpy(phys_to_virt(str_base), resume, sizeof(resume));
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
|
||||
struct pxafb_mode_info palm_320x480_lcd_mode = {
|
||||
.pixclock = 57692,
|
||||
.xres = 320,
|
||||
.yres = 480,
|
||||
.bpp = 16,
|
||||
|
||||
.left_margin = 32,
|
||||
.right_margin = 1,
|
||||
.upper_margin = 7,
|
||||
.lower_margin = 1,
|
||||
|
||||
.hsync_len = 4,
|
||||
.vsync_len = 1,
|
||||
};
|
||||
|
||||
struct pxafb_mode_info palm_320x320_lcd_mode = {
|
||||
.pixclock = 115384,
|
||||
.xres = 320,
|
||||
.yres = 320,
|
||||
.bpp = 16,
|
||||
|
||||
.left_margin = 27,
|
||||
.right_margin = 7,
|
||||
.upper_margin = 7,
|
||||
.lower_margin = 8,
|
||||
|
||||
.hsync_len = 6,
|
||||
.vsync_len = 1,
|
||||
};
|
||||
|
||||
struct pxafb_mode_info palm_320x320_new_lcd_mode = {
|
||||
.pixclock = 86538,
|
||||
.xres = 320,
|
||||
.yres = 320,
|
||||
.bpp = 16,
|
||||
|
||||
.left_margin = 20,
|
||||
.right_margin = 8,
|
||||
.upper_margin = 8,
|
||||
.lower_margin = 5,
|
||||
|
||||
.hsync_len = 4,
|
||||
.vsync_len = 1,
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info palm27x_lcd_screen = {
|
||||
.num_modes = 1,
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
static int palm27x_lcd_power;
|
||||
static void palm27x_lcd_ctl(int on, struct fb_var_screeninfo *info)
|
||||
{
|
||||
gpio_set_value(palm27x_lcd_power, on);
|
||||
}
|
||||
|
||||
void __init palm27x_lcd_init(int power, struct pxafb_mode_info *mode)
|
||||
{
|
||||
palm27x_lcd_screen.modes = mode;
|
||||
|
||||
if (gpio_is_valid(power)) {
|
||||
if (!gpio_request(power, "LCD power")) {
|
||||
pr_err("Palm27x: failed to claim lcd power gpio!\n");
|
||||
return;
|
||||
}
|
||||
if (!gpio_direction_output(power, 1)) {
|
||||
pr_err("Palm27x: lcd power configuration failed!\n");
|
||||
return;
|
||||
}
|
||||
palm27x_lcd_power = power;
|
||||
palm27x_lcd_screen.pxafb_lcd_power = palm27x_lcd_ctl;
|
||||
}
|
||||
|
||||
set_pxa_fb_info(&palm27x_lcd_screen);
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* USB Gadget
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_USB_GADGET_PXA27X) || \
|
||||
defined(CONFIG_USB_GADGET_PXA27X_MODULE)
|
||||
static struct gpio_vbus_mach_info palm27x_udc_info = {
|
||||
.gpio_vbus_inverted = 1,
|
||||
};
|
||||
|
||||
static struct platform_device palm27x_gpio_vbus = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palm27x_udc_info,
|
||||
},
|
||||
};
|
||||
|
||||
void __init palm27x_udc_init(int vbus, int pullup, int vbus_inverted)
|
||||
{
|
||||
palm27x_udc_info.gpio_vbus = vbus;
|
||||
palm27x_udc_info.gpio_pullup = pullup;
|
||||
|
||||
palm27x_udc_info.gpio_vbus_inverted = vbus_inverted;
|
||||
|
||||
if (!gpio_request(pullup, "USB Pullup")) {
|
||||
gpio_direction_output(pullup,
|
||||
palm27x_udc_info.gpio_vbus_inverted);
|
||||
gpio_free(pullup);
|
||||
} else
|
||||
return;
|
||||
|
||||
platform_device_register(&palm27x_gpio_vbus);
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* IrDA
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_IRDA) || defined(CONFIG_IRDA_MODULE)
|
||||
static struct pxaficp_platform_data palm27x_ficp_platform_data = {
|
||||
.transceiver_cap = IR_SIRMODE | IR_OFF,
|
||||
};
|
||||
|
||||
void __init palm27x_irda_init(int pwdn)
|
||||
{
|
||||
palm27x_ficp_platform_data.gpio_pwdown = pwdn;
|
||||
pxa_set_ficp_info(&palm27x_ficp_platform_data);
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* WM97xx audio, battery
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_TOUCHSCREEN_WM97XX) || \
|
||||
defined(CONFIG_TOUCHSCREEN_WM97XX_MODULE)
|
||||
static struct wm97xx_batt_pdata palm27x_batt_pdata = {
|
||||
.batt_aux = WM97XX_AUX_ID3,
|
||||
.temp_aux = WM97XX_AUX_ID2,
|
||||
.charge_gpio = -1,
|
||||
.batt_mult = 1000,
|
||||
.batt_div = 414,
|
||||
.temp_mult = 1,
|
||||
.temp_div = 1,
|
||||
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LIPO,
|
||||
.batt_name = "main-batt",
|
||||
};
|
||||
|
||||
static struct wm97xx_pdata palm27x_wm97xx_pdata = {
|
||||
.batt_pdata = &palm27x_batt_pdata,
|
||||
};
|
||||
|
||||
static pxa2xx_audio_ops_t palm27x_ac97_pdata = {
|
||||
.codec_pdata = { &palm27x_wm97xx_pdata, },
|
||||
};
|
||||
|
||||
static struct palm27x_asoc_info palm27x_asoc_pdata = {
|
||||
.jack_gpio = -1,
|
||||
};
|
||||
|
||||
static struct platform_device palm27x_asoc = {
|
||||
.name = "palm27x-asoc",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palm27x_asoc_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
void __init palm27x_ac97_init(int minv, int maxv, int jack, int reset)
|
||||
{
|
||||
palm27x_ac97_pdata.reset_gpio = reset;
|
||||
palm27x_asoc_pdata.jack_gpio = jack;
|
||||
|
||||
if (minv < 0 || maxv < 0) {
|
||||
palm27x_ac97_pdata.codec_pdata[0] = NULL;
|
||||
pxa_set_ac97_info(&palm27x_ac97_pdata);
|
||||
} else {
|
||||
palm27x_batt_pdata.min_voltage = minv,
|
||||
palm27x_batt_pdata.max_voltage = maxv,
|
||||
|
||||
pxa_set_ac97_info(&palm27x_ac97_pdata);
|
||||
platform_device_register(&palm27x_asoc);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
|
||||
static int palm_bl_power;
|
||||
static int palm_lcd_power;
|
||||
|
||||
static int palm27x_backlight_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(palm_bl_power, "BL POWER");
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = gpio_direction_output(palm_bl_power, 0);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
if (gpio_is_valid(palm_lcd_power)) {
|
||||
ret = gpio_request(palm_lcd_power, "LCD POWER");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_output(palm_lcd_power, 0);
|
||||
if (ret)
|
||||
goto err3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(palm_lcd_power);
|
||||
err2:
|
||||
gpio_free(palm_bl_power);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int palm27x_backlight_notify(struct device *dev, int brightness)
|
||||
{
|
||||
gpio_set_value(palm_bl_power, brightness);
|
||||
if (gpio_is_valid(palm_lcd_power))
|
||||
gpio_set_value(palm_lcd_power, brightness);
|
||||
return brightness;
|
||||
}
|
||||
|
||||
static void palm27x_backlight_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(palm_bl_power);
|
||||
if (gpio_is_valid(palm_lcd_power))
|
||||
gpio_free(palm_lcd_power);
|
||||
}
|
||||
|
||||
static struct platform_pwm_backlight_data palm27x_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = 0xfe,
|
||||
.dft_brightness = 0x7e,
|
||||
.pwm_period_ns = 3500,
|
||||
.init = palm27x_backlight_init,
|
||||
.notify = palm27x_backlight_notify,
|
||||
.exit = palm27x_backlight_exit,
|
||||
};
|
||||
|
||||
static struct platform_device palm27x_backlight = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.parent = &pxa27x_device_pwm0.dev,
|
||||
.platform_data = &palm27x_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
void __init palm27x_pwm_init(int bl, int lcd)
|
||||
{
|
||||
palm_bl_power = bl;
|
||||
palm_lcd_power = lcd;
|
||||
platform_device_register(&palm27x_backlight);
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Power supply
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_PDA_POWER) || defined(CONFIG_PDA_POWER_MODULE)
|
||||
static int palm_ac_state;
|
||||
static int palm_usb_state;
|
||||
|
||||
static int palm27x_power_supply_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(palm_ac_state, "AC state");
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = gpio_direction_input(palm_ac_state);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
if (gpio_is_valid(palm_usb_state)) {
|
||||
ret = gpio_request(palm_usb_state, "USB state");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_input(palm_usb_state);
|
||||
if (ret)
|
||||
goto err3;
|
||||
}
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(palm_usb_state);
|
||||
err2:
|
||||
gpio_free(palm_ac_state);
|
||||
err1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void palm27x_power_supply_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(palm_usb_state);
|
||||
gpio_free(palm_ac_state);
|
||||
}
|
||||
|
||||
static int palm27x_is_ac_online(void)
|
||||
{
|
||||
return gpio_get_value(palm_ac_state);
|
||||
}
|
||||
|
||||
static int palm27x_is_usb_online(void)
|
||||
{
|
||||
return !gpio_get_value(palm_usb_state);
|
||||
}
|
||||
static char *palm27x_supplicants[] = {
|
||||
"main-battery",
|
||||
};
|
||||
|
||||
static struct pda_power_pdata palm27x_ps_info = {
|
||||
.init = palm27x_power_supply_init,
|
||||
.exit = palm27x_power_supply_exit,
|
||||
.is_ac_online = palm27x_is_ac_online,
|
||||
.is_usb_online = palm27x_is_usb_online,
|
||||
.supplied_to = palm27x_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(palm27x_supplicants),
|
||||
};
|
||||
|
||||
static struct platform_device palm27x_power_supply = {
|
||||
.name = "pda-power",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palm27x_ps_info,
|
||||
},
|
||||
};
|
||||
|
||||
void __init palm27x_power_init(int ac, int usb)
|
||||
{
|
||||
palm_ac_state = ac;
|
||||
palm_usb_state = usb;
|
||||
platform_device_register(&palm27x_power_supply);
|
||||
}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Core power regulator
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_REGULATOR_MAX1586) || \
|
||||
defined(CONFIG_REGULATOR_MAX1586_MODULE)
|
||||
static struct regulator_consumer_supply palm27x_max1587a_consumers[] = {
|
||||
{
|
||||
.supply = "vcc_core",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data palm27x_max1587a_v3_info = {
|
||||
.constraints = {
|
||||
.name = "vcc_core range",
|
||||
.min_uV = 900000,
|
||||
.max_uV = 1705000,
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
},
|
||||
.consumer_supplies = palm27x_max1587a_consumers,
|
||||
.num_consumer_supplies = ARRAY_SIZE(palm27x_max1587a_consumers),
|
||||
};
|
||||
|
||||
static struct max1586_subdev_data palm27x_max1587a_subdevs[] = {
|
||||
{
|
||||
.name = "vcc_core",
|
||||
.id = MAX1586_V3,
|
||||
.platform_data = &palm27x_max1587a_v3_info,
|
||||
}
|
||||
};
|
||||
|
||||
static struct max1586_platform_data palm27x_max1587a_info = {
|
||||
.subdevs = palm27x_max1587a_subdevs,
|
||||
.num_subdevs = ARRAY_SIZE(palm27x_max1587a_subdevs),
|
||||
.v3_gain = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata palm27x_pi2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("max1586", 0x14),
|
||||
.platform_data = &palm27x_max1587a_info,
|
||||
},
|
||||
};
|
||||
|
||||
void __init palm27x_pmic_init(void)
|
||||
{
|
||||
i2c_register_board_info(1, ARRAY_AND_SIZE(palm27x_pi2c_board_info));
|
||||
pxa27x_set_i2c_power_info(NULL);
|
||||
}
|
||||
#endif
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/wm97xx.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
|
@ -41,6 +41,7 @@
|
|||
#include <mach/irda.h>
|
||||
#include <mach/pxa27x_keypad.h>
|
||||
#include <mach/palmasoc.h>
|
||||
#include <mach/palm27x.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
@ -127,6 +128,7 @@ static unsigned long palmld_pin_config[] __initdata = {
|
|||
/******************************************************************************
|
||||
* NOR Flash
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||
static struct mtd_partition palmld_partitions[] = {
|
||||
{
|
||||
.name = "Flash",
|
||||
|
@ -160,20 +162,18 @@ static struct platform_device palmld_flash = {
|
|||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
static struct pxamci_platform_data palmld_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.gpio_card_detect = GPIO_NR_PALMLD_SD_DETECT_N,
|
||||
.gpio_card_ro = GPIO_NR_PALMLD_SD_READONLY,
|
||||
.gpio_power = GPIO_NR_PALMLD_SD_POWER,
|
||||
.detect_delay_ms = 200,
|
||||
};
|
||||
static void __init palmld_nor_init(void)
|
||||
{
|
||||
platform_device_register(&palmld_flash);
|
||||
}
|
||||
#else
|
||||
static inline void palmld_nor_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keyboard
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
|
||||
static unsigned int palmld_matrix_keys[] = {
|
||||
KEY(0, 1, KEY_F2),
|
||||
KEY(0, 2, KEY_UP),
|
||||
|
@ -200,9 +200,18 @@ static struct pxa27x_keypad_platform_data palmld_keypad_platform_data = {
|
|||
.debounce_interval = 30,
|
||||
};
|
||||
|
||||
static void __init palmld_kpc_init(void)
|
||||
{
|
||||
pxa_set_keypad_info(&palmld_keypad_platform_data);
|
||||
}
|
||||
#else
|
||||
static inline void palmld_kpc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keys
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
static struct gpio_keys_button palmld_pxa_buttons[] = {
|
||||
{KEY_F8, GPIO_NR_PALMLD_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
|
||||
{KEY_F9, GPIO_NR_PALMLD_LOCK_SWITCH, 0, "Lock Switch" },
|
||||
|
@ -222,77 +231,18 @@ static struct platform_device palmld_pxa_keys = {
|
|||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
static int palmld_backlight_init(struct device *dev)
|
||||
static void __init palmld_keys_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMLD_BL_POWER, "BL POWER");
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMLD_BL_POWER, 0);
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_request(GPIO_NR_PALMLD_LCD_POWER, "LCD POWER");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMLD_LCD_POWER, 0);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(GPIO_NR_PALMLD_LCD_POWER);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMLD_BL_POWER);
|
||||
err:
|
||||
return ret;
|
||||
platform_device_register(&palmld_pxa_keys);
|
||||
}
|
||||
|
||||
static int palmld_backlight_notify(struct device *dev, int brightness)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_PALMLD_BL_POWER, brightness);
|
||||
gpio_set_value(GPIO_NR_PALMLD_LCD_POWER, brightness);
|
||||
return brightness;
|
||||
}
|
||||
|
||||
static void palmld_backlight_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMLD_BL_POWER);
|
||||
gpio_free(GPIO_NR_PALMLD_LCD_POWER);
|
||||
}
|
||||
|
||||
static struct platform_pwm_backlight_data palmld_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = PALMLD_MAX_INTENSITY,
|
||||
.dft_brightness = PALMLD_MAX_INTENSITY,
|
||||
.pwm_period_ns = PALMLD_PERIOD_NS,
|
||||
.init = palmld_backlight_init,
|
||||
.notify = palmld_backlight_notify,
|
||||
.exit = palmld_backlight_exit,
|
||||
};
|
||||
|
||||
static struct platform_device palmld_backlight = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.parent = &pxa27x_device_pwm0.dev,
|
||||
.platform_data = &palmld_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* IrDA
|
||||
******************************************************************************/
|
||||
static struct pxaficp_platform_data palmld_ficp_platform_data = {
|
||||
.gpio_pwdown = GPIO_NR_PALMLD_IR_DISABLE,
|
||||
.transceiver_cap = IR_SIRMODE | IR_OFF,
|
||||
};
|
||||
#else
|
||||
static inline void palmld_keys_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* LEDs
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
struct gpio_led gpio_leds[] = {
|
||||
{
|
||||
.name = "palmld:green:led",
|
||||
|
@ -318,174 +268,34 @@ static struct platform_device palmld_leds = {
|
|||
}
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power supply
|
||||
******************************************************************************/
|
||||
static int power_supply_init(struct device *dev)
|
||||
static void __init palmld_leds_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMLD_POWER_DETECT, "CABLE_STATE_AC");
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = gpio_direction_input(GPIO_NR_PALMLD_POWER_DETECT);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMLD_USB_DETECT_N, "CABLE_STATE_USB");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_input(GPIO_NR_PALMLD_USB_DETECT_N);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
||||
return 0;
|
||||
|
||||
err3:
|
||||
gpio_free(GPIO_NR_PALMLD_USB_DETECT_N);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMLD_POWER_DETECT);
|
||||
err1:
|
||||
return ret;
|
||||
platform_device_register(&palmld_leds);
|
||||
}
|
||||
|
||||
static int palmld_is_ac_online(void)
|
||||
{
|
||||
return gpio_get_value(GPIO_NR_PALMLD_POWER_DETECT);
|
||||
}
|
||||
|
||||
static int palmld_is_usb_online(void)
|
||||
{
|
||||
return !gpio_get_value(GPIO_NR_PALMLD_USB_DETECT_N);
|
||||
}
|
||||
|
||||
static void power_supply_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMLD_USB_DETECT_N);
|
||||
gpio_free(GPIO_NR_PALMLD_POWER_DETECT);
|
||||
}
|
||||
|
||||
static char *palmld_supplicants[] = {
|
||||
"main-battery",
|
||||
};
|
||||
|
||||
static struct pda_power_pdata power_supply_info = {
|
||||
.init = power_supply_init,
|
||||
.is_ac_online = palmld_is_ac_online,
|
||||
.is_usb_online = palmld_is_usb_online,
|
||||
.exit = power_supply_exit,
|
||||
.supplied_to = palmld_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(palmld_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 = PALMLD_BAT_MAX_VOLTAGE,
|
||||
.min_voltage = PALMLD_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",
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* aSoC audio
|
||||
******************************************************************************/
|
||||
static struct palm27x_asoc_info palmld_asoc_pdata = {
|
||||
.jack_gpio = GPIO_NR_PALMLD_EARPHONE_DETECT,
|
||||
};
|
||||
|
||||
static pxa2xx_audio_ops_t palmld_ac97_pdata = {
|
||||
.reset_gpio = 95,
|
||||
};
|
||||
|
||||
static struct platform_device palmld_asoc = {
|
||||
.name = "palm27x-asoc",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palmld_asoc_pdata,
|
||||
},
|
||||
};
|
||||
#else
|
||||
static inline void palmld_leds_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* HDD
|
||||
******************************************************************************/
|
||||
static struct platform_device palmld_hdd = {
|
||||
#if defined(CONFIG_PATA_PALMLD) || defined(CONFIG_PATA_PALMLD_MODULE)
|
||||
static struct platform_device palmld_ide_device = {
|
||||
.name = "pata_palmld",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
static struct pxafb_mode_info palmld_lcd_modes[] = {
|
||||
static void __init palmld_ide_init(void)
|
||||
{
|
||||
.pixclock = 57692,
|
||||
.xres = 320,
|
||||
.yres = 480,
|
||||
.bpp = 16,
|
||||
|
||||
.left_margin = 32,
|
||||
.right_margin = 1,
|
||||
.upper_margin = 7,
|
||||
.lower_margin = 1,
|
||||
|
||||
.hsync_len = 4,
|
||||
.vsync_len = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info palmld_lcd_screen = {
|
||||
.modes = palmld_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(palmld_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power management - standby
|
||||
******************************************************************************/
|
||||
static void __init palmld_pm_init(void)
|
||||
{
|
||||
static u32 resume[] = {
|
||||
0xe3a00101, /* mov r0, #0x40000000 */
|
||||
0xe380060f, /* orr r0, r0, #0x00f00000 */
|
||||
0xe590f008, /* ldr pc, [r0, #0x08] */
|
||||
};
|
||||
|
||||
/* copy the bootloader */
|
||||
memcpy(phys_to_virt(PALMLD_STR_BASE), resume, sizeof(resume));
|
||||
platform_device_register(&palmld_ide_device);
|
||||
}
|
||||
#else
|
||||
static inline void palmld_ide_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
&palmld_pxa_keys,
|
||||
#endif
|
||||
&palmld_backlight,
|
||||
&palmld_leds,
|
||||
&power_supply,
|
||||
&palmld_asoc,
|
||||
&palmld_hdd,
|
||||
&palmld_flash,
|
||||
};
|
||||
|
||||
static struct map_desc palmld_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = PALMLD_IDE_VIRT,
|
||||
|
@ -510,20 +320,26 @@ static void __init palmld_map_io(void)
|
|||
static void __init palmld_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config));
|
||||
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
palmld_pm_init();
|
||||
set_pxa_fb_info(&palmld_lcd_screen);
|
||||
pxa_set_mci_info(&palmld_mci_platform_data);
|
||||
pxa_set_ac97_info(&palmld_ac97_pdata);
|
||||
pxa_set_ficp_info(&palmld_ficp_platform_data);
|
||||
pxa_set_keypad_info(&palmld_keypad_platform_data);
|
||||
wm97xx_bat_set_pdata(&wm97xx_batt_pdata);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
palm27x_mmc_init(GPIO_NR_PALMLD_SD_DETECT_N, GPIO_NR_PALMLD_SD_READONLY,
|
||||
GPIO_NR_PALMLD_SD_POWER, 0);
|
||||
palm27x_pm_init(PALMLD_STR_BASE);
|
||||
palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
|
||||
palm27x_irda_init(GPIO_NR_PALMLD_IR_DISABLE);
|
||||
palm27x_ac97_init(PALMLD_BAT_MIN_VOLTAGE, PALMLD_BAT_MAX_VOLTAGE,
|
||||
GPIO_NR_PALMLD_EARPHONE_DETECT, 95);
|
||||
palm27x_pwm_init(GPIO_NR_PALMLD_BL_POWER, GPIO_NR_PALMLD_LCD_POWER);
|
||||
palm27x_power_init(GPIO_NR_PALMLD_POWER_DETECT,
|
||||
GPIO_NR_PALMLD_USB_DETECT_N);
|
||||
palm27x_pmic_init();
|
||||
palmld_kpc_init();
|
||||
palmld_keys_init();
|
||||
palmld_nor_init();
|
||||
palmld_leds_init();
|
||||
palmld_ide_init();
|
||||
}
|
||||
|
||||
MACHINE_START(PALMLD, "Palm LifeDrive")
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/wm97xx.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
|
||||
|
@ -42,6 +42,7 @@
|
|||
#include <mach/pxa27x_keypad.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/palmasoc.h>
|
||||
#include <mach/palm27x.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
@ -103,20 +104,10 @@ static unsigned long palmt5_pin_config[] __initdata = {
|
|||
GPIO107_GPIO, /* earphone detect */
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
static struct pxamci_platform_data palmt5_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.gpio_card_detect = GPIO_NR_PALMT5_SD_DETECT_N,
|
||||
.gpio_card_ro = GPIO_NR_PALMT5_SD_READONLY,
|
||||
.gpio_power = GPIO_NR_PALMT5_SD_POWER,
|
||||
.detect_delay_ms = 200,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keyboard
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
|
||||
static unsigned int palmt5_matrix_keys[] = {
|
||||
KEY(0, 0, KEY_POWER),
|
||||
KEY(0, 1, KEY_F1),
|
||||
|
@ -142,9 +133,18 @@ static struct pxa27x_keypad_platform_data palmt5_keypad_platform_data = {
|
|||
.debounce_interval = 30,
|
||||
};
|
||||
|
||||
static void __init palmt5_kpc_init(void)
|
||||
{
|
||||
pxa_set_keypad_info(&palmt5_keypad_platform_data);
|
||||
}
|
||||
#else
|
||||
static inline void palmt5_kpc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keys
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
static struct gpio_keys_button palmt5_pxa_buttons[] = {
|
||||
{KEY_F8, GPIO_NR_PALMT5_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
|
||||
};
|
||||
|
@ -162,241 +162,17 @@ static struct platform_device palmt5_pxa_keys = {
|
|||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
static int palmt5_backlight_init(struct device *dev)
|
||||
static void __init palmt5_keys_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMT5_BL_POWER, "BL POWER");
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMT5_BL_POWER, 0);
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_request(GPIO_NR_PALMT5_LCD_POWER, "LCD POWER");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMT5_LCD_POWER, 0);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(GPIO_NR_PALMT5_LCD_POWER);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMT5_BL_POWER);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int palmt5_backlight_notify(struct device *dev, int brightness)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_PALMT5_BL_POWER, brightness);
|
||||
gpio_set_value(GPIO_NR_PALMT5_LCD_POWER, brightness);
|
||||
return brightness;
|
||||
}
|
||||
|
||||
static void palmt5_backlight_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMT5_BL_POWER);
|
||||
gpio_free(GPIO_NR_PALMT5_LCD_POWER);
|
||||
}
|
||||
|
||||
static struct platform_pwm_backlight_data palmt5_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = PALMT5_MAX_INTENSITY,
|
||||
.dft_brightness = PALMT5_MAX_INTENSITY,
|
||||
.pwm_period_ns = PALMT5_PERIOD_NS,
|
||||
.init = palmt5_backlight_init,
|
||||
.notify = palmt5_backlight_notify,
|
||||
.exit = palmt5_backlight_exit,
|
||||
};
|
||||
|
||||
static struct platform_device palmt5_backlight = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.parent = &pxa27x_device_pwm0.dev,
|
||||
.platform_data = &palmt5_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* IrDA
|
||||
******************************************************************************/
|
||||
static struct pxaficp_platform_data palmt5_ficp_platform_data = {
|
||||
.gpio_pwdown = GPIO_NR_PALMT5_IR_DISABLE,
|
||||
.transceiver_cap = IR_SIRMODE | IR_OFF,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* UDC
|
||||
******************************************************************************/
|
||||
static struct gpio_vbus_mach_info palmt5_udc_info = {
|
||||
.gpio_vbus = GPIO_NR_PALMT5_USB_DETECT_N,
|
||||
.gpio_vbus_inverted = 1,
|
||||
.gpio_pullup = GPIO_NR_PALMT5_USB_PULLUP,
|
||||
};
|
||||
|
||||
static struct platform_device palmt5_gpio_vbus = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palmt5_udc_info,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power supply
|
||||
******************************************************************************/
|
||||
static int power_supply_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMT5_POWER_DETECT, "CABLE_STATE_AC");
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = gpio_direction_input(GPIO_NR_PALMT5_POWER_DETECT);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
return 0;
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMT5_POWER_DETECT);
|
||||
err1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int palmt5_is_ac_online(void)
|
||||
{
|
||||
return gpio_get_value(GPIO_NR_PALMT5_POWER_DETECT);
|
||||
}
|
||||
|
||||
static void power_supply_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMT5_POWER_DETECT);
|
||||
}
|
||||
|
||||
static char *palmt5_supplicants[] = {
|
||||
"main-battery",
|
||||
};
|
||||
|
||||
static struct pda_power_pdata power_supply_info = {
|
||||
.init = power_supply_init,
|
||||
.is_ac_online = palmt5_is_ac_online,
|
||||
.exit = power_supply_exit,
|
||||
.supplied_to = palmt5_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(palmt5_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 = PALMT5_BAT_MAX_VOLTAGE,
|
||||
.min_voltage = PALMT5_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",
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* aSoC audio
|
||||
******************************************************************************/
|
||||
static struct palm27x_asoc_info palmt5_asoc_pdata = {
|
||||
.jack_gpio = GPIO_NR_PALMT5_EARPHONE_DETECT,
|
||||
};
|
||||
|
||||
static pxa2xx_audio_ops_t palmt5_ac97_pdata = {
|
||||
.reset_gpio = 95,
|
||||
};
|
||||
|
||||
static struct platform_device palmt5_asoc = {
|
||||
.name = "palm27x-asoc",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palmt5_asoc_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
static struct pxafb_mode_info palmt5_lcd_modes[] = {
|
||||
{
|
||||
.pixclock = 57692,
|
||||
.xres = 320,
|
||||
.yres = 480,
|
||||
.bpp = 16,
|
||||
|
||||
.left_margin = 32,
|
||||
.right_margin = 1,
|
||||
.upper_margin = 7,
|
||||
.lower_margin = 1,
|
||||
|
||||
.hsync_len = 4,
|
||||
.vsync_len = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info palmt5_lcd_screen = {
|
||||
.modes = palmt5_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(palmt5_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power management - standby
|
||||
******************************************************************************/
|
||||
static void __init palmt5_pm_init(void)
|
||||
{
|
||||
static u32 resume[] = {
|
||||
0xe3a00101, /* mov r0, #0x40000000 */
|
||||
0xe380060f, /* orr r0, r0, #0x00f00000 */
|
||||
0xe590f008, /* ldr pc, [r0, #0x08] */
|
||||
};
|
||||
|
||||
/* copy the bootloader */
|
||||
memcpy(phys_to_virt(PALMT5_STR_BASE), resume, sizeof(resume));
|
||||
platform_device_register(&palmt5_pxa_keys);
|
||||
}
|
||||
#else
|
||||
static inline void palmt5_keys_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
&palmt5_pxa_keys,
|
||||
#endif
|
||||
&palmt5_backlight,
|
||||
&power_supply,
|
||||
&palmt5_asoc,
|
||||
&palmt5_gpio_vbus,
|
||||
};
|
||||
|
||||
/* setup udc GPIOs initial state */
|
||||
static void __init palmt5_udc_init(void)
|
||||
{
|
||||
if (!gpio_request(GPIO_NR_PALMT5_USB_PULLUP, "UDC Vbus")) {
|
||||
gpio_direction_output(GPIO_NR_PALMT5_USB_PULLUP, 1);
|
||||
gpio_free(GPIO_NR_PALMT5_USB_PULLUP);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init palmt5_reserve(void)
|
||||
{
|
||||
memblock_reserve(0xa0200000, 0x1000);
|
||||
|
@ -405,21 +181,24 @@ static void __init palmt5_reserve(void)
|
|||
static void __init palmt5_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmt5_pin_config));
|
||||
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
palmt5_pm_init();
|
||||
set_pxa_fb_info(&palmt5_lcd_screen);
|
||||
pxa_set_mci_info(&palmt5_mci_platform_data);
|
||||
palmt5_udc_init();
|
||||
pxa_set_ac97_info(&palmt5_ac97_pdata);
|
||||
pxa_set_ficp_info(&palmt5_ficp_platform_data);
|
||||
pxa_set_keypad_info(&palmt5_keypad_platform_data);
|
||||
wm97xx_bat_set_pdata(&wm97xx_batt_pdata);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
palm27x_mmc_init(GPIO_NR_PALMT5_SD_DETECT_N, GPIO_NR_PALMT5_SD_READONLY,
|
||||
GPIO_NR_PALMT5_SD_POWER, 0);
|
||||
palm27x_pm_init(PALMT5_STR_BASE);
|
||||
palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
|
||||
palm27x_udc_init(GPIO_NR_PALMT5_USB_DETECT_N,
|
||||
GPIO_NR_PALMT5_USB_PULLUP, 1);
|
||||
palm27x_irda_init(GPIO_NR_PALMT5_IR_DISABLE);
|
||||
palm27x_ac97_init(PALMT5_BAT_MIN_VOLTAGE, PALMT5_BAT_MAX_VOLTAGE,
|
||||
GPIO_NR_PALMT5_EARPHONE_DETECT, 95);
|
||||
palm27x_pwm_init(GPIO_NR_PALMT5_BL_POWER, GPIO_NR_PALMT5_LCD_POWER);
|
||||
palm27x_power_init(GPIO_NR_PALMT5_POWER_DETECT, -1);
|
||||
palm27x_pmic_init();
|
||||
palmt5_kpc_init();
|
||||
palmt5_keys_init();
|
||||
}
|
||||
|
||||
MACHINE_START(PALMT5, "Palm Tungsten|T5")
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/wm97xx.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
|
||||
|
@ -271,9 +271,9 @@ static struct platform_device power_supply = {
|
|||
};
|
||||
|
||||
/******************************************************************************
|
||||
* WM97xx battery
|
||||
* WM97xx audio, battery
|
||||
******************************************************************************/
|
||||
static struct wm97xx_batt_info wm97xx_batt_pdata = {
|
||||
static struct wm97xx_batt_pdata palmte2_batt_pdata = {
|
||||
.batt_aux = WM97XX_AUX_ID3,
|
||||
.temp_aux = WM97XX_AUX_ID2,
|
||||
.charge_gpio = -1,
|
||||
|
@ -287,9 +287,14 @@ static struct wm97xx_batt_info wm97xx_batt_pdata = {
|
|||
.batt_name = "main-batt",
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* aSoC audio
|
||||
******************************************************************************/
|
||||
static struct wm97xx_pdata palmte2_wm97xx_pdata = {
|
||||
.batt_pdata = &palmte2_batt_pdata,
|
||||
};
|
||||
|
||||
static pxa2xx_audio_ops_t palmte2_ac97_pdata = {
|
||||
.codec_pdata = { &palmte2_wm97xx_pdata, },
|
||||
};
|
||||
|
||||
static struct palm27x_asoc_info palmte2_asoc_pdata = {
|
||||
.jack_gpio = GPIO_NR_PALMTE2_EARPHONE_DETECT,
|
||||
};
|
||||
|
@ -361,9 +366,8 @@ static void __init palmte2_init(void)
|
|||
set_pxa_fb_info(&palmte2_lcd_screen);
|
||||
pxa_set_mci_info(&palmte2_mci_platform_data);
|
||||
palmte2_udc_init();
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ac97_info(&palmte2_ac97_pdata);
|
||||
pxa_set_ficp_info(&palmte2_ficp_platform_data);
|
||||
wm97xx_bat_set_pdata(&wm97xx_batt_pdata);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#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 <linux/sysdev.h>
|
||||
#include <linux/w1-gpio.h>
|
||||
|
@ -46,6 +45,7 @@
|
|||
#include <mach/pxa2xx-regs.h>
|
||||
#include <mach/palmasoc.h>
|
||||
#include <mach/camera.h>
|
||||
#include <mach/palm27x.h>
|
||||
|
||||
#include <sound/pxa2xx-lib.h>
|
||||
|
||||
|
@ -159,32 +159,10 @@ static unsigned long centro685_pin_config[] __initdata = {
|
|||
};
|
||||
#endif /* CONFIG_MACH_CENTRO */
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
#ifdef CONFIG_MACH_TREO680
|
||||
static struct pxamci_platform_data treo680_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.gpio_card_detect = GPIO_NR_TREO_SD_DETECT_N,
|
||||
.gpio_card_ro = GPIO_NR_TREO680_SD_READONLY,
|
||||
.gpio_power = GPIO_NR_TREO680_SD_POWER,
|
||||
};
|
||||
#endif /* CONFIG_MACH_TREO680 */
|
||||
|
||||
#ifdef CONFIG_MACH_CENTRO
|
||||
static struct pxamci_platform_data centro_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.gpio_card_detect = GPIO_NR_TREO_SD_DETECT_N,
|
||||
.gpio_card_ro = -1,
|
||||
.gpio_power = GPIO_NR_CENTRO_SD_POWER,
|
||||
.gpio_power_invert = 1,
|
||||
};
|
||||
#endif /* CONFIG_MACH_CENTRO */
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keyboard
|
||||
******************************************************************************/
|
||||
#ifdef CONFIG_MACH_TREO680
|
||||
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
|
||||
static unsigned int treo680_matrix_keys[] = {
|
||||
KEY(0, 0, KEY_F8), /* Red/Off/Power */
|
||||
KEY(0, 1, KEY_LEFT),
|
||||
|
@ -244,19 +222,6 @@ static unsigned int treo680_matrix_keys[] = {
|
|||
KEY(7, 5, KEY_I),
|
||||
};
|
||||
|
||||
static struct pxa27x_keypad_platform_data treo680_keypad_platform_data = {
|
||||
.matrix_key_rows = 8,
|
||||
.matrix_key_cols = 7,
|
||||
.matrix_key_map = treo680_matrix_keys,
|
||||
.matrix_key_map_size = ARRAY_SIZE(treo680_matrix_keys),
|
||||
.direct_key_map = { KEY_CONNECT },
|
||||
.direct_key_num = 1,
|
||||
|
||||
.debounce_interval = 30,
|
||||
};
|
||||
#endif /* CONFIG_MACH_TREO680 */
|
||||
|
||||
#ifdef CONFIG_MACH_CENTRO
|
||||
static unsigned int centro_matrix_keys[] = {
|
||||
KEY(0, 0, KEY_F9), /* Home */
|
||||
KEY(0, 1, KEY_LEFT),
|
||||
|
@ -316,157 +281,50 @@ static unsigned int centro_matrix_keys[] = {
|
|||
KEY(7, 5, KEY_I),
|
||||
};
|
||||
|
||||
static struct pxa27x_keypad_platform_data centro_keypad_platform_data = {
|
||||
static struct pxa27x_keypad_platform_data treo680_keypad_pdata = {
|
||||
.matrix_key_rows = 8,
|
||||
.matrix_key_cols = 7,
|
||||
.matrix_key_map = centro_matrix_keys,
|
||||
.matrix_key_map_size = ARRAY_SIZE(centro_matrix_keys),
|
||||
.matrix_key_map = treo680_matrix_keys,
|
||||
.matrix_key_map_size = ARRAY_SIZE(treo680_matrix_keys),
|
||||
.direct_key_map = { KEY_CONNECT },
|
||||
.direct_key_num = 1,
|
||||
|
||||
.debounce_interval = 30,
|
||||
};
|
||||
#endif /* CONFIG_MACH_CENTRO */
|
||||
|
||||
/******************************************************************************
|
||||
* aSoC audio
|
||||
******************************************************************************/
|
||||
|
||||
static pxa2xx_audio_ops_t treo_ac97_pdata = {
|
||||
.reset_gpio = 95,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
static int treo_backlight_init(struct device *dev)
|
||||
static void __init palmtreo_kpc_init(void)
|
||||
{
|
||||
int ret;
|
||||
static struct pxa27x_keypad_platform_data *data = &treo680_keypad_pdata;
|
||||
|
||||
ret = gpio_request(GPIO_NR_TREO_BL_POWER, "BL POWER");
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = gpio_direction_output(GPIO_NR_TREO_BL_POWER, 0);
|
||||
if (ret)
|
||||
goto err2;
|
||||
if (machine_is_centro()) {
|
||||
data->matrix_key_map = centro_matrix_keys;
|
||||
data->matrix_key_map_size = ARRAY_SIZE(centro_matrix_keys);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
gpio_free(GPIO_NR_TREO_BL_POWER);
|
||||
err:
|
||||
return ret;
|
||||
pxa_set_keypad_info(&treo680_keypad_pdata);
|
||||
}
|
||||
|
||||
static int treo_backlight_notify(struct device *dev, int brightness)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_TREO_BL_POWER, brightness);
|
||||
return TREO_MAX_INTENSITY - brightness;
|
||||
};
|
||||
|
||||
static void treo_backlight_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_TREO_BL_POWER);
|
||||
}
|
||||
|
||||
static struct platform_pwm_backlight_data treo_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = TREO_MAX_INTENSITY,
|
||||
.dft_brightness = TREO_DEFAULT_INTENSITY,
|
||||
.pwm_period_ns = TREO_PERIOD_NS,
|
||||
.init = treo_backlight_init,
|
||||
.notify = treo_backlight_notify,
|
||||
.exit = treo_backlight_exit,
|
||||
};
|
||||
|
||||
static struct platform_device treo_backlight = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.parent = &pxa27x_device_pwm0.dev,
|
||||
.platform_data = &treo_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* IrDA
|
||||
******************************************************************************/
|
||||
static struct pxaficp_platform_data treo_ficp_info = {
|
||||
.gpio_pwdown = GPIO_NR_TREO_IR_EN,
|
||||
.transceiver_cap = IR_SIRMODE | IR_OFF,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* UDC
|
||||
******************************************************************************/
|
||||
static struct pxa2xx_udc_mach_info treo_udc_info __initdata = {
|
||||
.gpio_vbus = GPIO_NR_TREO_USB_DETECT,
|
||||
.gpio_vbus_inverted = 1,
|
||||
.gpio_pullup = GPIO_NR_TREO_USB_PULLUP,
|
||||
};
|
||||
|
||||
#else
|
||||
static inline void palmtreo_kpc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* USB host
|
||||
******************************************************************************/
|
||||
#ifdef CONFIG_MACH_TREO680
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
static struct pxaohci_platform_data treo680_ohci_info = {
|
||||
.port_mode = PMM_PERPORT_MODE,
|
||||
.flags = ENABLE_PORT1 | ENABLE_PORT3,
|
||||
.power_budget = 0,
|
||||
};
|
||||
#endif /* CONFIG_MACH_TREO680 */
|
||||
|
||||
/******************************************************************************
|
||||
* Power supply
|
||||
******************************************************************************/
|
||||
static int power_supply_init(struct device *dev)
|
||||
static void __init palmtreo_uhc_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_TREO_POWER_DETECT, "CABLE_STATE_AC");
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = gpio_direction_input(GPIO_NR_TREO_POWER_DETECT);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
gpio_free(GPIO_NR_TREO_POWER_DETECT);
|
||||
err1:
|
||||
return ret;
|
||||
if (machine_is_treo680())
|
||||
pxa_set_ohci_info(&treo680_ohci_info);
|
||||
}
|
||||
|
||||
static int treo_is_ac_online(void)
|
||||
{
|
||||
return gpio_get_value(GPIO_NR_TREO_POWER_DETECT);
|
||||
}
|
||||
|
||||
static void power_supply_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_TREO_POWER_DETECT);
|
||||
}
|
||||
|
||||
static char *treo_supplicants[] = {
|
||||
"main-battery",
|
||||
};
|
||||
|
||||
static struct pda_power_pdata power_supply_info = {
|
||||
.init = power_supply_init,
|
||||
.is_ac_online = treo_is_ac_online,
|
||||
.exit = power_supply_exit,
|
||||
.supplied_to = treo_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(treo_supplicants),
|
||||
};
|
||||
|
||||
static struct platform_device power_supply = {
|
||||
.name = "pda-power",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &power_supply_info,
|
||||
},
|
||||
};
|
||||
#else
|
||||
static inline void palmtreo_uhc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Vibra and LEDs
|
||||
|
@ -495,16 +353,6 @@ static struct gpio_led_platform_data treo680_gpio_led_info = {
|
|||
.num_leds = ARRAY_SIZE(treo680_gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device treo680_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &treo680_gpio_led_info,
|
||||
}
|
||||
};
|
||||
#endif /* CONFIG_MACH_TREO680 */
|
||||
|
||||
#ifdef CONFIG_MACH_CENTRO
|
||||
static struct gpio_led centro_gpio_leds[] = {
|
||||
{
|
||||
.name = "centro:vibra:vibra",
|
||||
|
@ -529,145 +377,67 @@ static struct gpio_led_platform_data centro_gpio_led_info = {
|
|||
.num_leds = ARRAY_SIZE(centro_gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device centro_leds = {
|
||||
static struct platform_device palmtreo_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = ¢ro_gpio_led_info,
|
||||
.platform_data = &treo680_gpio_led_info,
|
||||
}
|
||||
};
|
||||
#endif /* CONFIG_MACH_CENTRO */
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
/* TODO: add support for 324x324 */
|
||||
static struct pxafb_mode_info treo_lcd_modes[] = {
|
||||
static void __init palmtreo_leds_init(void)
|
||||
{
|
||||
.pixclock = 86538,
|
||||
.xres = 320,
|
||||
.yres = 320,
|
||||
.bpp = 16,
|
||||
if (machine_is_centro())
|
||||
palmtreo_leds.dev.platform_data = ¢ro_gpio_led_info;
|
||||
|
||||
.left_margin = 20,
|
||||
.right_margin = 8,
|
||||
.upper_margin = 8,
|
||||
.lower_margin = 5,
|
||||
|
||||
.hsync_len = 4,
|
||||
.vsync_len = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static void treo_lcd_power(int on, struct fb_var_screeninfo *info)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_TREO_BL_POWER, on);
|
||||
}
|
||||
|
||||
static struct pxafb_mach_info treo_lcd_screen = {
|
||||
.modes = treo_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(treo_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power management - standby
|
||||
******************************************************************************/
|
||||
static void __init treo_pm_init(void)
|
||||
{
|
||||
static u32 resume[] = {
|
||||
0xe3a00101, /* mov r0, #0x40000000 */
|
||||
0xe380060f, /* orr r0, r0, #0x00f00000 */
|
||||
0xe590f008, /* ldr pc, [r0, #0x08] */
|
||||
};
|
||||
|
||||
/* this is where the bootloader jumps */
|
||||
memcpy(phys_to_virt(TREO_STR_BASE), resume, sizeof(resume));
|
||||
platform_device_register(&palmtreo_leds);
|
||||
}
|
||||
#else
|
||||
static inline void palmtreo_leds_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
static struct platform_device *treo_devices[] __initdata = {
|
||||
&treo_backlight,
|
||||
&power_supply,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MACH_TREO680
|
||||
static struct platform_device *treo680_devices[] __initdata = {
|
||||
&treo680_leds,
|
||||
};
|
||||
#endif /* CONFIG_MACH_TREO680 */
|
||||
|
||||
#ifdef CONFIG_MACH_CENTRO
|
||||
static struct platform_device *centro_devices[] __initdata = {
|
||||
¢ro_leds,
|
||||
};
|
||||
#endif /* CONFIG_MACH_CENTRO */
|
||||
|
||||
/* setup udc GPIOs initial state */
|
||||
static void __init treo_udc_init(void)
|
||||
{
|
||||
if (!gpio_request(GPIO_NR_TREO_USB_PULLUP, "UDC Vbus")) {
|
||||
gpio_direction_output(GPIO_NR_TREO_USB_PULLUP, 1);
|
||||
gpio_free(GPIO_NR_TREO_USB_PULLUP);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init treo_lcd_power_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_TREO_LCD_POWER, "LCD POWER");
|
||||
if (ret) {
|
||||
pr_err("Treo680: LCD power GPIO request failed!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
ret = gpio_direction_output(GPIO_NR_TREO_LCD_POWER, 0);
|
||||
if (ret) {
|
||||
pr_err("Treo680: setting LCD power GPIO direction failed!\n");
|
||||
gpio_free(GPIO_NR_TREO_LCD_POWER);
|
||||
return;
|
||||
}
|
||||
|
||||
treo_lcd_screen.pxafb_lcd_power = treo_lcd_power;
|
||||
}
|
||||
|
||||
static void __init treo_reserve(void)
|
||||
{
|
||||
memblock_reserve(0xa0000000, 0x1000);
|
||||
memblock_reserve(0xa2000000, 0x1000);
|
||||
}
|
||||
|
||||
static void __init treo_init(void)
|
||||
static void __init palmphone_common_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(treo_pin_config));
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
treo_pm_init();
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(treo_pin_config));
|
||||
treo_lcd_power_init();
|
||||
set_pxa_fb_info(&treo_lcd_screen);
|
||||
treo_udc_init();
|
||||
pxa_set_udc_info(&treo_udc_info);
|
||||
pxa_set_ac97_info(&treo_ac97_pdata);
|
||||
pxa_set_ficp_info(&treo_ficp_info);
|
||||
|
||||
platform_add_devices(ARRAY_AND_SIZE(treo_devices));
|
||||
palm27x_pm_init(TREO_STR_BASE);
|
||||
palm27x_lcd_init(GPIO_NR_TREO_BL_POWER, &palm_320x320_new_lcd_mode);
|
||||
palm27x_udc_init(GPIO_NR_TREO_USB_DETECT, GPIO_NR_TREO_USB_PULLUP, 1);
|
||||
palm27x_irda_init(GPIO_NR_TREO_IR_EN);
|
||||
palm27x_ac97_init(-1, -1, -1, 95);
|
||||
palm27x_pwm_init(GPIO_NR_TREO_BL_POWER, -1);
|
||||
palm27x_power_init(GPIO_NR_TREO_POWER_DETECT, -1);
|
||||
palm27x_pmic_init();
|
||||
palmtreo_kpc_init();
|
||||
palmtreo_uhc_init();
|
||||
palmtreo_leds_init();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MACH_TREO680
|
||||
static void __init treo680_init(void)
|
||||
{
|
||||
treo_init();
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(treo680_pin_config));
|
||||
pxa_set_mci_info(&treo680_mci_platform_data);
|
||||
pxa_set_keypad_info(&treo680_keypad_platform_data);
|
||||
pxa_set_ohci_info(&treo680_ohci_info);
|
||||
palmphone_common_init();
|
||||
palm27x_mmc_init(GPIO_NR_TREO_SD_DETECT_N, GPIO_NR_TREO680_SD_READONLY,
|
||||
GPIO_NR_TREO680_SD_POWER, 0);
|
||||
}
|
||||
|
||||
platform_add_devices(ARRAY_AND_SIZE(treo680_devices));
|
||||
static void __init centro_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(centro685_pin_config));
|
||||
palmphone_common_init();
|
||||
palm27x_mmc_init(GPIO_NR_TREO_SD_DETECT_N, -1,
|
||||
GPIO_NR_CENTRO_SD_POWER, 1);
|
||||
}
|
||||
|
||||
MACHINE_START(TREO680, "Palm Treo 680")
|
||||
|
@ -680,19 +450,6 @@ MACHINE_START(TREO680, "Palm Treo 680")
|
|||
.timer = &pxa_timer,
|
||||
.init_machine = treo680_init,
|
||||
MACHINE_END
|
||||
#endif /* CONFIG_MACH_TREO680 */
|
||||
|
||||
#ifdef CONFIG_MACH_CENTRO
|
||||
static void __init centro_init(void)
|
||||
{
|
||||
treo_init();
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(centro685_pin_config));
|
||||
pxa_set_mci_info(¢ro_mci_platform_data);
|
||||
|
||||
pxa_set_keypad_info(¢ro_keypad_platform_data);
|
||||
|
||||
platform_add_devices(ARRAY_AND_SIZE(centro_devices));
|
||||
}
|
||||
|
||||
MACHINE_START(CENTRO, "Palm Centro 685")
|
||||
.phys_io = TREO_PHYS_IO_START,
|
||||
|
@ -702,6 +459,5 @@ MACHINE_START(CENTRO, "Palm Centro 685")
|
|||
.reserve = treo_reserve,
|
||||
.init_irq = pxa27x_init_irq,
|
||||
.timer = &pxa_timer,
|
||||
.init_machine = centro_init,
|
||||
.init_machine = centro_init,
|
||||
MACHINE_END
|
||||
#endif /* CONFIG_MACH_CENTRO */
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/wm97xx.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
|
@ -46,6 +46,7 @@
|
|||
#include <mach/pxa27x_keypad.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/palmasoc.h>
|
||||
#include <mach/palm27x.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
|
@ -129,6 +130,7 @@ static unsigned long palmtx_pin_config[] __initdata = {
|
|||
/******************************************************************************
|
||||
* NOR Flash
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
|
||||
static struct mtd_partition palmtx_partitions[] = {
|
||||
{
|
||||
.name = "Flash",
|
||||
|
@ -162,20 +164,18 @@ static struct platform_device palmtx_flash = {
|
|||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
static struct pxamci_platform_data palmtx_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.gpio_card_detect = GPIO_NR_PALMTX_SD_DETECT_N,
|
||||
.gpio_card_ro = GPIO_NR_PALMTX_SD_READONLY,
|
||||
.gpio_power = GPIO_NR_PALMTX_SD_POWER,
|
||||
.detect_delay_ms = 200,
|
||||
};
|
||||
static void __init palmtx_nor_init(void)
|
||||
{
|
||||
platform_device_register(&palmtx_flash);
|
||||
}
|
||||
#else
|
||||
static inline void palmtx_nor_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keyboard
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
|
||||
static unsigned int palmtx_matrix_keys[] = {
|
||||
KEY(0, 0, KEY_POWER),
|
||||
KEY(0, 1, KEY_F1),
|
||||
|
@ -201,9 +201,18 @@ static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
|
|||
.debounce_interval = 30,
|
||||
};
|
||||
|
||||
static void __init palmtx_kpc_init(void)
|
||||
{
|
||||
pxa_set_keypad_info(&palmtx_keypad_platform_data);
|
||||
}
|
||||
#else
|
||||
static inline void palmtx_kpc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keys
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
static struct gpio_keys_button palmtx_pxa_buttons[] = {
|
||||
{KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
|
||||
};
|
||||
|
@ -221,208 +230,18 @@ static struct platform_device palmtx_pxa_keys = {
|
|||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
static int palmtx_backlight_init(struct device *dev)
|
||||
static void __init palmtx_keys_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMTX_BL_POWER, "BL POWER");
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMTX_BL_POWER, 0);
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_request(GPIO_NR_PALMTX_LCD_POWER, "LCD POWER");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMTX_LCD_POWER, 0);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(GPIO_NR_PALMTX_LCD_POWER);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMTX_BL_POWER);
|
||||
err:
|
||||
return ret;
|
||||
platform_device_register(&palmtx_pxa_keys);
|
||||
}
|
||||
|
||||
static int palmtx_backlight_notify(struct device *dev, int brightness)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_PALMTX_BL_POWER, brightness);
|
||||
gpio_set_value(GPIO_NR_PALMTX_LCD_POWER, brightness);
|
||||
return brightness;
|
||||
}
|
||||
|
||||
static void palmtx_backlight_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMTX_BL_POWER);
|
||||
gpio_free(GPIO_NR_PALMTX_LCD_POWER);
|
||||
}
|
||||
|
||||
static struct platform_pwm_backlight_data palmtx_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = PALMTX_MAX_INTENSITY,
|
||||
.dft_brightness = PALMTX_MAX_INTENSITY,
|
||||
.pwm_period_ns = PALMTX_PERIOD_NS,
|
||||
.init = palmtx_backlight_init,
|
||||
.notify = palmtx_backlight_notify,
|
||||
.exit = palmtx_backlight_exit,
|
||||
};
|
||||
|
||||
static struct platform_device palmtx_backlight = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.parent = &pxa27x_device_pwm0.dev,
|
||||
.platform_data = &palmtx_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* IrDA
|
||||
******************************************************************************/
|
||||
static struct pxaficp_platform_data palmtx_ficp_platform_data = {
|
||||
.gpio_pwdown = GPIO_NR_PALMTX_IR_DISABLE,
|
||||
.transceiver_cap = IR_SIRMODE | IR_OFF,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* UDC
|
||||
******************************************************************************/
|
||||
static struct gpio_vbus_mach_info palmtx_udc_info = {
|
||||
.gpio_vbus = GPIO_NR_PALMTX_USB_DETECT_N,
|
||||
.gpio_vbus_inverted = 1,
|
||||
.gpio_pullup = GPIO_NR_PALMTX_USB_PULLUP,
|
||||
};
|
||||
|
||||
static struct platform_device palmtx_gpio_vbus = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palmtx_udc_info,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power supply
|
||||
******************************************************************************/
|
||||
static int power_supply_init(struct device *dev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMTX_POWER_DETECT, "CABLE_STATE_AC");
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = gpio_direction_input(GPIO_NR_PALMTX_POWER_DETECT);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
return 0;
|
||||
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMTX_POWER_DETECT);
|
||||
err1:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int palmtx_is_ac_online(void)
|
||||
{
|
||||
return gpio_get_value(GPIO_NR_PALMTX_POWER_DETECT);
|
||||
}
|
||||
|
||||
static void power_supply_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMTX_POWER_DETECT);
|
||||
}
|
||||
|
||||
static char *palmtx_supplicants[] = {
|
||||
"main-battery",
|
||||
};
|
||||
|
||||
static struct pda_power_pdata power_supply_info = {
|
||||
.init = power_supply_init,
|
||||
.is_ac_online = palmtx_is_ac_online,
|
||||
.exit = power_supply_exit,
|
||||
.supplied_to = palmtx_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(palmtx_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 = PALMTX_BAT_MAX_VOLTAGE,
|
||||
.min_voltage = PALMTX_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",
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* aSoC audio
|
||||
******************************************************************************/
|
||||
static struct palm27x_asoc_info palmtx_asoc_pdata = {
|
||||
.jack_gpio = GPIO_NR_PALMTX_EARPHONE_DETECT,
|
||||
};
|
||||
|
||||
static pxa2xx_audio_ops_t palmtx_ac97_pdata = {
|
||||
.reset_gpio = 95,
|
||||
};
|
||||
|
||||
static struct platform_device palmtx_asoc = {
|
||||
.name = "palm27x-asoc",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palmtx_asoc_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
static struct pxafb_mode_info palmtx_lcd_modes[] = {
|
||||
{
|
||||
.pixclock = 57692,
|
||||
.xres = 320,
|
||||
.yres = 480,
|
||||
.bpp = 16,
|
||||
|
||||
.left_margin = 32,
|
||||
.right_margin = 1,
|
||||
.upper_margin = 7,
|
||||
.lower_margin = 1,
|
||||
|
||||
.hsync_len = 4,
|
||||
.vsync_len = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info palmtx_lcd_screen = {
|
||||
.modes = palmtx_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(palmtx_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
#else
|
||||
static inline void palmtx_keys_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* NAND Flash
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MTD_NAND_GPIO) || defined(CONFIG_MTD_NAND_GPIO_MODULE)
|
||||
static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd,
|
||||
unsigned int ctrl)
|
||||
{
|
||||
|
@ -482,36 +301,17 @@ static struct platform_device palmtx_nand = {
|
|||
}
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power management - standby
|
||||
******************************************************************************/
|
||||
static void __init palmtx_pm_init(void)
|
||||
static void __init palmtx_nand_init(void)
|
||||
{
|
||||
static u32 resume[] = {
|
||||
0xe3a00101, /* mov r0, #0x40000000 */
|
||||
0xe380060f, /* orr r0, r0, #0x00f00000 */
|
||||
0xe590f008, /* ldr pc, [r0, #0x08] */
|
||||
};
|
||||
|
||||
/* copy the bootloader */
|
||||
memcpy(phys_to_virt(PALMTX_STR_BASE), resume, sizeof(resume));
|
||||
platform_device_register(&palmtx_nand);
|
||||
}
|
||||
#else
|
||||
static inline void palmtx_nand_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
&palmtx_pxa_keys,
|
||||
#endif
|
||||
&palmtx_backlight,
|
||||
&power_supply,
|
||||
&palmtx_asoc,
|
||||
&palmtx_gpio_vbus,
|
||||
&palmtx_flash,
|
||||
&palmtx_nand,
|
||||
};
|
||||
|
||||
static struct map_desc palmtx_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = PALMTX_PCMCIA_VIRT,
|
||||
|
@ -537,34 +337,29 @@ static void __init palmtx_map_io(void)
|
|||
iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
|
||||
}
|
||||
|
||||
/* setup udc GPIOs initial state */
|
||||
static void __init palmtx_udc_init(void)
|
||||
{
|
||||
if (!gpio_request(GPIO_NR_PALMTX_USB_PULLUP, "UDC Vbus")) {
|
||||
gpio_direction_output(GPIO_NR_PALMTX_USB_PULLUP, 1);
|
||||
gpio_free(GPIO_NR_PALMTX_USB_PULLUP);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void __init palmtx_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
|
||||
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
palmtx_pm_init();
|
||||
set_pxa_fb_info(&palmtx_lcd_screen);
|
||||
pxa_set_mci_info(&palmtx_mci_platform_data);
|
||||
palmtx_udc_init();
|
||||
pxa_set_ac97_info(&palmtx_ac97_pdata);
|
||||
pxa_set_ficp_info(&palmtx_ficp_platform_data);
|
||||
pxa_set_keypad_info(&palmtx_keypad_platform_data);
|
||||
wm97xx_bat_set_pdata(&wm97xx_batt_pdata);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
palm27x_mmc_init(GPIO_NR_PALMTX_SD_DETECT_N, GPIO_NR_PALMTX_SD_READONLY,
|
||||
GPIO_NR_PALMTX_SD_POWER, 0);
|
||||
palm27x_pm_init(PALMTX_STR_BASE);
|
||||
palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
|
||||
palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
|
||||
GPIO_NR_PALMTX_USB_PULLUP, 1);
|
||||
palm27x_irda_init(GPIO_NR_PALMTX_IR_DISABLE);
|
||||
palm27x_ac97_init(PALMTX_BAT_MIN_VOLTAGE, PALMTX_BAT_MAX_VOLTAGE,
|
||||
GPIO_NR_PALMTX_EARPHONE_DETECT, 95);
|
||||
palm27x_pwm_init(GPIO_NR_PALMTX_BL_POWER, GPIO_NR_PALMTX_LCD_POWER);
|
||||
palm27x_power_init(GPIO_NR_PALMTX_POWER_DETECT, -1);
|
||||
palm27x_pmic_init();
|
||||
palmtx_kpc_init();
|
||||
palmtx_keys_init();
|
||||
palmtx_nor_init();
|
||||
palmtx_nand_init();
|
||||
}
|
||||
|
||||
MACHINE_START(PALMTX, "Palm T|X")
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include <linux/pda_power.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx_batt.h>
|
||||
#include <linux/wm97xx.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
|
||||
|
@ -44,6 +44,7 @@
|
|||
#include <mach/pxa27x_keypad.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/palmasoc.h>
|
||||
#include <mach/palm27x.h>
|
||||
|
||||
#include <mach/pm.h>
|
||||
|
||||
|
@ -108,22 +109,10 @@ static unsigned long palmz72_pin_config[] __initdata = {
|
|||
GPIO27_GPIO, /* WM9712 IRQ */
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* SD/MMC card controller
|
||||
******************************************************************************/
|
||||
/* SD_POWER is not actually power, but it is more like chip
|
||||
* select, i.e. it is inverted */
|
||||
static struct pxamci_platform_data palmz72_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.gpio_card_detect = GPIO_NR_PALMZ72_SD_DETECT_N,
|
||||
.gpio_card_ro = GPIO_NR_PALMZ72_SD_RO,
|
||||
.gpio_power = GPIO_NR_PALMZ72_SD_POWER_N,
|
||||
.gpio_power_invert = 1,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* GPIO keyboard
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
|
||||
static unsigned int palmz72_matrix_keys[] = {
|
||||
KEY(0, 0, KEY_POWER),
|
||||
KEY(0, 1, KEY_F1),
|
||||
|
@ -149,77 +138,18 @@ static struct pxa27x_keypad_platform_data palmz72_keypad_platform_data = {
|
|||
.debounce_interval = 30,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Backlight
|
||||
******************************************************************************/
|
||||
static int palmz72_backlight_init(struct device *dev)
|
||||
static void __init palmz72_kpc_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMZ72_BL_POWER, "BL POWER");
|
||||
if (ret)
|
||||
goto err;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMZ72_BL_POWER, 0);
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_request(GPIO_NR_PALMZ72_LCD_POWER, "LCD POWER");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_output(GPIO_NR_PALMZ72_LCD_POWER, 0);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(GPIO_NR_PALMZ72_LCD_POWER);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMZ72_BL_POWER);
|
||||
err:
|
||||
return ret;
|
||||
pxa_set_keypad_info(&palmz72_keypad_platform_data);
|
||||
}
|
||||
|
||||
static int palmz72_backlight_notify(struct device *dev, int brightness)
|
||||
{
|
||||
gpio_set_value(GPIO_NR_PALMZ72_BL_POWER, brightness);
|
||||
gpio_set_value(GPIO_NR_PALMZ72_LCD_POWER, brightness);
|
||||
return brightness;
|
||||
}
|
||||
|
||||
static void palmz72_backlight_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMZ72_BL_POWER);
|
||||
gpio_free(GPIO_NR_PALMZ72_LCD_POWER);
|
||||
}
|
||||
|
||||
static struct platform_pwm_backlight_data palmz72_backlight_data = {
|
||||
.pwm_id = 0,
|
||||
.max_brightness = PALMZ72_MAX_INTENSITY,
|
||||
.dft_brightness = PALMZ72_MAX_INTENSITY,
|
||||
.pwm_period_ns = PALMZ72_PERIOD_NS,
|
||||
.init = palmz72_backlight_init,
|
||||
.notify = palmz72_backlight_notify,
|
||||
.exit = palmz72_backlight_exit,
|
||||
};
|
||||
|
||||
static struct platform_device palmz72_backlight = {
|
||||
.name = "pwm-backlight",
|
||||
.dev = {
|
||||
.parent = &pxa27x_device_pwm0.dev,
|
||||
.platform_data = &palmz72_backlight_data,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* IrDA
|
||||
******************************************************************************/
|
||||
static struct pxaficp_platform_data palmz72_ficp_platform_data = {
|
||||
.gpio_pwdown = GPIO_NR_PALMZ72_IR_DISABLE,
|
||||
.transceiver_cap = IR_SIRMODE | IR_OFF,
|
||||
};
|
||||
#else
|
||||
static inline void palmz72_kpc_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* LEDs
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
static struct gpio_led gpio_leds[] = {
|
||||
{
|
||||
.name = "palmz72:green:led",
|
||||
|
@ -241,139 +171,13 @@ static struct platform_device palmz72_leds = {
|
|||
}
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* UDC
|
||||
******************************************************************************/
|
||||
static struct gpio_vbus_mach_info palmz72_udc_info = {
|
||||
.gpio_vbus = GPIO_NR_PALMZ72_USB_DETECT_N,
|
||||
.gpio_pullup = GPIO_NR_PALMZ72_USB_PULLUP,
|
||||
};
|
||||
|
||||
static struct platform_device palmz72_gpio_vbus = {
|
||||
.name = "gpio-vbus",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &palmz72_udc_info,
|
||||
},
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Power supply
|
||||
******************************************************************************/
|
||||
static int power_supply_init(struct device *dev)
|
||||
static void __init palmz72_leds_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMZ72_POWER_DETECT, "CABLE_STATE_AC");
|
||||
if (ret)
|
||||
goto err1;
|
||||
ret = gpio_direction_input(GPIO_NR_PALMZ72_POWER_DETECT);
|
||||
if (ret)
|
||||
goto err2;
|
||||
|
||||
ret = gpio_request(GPIO_NR_PALMZ72_USB_DETECT_N, "CABLE_STATE_USB");
|
||||
if (ret)
|
||||
goto err2;
|
||||
ret = gpio_direction_input(GPIO_NR_PALMZ72_USB_DETECT_N);
|
||||
if (ret)
|
||||
goto err3;
|
||||
|
||||
return 0;
|
||||
err3:
|
||||
gpio_free(GPIO_NR_PALMZ72_USB_DETECT_N);
|
||||
err2:
|
||||
gpio_free(GPIO_NR_PALMZ72_POWER_DETECT);
|
||||
err1:
|
||||
return ret;
|
||||
platform_device_register(&palmz72_leds);
|
||||
}
|
||||
|
||||
static int palmz72_is_ac_online(void)
|
||||
{
|
||||
return gpio_get_value(GPIO_NR_PALMZ72_POWER_DETECT);
|
||||
}
|
||||
|
||||
static int palmz72_is_usb_online(void)
|
||||
{
|
||||
return !gpio_get_value(GPIO_NR_PALMZ72_USB_DETECT_N);
|
||||
}
|
||||
|
||||
static void power_supply_exit(struct device *dev)
|
||||
{
|
||||
gpio_free(GPIO_NR_PALMZ72_USB_DETECT_N);
|
||||
gpio_free(GPIO_NR_PALMZ72_POWER_DETECT);
|
||||
}
|
||||
|
||||
static char *palmz72_supplicants[] = {
|
||||
"main-battery",
|
||||
};
|
||||
|
||||
static struct pda_power_pdata power_supply_info = {
|
||||
.init = power_supply_init,
|
||||
.is_ac_online = palmz72_is_ac_online,
|
||||
.is_usb_online = palmz72_is_usb_online,
|
||||
.exit = power_supply_exit,
|
||||
.supplied_to = palmz72_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(palmz72_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 = PALMZ72_BAT_MAX_VOLTAGE,
|
||||
.min_voltage = PALMZ72_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",
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* aSoC audio
|
||||
******************************************************************************/
|
||||
static struct platform_device palmz72_asoc = {
|
||||
.name = "palm27x-asoc",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* Framebuffer
|
||||
******************************************************************************/
|
||||
static struct pxafb_mode_info palmz72_lcd_modes[] = {
|
||||
{
|
||||
.pixclock = 115384,
|
||||
.xres = 320,
|
||||
.yres = 320,
|
||||
.bpp = 16,
|
||||
|
||||
.left_margin = 27,
|
||||
.right_margin = 7,
|
||||
.upper_margin = 7,
|
||||
.lower_margin = 8,
|
||||
|
||||
.hsync_len = 6,
|
||||
.vsync_len = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info palmz72_lcd_screen = {
|
||||
.modes = palmz72_lcd_modes,
|
||||
.num_modes = ARRAY_SIZE(palmz72_lcd_modes),
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
|
||||
};
|
||||
#else
|
||||
static inline void palmz72_leds_init(void) {}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
|
@ -452,40 +256,26 @@ device_initcall(palmz72_pm_init);
|
|||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&palmz72_backlight,
|
||||
&palmz72_leds,
|
||||
&palmz72_asoc,
|
||||
&power_supply,
|
||||
&palmz72_gpio_vbus,
|
||||
};
|
||||
|
||||
/* setup udc GPIOs initial state */
|
||||
static void __init palmz72_udc_init(void)
|
||||
{
|
||||
if (!gpio_request(GPIO_NR_PALMZ72_USB_PULLUP, "USB Pullup")) {
|
||||
gpio_direction_output(GPIO_NR_PALMZ72_USB_PULLUP, 0);
|
||||
gpio_free(GPIO_NR_PALMZ72_USB_PULLUP);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init palmz72_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(palmz72_pin_config));
|
||||
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
set_pxa_fb_info(&palmz72_lcd_screen);
|
||||
pxa_set_mci_info(&palmz72_mci_platform_data);
|
||||
palmz72_udc_init();
|
||||
pxa_set_ac97_info(NULL);
|
||||
pxa_set_ficp_info(&palmz72_ficp_platform_data);
|
||||
pxa_set_keypad_info(&palmz72_keypad_platform_data);
|
||||
wm97xx_bat_set_pdata(&wm97xx_batt_pdata);
|
||||
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
palm27x_mmc_init(GPIO_NR_PALMZ72_SD_DETECT_N, GPIO_NR_PALMZ72_SD_RO,
|
||||
GPIO_NR_PALMZ72_SD_POWER_N, 1);
|
||||
palm27x_lcd_init(-1, &palm_320x320_lcd_mode);
|
||||
palm27x_udc_init(GPIO_NR_PALMZ72_USB_DETECT_N,
|
||||
GPIO_NR_PALMZ72_USB_PULLUP, 0);
|
||||
palm27x_irda_init(GPIO_NR_PALMZ72_IR_DISABLE);
|
||||
palm27x_ac97_init(PALMZ72_BAT_MIN_VOLTAGE, PALMZ72_BAT_MAX_VOLTAGE,
|
||||
-1, 113);
|
||||
palm27x_pwm_init(-1, -1);
|
||||
palm27x_power_init(-1, -1);
|
||||
palm27x_pmic_init();
|
||||
palmz72_kpc_init();
|
||||
palmz72_leds_init();
|
||||
}
|
||||
|
||||
MACHINE_START(PALMZ72, "Palm Zire72")
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
#include <mach/irda.h>
|
||||
#include <mach/poodle.h>
|
||||
#include <mach/pxafb.h>
|
||||
#include <mach/sharpsl.h>
|
||||
#include <mach/pxa2xx_spi.h>
|
||||
#include <plat/i2c.h>
|
||||
|
||||
|
@ -53,7 +52,6 @@
|
|||
|
||||
#include "generic.h"
|
||||
#include "devices.h"
|
||||
#include "sharpsl.h"
|
||||
|
||||
static unsigned long poodle_pin_config[] __initdata = {
|
||||
/* I/O */
|
||||
|
|
|
@ -322,6 +322,7 @@ void __init pxa26x_init_irq(void)
|
|||
|
||||
static struct platform_device *pxa25x_devices[] __initdata = {
|
||||
&pxa25x_device_udc,
|
||||
&pxa_device_pmu,
|
||||
&pxa_device_i2s,
|
||||
&sa1100_device_rtc,
|
||||
&pxa25x_device_ssp,
|
||||
|
|
|
@ -383,6 +383,7 @@ void __init pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info)
|
|||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&pxa27x_device_udc,
|
||||
&pxa_device_pmu,
|
||||
&pxa_device_i2s,
|
||||
&sa1100_device_rtc,
|
||||
&pxa_device_rtc,
|
||||
|
|
|
@ -52,7 +52,7 @@
|
|||
static unsigned char smcfs_mult[8] = { 6, 0, 8, 0, 0, 16, };
|
||||
|
||||
/* crystal frequency to HSIO bus frequency multiplier (HSS) */
|
||||
static unsigned char hss_mult[4] = { 8, 12, 16, 0 };
|
||||
static unsigned char hss_mult[4] = { 8, 12, 16, 24 };
|
||||
|
||||
/*
|
||||
* Get the clock frequency as reflected by CCSR and the turbo flag.
|
||||
|
@ -552,11 +552,23 @@ static void pxa_unmask_ext_wakeup(unsigned int irq)
|
|||
PECR |= PECR_IE(irq - IRQ_WAKEUP0);
|
||||
}
|
||||
|
||||
static int pxa_set_ext_wakeup_type(unsigned int irq, unsigned int flow_type)
|
||||
{
|
||||
if (flow_type & IRQ_TYPE_EDGE_RISING)
|
||||
PWER |= 1 << (irq - IRQ_WAKEUP0);
|
||||
|
||||
if (flow_type & IRQ_TYPE_EDGE_FALLING)
|
||||
PWER |= 1 << (irq - IRQ_WAKEUP0 + 2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip pxa_ext_wakeup_chip = {
|
||||
.name = "WAKEUP",
|
||||
.ack = pxa_ack_ext_wakeup,
|
||||
.mask = pxa_mask_ext_wakeup,
|
||||
.unmask = pxa_unmask_ext_wakeup,
|
||||
.set_type = pxa_set_ext_wakeup_type,
|
||||
};
|
||||
|
||||
static void __init pxa_init_ext_wakeup_irq(set_wake_t fn)
|
||||
|
@ -596,6 +608,7 @@ void __init pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info)
|
|||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&pxa27x_device_udc,
|
||||
&pxa_device_pmu,
|
||||
&pxa_device_i2s,
|
||||
&sa1100_device_rtc,
|
||||
&pxa_device_rtc,
|
||||
|
|
|
@ -745,13 +745,32 @@ static int raumfeld_is_usb_online(void)
|
|||
|
||||
static char *raumfeld_power_supplicants[] = { "ds2760-battery.0" };
|
||||
|
||||
static void raumfeld_power_signal_charged(void)
|
||||
{
|
||||
struct power_supply *psy =
|
||||
power_supply_get_by_name(raumfeld_power_supplicants[0]);
|
||||
|
||||
if (psy)
|
||||
power_supply_set_battery_charged(psy);
|
||||
}
|
||||
|
||||
static int raumfeld_power_resume(void)
|
||||
{
|
||||
/* check if GPIO_CHARGE_DONE went low while we were sleeping */
|
||||
if (!gpio_get_value(GPIO_CHARGE_DONE))
|
||||
raumfeld_power_signal_charged();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct pda_power_pdata power_supply_info = {
|
||||
.init = power_supply_init,
|
||||
.is_ac_online = raumfeld_is_ac_online,
|
||||
.is_usb_online = raumfeld_is_usb_online,
|
||||
.exit = power_supply_exit,
|
||||
.supplied_to = raumfeld_power_supplicants,
|
||||
.num_supplicants = ARRAY_SIZE(raumfeld_power_supplicants)
|
||||
.num_supplicants = ARRAY_SIZE(raumfeld_power_supplicants),
|
||||
.resume = raumfeld_power_resume,
|
||||
};
|
||||
|
||||
static struct resource power_supply_resources[] = {
|
||||
|
@ -766,13 +785,7 @@ static struct resource power_supply_resources[] = {
|
|||
|
||||
static irqreturn_t charge_done_irq(int irq, void *dev_id)
|
||||
{
|
||||
struct power_supply *psy;
|
||||
|
||||
psy = power_supply_get_by_name("ds2760-battery.0");
|
||||
|
||||
if (psy)
|
||||
power_supply_set_battery_charged(psy);
|
||||
|
||||
raumfeld_power_signal_charged();
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2004-2005 Richard Purdie
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <mach/sharpsl_pm.h>
|
||||
|
||||
/*
|
||||
* SharpSL Battery/PM Driver
|
||||
*/
|
||||
#define READ_GPIO_BIT(x) (GPLR(x) & GPIO_bit(x))
|
||||
|
||||
/* MAX1111 Channel Definitions */
|
||||
#define MAX1111_BATT_VOLT 4u
|
||||
#define MAX1111_BATT_TEMP 2u
|
||||
#define MAX1111_ACIN_VOLT 6u
|
||||
|
||||
extern struct battery_thresh sharpsl_battery_levels_acin[];
|
||||
extern struct battery_thresh sharpsl_battery_levels_noac[];
|
||||
int sharpsl_pm_pxa_read_max1111(int channel);
|
||||
|
||||
|
|
@ -29,11 +29,8 @@
|
|||
#include <mach/pm.h>
|
||||
#include <mach/pxa2xx-regs.h>
|
||||
#include <mach/regs-rtc.h>
|
||||
#include <mach/sharpsl.h>
|
||||
#include <mach/sharpsl_pm.h>
|
||||
|
||||
#include "sharpsl.h"
|
||||
|
||||
/*
|
||||
* Constants
|
||||
*/
|
||||
|
@ -180,17 +177,12 @@ int sharpsl_pm_pxa_read_max1111(int channel)
|
|||
if (machine_is_tosa())
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_CORGI_SSP_DEPRECATED
|
||||
return corgi_ssp_max1111_get((channel << MAXCTRL_SEL_SH) | MAXCTRL_PD0 | MAXCTRL_PD1
|
||||
| MAXCTRL_SGL | MAXCTRL_UNI | MAXCTRL_STR);
|
||||
#else
|
||||
extern int max1111_read_channel(int);
|
||||
|
||||
/* max1111 accepts channels from 0-3, however,
|
||||
* it is encoded from 0-7 here in the code.
|
||||
*/
|
||||
return max1111_read_channel(channel >> 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int get_percentage(int voltage)
|
||||
|
@ -277,21 +269,6 @@ static void sharpsl_battery_thread(struct work_struct *private_)
|
|||
dev_dbg(sharpsl_pm.dev, "Battery: voltage: %d, status: %d, percentage: %d, time: %ld\n", voltage,
|
||||
sharpsl_pm.battstat.mainbat_status, sharpsl_pm.battstat.mainbat_percent, jiffies);
|
||||
|
||||
#ifdef CONFIG_BACKLIGHT_CORGI
|
||||
/* If battery is low. limit backlight intensity to save power. */
|
||||
if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
|
||||
&& ((sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_LOW)
|
||||
|| (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL))) {
|
||||
if (!(sharpsl_pm.flags & SHARPSL_BL_LIMIT)) {
|
||||
sharpsl_pm.machinfo->backlight_limit(1);
|
||||
sharpsl_pm.flags |= SHARPSL_BL_LIMIT;
|
||||
}
|
||||
} else if (sharpsl_pm.flags & SHARPSL_BL_LIMIT) {
|
||||
sharpsl_pm.machinfo->backlight_limit(0);
|
||||
sharpsl_pm.flags &= ~SHARPSL_BL_LIMIT;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Suspend if critical battery level */
|
||||
if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
|
||||
&& (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL)
|
||||
|
|
|
@ -339,10 +339,6 @@ ENTRY(pxa_cpu_resume)
|
|||
mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs
|
||||
mcr p15, 0, r1, c7, c7, 0 @ invalidate I & D caches, BTB
|
||||
|
||||
#ifdef CONFIG_XSCALE_CACHE_ERRATA
|
||||
bic r9, r9, #0x0004 @ see cpu_xscale_proc_init
|
||||
#endif
|
||||
|
||||
mcr p14, 0, r3, c6, c0, 0 @ clock configuration, turbo mode.
|
||||
mcr p15, 0, r4, c15, c1, 0 @ CP access reg
|
||||
mcr p15, 0, r5, c13, c0, 0 @ PID
|
||||
|
@ -368,9 +364,6 @@ sleep_save_sp:
|
|||
|
||||
.text
|
||||
resume_after_mmu:
|
||||
#ifdef CONFIG_XSCALE_CACHE_ERRATA
|
||||
bl cpu_xscale_proc_init
|
||||
#endif
|
||||
ldmfd sp!, {r2, r3}
|
||||
#ifndef CONFIG_IWMMXT
|
||||
mar acc0, r2, r3
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -22,11 +22,10 @@
|
|||
#include <asm/mach-types.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include <mach/sharpsl.h>
|
||||
#include <mach/spitz.h>
|
||||
#include <mach/pxa27x.h>
|
||||
#include <mach/sharpsl_pm.h>
|
||||
|
||||
#include "sharpsl.h"
|
||||
#include "generic.h"
|
||||
|
||||
#define SHARPSL_CHARGE_ON_VOLT 0x99 /* 2.9V */
|
||||
|
@ -178,11 +177,11 @@ unsigned long spitzpm_read_devdata(int type)
|
|||
case SHARPSL_STATUS_ACIN:
|
||||
return (((~GPLR(SPITZ_GPIO_AC_IN)) & GPIO_bit(SPITZ_GPIO_AC_IN)) != 0);
|
||||
case SHARPSL_STATUS_LOCK:
|
||||
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batlock);
|
||||
return gpio_get_value(sharpsl_pm.machinfo->gpio_batlock);
|
||||
case SHARPSL_STATUS_CHRGFULL:
|
||||
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_batfull);
|
||||
return gpio_get_value(sharpsl_pm.machinfo->gpio_batfull);
|
||||
case SHARPSL_STATUS_FATAL:
|
||||
return READ_GPIO_BIT(sharpsl_pm.machinfo->gpio_fatal);
|
||||
return gpio_get_value(sharpsl_pm.machinfo->gpio_fatal);
|
||||
case SHARPSL_ACIN_VOLT:
|
||||
return sharpsl_pm_pxa_read_max1111(MAX1111_ACIN_VOLT);
|
||||
case SHARPSL_BATT_TEMP:
|
||||
|
@ -212,8 +211,6 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = {
|
|||
.should_wakeup = spitz_should_wakeup,
|
||||
#if defined(CONFIG_LCD_CORGI)
|
||||
.backlight_limit = corgi_lcd_limit_intensity,
|
||||
#elif defined(CONFIG_BACKLIGHT_CORGI)
|
||||
.backlight_limit = corgibl_limit_intensity,
|
||||
#endif
|
||||
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
|
||||
.charge_on_temp = SHARPSL_CHARGE_ON_TEMP,
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -530,13 +530,9 @@ static void __init trizeps4_init(void)
|
|||
i2c_register_board_info(0, trizeps4_i2c_devices,
|
||||
ARRAY_SIZE(trizeps4_i2c_devices));
|
||||
|
||||
#ifdef CONFIG_IDE_PXA_CF
|
||||
/* if boot direct from compact flash dont disable power */
|
||||
trizeps_conxs_bcr = 0x0009;
|
||||
#else
|
||||
/* this is the reset value */
|
||||
trizeps_conxs_bcr = 0x00A0;
|
||||
#endif
|
||||
|
||||
BCR_writew(trizeps_conxs_bcr);
|
||||
board_backlight_power(1);
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include <linux/dm9000.h>
|
||||
#include <linux/ucb1400.h>
|
||||
#include <linux/ata_platform.h>
|
||||
#include <linux/regulator/max1586.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -37,6 +38,7 @@
|
|||
#include <mach/ohci.h>
|
||||
#include <mach/pxa27x-udc.h>
|
||||
#include <mach/udc.h>
|
||||
#include <mach/pata_pxa.h>
|
||||
|
||||
#include <plat/i2c.h>
|
||||
|
||||
|
@ -464,7 +466,6 @@ static struct i2c_board_info __initdata vpac270_i2c_devs[] = {
|
|||
|
||||
static void __init vpac270_rtc_init(void)
|
||||
{
|
||||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(vpac270_i2c_devs));
|
||||
}
|
||||
#else
|
||||
|
@ -492,7 +493,55 @@ static struct pxafb_mode_info vpac270_lcd_modes[] = {
|
|||
.vsync_len = 2,
|
||||
|
||||
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
},
|
||||
}, { /* CRT 640x480 */
|
||||
.pixclock = 35000,
|
||||
.xres = 640,
|
||||
.yres = 480,
|
||||
.bpp = 16,
|
||||
.depth = 16,
|
||||
|
||||
.left_margin = 96,
|
||||
.right_margin = 48,
|
||||
.upper_margin = 33,
|
||||
.lower_margin = 10,
|
||||
|
||||
.hsync_len = 48,
|
||||
.vsync_len = 1,
|
||||
|
||||
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
}, { /* CRT 800x600 H=30kHz V=48HZ */
|
||||
.pixclock = 25000,
|
||||
.xres = 800,
|
||||
.yres = 600,
|
||||
.bpp = 16,
|
||||
.depth = 16,
|
||||
|
||||
.left_margin = 50,
|
||||
.right_margin = 1,
|
||||
.upper_margin = 21,
|
||||
.lower_margin = 12,
|
||||
|
||||
.hsync_len = 8,
|
||||
.vsync_len = 1,
|
||||
|
||||
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
}, { /* CRT 1024x768 H=40kHz V=50Hz */
|
||||
.pixclock = 15000,
|
||||
.xres = 1024,
|
||||
.yres = 768,
|
||||
.bpp = 16,
|
||||
.depth = 16,
|
||||
|
||||
.left_margin = 220,
|
||||
.right_margin = 8,
|
||||
.upper_margin = 33,
|
||||
.lower_margin = 2,
|
||||
|
||||
.hsync_len = 48,
|
||||
.vsync_len = 1,
|
||||
|
||||
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
}
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info vpac270_lcd_screen = {
|
||||
|
@ -538,9 +587,10 @@ static inline void vpac270_lcd_init(void) {}
|
|||
/******************************************************************************
|
||||
* PATA IDE
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE)
|
||||
static struct pata_platform_info vpac270_pata_pdata = {
|
||||
.ioport_shift = 1,
|
||||
#if defined(CONFIG_PATA_PXA) || defined(CONFIG_PATA_PXA_MODULE)
|
||||
static struct pata_pxa_pdata vpac270_pata_pdata = {
|
||||
.reg_shift = 1,
|
||||
.dma_dreq = 1,
|
||||
.irq_flags = IRQF_TRIGGER_RISING,
|
||||
};
|
||||
|
||||
|
@ -555,7 +605,12 @@ static struct resource vpac270_ide_resources[] = {
|
|||
.end = PXA_CS3_PHYS + 0x15f,
|
||||
.flags = IORESOURCE_MEM
|
||||
},
|
||||
[2] = { /* IDE IRQ pin */
|
||||
[2] = { /* DMA Base address */
|
||||
.start = PXA_CS3_PHYS + 0x20,
|
||||
.end = PXA_CS3_PHYS + 0x2f,
|
||||
.flags = IORESOURCE_DMA
|
||||
},
|
||||
[3] = { /* IDE IRQ pin */
|
||||
.start = gpio_to_irq(GPIO36_VPAC270_IDE_IRQ),
|
||||
.end = gpio_to_irq(GPIO36_VPAC270_IDE_IRQ),
|
||||
.flags = IORESOURCE_IRQ
|
||||
|
@ -563,11 +618,12 @@ static struct resource vpac270_ide_resources[] = {
|
|||
};
|
||||
|
||||
static struct platform_device vpac270_ide_device = {
|
||||
.name = "pata_platform",
|
||||
.name = "pata_pxa",
|
||||
.num_resources = ARRAY_SIZE(vpac270_ide_resources),
|
||||
.resource = vpac270_ide_resources,
|
||||
.dev = {
|
||||
.platform_data = &vpac270_pata_pdata,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -579,6 +635,59 @@ static void __init vpac270_ide_init(void)
|
|||
static inline void vpac270_ide_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Core power regulator
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_REGULATOR_MAX1586) || \
|
||||
defined(CONFIG_REGULATOR_MAX1586_MODULE)
|
||||
static struct regulator_consumer_supply vpac270_max1587a_consumers[] = {
|
||||
{
|
||||
.supply = "vcc_core",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data vpac270_max1587a_v3_info = {
|
||||
.constraints = {
|
||||
.name = "vcc_core range",
|
||||
.min_uV = 900000,
|
||||
.max_uV = 1705000,
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
},
|
||||
.consumer_supplies = vpac270_max1587a_consumers,
|
||||
.num_consumer_supplies = ARRAY_SIZE(vpac270_max1587a_consumers),
|
||||
};
|
||||
|
||||
static struct max1586_subdev_data vpac270_max1587a_subdevs[] = {
|
||||
{
|
||||
.name = "vcc_core",
|
||||
.id = MAX1586_V3,
|
||||
.platform_data = &vpac270_max1587a_v3_info,
|
||||
}
|
||||
};
|
||||
|
||||
static struct max1586_platform_data vpac270_max1587a_info = {
|
||||
.subdevs = vpac270_max1587a_subdevs,
|
||||
.num_subdevs = ARRAY_SIZE(vpac270_max1587a_subdevs),
|
||||
.v3_gain = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata vpac270_pi2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("max1586", 0x14),
|
||||
.platform_data = &vpac270_max1587a_info,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init vpac270_pmic_init(void)
|
||||
{
|
||||
i2c_register_board_info(1, ARRAY_AND_SIZE(vpac270_pi2c_board_info));
|
||||
}
|
||||
#else
|
||||
static inline void vpac270_pmic_init(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
|
@ -589,7 +698,10 @@ static void __init vpac270_init(void)
|
|||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
pxa_set_i2c_info(NULL);
|
||||
pxa27x_set_i2c_power_info(NULL);
|
||||
|
||||
vpac270_pmic_init();
|
||||
vpac270_lcd_init();
|
||||
vpac270_mmc_init();
|
||||
vpac270_nor_init();
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/z2_battery.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/libertas_spi.h>
|
||||
|
@ -26,6 +27,7 @@
|
|||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -162,7 +164,7 @@ static struct mtd_partition z2_flash_parts[] = {
|
|||
}, {
|
||||
.name = "U-Boot Environment",
|
||||
.offset = 0x40000,
|
||||
.size = 0x60000,
|
||||
.size = 0x20000,
|
||||
}, {
|
||||
.name = "Flash",
|
||||
.offset = 0x60000,
|
||||
|
@ -451,6 +453,42 @@ static void __init z2_keys_init(void)
|
|||
static inline void z2_keys_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Battery
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
|
||||
static struct z2_battery_info batt_chip_info = {
|
||||
.batt_I2C_bus = 0,
|
||||
.batt_I2C_addr = 0x55,
|
||||
.batt_I2C_reg = 2,
|
||||
.charge_gpio = GPIO0_ZIPITZ2_AC_DETECT,
|
||||
.min_voltage = 2400000,
|
||||
.max_voltage = 3700000,
|
||||
.batt_div = 69,
|
||||
.batt_mult = 1000000,
|
||||
.batt_tech = POWER_SUPPLY_TECHNOLOGY_LION,
|
||||
.batt_name = "Z2",
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata z2_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("aer915", 0x55),
|
||||
.platform_data = &batt_chip_info,
|
||||
}, {
|
||||
I2C_BOARD_INFO("wm8750", 0x1b),
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
static void __init z2_i2c_init(void)
|
||||
{
|
||||
pxa_set_i2c_info(NULL);
|
||||
i2c_register_board_info(0, ARRAY_AND_SIZE(z2_i2c_board_info));
|
||||
}
|
||||
#else
|
||||
static inline void z2_i2c_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* SSP Devices - WiFi and LCD control
|
||||
******************************************************************************/
|
||||
|
@ -572,6 +610,75 @@ static void __init z2_spi_init(void)
|
|||
static inline void z2_spi_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Core power regulator
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_REGULATOR_TPS65023) || \
|
||||
defined(CONFIG_REGULATOR_TPS65023_MODULE)
|
||||
static struct regulator_consumer_supply z2_tps65021_consumers[] = {
|
||||
{
|
||||
.supply = "vcc_core",
|
||||
}
|
||||
};
|
||||
|
||||
static struct regulator_init_data z2_tps65021_info[] = {
|
||||
{
|
||||
.constraints = {
|
||||
.name = "vcc_core range",
|
||||
.min_uV = 800000,
|
||||
.max_uV = 1600000,
|
||||
.always_on = 1,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
||||
},
|
||||
.consumer_supplies = z2_tps65021_consumers,
|
||||
.num_consumer_supplies = ARRAY_SIZE(z2_tps65021_consumers),
|
||||
}, {
|
||||
.constraints = {
|
||||
.name = "DCDC2",
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.always_on = 1,
|
||||
},
|
||||
}, {
|
||||
.constraints = {
|
||||
.name = "DCDC3",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.always_on = 1,
|
||||
},
|
||||
}, {
|
||||
.constraints = {
|
||||
.name = "LDO1",
|
||||
.min_uV = 1000000,
|
||||
.max_uV = 3150000,
|
||||
.always_on = 1,
|
||||
},
|
||||
}, {
|
||||
.constraints = {
|
||||
.name = "LDO2",
|
||||
.min_uV = 1050000,
|
||||
.max_uV = 3300000,
|
||||
.always_on = 1,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata z2_pi2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("tps65021", 0x48),
|
||||
.platform_data = &z2_tps65021_info,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init z2_pmic_init(void)
|
||||
{
|
||||
pxa27x_set_i2c_power_info(NULL);
|
||||
i2c_register_board_info(1, ARRAY_AND_SIZE(z2_pi2c_board_info));
|
||||
}
|
||||
#else
|
||||
static inline void z2_pmic_init(void) {}
|
||||
#endif
|
||||
|
||||
/******************************************************************************
|
||||
* Machine init
|
||||
******************************************************************************/
|
||||
|
@ -579,17 +686,20 @@ static void __init z2_init(void)
|
|||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(z2_pin_config));
|
||||
|
||||
pxa_set_ffuart_info(NULL);
|
||||
pxa_set_btuart_info(NULL);
|
||||
pxa_set_stuart_info(NULL);
|
||||
|
||||
z2_lcd_init();
|
||||
z2_mmc_init();
|
||||
z2_mkp_init();
|
||||
|
||||
pxa_set_i2c_info(NULL);
|
||||
|
||||
z2_i2c_init();
|
||||
z2_spi_init();
|
||||
z2_nor_init();
|
||||
z2_pwm_init();
|
||||
z2_leds_init();
|
||||
z2_keys_init();
|
||||
z2_pmic_init();
|
||||
}
|
||||
|
||||
MACHINE_START(ZIPIT2, "Zipit Z2")
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
*/
|
||||
#ifdef CONFIG_SA1111
|
||||
#define NR_IRQS (IRQ_BOARD_END + 55)
|
||||
#elif defined(CONFIG_SHARPSL_LOCOMO)
|
||||
#elif defined(CONFIG_SHARP_LOCOMO)
|
||||
#define NR_IRQS (IRQ_BOARD_START + 4)
|
||||
#else
|
||||
#define NR_IRQS (IRQ_BOARD_START)
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
|
||||
obj-y := dma.o
|
||||
|
||||
obj-$(CONFIG_ARCH_PXA) += pmu.o
|
||||
obj-$(CONFIG_GENERIC_GPIO) += gpio.o
|
||||
obj-$(CONFIG_PXA3xx) += mfp.o
|
||||
obj-$(CONFIG_ARCH_MMP) += mfp.o
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
/*
|
||||
* PMU IRQ registration for the PXA xscale PMU families.
|
||||
* Copyright (C) 2010 Will Deacon, ARM Ltd.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/pmu.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
static struct resource pmu_resource = {
|
||||
.start = IRQ_PMU,
|
||||
.end = IRQ_PMU,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
};
|
||||
|
||||
static struct platform_device pmu_device = {
|
||||
.name = "arm-pmu",
|
||||
.id = ARM_PMU_DEVICE_CPU,
|
||||
.resource = &pmu_resource,
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
||||
static int __init pxa_pmu_init(void)
|
||||
{
|
||||
platform_device_register(&pmu_device);
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(pxa_pmu_init);
|
|
@ -642,6 +642,17 @@ config PATA_VIA
|
|||
|
||||
If unsure, say N.
|
||||
|
||||
config PATA_PXA
|
||||
tristate "PXA DMA-capable PATA support"
|
||||
depends on ARCH_PXA
|
||||
help
|
||||
This option enables support for harddrive attached to PXA CPU's bus.
|
||||
|
||||
NOTE: This driver utilizes PXA DMA controller, in case your hardware
|
||||
is not capable of doing MWDMA, use pata_platform instead.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config PATA_WINBOND
|
||||
tristate "Winbond SL82C105 PATA support"
|
||||
depends on PCI
|
||||
|
|
|
@ -89,6 +89,8 @@ obj-$(CONFIG_PATA_RB532) += pata_rb532_cf.o
|
|||
obj-$(CONFIG_PATA_RZ1000) += pata_rz1000.o
|
||||
obj-$(CONFIG_PATA_WINBOND_VLB) += pata_winbond.o
|
||||
|
||||
obj-$(CONFIG_PATA_PXA) += pata_pxa.o
|
||||
|
||||
# Should be last but two libata driver
|
||||
obj-$(CONFIG_PATA_ACPI) += pata_acpi.o
|
||||
# Should be last but one libata driver
|
||||
|
|
|
@ -0,0 +1,411 @@
|
|||
/*
|
||||
* Generic PXA PATA driver
|
||||
*
|
||||
* Copyright (C) 2010 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 as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; see the file COPYING. If not, write to
|
||||
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/ata.h>
|
||||
#include <linux/libata.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/completion.h>
|
||||
|
||||
#include <scsi/scsi_host.h>
|
||||
|
||||
#include <mach/pxa2xx-regs.h>
|
||||
#include <mach/pata_pxa.h>
|
||||
#include <mach/dma.h>
|
||||
|
||||
#define DRV_NAME "pata_pxa"
|
||||
#define DRV_VERSION "0.1"
|
||||
|
||||
struct pata_pxa_data {
|
||||
uint32_t dma_channel;
|
||||
struct pxa_dma_desc *dma_desc;
|
||||
dma_addr_t dma_desc_addr;
|
||||
uint32_t dma_desc_id;
|
||||
|
||||
/* DMA IO physical address */
|
||||
uint32_t dma_io_addr;
|
||||
/* PXA DREQ<0:2> pin selector */
|
||||
uint32_t dma_dreq;
|
||||
/* DMA DCSR register value */
|
||||
uint32_t dma_dcsr;
|
||||
|
||||
struct completion dma_done;
|
||||
};
|
||||
|
||||
/*
|
||||
* Setup the DMA descriptors. The size is transfer capped at 4k per descriptor,
|
||||
* if the transfer is longer, it is split into multiple chained descriptors.
|
||||
*/
|
||||
static void pxa_load_dmac(struct scatterlist *sg, struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct pata_pxa_data *pd = qc->ap->private_data;
|
||||
|
||||
uint32_t cpu_len, seg_len;
|
||||
dma_addr_t cpu_addr;
|
||||
|
||||
cpu_addr = sg_dma_address(sg);
|
||||
cpu_len = sg_dma_len(sg);
|
||||
|
||||
do {
|
||||
seg_len = (cpu_len > 0x1000) ? 0x1000 : cpu_len;
|
||||
|
||||
pd->dma_desc[pd->dma_desc_id].ddadr = pd->dma_desc_addr +
|
||||
((pd->dma_desc_id + 1) * sizeof(struct pxa_dma_desc));
|
||||
|
||||
pd->dma_desc[pd->dma_desc_id].dcmd = DCMD_BURST32 |
|
||||
DCMD_WIDTH2 | (DCMD_LENGTH & seg_len);
|
||||
|
||||
if (qc->tf.flags & ATA_TFLAG_WRITE) {
|
||||
pd->dma_desc[pd->dma_desc_id].dsadr = cpu_addr;
|
||||
pd->dma_desc[pd->dma_desc_id].dtadr = pd->dma_io_addr;
|
||||
pd->dma_desc[pd->dma_desc_id].dcmd |= DCMD_INCSRCADDR |
|
||||
DCMD_FLOWTRG;
|
||||
} else {
|
||||
pd->dma_desc[pd->dma_desc_id].dsadr = pd->dma_io_addr;
|
||||
pd->dma_desc[pd->dma_desc_id].dtadr = cpu_addr;
|
||||
pd->dma_desc[pd->dma_desc_id].dcmd |= DCMD_INCTRGADDR |
|
||||
DCMD_FLOWSRC;
|
||||
}
|
||||
|
||||
cpu_len -= seg_len;
|
||||
cpu_addr += seg_len;
|
||||
pd->dma_desc_id++;
|
||||
|
||||
} while (cpu_len);
|
||||
|
||||
/* Should not happen */
|
||||
if (seg_len & 0x1f)
|
||||
DALGN |= (1 << pd->dma_dreq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepare taskfile for submission.
|
||||
*/
|
||||
static void pxa_qc_prep(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct pata_pxa_data *pd = qc->ap->private_data;
|
||||
int si = 0;
|
||||
struct scatterlist *sg;
|
||||
|
||||
if (!(qc->flags & ATA_QCFLAG_DMAMAP))
|
||||
return;
|
||||
|
||||
pd->dma_desc_id = 0;
|
||||
|
||||
DCSR(pd->dma_channel) = 0;
|
||||
DALGN &= ~(1 << pd->dma_dreq);
|
||||
|
||||
for_each_sg(qc->sg, sg, qc->n_elem, si)
|
||||
pxa_load_dmac(sg, qc);
|
||||
|
||||
pd->dma_desc[pd->dma_desc_id - 1].ddadr = DDADR_STOP;
|
||||
|
||||
/* Fire IRQ only at the end of last block */
|
||||
pd->dma_desc[pd->dma_desc_id - 1].dcmd |= DCMD_ENDIRQEN;
|
||||
|
||||
DDADR(pd->dma_channel) = pd->dma_desc_addr;
|
||||
DRCMR(pd->dma_dreq) = DRCMR_MAPVLD | pd->dma_channel;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure the DMA controller, load the DMA descriptors, but don't start the
|
||||
* DMA controller yet. Only issue the ATA command.
|
||||
*/
|
||||
static void pxa_bmdma_setup(struct ata_queued_cmd *qc)
|
||||
{
|
||||
qc->ap->ops->sff_exec_command(qc->ap, &qc->tf);
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute the DMA transfer.
|
||||
*/
|
||||
static void pxa_bmdma_start(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct pata_pxa_data *pd = qc->ap->private_data;
|
||||
init_completion(&pd->dma_done);
|
||||
DCSR(pd->dma_channel) = DCSR_RUN;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait until the DMA transfer completes, then stop the DMA controller.
|
||||
*/
|
||||
static void pxa_bmdma_stop(struct ata_queued_cmd *qc)
|
||||
{
|
||||
struct pata_pxa_data *pd = qc->ap->private_data;
|
||||
|
||||
if ((DCSR(pd->dma_channel) & DCSR_RUN) &&
|
||||
wait_for_completion_timeout(&pd->dma_done, HZ))
|
||||
dev_err(qc->ap->dev, "Timeout waiting for DMA completion!");
|
||||
|
||||
DCSR(pd->dma_channel) = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read DMA status. The bmdma_stop() will take care of properly finishing the
|
||||
* DMA transfer so we always have DMA-complete interrupt here.
|
||||
*/
|
||||
static unsigned char pxa_bmdma_status(struct ata_port *ap)
|
||||
{
|
||||
struct pata_pxa_data *pd = ap->private_data;
|
||||
unsigned char ret = ATA_DMA_INTR;
|
||||
|
||||
if (pd->dma_dcsr & DCSR_BUSERR)
|
||||
ret |= ATA_DMA_ERR;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* No IRQ register present so we do nothing.
|
||||
*/
|
||||
static void pxa_irq_clear(struct ata_port *ap)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for ATAPI DMA. ATAPI DMA is unsupported by this driver. It's still
|
||||
* unclear why ATAPI has DMA issues.
|
||||
*/
|
||||
static int pxa_check_atapi_dma(struct ata_queued_cmd *qc)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static struct scsi_host_template pxa_ata_sht = {
|
||||
ATA_BMDMA_SHT(DRV_NAME),
|
||||
};
|
||||
|
||||
static struct ata_port_operations pxa_ata_port_ops = {
|
||||
.inherits = &ata_bmdma_port_ops,
|
||||
.cable_detect = ata_cable_40wire,
|
||||
|
||||
.bmdma_setup = pxa_bmdma_setup,
|
||||
.bmdma_start = pxa_bmdma_start,
|
||||
.bmdma_stop = pxa_bmdma_stop,
|
||||
.bmdma_status = pxa_bmdma_status,
|
||||
|
||||
.check_atapi_dma = pxa_check_atapi_dma,
|
||||
|
||||
.sff_irq_clear = pxa_irq_clear,
|
||||
|
||||
.qc_prep = pxa_qc_prep,
|
||||
};
|
||||
|
||||
/*
|
||||
* DMA interrupt handler.
|
||||
*/
|
||||
static void pxa_ata_dma_irq(int dma, void *port)
|
||||
{
|
||||
struct ata_port *ap = port;
|
||||
struct pata_pxa_data *pd = ap->private_data;
|
||||
|
||||
pd->dma_dcsr = DCSR(dma);
|
||||
DCSR(dma) = pd->dma_dcsr;
|
||||
|
||||
if (pd->dma_dcsr & DCSR_STOPSTATE)
|
||||
complete(&pd->dma_done);
|
||||
}
|
||||
|
||||
static int __devinit pxa_ata_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host;
|
||||
struct ata_port *ap;
|
||||
struct pata_pxa_data *data;
|
||||
struct resource *cmd_res;
|
||||
struct resource *ctl_res;
|
||||
struct resource *dma_res;
|
||||
struct resource *irq_res;
|
||||
struct pata_pxa_pdata *pdata = pdev->dev.platform_data;
|
||||
int ret = 0;
|
||||
|
||||
/*
|
||||
* Resource validation, three resources are needed:
|
||||
* - CMD port base address
|
||||
* - CTL port base address
|
||||
* - DMA port base address
|
||||
* - IRQ pin
|
||||
*/
|
||||
if (pdev->num_resources != 4) {
|
||||
dev_err(&pdev->dev, "invalid number of resources\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* CMD port base address
|
||||
*/
|
||||
cmd_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (unlikely(cmd_res == NULL))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* CTL port base address
|
||||
*/
|
||||
ctl_res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
if (unlikely(ctl_res == NULL))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* DMA port base address
|
||||
*/
|
||||
dma_res = platform_get_resource(pdev, IORESOURCE_DMA, 0);
|
||||
if (unlikely(dma_res == NULL))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* IRQ pin
|
||||
*/
|
||||
irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||
if (unlikely(irq_res == NULL))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Allocate the host
|
||||
*/
|
||||
host = ata_host_alloc(&pdev->dev, 1);
|
||||
if (!host)
|
||||
return -ENOMEM;
|
||||
|
||||
ap = host->ports[0];
|
||||
ap->ops = &pxa_ata_port_ops;
|
||||
ap->pio_mask = ATA_PIO4;
|
||||
ap->mwdma_mask = ATA_MWDMA2;
|
||||
ap->flags = ATA_FLAG_MMIO;
|
||||
|
||||
ap->ioaddr.cmd_addr = devm_ioremap(&pdev->dev, cmd_res->start,
|
||||
resource_size(cmd_res));
|
||||
ap->ioaddr.ctl_addr = devm_ioremap(&pdev->dev, ctl_res->start,
|
||||
resource_size(ctl_res));
|
||||
ap->ioaddr.bmdma_addr = devm_ioremap(&pdev->dev, dma_res->start,
|
||||
resource_size(dma_res));
|
||||
|
||||
/*
|
||||
* Adjust register offsets
|
||||
*/
|
||||
ap->ioaddr.altstatus_addr = ap->ioaddr.ctl_addr;
|
||||
ap->ioaddr.data_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_DATA << pdata->reg_shift);
|
||||
ap->ioaddr.error_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_ERR << pdata->reg_shift);
|
||||
ap->ioaddr.feature_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_FEATURE << pdata->reg_shift);
|
||||
ap->ioaddr.nsect_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_NSECT << pdata->reg_shift);
|
||||
ap->ioaddr.lbal_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_LBAL << pdata->reg_shift);
|
||||
ap->ioaddr.lbam_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_LBAM << pdata->reg_shift);
|
||||
ap->ioaddr.lbah_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_LBAH << pdata->reg_shift);
|
||||
ap->ioaddr.device_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_DEVICE << pdata->reg_shift);
|
||||
ap->ioaddr.status_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_STATUS << pdata->reg_shift);
|
||||
ap->ioaddr.command_addr = ap->ioaddr.cmd_addr +
|
||||
(ATA_REG_CMD << pdata->reg_shift);
|
||||
|
||||
/*
|
||||
* Allocate and load driver's internal data structure
|
||||
*/
|
||||
data = devm_kzalloc(&pdev->dev, sizeof(struct pata_pxa_data),
|
||||
GFP_KERNEL);
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
ap->private_data = data;
|
||||
data->dma_dreq = pdata->dma_dreq;
|
||||
data->dma_io_addr = dma_res->start;
|
||||
|
||||
/*
|
||||
* Allocate space for the DMA descriptors
|
||||
*/
|
||||
data->dma_desc = dmam_alloc_coherent(&pdev->dev, PAGE_SIZE,
|
||||
&data->dma_desc_addr, GFP_KERNEL);
|
||||
if (!data->dma_desc)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Request the DMA channel
|
||||
*/
|
||||
data->dma_channel = pxa_request_dma(DRV_NAME, DMA_PRIO_LOW,
|
||||
pxa_ata_dma_irq, ap);
|
||||
if (data->dma_channel < 0)
|
||||
return -EBUSY;
|
||||
|
||||
/*
|
||||
* Stop and clear the DMA channel
|
||||
*/
|
||||
DCSR(data->dma_channel) = 0;
|
||||
|
||||
/*
|
||||
* Activate the ATA host
|
||||
*/
|
||||
ret = ata_host_activate(host, irq_res->start, ata_sff_interrupt,
|
||||
pdata->irq_flags, &pxa_ata_sht);
|
||||
if (ret)
|
||||
pxa_free_dma(data->dma_channel);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit pxa_ata_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ata_host *host = dev_get_drvdata(&pdev->dev);
|
||||
struct pata_pxa_data *data = host->ports[0]->private_data;
|
||||
|
||||
pxa_free_dma(data->dma_channel);
|
||||
|
||||
ata_host_detach(host);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver pxa_ata_driver = {
|
||||
.probe = pxa_ata_probe,
|
||||
.remove = __devexit_p(pxa_ata_remove),
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init pxa_ata_init(void)
|
||||
{
|
||||
return platform_driver_register(&pxa_ata_driver);
|
||||
}
|
||||
|
||||
static void __exit pxa_ata_exit(void)
|
||||
{
|
||||
platform_driver_unregister(&pxa_ata_driver);
|
||||
}
|
||||
|
||||
module_init(pxa_ata_init);
|
||||
module_exit(pxa_ata_exit);
|
||||
|
||||
MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
|
||||
MODULE_DESCRIPTION("DMA-capable driver for PATA on PXA CPU");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(DRV_VERSION);
|
||||
MODULE_ALIAS("platform:" DRV_NAME);
|
|
@ -215,7 +215,7 @@ config PCMCIA_PXA2XX
|
|||
depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
|
||||
|| MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \
|
||||
|| ARCOM_PCMCIA || ARCH_PXA_ESERIES || MACH_STARGATE2 \
|
||||
|| MACH_VPAC270)
|
||||
|| MACH_VPAC270 || MACH_BALLOON3)
|
||||
select PCMCIA_SOC_COMMON
|
||||
help
|
||||
Say Y here to include support for the PXA2xx PCMCIA controller
|
||||
|
|
|
@ -70,6 +70,7 @@ pxa2xx-obj-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o
|
|||
pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o
|
||||
pxa2xx-obj-$(CONFIG_MACH_STARGATE2) += pxa2xx_stargate2.o
|
||||
pxa2xx-obj-$(CONFIG_MACH_VPAC270) += pxa2xx_vpac270.o
|
||||
pxa2xx-obj-$(CONFIG_MACH_BALLOON3) += pxa2xx_balloon3.o
|
||||
|
||||
obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_base.o $(pxa2xx-obj-y)
|
||||
|
||||
|
|
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
* linux/drivers/pcmcia/pxa2xx_balloon3.c
|
||||
*
|
||||
* Balloon3 PCMCIA specific routines.
|
||||
*
|
||||
* Author: Nick Bane
|
||||
* Created: June, 2006
|
||||
* Copyright: Toby Churchill Ltd
|
||||
* Derived from pxa2xx_mainstone.c, by Nico Pitre
|
||||
*
|
||||
* Various modification by 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.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <mach/balloon3.h>
|
||||
|
||||
#include "soc_common.h"
|
||||
|
||||
/*
|
||||
* These are a list of interrupt sources that provokes a polled
|
||||
* check of status
|
||||
*/
|
||||
static struct pcmcia_irqs irqs[] = {
|
||||
{ 0, BALLOON3_S0_CD_IRQ, "PCMCIA0 CD" },
|
||||
{ 0, BALLOON3_BP_NSTSCHG_IRQ, "PCMCIA0 STSCHG" },
|
||||
};
|
||||
|
||||
static int balloon3_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
uint16_t ver;
|
||||
int ret;
|
||||
static void __iomem *fpga_ver;
|
||||
|
||||
ver = __raw_readw(BALLOON3_FPGA_VER);
|
||||
if (ver > 0x0201)
|
||||
pr_warn("The FPGA code, version 0x%04x, is newer than rel-0.3. "
|
||||
"PCMCIA/CF support might be broken in this version!",
|
||||
ver);
|
||||
|
||||
skt->socket.pci_irq = BALLOON3_BP_CF_NRDY_IRQ;
|
||||
return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
||||
static void balloon3_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
|
||||
}
|
||||
|
||||
static unsigned long balloon3_pcmcia_status[2] = {
|
||||
BALLOON3_CF_nSTSCHG_BVD1,
|
||||
BALLOON3_CF_nSTSCHG_BVD1
|
||||
};
|
||||
|
||||
static void balloon3_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
|
||||
struct pcmcia_state *state)
|
||||
{
|
||||
uint16_t status;
|
||||
int flip;
|
||||
|
||||
/* This actually reads the STATUS register */
|
||||
status = __raw_readw(BALLOON3_CF_STATUS_REG);
|
||||
flip = (status ^ balloon3_pcmcia_status[skt->nr])
|
||||
& BALLOON3_CF_nSTSCHG_BVD1;
|
||||
/*
|
||||
* Workaround for STSCHG which can't be deasserted:
|
||||
* We therefore disable/enable corresponding IRQs
|
||||
* as needed to avoid IRQ locks.
|
||||
*/
|
||||
if (flip) {
|
||||
balloon3_pcmcia_status[skt->nr] = status;
|
||||
if (status & BALLOON3_CF_nSTSCHG_BVD1)
|
||||
enable_irq(BALLOON3_BP_NSTSCHG_IRQ);
|
||||
else
|
||||
disable_irq(BALLOON3_BP_NSTSCHG_IRQ);
|
||||
}
|
||||
|
||||
state->detect = !gpio_get_value(BALLOON3_GPIO_S0_CD);
|
||||
state->ready = !!(status & BALLOON3_CF_nIRQ);
|
||||
state->bvd1 = !!(status & BALLOON3_CF_nSTSCHG_BVD1);
|
||||
state->bvd2 = 0; /* not available */
|
||||
state->vs_3v = 1; /* Always true its a CF card */
|
||||
state->vs_Xv = 0; /* not available */
|
||||
state->wrprot = 0; /* not available */
|
||||
}
|
||||
|
||||
static int balloon3_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
|
||||
const socket_state_t *state)
|
||||
{
|
||||
__raw_writew((state->flags & SS_RESET) ? BALLOON3_CF_RESET : 0,
|
||||
BALLOON3_CF_CONTROL_REG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void balloon3_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
}
|
||||
|
||||
static void balloon3_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
|
||||
{
|
||||
}
|
||||
|
||||
static struct pcmcia_low_level balloon3_pcmcia_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.hw_init = balloon3_pcmcia_hw_init,
|
||||
.hw_shutdown = balloon3_pcmcia_hw_shutdown,
|
||||
.socket_state = balloon3_pcmcia_socket_state,
|
||||
.configure_socket = balloon3_pcmcia_configure_socket,
|
||||
.socket_init = balloon3_pcmcia_socket_init,
|
||||
.socket_suspend = balloon3_pcmcia_socket_suspend,
|
||||
.first = 0,
|
||||
.nr = 1,
|
||||
};
|
||||
|
||||
static struct platform_device *balloon3_pcmcia_device;
|
||||
|
||||
static int __init balloon3_pcmcia_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
balloon3_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
|
||||
if (!balloon3_pcmcia_device)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = platform_device_add_data(balloon3_pcmcia_device,
|
||||
&balloon3_pcmcia_ops, sizeof(balloon3_pcmcia_ops));
|
||||
|
||||
if (!ret)
|
||||
ret = platform_device_add(balloon3_pcmcia_device);
|
||||
|
||||
if (ret)
|
||||
platform_device_put(balloon3_pcmcia_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit balloon3_pcmcia_exit(void)
|
||||
{
|
||||
platform_device_unregister(balloon3_pcmcia_device);
|
||||
}
|
||||
|
||||
module_init(balloon3_pcmcia_init);
|
||||
module_exit(balloon3_pcmcia_exit);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Nick Bane <nick@cecomputing.co.uk>");
|
||||
MODULE_ALIAS("platform:pxa2xx-pcmcia");
|
||||
MODULE_DESCRIPTION("Balloon3 board CF/PCMCIA driver");
|
|
@ -29,7 +29,6 @@ static DEFINE_MUTEX(bat_lock);
|
|||
static struct work_struct bat_work;
|
||||
static struct mutex work_lock;
|
||||
static int bat_status = POWER_SUPPLY_STATUS_UNKNOWN;
|
||||
static struct wm97xx_batt_info *gpdata;
|
||||
static enum power_supply_property *prop;
|
||||
|
||||
static unsigned long wm97xx_read_bat(struct power_supply *bat_ps)
|
||||
|
@ -172,12 +171,6 @@ static int __devinit wm97xx_bat_probe(struct platform_device *dev)
|
|||
struct wm97xx_pdata *wmdata = dev->dev.platform_data;
|
||||
struct wm97xx_batt_pdata *pdata;
|
||||
|
||||
if (gpdata) {
|
||||
dev_err(&dev->dev, "Do not pass platform_data through "
|
||||
"wm97xx_bat_set_pdata!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!wmdata) {
|
||||
dev_err(&dev->dev, "No platform data supplied\n");
|
||||
return -EINVAL;
|
||||
|
@ -308,15 +301,6 @@ static void __exit wm97xx_bat_exit(void)
|
|||
platform_driver_unregister(&wm97xx_bat_driver);
|
||||
}
|
||||
|
||||
/* The interface is deprecated, as well as linux/wm97xx_batt.h */
|
||||
void wm97xx_bat_set_pdata(struct wm97xx_batt_info *data);
|
||||
|
||||
void wm97xx_bat_set_pdata(struct wm97xx_batt_info *data)
|
||||
{
|
||||
gpdata = data;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(wm97xx_bat_set_pdata);
|
||||
|
||||
module_init(wm97xx_bat_init);
|
||||
module_exit(wm97xx_bat_exit);
|
||||
|
||||
|
|
|
@ -1,16 +0,0 @@
|
|||
#ifndef _LINUX_WM97XX_BAT_H
|
||||
#define _LINUX_WM97XX_BAT_H
|
||||
|
||||
#include <linux/wm97xx.h>
|
||||
|
||||
#warning This file will be removed soon, use wm97xx.h instead!
|
||||
|
||||
#define wm97xx_batt_info wm97xx_batt_pdata
|
||||
|
||||
#ifdef CONFIG_BATTERY_WM97XX
|
||||
void wm97xx_bat_set_pdata(struct wm97xx_batt_info *data);
|
||||
#else
|
||||
static inline void wm97xx_bat_set_pdata(struct wm97xx_batt_info *data) {}
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue