Commit 7f9c7e28 authored by Russell King's avatar Russell King

Merge branch 'devel' of...

Merge branch 'devel' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 into devel-stable
parents 4af8f24d b476ef05
...@@ -992,6 +992,11 @@ M: Lennert Buytenhek <kernel@wantstofly.org> ...@@ -992,6 +992,11 @@ M: Lennert Buytenhek <kernel@wantstofly.org>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained S: Maintained
ARM/TETON BGA MACHINE SUPPORT
M: Mark F. Brown <mark.brown314@gmail.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
ARM/THECUS N2100 MACHINE SUPPORT ARM/THECUS N2100 MACHINE SUPPORT
M: Lennert Buytenhek <kernel@wantstofly.org> M: Lennert Buytenhek <kernel@wantstofly.org>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
......
...@@ -510,6 +510,7 @@ config ARCH_MMP ...@@ -510,6 +510,7 @@ config ARCH_MMP
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select TICK_ONESHOT select TICK_ONESHOT
select PLAT_PXA select PLAT_PXA
select SPARSE_IRQ
help help
Support for Marvell's PXA168/PXA910(MMP) and MMP2 processor line. Support for Marvell's PXA168/PXA910(MMP) and MMP2 processor line.
...@@ -587,6 +588,7 @@ config ARCH_PXA ...@@ -587,6 +588,7 @@ config ARCH_PXA
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select TICK_ONESHOT select TICK_ONESHOT
select PLAT_PXA select PLAT_PXA
select SPARSE_IRQ
help help
Support for Intel/Marvell's PXA2xx/PXA3xx processor line. Support for Intel/Marvell's PXA2xx/PXA3xx processor line.
......
...@@ -57,6 +57,13 @@ config MACH_MARVELL_JASPER ...@@ -57,6 +57,13 @@ config MACH_MARVELL_JASPER
PXA910-based development board. Since MMP2 is compatible to PXA910-based development board. Since MMP2 is compatible to
ARMv6 architecture. ARMv6 architecture.
config MACH_TETON_BGA
bool "Marvell's PXA168 Teton BGA Development Board"
select CPU_PXA168
help
Say 'Y' here if you want to support the Marvell PXA168-based
Teton BGA Development Board.
endmenu endmenu
config CPU_PXA168 config CPU_PXA168
......
...@@ -17,3 +17,4 @@ obj-$(CONFIG_MACH_TAVOREVB) += tavorevb.o ...@@ -17,3 +17,4 @@ obj-$(CONFIG_MACH_TAVOREVB) += tavorevb.o
obj-$(CONFIG_MACH_TTC_DKB) += ttc_dkb.o obj-$(CONFIG_MACH_TTC_DKB) += ttc_dkb.o
obj-$(CONFIG_MACH_FLINT) += flint.o obj-$(CONFIG_MACH_FLINT) += flint.o
obj-$(CONFIG_MACH_MARVELL_JASPER) += jasper.o obj-$(CONFIG_MACH_MARVELL_JASPER) += jasper.o
obj-$(CONFIG_MACH_TETON_BGA) += teton_bga.o
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/mtd/nand.h> #include <linux/mtd/nand.h>
#include <linux/interrupt.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -23,6 +24,9 @@ ...@@ -23,6 +24,9 @@
#include <mach/mfp-pxa168.h> #include <mach/mfp-pxa168.h>
#include <mach/pxa168.h> #include <mach/pxa168.h>
#include <mach/gpio.h> #include <mach/gpio.h>
#include <video/pxa168fb.h>
#include <linux/input.h>
#include <plat/pxa27x_keypad.h>
#include "common.h" #include "common.h"
...@@ -66,6 +70,43 @@ static unsigned long common_pin_config[] __initdata = { ...@@ -66,6 +70,43 @@ static unsigned long common_pin_config[] __initdata = {
GPIO115_I2S_BCLK, GPIO115_I2S_BCLK,
GPIO116_I2S_RXD, GPIO116_I2S_RXD,
GPIO117_I2S_TXD, GPIO117_I2S_TXD,
/* LCD */
GPIO56_LCD_FCLK_RD,
GPIO57_LCD_LCLK_A0,
GPIO58_LCD_PCLK_WR,
GPIO59_LCD_DENA_BIAS,
GPIO60_LCD_DD0,
GPIO61_LCD_DD1,
GPIO62_LCD_DD2,
GPIO63_LCD_DD3,
GPIO64_LCD_DD4,
GPIO65_LCD_DD5,
GPIO66_LCD_DD6,
GPIO67_LCD_DD7,
GPIO68_LCD_DD8,
GPIO69_LCD_DD9,
GPIO70_LCD_DD10,
GPIO71_LCD_DD11,
GPIO72_LCD_DD12,
GPIO73_LCD_DD13,
GPIO74_LCD_DD14,
GPIO75_LCD_DD15,
GPIO76_LCD_DD16,
GPIO77_LCD_DD17,
GPIO78_LCD_DD18,
GPIO79_LCD_DD19,
GPIO80_LCD_DD20,
GPIO81_LCD_DD21,
GPIO82_LCD_DD22,
GPIO83_LCD_DD23,
/* Keypad */
GPIO109_KP_MKIN1,
GPIO110_KP_MKIN0,
GPIO111_KP_MKOUT7,
GPIO112_KP_MKOUT6,
GPIO121_KP_MKIN4,
}; };
static struct smc91x_platdata smc91x_info = { static struct smc91x_platdata smc91x_info = {
...@@ -134,6 +175,51 @@ static struct i2c_board_info aspenite_i2c_info[] __initdata = { ...@@ -134,6 +175,51 @@ static struct i2c_board_info aspenite_i2c_info[] __initdata = {
{ I2C_BOARD_INFO("wm8753", 0x1b), }, { I2C_BOARD_INFO("wm8753", 0x1b), },
}; };
static struct fb_videomode video_modes[] = {
[0] = {
.pixclock = 30120,
.refresh = 60,
.xres = 800,
.yres = 480,
.hsync_len = 1,
.left_margin = 215,
.right_margin = 40,
.vsync_len = 1,
.upper_margin = 34,
.lower_margin = 10,
.sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT,
},
};
struct pxa168fb_mach_info aspenite_lcd_info = {
.id = "Graphic Frame",
.modes = video_modes,
.num_modes = ARRAY_SIZE(video_modes),
.pix_fmt = PIX_FMT_RGB565,
.io_pin_allocation_mode = PIN_MODE_DUMB_24,
.dumb_mode = DUMB_MODE_RGB888,
.active = 1,
.panel_rbswap = 0,
.invert_pixclock = 0,
};
static unsigned int aspenite_matrix_key_map[] = {
KEY(0, 6, KEY_UP), /* SW 4 */
KEY(0, 7, KEY_DOWN), /* SW 5 */
KEY(1, 6, KEY_LEFT), /* SW 6 */
KEY(1, 7, KEY_RIGHT), /* SW 7 */
KEY(4, 6, KEY_ENTER), /* SW 8 */
KEY(4, 7, KEY_ESC), /* SW 9 */
};
static struct pxa27x_keypad_platform_data aspenite_keypad_info __initdata = {
.matrix_key_rows = 5,
.matrix_key_cols = 8,
.matrix_key_map = aspenite_matrix_key_map,
.matrix_key_map_size = ARRAY_SIZE(aspenite_matrix_key_map),
.debounce_interval = 30,
};
static void __init common_init(void) static void __init common_init(void)
{ {
mfp_config(ARRAY_AND_SIZE(common_pin_config)); mfp_config(ARRAY_AND_SIZE(common_pin_config));
...@@ -143,6 +229,8 @@ static void __init common_init(void) ...@@ -143,6 +229,8 @@ static void __init common_init(void)
pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info)); pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info));
pxa168_add_ssp(1); pxa168_add_ssp(1);
pxa168_add_nand(&aspenite_nand_info); pxa168_add_nand(&aspenite_nand_info);
pxa168_add_fb(&aspenite_lcd_info);
pxa168_add_keypad(&aspenite_keypad_info);
/* off-chip devices */ /* off-chip devices */
platform_device_register(&smc91x_device); platform_device_register(&smc91x_device);
...@@ -152,6 +240,7 @@ MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform") ...@@ -152,6 +240,7 @@ MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = mmp_map_io, .map_io = mmp_map_io,
.nr_irqs = IRQ_BOARD_START,
.init_irq = pxa168_init_irq, .init_irq = pxa168_init_irq,
.timer = &pxa168_timer, .timer = &pxa168_timer,
.init_machine = common_init, .init_machine = common_init,
...@@ -161,6 +250,7 @@ MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform") ...@@ -161,6 +250,7 @@ MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = mmp_map_io, .map_io = mmp_map_io,
.nr_irqs = IRQ_BOARD_START,
.init_irq = pxa168_init_irq, .init_irq = pxa168_init_irq,
.timer = &pxa168_timer, .timer = &pxa168_timer,
.init_machine = common_init, .init_machine = common_init,
......
...@@ -10,13 +10,20 @@ ...@@ -10,13 +10,20 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <mach/addr-map.h> #include <mach/addr-map.h>
#include <mach/cputype.h>
#include "common.h" #include "common.h"
#define MMP_CHIPID (AXI_VIRT_BASE + 0x82c00)
unsigned int mmp_chip_id;
EXPORT_SYMBOL(mmp_chip_id);
static struct map_desc standard_io_desc[] __initdata = { static struct map_desc standard_io_desc[] __initdata = {
{ {
.pfn = __phys_to_pfn(APB_PHYS_BASE), .pfn = __phys_to_pfn(APB_PHYS_BASE),
...@@ -34,4 +41,7 @@ static struct map_desc standard_io_desc[] __initdata = { ...@@ -34,4 +41,7 @@ static struct map_desc standard_io_desc[] __initdata = {
void __init mmp_map_io(void) void __init mmp_map_io(void)
{ {
iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc)); iotable_init(standard_io_desc, ARRAY_SIZE(standard_io_desc));
/* this is early, initialize mmp_chip_id here */
mmp_chip_id = __raw_readl(MMP_CHIPID);
} }
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/smc91x.h> #include <linux/smc91x.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/interrupt.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -25,6 +26,8 @@ ...@@ -25,6 +26,8 @@
#include "common.h" #include "common.h"
#define FLINT_NR_IRQS (IRQ_BOARD_START + 48)
static unsigned long flint_pin_config[] __initdata = { static unsigned long flint_pin_config[] __initdata = {
/* UART1 */ /* UART1 */
GPIO45_UART1_RXD, GPIO45_UART1_RXD,
...@@ -116,6 +119,7 @@ MACHINE_START(FLINT, "Flint Development Platform") ...@@ -116,6 +119,7 @@ MACHINE_START(FLINT, "Flint Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = mmp_map_io, .map_io = mmp_map_io,
.nr_irqs = FLINT_NR_IRQS,
.init_irq = mmp2_init_irq, .init_irq = mmp2_init_irq,
.timer = &mmp2_timer, .timer = &mmp2_timer,
.init_machine = flint_init, .init_machine = flint_init,
......
...@@ -4,36 +4,51 @@ ...@@ -4,36 +4,51 @@
#include <asm/cputype.h> #include <asm/cputype.h>
/* /*
* CPU Stepping OLD_ID CPU_ID CHIP_ID * CPU Stepping CPU_ID CHIP_ID
* *
* PXA168 A0 0x41159263 0x56158400 0x00A0A333 * PXA168 S0 0x56158400 0x0000C910
* PXA910 Y0 0x41159262 0x56158000 0x00F0C910 * PXA168 A0 0x56158400 0x00A0A168
* MMP2 Z0 0x560f5811 * PXA910 Y1 0x56158400 0x00F2C920
* PXA910 A0 0x56158400 0x00F2C910
* PXA910 A1 0x56158400 0x00A0C910
* PXA920 Y0 0x56158400 0x00F2C920
* PXA920 A0 0x56158400 0x00A0C920
* PXA920 A1 0x56158400 0x00A1C920
* MMP2 Z0 0x560f5811 0x00F00410
* MMP2 Z1 0x560f5811 0x00E00410
* MMP2 A0 0x560f5811 0x00A0A610
*/ */
extern unsigned int mmp_chip_id;
#ifdef CONFIG_CPU_PXA168 #ifdef CONFIG_CPU_PXA168
# define __cpu_is_pxa168(id) \ static inline int cpu_is_pxa168(void)
({ unsigned int _id = ((id) >> 8) & 0xff; _id == 0x84; }) {
return (((read_cpuid_id() >> 8) & 0xff) == 0x84) &&
((mmp_chip_id & 0xfff) == 0x168);
}
#else #else
# define __cpu_is_pxa168(id) (0) #define cpu_is_pxa168() (0)
#endif #endif
/* cpu_is_pxa910() is shared on both pxa910 and pxa920 */
#ifdef CONFIG_CPU_PXA910 #ifdef CONFIG_CPU_PXA910
# define __cpu_is_pxa910(id) \ static inline int cpu_is_pxa910(void)
({ unsigned int _id = ((id) >> 8) & 0xff; _id == 0x80; }) {
return (((read_cpuid_id() >> 8) & 0xff) == 0x84) &&
(((mmp_chip_id & 0xfff) == 0x910) ||
((mmp_chip_id & 0xfff) == 0x920));
}
#else #else
# define __cpu_is_pxa910(id) (0) #define cpu_is_pxa910() (0)
#endif #endif
#ifdef CONFIG_CPU_MMP2 #ifdef CONFIG_CPU_MMP2
# define __cpu_is_mmp2(id) \ static inline int cpu_is_mmp2(void)
({ unsigned int _id = ((id) >> 8) & 0xff; _id == 0x58; }) {
return (((cpu_readid_id() >> 8) & 0xff) == 0x58);
#else #else
# define __cpu_is_mmp2(id) (0) #define cpu_is_mmp2() (0)
#endif #endif
#define cpu_is_pxa168() ({ __cpu_is_pxa168(read_cpuid_id()); })
#define cpu_is_pxa910() ({ __cpu_is_pxa910(read_cpuid_id()); })
#define cpu_is_mmp2() ({ __cpu_is_mmp2(read_cpuid_id()); })
#endif /* __ASM_MACH_CPUTYPE_H */ #endif /* __ASM_MACH_CPUTYPE_H */
...@@ -222,10 +222,8 @@ ...@@ -222,10 +222,8 @@
#define IRQ_GPIO_NUM 192 #define IRQ_GPIO_NUM 192
#define IRQ_GPIO(x) (IRQ_GPIO_START + (x)) #define IRQ_GPIO(x) (IRQ_GPIO_START + (x))
/* Board IRQ - 64 by default, increase if not enough */
#define IRQ_BOARD_START (IRQ_GPIO_START + IRQ_GPIO_NUM) #define IRQ_BOARD_START (IRQ_GPIO_START + IRQ_GPIO_NUM)
#define IRQ_BOARD_END (IRQ_BOARD_START + 64)
#define NR_IRQS (IRQ_BOARD_END) #define NR_IRQS (IRQ_BOARD_START)
#endif /* __ASM_MACH_IRQS_H */ #endif /* __ASM_MACH_IRQS_H */
...@@ -289,4 +289,11 @@ ...@@ -289,4 +289,11 @@
#define GPIO86_PWM1_OUT MFP_CFG(GPIO86, AF2) #define GPIO86_PWM1_OUT MFP_CFG(GPIO86, AF2)
#define GPIO86_PWM2_OUT MFP_CFG(GPIO86, AF3) #define GPIO86_PWM2_OUT MFP_CFG(GPIO86, AF3)
/* Keypad */
#define GPIO109_KP_MKIN1 MFP_CFG(GPIO109, AF7)
#define GPIO110_KP_MKIN0 MFP_CFG(GPIO110, AF7)
#define GPIO111_KP_MKOUT7 MFP_CFG(GPIO111, AF7)
#define GPIO112_KP_MKOUT6 MFP_CFG(GPIO112, AF7)
#define GPIO121_KP_MKIN4 MFP_CFG(GPIO121, AF7)
#endif /* __ASM_MACH_MFP_PXA168_H */ #endif /* __ASM_MACH_MFP_PXA168_H */
...@@ -5,11 +5,15 @@ struct sys_timer; ...@@ -5,11 +5,15 @@ struct sys_timer;
extern struct sys_timer pxa168_timer; extern struct sys_timer pxa168_timer;
extern void __init pxa168_init_irq(void); extern void __init pxa168_init_irq(void);
extern void pxa168_clear_keypad_wakeup(void);
#include <linux/i2c.h> #include <linux/i2c.h>
#include <mach/devices.h> #include <mach/devices.h>
#include <plat/i2c.h> #include <plat/i2c.h>
#include <plat/pxa3xx_nand.h> #include <plat/pxa3xx_nand.h>
#include <video/pxa168fb.h>
#include <plat/pxa27x_keypad.h>
#include <mach/cputype.h>
extern struct pxa_device_desc pxa168_device_uart1; extern struct pxa_device_desc pxa168_device_uart1;
extern struct pxa_device_desc pxa168_device_uart2; extern struct pxa_device_desc pxa168_device_uart2;
...@@ -25,6 +29,8 @@ extern struct pxa_device_desc pxa168_device_ssp3; ...@@ -25,6 +29,8 @@ extern struct pxa_device_desc pxa168_device_ssp3;
extern struct pxa_device_desc pxa168_device_ssp4; extern struct pxa_device_desc pxa168_device_ssp4;
extern struct pxa_device_desc pxa168_device_ssp5; extern struct pxa_device_desc pxa168_device_ssp5;
extern struct pxa_device_desc pxa168_device_nand; extern struct pxa_device_desc pxa168_device_nand;
extern struct pxa_device_desc pxa168_device_fb;
extern struct pxa_device_desc pxa168_device_keypad;
static inline int pxa168_add_uart(int id) static inline int pxa168_add_uart(int id)
{ {
...@@ -97,4 +103,18 @@ static inline int pxa168_add_nand(struct pxa3xx_nand_platform_data *info) ...@@ -97,4 +103,18 @@ static inline int pxa168_add_nand(struct pxa3xx_nand_platform_data *info)
{ {
return pxa_register_device(&pxa168_device_nand, info, sizeof(*info)); return pxa_register_device(&pxa168_device_nand, info, sizeof(*info));
} }
static inline int pxa168_add_fb(struct pxa168fb_mach_info *mi)
{
return pxa_register_device(&pxa168_device_fb, mi, sizeof(*mi));
}
static inline int pxa168_add_keypad(struct pxa27x_keypad_platform_data *data)
{
if (cpu_is_pxa168())
data->clear_wakeup_event = pxa168_clear_keypad_wakeup;
return pxa_register_device(&pxa168_device_keypad, data, sizeof(*data));
}
#endif /* __ASM_MACH_PXA168_H */ #endif /* __ASM_MACH_PXA168_H */
...@@ -33,4 +33,16 @@ ...@@ -33,4 +33,16 @@
#define APMU_FNRST_DIS (1 << 1) #define APMU_FNRST_DIS (1 << 1)
#define APMU_AXIRST_DIS (1 << 0) #define APMU_AXIRST_DIS (1 << 0)
/* Wake Clear Register */
#define APMU_WAKE_CLR APMU_REG(0x07c)
#define APMU_PXA168_KP_WAKE_CLR (1 << 7)
#define APMU_PXA168_CFI_WAKE_CLR (1 << 6)
#define APMU_PXA168_XD_WAKE_CLR (1 << 5)
#define APMU_PXA168_MSP_WAKE_CLR (1 << 4)
#define APMU_PXA168_SD4_WAKE_CLR (1 << 3)
#define APMU_PXA168_SD3_WAKE_CLR (1 << 2)
#define APMU_PXA168_SD2_WAKE_CLR (1 << 1)
#define APMU_PXA168_SD1_WAKE_CLR (1 << 0)
#endif /* __ASM_MACH_REGS_APMU_H */ #endif /* __ASM_MACH_REGS_APMU_H */
/*
* linux/arch/arm/mach-mmp/include/mach/teton_bga.h
*
* Support for the Marvell PXA168 Teton BGA Development Platform.
*
* 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
* publishhed by the Free Software Foundation.
*/
#ifndef __ASM_MACH_TETON_BGA_H
#define __ASM_MACH_TETON_BGA_H
/* GPIOs */
#define MMC_PWENA_GPIO 27
#define USBHPENB_GPIO 55
#define RTC_INT_GPIO 78
#define LCD_VBLK_EN_GPIO 79
#define LCD_DVDD_EN_GPIO 80
#define RST_WIFI_GPIO 81
#define CF_PWEN_GPIO 82
#define USB_OC_GPIO 83
#define PWM_GPIO 84
#define USBHPENA_GPIO 85
#define TS_INT_GPIO 86
#define CIR_GPIO 108
#endif /* __ASM_MACH_TETON_BGA_H */
...@@ -18,16 +18,18 @@ ...@@ -18,16 +18,18 @@
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/regulator/max8649.h> #include <linux/regulator/max8649.h>
#include <linux/mfd/max8925.h> #include <linux/mfd/max8925.h>
#include <linux/interrupt.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <mach/addr-map.h> #include <mach/addr-map.h>
#include <mach/mfp-mmp2.h> #include <mach/mfp-mmp2.h>
#include <mach/mmp2.h> #include <mach/mmp2.h>
#include <mach/irqs.h>
#include "common.h" #include "common.h"
#define JASPER_NR_IRQS (IRQ_BOARD_START + 48)
static unsigned long jasper_pin_config[] __initdata = { static unsigned long jasper_pin_config[] __initdata = {
/* UART1 */ /* UART1 */
GPIO29_UART1_RXD, GPIO29_UART1_RXD,
...@@ -137,6 +139,7 @@ MACHINE_START(MARVELL_JASPER, "Jasper Development Platform") ...@@ -137,6 +139,7 @@ MACHINE_START(MARVELL_JASPER, "Jasper Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = mmp_map_io, .map_io = mmp_map_io,
.nr_irqs = JASPER_NR_IRQS,
.init_irq = mmp2_init_irq, .init_irq = mmp2_init_irq,
.timer = &mmp2_timer, .timer = &mmp2_timer,
.init_machine = jasper_init, .init_machine = jasper_init,
......
...@@ -77,8 +77,10 @@ static APBC_CLK(ssp2, PXA168_SSP2, 4, 0); ...@@ -77,8 +77,10 @@ static APBC_CLK(ssp2, PXA168_SSP2, 4, 0);
static APBC_CLK(ssp3, PXA168_SSP3, 4, 0); static APBC_CLK(ssp3, PXA168_SSP3, 4, 0);
static APBC_CLK(ssp4, PXA168_SSP4, 4, 0); static APBC_CLK(ssp4, PXA168_SSP4, 4, 0);
static APBC_CLK(ssp5, PXA168_SSP5, 4, 0); static APBC_CLK(ssp5, PXA168_SSP5, 4, 0);
static APBC_CLK(keypad, PXA168_KPC, 0, 32000);
static APMU_CLK(nand, NAND, 0x01db, 208000000); static APMU_CLK(nand, NAND, 0x01db, 208000000);
static APMU_CLK(lcd, LCD, 0x7f, 312000000);
/* device and clock bindings */ /* device and clock bindings */
static struct clk_lookup pxa168_clkregs[] = { static struct clk_lookup pxa168_clkregs[] = {
...@@ -96,6 +98,8 @@ static struct clk_lookup pxa168_clkregs[] = { ...@@ -96,6 +98,8 @@ static struct clk_lookup pxa168_clkregs[] = {
INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL), INIT_CLKREG(&clk_ssp4, "pxa168-ssp.3", NULL),
INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL), INIT_CLKREG(&clk_ssp5, "pxa168-ssp.4", NULL),
INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL), INIT_CLKREG(&clk_nand, "pxa3xx-nand", NULL),
INIT_CLKREG(&clk_lcd, "pxa168-fb", NULL),
INIT_CLKREG(&clk_keypad, "pxa27x-keypad", NULL),
}; };
static int __init pxa168_init(void) static int __init pxa168_init(void)
...@@ -132,6 +136,16 @@ struct sys_timer pxa168_timer = { ...@@ -132,6 +136,16 @@ struct sys_timer pxa168_timer = {
.init = pxa168_timer_init, .init = pxa168_timer_init,
}; };
void pxa168_clear_keypad_wakeup(void)
{
uint32_t val;
uint32_t mask = APMU_PXA168_KP_WAKE_CLR;
/* wake event clear is needed in order to clear keypad interrupt */
val = __raw_readl(APMU_WAKE_CLR);
__raw_writel(val | mask, APMU_WAKE_CLR);
}
/* on-chip devices */ /* on-chip devices */
PXA168_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4017000, 0x30, 21, 22); PXA168_DEVICE(uart1, "pxa2xx-uart", 0, UART1, 0xd4017000, 0x30, 21, 22);
PXA168_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4018000, 0x30, 23, 24); PXA168_DEVICE(uart2, "pxa2xx-uart", 1, UART2, 0xd4018000, 0x30, 23, 24);
...@@ -147,3 +161,5 @@ PXA168_DEVICE(ssp2, "pxa168-ssp", 1, SSP2, 0xd401c000, 0x40, 54, 55); ...@@ -147,3 +161,5 @@ PXA168_DEVICE(ssp2, "pxa168-ssp", 1, SSP2, 0xd401c000, 0x40, 54, 55);
PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, 0xd401f000, 0x40, 56, 57); PXA168_DEVICE(ssp3, "pxa168-ssp", 2, SSP3, 0xd401f000, 0x40, 56, 57);
PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59); PXA168_DEVICE(ssp4, "pxa168-ssp", 3, SSP4, 0xd4020000, 0x40, 58, 59);
PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61); PXA168_DEVICE(ssp5, "pxa168-ssp", 4, SSP5, 0xd4021000, 0x40, 60, 61);
PXA168_DEVICE(fb, "pxa168-fb", -1, LCD, 0xd420b000, 0x1c8);
PXA168_DEVICE(keypad, "pxa27x-keypad", -1, KEYPAD, 0xd4012000, 0x4c);
/*
* linux/arch/arm/mach-mmp/teton_bga.c
*
* Support for the Marvell PXA168 Teton BGA Development Platform.
*
* Author: Mark F. Brown <mark.brown314@gmail.com>
*
* This code is based on aspenite.c
*
* 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
* publishhed by the Free Software Foundation.
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/input.h>
#include <plat/pxa27x_keypad.h>
#include <linux/i2c.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <mach/addr-map.h>
#include <mach/mfp-pxa168.h>
#include <mach/pxa168.h>
#include <mach/teton_bga.h>
#include "common.h"
static unsigned long teton_bga_pin_config[] __initdata = {
/* UART1 */
GPIO107_UART1_TXD,
GPIO108_UART1_RXD,
/* Keypad */
GPIO109_KP_MKIN1,
GPIO110_KP_MKIN0,
GPIO111_KP_MKOUT7,
GPIO112_KP_MKOUT6,
/* I2C Bus */
GPIO105_CI2C_SDA,
GPIO106_CI2C_SCL,
/* RTC */
GPIO78_GPIO,
};
static unsigned int teton_bga_matrix_key_map[] = {
KEY(0, 6, KEY_ESC),
KEY(0, 7, KEY_ENTER),
KEY(1, 6, KEY_LEFT),
KEY(1, 7, KEY_RIGHT),
};
static struct pxa27x_keypad_platform_data teton_bga_keypad_info __initdata = {
.matrix_key_rows = 2,
.matrix_key_cols = 8,
.matrix_key_map = teton_bga_matrix_key_map,
.matrix_key_map_size = ARRAY_SIZE(teton_bga_matrix_key_map),
.debounce_interval = 30,
};
static struct i2c_board_info teton_bga_i2c_info[] __initdata = {
{
I2C_BOARD_INFO("ds1337", 0x68),
.irq = gpio_to_irq(RTC_INT_GPIO)
},
};
static void __init teton_bga_init(void)
{
mfp_config(ARRAY_AND_SIZE(teton_bga_pin_config));
/* on-chip devices */
pxa168_add_uart(1);
pxa168_add_keypad(&teton_bga_keypad_info);
pxa168_add_twsi(0, NULL, ARRAY_AND_SIZE(teton_bga_i2c_info));
}
MACHINE_START(TETON_BGA, "PXA168-based Teton BGA Development Platform")
.phys_io = APB_PHYS_BASE,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = mmp_map_io,
.nr_irqs = IRQ_BOARD_START,
.init_irq = pxa168_init_irq,
.timer = &pxa168_timer,
.init_machine = teton_bga_init,
MACHINE_END
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/mtd/onenand.h> #include <linux/mtd/onenand.h>
#include <linux/interrupt.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
...@@ -24,6 +25,8 @@ ...@@ -24,6 +25,8 @@
#include "common.h" #include "common.h"
#define TTCDKB_NR_IRQS (IRQ_BOARD_START + 24)
static unsigned long ttc_dkb_pin_config[] __initdata = { static unsigned long ttc_dkb_pin_config[] __initdata = {
/* UART2 */ /* UART2 */
GPIO47_UART2_RXD, GPIO47_UART2_RXD,
...@@ -125,6 +128,7 @@ MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform") ...@@ -125,6 +128,7 @@ MACHINE_START(TTC_DKB, "PXA910-based TTC_DKB Development Platform")
.phys_io = APB_PHYS_BASE, .phys_io = APB_PHYS_BASE,
.io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc, .io_pg_offst = (APB_VIRT_BASE >> 18) & 0xfffc,
.map_io = mmp_map_io, .map_io = mmp_map_io,
.nr_irqs = TTCDKB_NR_IRQS,
.init_irq = pxa910_init_irq, .init_irq = pxa910_init_irq,
.timer = &pxa910_timer, .timer = &pxa910_timer,
.init_machine = ttc_dkb_init, .init_machine = ttc_dkb_init,
......
...@@ -8,19 +8,16 @@ config ARCH_LUBBOCK ...@@ -8,19 +8,16 @@ config ARCH_LUBBOCK
bool "Intel DBPXA250 Development Platform (aka Lubbock)" bool "Intel DBPXA250 Development Platform (aka Lubbock)"
select PXA25x select PXA25x
select SA1111 select SA1111
select PXA_HAVE_BOARD_IRQS
config MACH_MAINSTONE config MACH_MAINSTONE
bool "Intel HCDDBBVA0 Development Platform (aka Mainstone)" bool "Intel HCDDBBVA0 Development Platform (aka Mainstone)"
select PXA27x select PXA27x
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_ZYLONITE config MACH_ZYLONITE
bool bool
select PXA3xx select PXA3xx
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_ZYLONITE300 config MACH_ZYLONITE300
bool "PXA3xx Development Platform (aka Zylonite) PXA300/310" bool "PXA3xx Development Platform (aka Zylonite) PXA300/310"
...@@ -44,6 +41,10 @@ config MACH_TAVOREVB ...@@ -44,6 +41,10 @@ config MACH_TAVOREVB
select PXA3xx select PXA3xx
select CPU_PXA930 select CPU_PXA930
config MACH_TAVOREVB3
bool "PXA95x Development Platform (aka TavorEVB III)"
select CPU_PXA950
config MACH_SAAR config MACH_SAAR
bool "PXA930 Handheld Platform (aka SAAR)" bool "PXA930 Handheld Platform (aka SAAR)"
select PXA3xx select PXA3xx
...@@ -61,7 +62,6 @@ config ARCH_VIPER ...@@ -61,7 +62,6 @@ config ARCH_VIPER
select ISA select ISA
select I2C_GPIO select I2C_GPIO
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
select PXA_HAVE_ISA_IRQS select PXA_HAVE_ISA_IRQS
select ARCOM_PCMCIA select ARCOM_PCMCIA
...@@ -69,7 +69,6 @@ config MACH_ARCOM_ZEUS ...@@ -69,7 +69,6 @@ config MACH_ARCOM_ZEUS
bool "Arcom/Eurotech ZEUS SBC" bool "Arcom/Eurotech ZEUS SBC"
select PXA27x select PXA27x
select ISA select ISA
select PXA_HAVE_BOARD_IRQS
select PXA_HAVE_ISA_IRQS select PXA_HAVE_ISA_IRQS
select ARCOM_PCMCIA select ARCOM_PCMCIA
...@@ -77,7 +76,6 @@ config MACH_BALLOON3 ...@@ -77,7 +76,6 @@ config MACH_BALLOON3
bool "Balloon 3 board" bool "Balloon 3 board"
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select PXA_HAVE_BOARD_IRQS
config MACH_CSB726 config MACH_CSB726
bool "Enable Cogent CSB726 System On a Module" bool "Enable Cogent CSB726 System On a Module"
...@@ -140,13 +138,11 @@ config MACH_INTELMOTE2 ...@@ -140,13 +138,11 @@ config MACH_INTELMOTE2
bool "Intel Mote 2 Platform" bool "Intel Mote 2 Platform"
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select PXA_HAVE_BOARD_IRQS
config MACH_STARGATE2 config MACH_STARGATE2
bool "Intel Stargate 2 Platform" bool "Intel Stargate 2 Platform"
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select PXA_HAVE_BOARD_IRQS
config MACH_XCEP config MACH_XCEP
bool "Iskratel Electronics XCEP" bool "Iskratel Electronics XCEP"
...@@ -206,13 +202,11 @@ config MACH_LOGICPD_PXA270 ...@@ -206,13 +202,11 @@ config MACH_LOGICPD_PXA270
bool "LogicPD PXA270 Card Engine Development Platform" bool "LogicPD PXA270 Card Engine Development Platform"
select PXA27x select PXA27x
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_PCM027 config MACH_PCM027
bool "Phytec phyCORE-PXA270 CPU module (PCM-027)" bool "Phytec phyCORE-PXA270 CPU module (PCM-027)"
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select PXA_HAVE_BOARD_IRQS
config MACH_PCM990_BASEBOARD config MACH_PCM990_BASEBOARD
bool "PHYTEC PCM-990 development board" bool "PHYTEC PCM-990 development board"
...@@ -247,7 +241,6 @@ config MACH_COLIBRI_PXA270_INCOME ...@@ -247,7 +241,6 @@ config MACH_COLIBRI_PXA270_INCOME
depends on MACH_COLIBRI depends on MACH_COLIBRI
select PXA27x select PXA27x
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_COLIBRI300 config MACH_COLIBRI300
bool "Toradex Colibri PXA300/310" bool "Toradex Colibri PXA300/310"
...@@ -274,7 +267,6 @@ config MACH_H4700 ...@@ -274,7 +267,6 @@ config MACH_H4700
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_H5000 config MACH_H5000
bool "HP iPAQ h5000" bool "HP iPAQ h5000"
...@@ -289,7 +281,6 @@ config MACH_MAGICIAN ...@@ -289,7 +281,6 @@ config MACH_MAGICIAN
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_MIOA701 config MACH_MIOA701
bool "Mitac Mio A701 Support" bool "Mitac Mio A701 Support"
...@@ -307,7 +298,6 @@ config PXA_EZX ...@@ -307,7 +298,6 @@ config PXA_EZX
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
config MACH_EZX_A780 config MACH_EZX_A780
bool "Motorola EZX A780" bool "Motorola EZX A780"
...@@ -478,7 +468,6 @@ config MACH_POODLE ...@@ -478,7 +468,6 @@ config MACH_POODLE
depends on PXA_SHARPSL depends on PXA_SHARPSL
select PXA25x select PXA25x
select SHARP_LOCOMO select SHARP_LOCOMO
select PXA_HAVE_BOARD_IRQS
config MACH_CORGI config MACH_CORGI
bool "Enable Sharp SL-C700 (Corgi) Support" bool "Enable Sharp SL-C700 (Corgi) Support"
...@@ -523,7 +512,6 @@ config MACH_TOSA ...@@ -523,7 +512,6 @@ config MACH_TOSA
bool "Enable Sharp SL-6000x (Tosa) Support" bool "Enable Sharp SL-6000x (Tosa) Support"
depends on PXA_SHARPSL depends on PXA_SHARPSL
select PXA25x select PXA25x
select PXA_HAVE_BOARD_IRQS
config TOSA_BT config TOSA_BT
tristate "Control the state of built-in bluetooth chip on Sharp SL-6000" tristate "Control the state of built-in bluetooth chip on Sharp SL-6000"
...@@ -552,7 +540,6 @@ config MACH_ICONTROL ...@@ -552,7 +540,6 @@ config MACH_ICONTROL
config ARCH_PXA_ESERIES config ARCH_PXA_ESERIES
bool "PXA based Toshiba e-series PDAs" bool "PXA based Toshiba e-series PDAs"
select PXA25x select PXA25x
select PXA_HAVE_BOARD_IRQS
config MACH_E330 config MACH_E330
bool "Toshiba e330" bool "Toshiba e330"
...@@ -606,7 +593,6 @@ config MACH_ZIPIT2 ...@@ -606,7 +593,6 @@ config MACH_ZIPIT2
bool "Zipit Z2 Handheld" bool "Zipit Z2 Handheld"
select PXA27x select PXA27x
select HAVE_PWM select HAVE_PWM
select PXA_HAVE_BOARD_IRQS
endmenu endmenu
...@@ -643,6 +629,7 @@ config CPU_PXA300 ...@@ -643,6 +629,7 @@ config CPU_PXA300
config CPU_PXA310 config CPU_PXA310
bool bool
select CPU_PXA300 select CPU_PXA300
select PXA310_ULPI if USB_ULPI
help help
PXA310 (codename Monahans-LV) PXA310 (codename Monahans-LV)
...@@ -692,10 +679,10 @@ config SHARPSL_PM_MAX1111 ...@@ -692,10 +679,10 @@ config SHARPSL_PM_MAX1111
select HWMON select HWMON
select SENSORS_MAX1111 select SENSORS_MAX1111
config PXA_HAVE_BOARD_IRQS config PXA_HAVE_ISA_IRQS
bool bool
config PXA_HAVE_ISA_IRQS config PXA310_ULPI
bool bool
endif endif
...@@ -18,7 +18,7 @@ endif ...@@ -18,7 +18,7 @@ endif
# SoC-specific code # SoC-specific code
obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa2xx.o pxa25x.o obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa2xx.o pxa25x.o
obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa2xx.o pxa27x.o obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa2xx.o pxa27x.o
obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o pxa3xx-ulpi.o
obj-$(CONFIG_CPU_PXA300) += pxa300.o obj-$(CONFIG_CPU_PXA300) += pxa300.o
obj-$(CONFIG_CPU_PXA320) += pxa320.o obj-$(CONFIG_CPU_PXA320) += pxa320.o
obj-$(CONFIG_CPU_PXA930) += pxa930.o obj-$(CONFIG_CPU_PXA930) += pxa930.o
...@@ -32,6 +32,7 @@ obj-$(CONFIG_MACH_ZYLONITE300) += zylonite.o zylonite_pxa300.o ...@@ -32,6 +32,7 @@ obj-$(CONFIG_MACH_ZYLONITE300) += zylonite.o zylonite_pxa300.o
obj-$(CONFIG_MACH_ZYLONITE320) += zylonite.o zylonite_pxa320.o obj-$(CONFIG_MACH_ZYLONITE320) += zylonite.o zylonite_pxa320.o
obj-$(CONFIG_MACH_LITTLETON) += littleton.o obj-$(CONFIG_MACH_LITTLETON) += littleton.o
obj-$(CONFIG_MACH_TAVOREVB) += tavorevb.o obj-$(CONFIG_MACH_TAVOREVB) += tavorevb.o
obj-$(CONFIG_MACH_TAVOREVB3) += tavorevb3.o
obj-$(CONFIG_MACH_SAAR) += saar.o obj-$(CONFIG_MACH_SAAR) += saar.o
# 3rd Party Dev Platforms # 3rd Party Dev Platforms
......
...@@ -68,42 +68,6 @@ static unsigned long balloon3_pin_config[] __initdata = { ...@@ -68,42 +68,6 @@ static unsigned long balloon3_pin_config[] __initdata = {
/* Reset, configured as GPIO wakeup source */ /* Reset, configured as GPIO wakeup source */
GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH, 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,
}; };
/****************************************************************************** /******************************************************************************
...@@ -131,6 +95,34 @@ int __init parse_balloon3_features(char *arg) ...@@ -131,6 +95,34 @@ int __init parse_balloon3_features(char *arg)
} }
early_param("balloon3_features", parse_balloon3_features); early_param("balloon3_features", parse_balloon3_features);
/******************************************************************************
* Compact Flash slot
******************************************************************************/
#if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
static unsigned long balloon3_cf_pin_config[] __initdata = {
GPIO48_nPOE,
GPIO49_nPWE,
GPIO50_nPIOR,
GPIO51_nPIOW,
GPIO85_nPCE_1,
GPIO54_nPCE_2,
GPIO79_PSKTSEL,
GPIO55_nPREG,
GPIO56_nPWAIT,
GPIO57_nIOIS16,
};
static void __init balloon3_cf_init(void)
{
if (!balloon3_has(BALLOON3_FEATURE_CF))
return;
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_cf_pin_config));
}
#else
static inline void balloon3_cf_init(void) {}
#endif
/****************************************************************************** /******************************************************************************
* NOR Flash * NOR Flash
******************************************************************************/ ******************************************************************************/
...@@ -179,6 +171,15 @@ static inline void balloon3_nor_init(void) {} ...@@ -179,6 +171,15 @@ static inline void balloon3_nor_init(void) {}
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_TOUCHSCREEN_UCB1400) || \ #if defined(CONFIG_TOUCHSCREEN_UCB1400) || \
defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE) defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
static unsigned long balloon3_ac97_pin_config[] __initdata = {
GPIO28_AC97_BITCLK,
GPIO29_AC97_SDATA_IN_0,
GPIO30_AC97_SDATA_OUT,
GPIO31_AC97_SYNC,
GPIO113_AC97_nRESET,
GPIO95_GPIO,
};
static struct ucb1400_pdata vpac270_ucb1400_pdata = { static struct ucb1400_pdata vpac270_ucb1400_pdata = {
.irq = IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ), .irq = IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ),
}; };
...@@ -197,6 +198,7 @@ static void __init balloon3_ts_init(void) ...@@ -197,6 +198,7 @@ static void __init balloon3_ts_init(void)
if (!balloon3_has(BALLOON3_FEATURE_AUDIO)) if (!balloon3_has(BALLOON3_FEATURE_AUDIO))
return; return;
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_ac97_pin_config));
pxa_set_ac97_info(NULL); pxa_set_ac97_info(NULL);
platform_device_register(&balloon3_ucb1400_device); platform_device_register(&balloon3_ucb1400_device);
} }
...@@ -208,6 +210,11 @@ static inline void balloon3_ts_init(void) {} ...@@ -208,6 +210,11 @@ static inline void balloon3_ts_init(void) {}
* Framebuffer * Framebuffer
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
static unsigned long balloon3_lcd_pin_config[] __initdata = {
GPIOxx_LCD_TFT_16BPP,
GPIO99_GPIO,
};
static struct pxafb_mode_info balloon3_lcd_modes[] = { static struct pxafb_mode_info balloon3_lcd_modes[] = {
{ {
.pixclock = 38000, .pixclock = 38000,
...@@ -242,6 +249,8 @@ static void __init balloon3_lcd_init(void) ...@@ -242,6 +249,8 @@ static void __init balloon3_lcd_init(void)
if (!balloon3_has(BALLOON3_FEATURE_TOPPOLY)) if (!balloon3_has(BALLOON3_FEATURE_TOPPOLY))
return; return;
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_lcd_pin_config));
ret = gpio_request(BALLOON3_GPIO_RUN_BACKLIGHT, "BKL-ON"); ret = gpio_request(BALLOON3_GPIO_RUN_BACKLIGHT, "BKL-ON");
if (ret) { if (ret) {
pr_err("Requesting BKL-ON GPIO failed!\n"); pr_err("Requesting BKL-ON GPIO failed!\n");
...@@ -271,6 +280,15 @@ static inline void balloon3_lcd_init(void) {} ...@@ -271,6 +280,15 @@ static inline void balloon3_lcd_init(void) {}
* SD/MMC card controller * SD/MMC card controller
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) #if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
static unsigned long balloon3_mmc_pin_config[] __initdata = {
GPIO32_MMC_CLK,
GPIO92_MMC_DAT_0,
GPIO109_MMC_DAT_1,
GPIO110_MMC_DAT_2,
GPIO111_MMC_DAT_3,
GPIO112_MMC_CMD,
};
static struct pxamci_platform_data balloon3_mci_platform_data = { static struct pxamci_platform_data balloon3_mci_platform_data = {
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.gpio_card_detect = -1, .gpio_card_detect = -1,
...@@ -281,6 +299,7 @@ static struct pxamci_platform_data balloon3_mci_platform_data = { ...@@ -281,6 +299,7 @@ static struct pxamci_platform_data balloon3_mci_platform_data = {
static void __init balloon3_mmc_init(void) static void __init balloon3_mmc_init(void)
{ {
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_mmc_pin_config));
pxa_set_mci_info(&balloon3_mci_platform_data); pxa_set_mci_info(&balloon3_mci_platform_data);
} }
#else #else
...@@ -339,6 +358,11 @@ static inline void balloon3_irda_init(void) {} ...@@ -339,6 +358,11 @@ static inline void balloon3_irda_init(void) {}
* USB Host * USB Host
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
static unsigned long balloon3_uhc_pin_config[] __initdata = {
GPIO88_USBH1_PWR,
GPIO89_USBH1_PEN,
};
static struct pxaohci_platform_data balloon3_ohci_info = { static struct pxaohci_platform_data balloon3_ohci_info = {
.port_mode = PMM_PERPORT_MODE, .port_mode = PMM_PERPORT_MODE,
.flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW, .flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW,
...@@ -348,6 +372,7 @@ static void __init balloon3_uhc_init(void) ...@@ -348,6 +372,7 @@ static void __init balloon3_uhc_init(void)
{ {
if (!balloon3_has(BALLOON3_FEATURE_OHCI)) if (!balloon3_has(BALLOON3_FEATURE_OHCI))
return; return;
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_uhc_pin_config));
pxa_set_ohci_info(&balloon3_ohci_info); pxa_set_ohci_info(&balloon3_ohci_info);
} }
#else #else
...@@ -358,6 +383,11 @@ static inline void balloon3_uhc_init(void) {} ...@@ -358,6 +383,11 @@ static inline void balloon3_uhc_init(void) {}
* LEDs * LEDs
******************************************************************************/ ******************************************************************************/
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
static unsigned long balloon3_led_pin_config[] __initdata = {
GPIO9_GPIO, /* NAND activity LED */
GPIO10_GPIO, /* Heartbeat LED */
};
struct gpio_led balloon3_gpio_leds[] = { struct gpio_led balloon3_gpio_leds[] = {
{ {
.name = "balloon3:green:idle", .name = "balloon3:green:idle",
...@@ -436,6 +466,7 @@ static struct platform_device balloon3_pcf_leds = { ...@@ -436,6 +466,7 @@ static struct platform_device balloon3_pcf_leds = {
static void __init balloon3_leds_init(void) static void __init balloon3_leds_init(void)
{ {
pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_led_pin_config));
platform_device_register(&balloon3_leds); platform_device_register(&balloon3_leds);
platform_device_register(&balloon3_pcf_leds); platform_device_register(&balloon3_pcf_leds);
} }
...@@ -757,6 +788,7 @@ static void __init balloon3_init(void) ...@@ -757,6 +788,7 @@ static void __init balloon3_init(void)
balloon3_ts_init(); balloon3_ts_init();
balloon3_udc_init(); balloon3_udc_init();
balloon3_uhc_init(); balloon3_uhc_init();
balloon3_cf_init();
} }
static struct map_desc balloon3_io_desc[] __initdata = { static struct map_desc balloon3_io_desc[] __initdata = {
...@@ -779,6 +811,7 @@ MACHINE_START(BALLOON3, "Balloon3") ...@@ -779,6 +811,7 @@ MACHINE_START(BALLOON3, "Balloon3")
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = balloon3_map_io, .map_io = balloon3_map_io,
.nr_irqs = BALLOON3_NR_IRQS,
.init_irq = balloon3_init_irq, .init_irq = balloon3_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = balloon3_init, .init_machine = balloon3_init,
......
...@@ -33,6 +33,9 @@ ...@@ -33,6 +33,9 @@
extern void cmx255_init(void); extern void cmx255_init(void);
extern void cmx270_init(void); extern void cmx270_init(void);
/* reserve IRQs for IT8152 */
#define CMX2XX_NR_IRQS (IRQ_BOARD_START + 40)
/* virtual addresses for statically mapped regions */ /* virtual addresses for statically mapped regions */
#define CMX2XX_VIRT_BASE (0xe8000000) #define CMX2XX_VIRT_BASE (0xe8000000)
#define CMX2XX_IT8152_VIRT (CMX2XX_VIRT_BASE) #define CMX2XX_IT8152_VIRT (CMX2XX_VIRT_BASE)
...@@ -514,6 +517,7 @@ MACHINE_START(ARMCORE, "Compulab CM-X2XX") ...@@ -514,6 +517,7 @@ MACHINE_START(ARMCORE, "Compulab CM-X2XX")
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = cmx2xx_map_io, .map_io = cmx2xx_map_io,
.nr_irqs = CMX2XX_NR_IRQS,
.init_irq = cmx2xx_init_irq, .init_irq = cmx2xx_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = cmx2xx_init, .init_machine = cmx2xx_init,
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/dm9000.h> #include <linux/dm9000.h>
...@@ -50,6 +51,7 @@ ...@@ -50,6 +51,7 @@
#include <plat/i2c.h> #include <plat/i2c.h>
#include <plat/pxa3xx_nand.h> #include <plat/pxa3xx_nand.h>
#include <mach/audio.h> #include <mach/audio.h>
#include <mach/pxa3xx-u2d.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
...@@ -68,6 +70,8 @@ ...@@ -68,6 +70,8 @@
#define GPIO97_RTC_RD (97) #define GPIO97_RTC_RD (97)
#define GPIO98_RTC_IO (98) #define GPIO98_RTC_IO (98)
#define GPIO_ULPI_PHY_RST (127)
static mfp_cfg_t cm_x3xx_mfp_cfg[] __initdata = { static mfp_cfg_t cm_x3xx_mfp_cfg[] __initdata = {
/* LCD */ /* LCD */
GPIO54_LCD_LDD_0, GPIO54_LCD_LDD_0,
...@@ -472,6 +476,78 @@ static void __init cm_x300_init_mmc(void) ...@@ -472,6 +476,78 @@ static void __init cm_x300_init_mmc(void)
static inline void cm_x300_init_mmc(void) {} static inline void cm_x300_init_mmc(void) {}
#endif #endif
#if defined(CONFIG_PXA310_ULPI)
static struct clk *pout_clk;
static int cm_x300_ulpi_phy_reset(void)
{
int err;
/* reset the PHY */
err = gpio_request(GPIO_ULPI_PHY_RST, "ulpi reset");
if (err) {
pr_err("%s: failed to request ULPI reset GPIO: %d\n",
__func__, err);
return err;
}
gpio_direction_output(GPIO_ULPI_PHY_RST, 0);
msleep(10);
gpio_set_value(GPIO_ULPI_PHY_RST, 1);
msleep(10);
gpio_free(GPIO_ULPI_PHY_RST);
return 0;
}
static inline int cm_x300_u2d_init(struct device *dev)
{
int err = 0;
if (cpu_is_pxa310()) {
/* CLK_POUT is connected to the ULPI PHY */
pout_clk = clk_get(NULL, "CLK_POUT");
if (IS_ERR(pout_clk)) {
err = PTR_ERR(pout_clk);
pr_err("%s: failed to get CLK_POUT: %d\n",
__func__, err);
return err;
}
clk_enable(pout_clk);
err = cm_x300_ulpi_phy_reset();
if (err) {
clk_disable(pout_clk);
clk_put(pout_clk);
}
}
return err;
}
static void cm_x300_u2d_exit(struct device *dev)
{
if (cpu_is_pxa310()) {
clk_disable(pout_clk);
clk_put(pout_clk);
}
}
static struct pxa3xx_u2d_platform_data cm_x300_u2d_platform_data = {
.ulpi_mode = ULPI_SER_6PIN,
.init = cm_x300_u2d_init,
.exit = cm_x300_u2d_exit,
};
static void cm_x300_init_u2d(void)
{
pxa3xx_set_u2d_info(&cm_x300_u2d_platform_data);
}
#else
static inline void cm_x300_init_u2d(void) {}
#endif
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
static int cm_x300_ohci_init(struct device *dev) static int cm_x300_ohci_init(struct device *dev)
{ {
...@@ -754,6 +830,7 @@ static void __init cm_x300_init(void) ...@@ -754,6 +830,7 @@ static void __init cm_x300_init(void)
cm_x300_init_da9030(); cm_x300_init_da9030();
cm_x300_init_dm9000(); cm_x300_init_dm9000();
cm_x300_init_lcd(); cm_x300_init_lcd();
cm_x300_init_u2d();
cm_x300_init_ohci(); cm_x300_init_ohci();
cm_x300_init_mmc(); cm_x300_init_mmc();
cm_x300_init_nand(); cm_x300_init_nand();
......
...@@ -159,7 +159,7 @@ static int pxa3xx_cpufreq_verify(struct cpufreq_policy *policy) ...@@ -159,7 +159,7 @@ static int pxa3xx_cpufreq_verify(struct cpufreq_policy *policy)
static unsigned int pxa3xx_cpufreq_get(unsigned int cpu) static unsigned int pxa3xx_cpufreq_get(unsigned int cpu)
{ {
return get_clk_frequency_khz(0); return pxa3xx_get_clk_frequency_khz(0);
} }
static int pxa3xx_cpufreq_set(struct cpufreq_policy *policy, static int pxa3xx_cpufreq_set(struct cpufreq_policy *policy,
...@@ -212,7 +212,8 @@ static int pxa3xx_cpufreq_init(struct cpufreq_policy *policy) ...@@ -212,7 +212,8 @@ static int pxa3xx_cpufreq_init(struct cpufreq_policy *policy)
policy->cpuinfo.min_freq = 104000; policy->cpuinfo.min_freq = 104000;
policy->cpuinfo.max_freq = (cpu_is_pxa320()) ? 806000 : 624000; policy->cpuinfo.max_freq = (cpu_is_pxa320()) ? 806000 : 624000;
policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */ policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */
policy->cur = policy->min = policy->max = get_clk_frequency_khz(0); policy->max = pxa3xx_get_clk_frequency_khz(0);
policy->cur = policy->min = policy->max;
if (cpu_is_pxa300() || cpu_is_pxa310()) if (cpu_is_pxa300() || cpu_is_pxa310())
ret = setup_freqs_table(policy, ARRAY_AND_SIZE(pxa300_freqs)); ret = setup_freqs_table(policy, ARRAY_AND_SIZE(pxa300_freqs));
......
...@@ -6,11 +6,12 @@ ...@@ -6,11 +6,12 @@
#include <asm/pmu.h> #include <asm/pmu.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/pxa3xx-u2d.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/ohci.h> #include <mach/ohci.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/pxa2xx_spi.h> #include <mach/pxa2xx_spi.h>
#include <mach/camera.h> #include <mach/camera.h>
#include <mach/audio.h> #include <mach/audio.h>
...@@ -134,6 +135,33 @@ struct platform_device pxa27x_device_udc = { ...@@ -134,6 +135,33 @@ struct platform_device pxa27x_device_udc = {
} }
}; };
#ifdef CONFIG_PXA3xx
static struct resource pxa3xx_u2d_resources[] = {
[0] = {
.start = 0x54100000,
.end = 0x54100fff,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_USB2,
.end = IRQ_USB2,
.flags = IORESOURCE_IRQ,
},
};
struct platform_device pxa3xx_device_u2d = {
.name = "pxa3xx-u2d",
.id = -1,
.resource = pxa3xx_u2d_resources,
.num_resources = ARRAY_SIZE(pxa3xx_u2d_resources),
};
void __init pxa3xx_set_u2d_info(struct pxa3xx_u2d_platform_data *info)
{
pxa_register_device(&pxa3xx_device_u2d, info);
}
#endif /* CONFIG_PXA3xx */
static struct resource pxafb_resources[] = { static struct resource pxafb_resources[] = {
[0] = { [0] = {
.start = 0x44000000, .start = 0x44000000,
......
...@@ -4,6 +4,7 @@ extern struct platform_device pxa3xx_device_mci2; ...@@ -4,6 +4,7 @@ extern struct platform_device pxa3xx_device_mci2;
extern struct platform_device pxa3xx_device_mci3; extern struct platform_device pxa3xx_device_mci3;
extern struct platform_device pxa25x_device_udc; extern struct platform_device pxa25x_device_udc;
extern struct platform_device pxa27x_device_udc; extern struct platform_device pxa27x_device_udc;
extern struct platform_device pxa3xx_device_u2d;
extern struct platform_device pxa_device_fb; extern struct platform_device pxa_device_fb;
extern struct platform_device pxa_device_ffuart; extern struct platform_device pxa_device_ffuart;
extern struct platform_device pxa_device_btuart; extern struct platform_device pxa_device_btuart;
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/ohci.h> #include <mach/ohci.h>
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <plat/i2c.h> #include <plat/i2c.h>
#include <mach/camera.h> #include <mach/camera.h>
#include <mach/pxa2xx_spi.h> #include <mach/pxa2xx_spi.h>
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <mach/pxa25x.h> #include <mach/pxa25x.h>
#include <mach/eseries-gpio.h> #include <mach/eseries-gpio.h>
#include <mach/eseries-irq.h>
#include <mach/audio.h> #include <mach/audio.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/udc.h> #include <mach/udc.h>
...@@ -183,6 +184,7 @@ MACHINE_START(E330, "Toshiba e330") ...@@ -183,6 +184,7 @@ MACHINE_START(E330, "Toshiba e330")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = ESERIES_NR_IRQS,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.init_machine = e330_init, .init_machine = e330_init,
...@@ -233,6 +235,7 @@ MACHINE_START(E350, "Toshiba e350") ...@@ -233,6 +235,7 @@ MACHINE_START(E350, "Toshiba e350")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = ESERIES_NR_IRQS,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.init_machine = e350_init, .init_machine = e350_init,
...@@ -356,6 +359,7 @@ MACHINE_START(E400, "Toshiba e400") ...@@ -356,6 +359,7 @@ MACHINE_START(E400, "Toshiba e400")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = ESERIES_NR_IRQS,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.init_machine = e400_init, .init_machine = e400_init,
...@@ -545,6 +549,7 @@ MACHINE_START(E740, "Toshiba e740") ...@@ -545,6 +549,7 @@ MACHINE_START(E740, "Toshiba e740")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = ESERIES_NR_IRQS,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.init_machine = e740_init, .init_machine = e740_init,
...@@ -737,6 +742,7 @@ MACHINE_START(E750, "Toshiba e750") ...@@ -737,6 +742,7 @@ MACHINE_START(E750, "Toshiba e750")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = ESERIES_NR_IRQS,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.init_machine = e750_init, .init_machine = e750_init,
...@@ -933,6 +939,7 @@ MACHINE_START(E800, "Toshiba e800") ...@@ -933,6 +939,7 @@ MACHINE_START(E800, "Toshiba e800")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = ESERIES_NR_IRQS,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.fixup = eseries_fixup, .fixup = eseries_fixup,
.init_machine = e800_init, .init_machine = e800_init,
......
...@@ -32,12 +32,14 @@ ...@@ -32,12 +32,14 @@
#include <mach/ohci.h> #include <mach/ohci.h>
#include <plat/i2c.h> #include <plat/i2c.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/camera.h> #include <mach/camera.h>
#include "devices.h" #include "devices.h"
#include "generic.h" #include "generic.h"
#define EZX_NR_IRQS (IRQ_BOARD_START + 24)
#define GPIO12_A780_FLIP_LID 12 #define GPIO12_A780_FLIP_LID 12
#define GPIO15_A1200_FLIP_LID 15 #define GPIO15_A1200_FLIP_LID 15
#define GPIO15_A910_FLIP_LID 15 #define GPIO15_A910_FLIP_LID 15
...@@ -800,6 +802,7 @@ MACHINE_START(EZX_A780, "Motorola EZX A780") ...@@ -800,6 +802,7 @@ MACHINE_START(EZX_A780, "Motorola EZX A780")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = EZX_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = a780_init, .init_machine = a780_init,
...@@ -866,6 +869,7 @@ MACHINE_START(EZX_E680, "Motorola EZX E680") ...@@ -866,6 +869,7 @@ MACHINE_START(EZX_E680, "Motorola EZX E680")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = EZX_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = e680_init, .init_machine = e680_init,
...@@ -932,6 +936,7 @@ MACHINE_START(EZX_A1200, "Motorola EZX A1200") ...@@ -932,6 +936,7 @@ MACHINE_START(EZX_A1200, "Motorola EZX A1200")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = EZX_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = a1200_init, .init_machine = a1200_init,
...@@ -1124,6 +1129,7 @@ MACHINE_START(EZX_A910, "Motorola EZX A910") ...@@ -1124,6 +1129,7 @@ MACHINE_START(EZX_A910, "Motorola EZX A910")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = EZX_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = a910_init, .init_machine = a910_init,
...@@ -1190,6 +1196,7 @@ MACHINE_START(EZX_E6, "Motorola EZX E6") ...@@ -1190,6 +1196,7 @@ MACHINE_START(EZX_E6, "Motorola EZX E6")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = EZX_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = e6_init, .init_machine = e6_init,
...@@ -1230,6 +1237,7 @@ MACHINE_START(EZX_E2, "Motorola EZX E2") ...@@ -1230,6 +1237,7 @@ MACHINE_START(EZX_E2, "Motorola EZX E2")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = EZX_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = e2_init, .init_machine = e2_init,
......
...@@ -66,8 +66,7 @@ unsigned int get_clk_frequency_khz(int info) ...@@ -66,8 +66,7 @@ unsigned int get_clk_frequency_khz(int info)
return pxa25x_get_clk_frequency_khz(info); return pxa25x_get_clk_frequency_khz(info);
else if (cpu_is_pxa27x()) else if (cpu_is_pxa27x())
return pxa27x_get_clk_frequency_khz(info); return pxa27x_get_clk_frequency_khz(info);
else return 0;
return pxa3xx_get_clk_frequency_khz(info);
} }
EXPORT_SYMBOL(get_clk_frequency_khz); EXPORT_SYMBOL(get_clk_frequency_khz);
...@@ -80,8 +79,7 @@ unsigned int get_memclk_frequency_10khz(void) ...@@ -80,8 +79,7 @@ unsigned int get_memclk_frequency_10khz(void)
return pxa25x_get_memclk_frequency_10khz(); return pxa25x_get_memclk_frequency_10khz();
else if (cpu_is_pxa27x()) else if (cpu_is_pxa27x())
return pxa27x_get_memclk_frequency_10khz(); return pxa27x_get_memclk_frequency_10khz();
else return 0;
return pxa3xx_get_memclk_frequency_10khz();
} }
EXPORT_SYMBOL(get_memclk_frequency_10khz); EXPORT_SYMBOL(get_memclk_frequency_10khz);
......
...@@ -54,11 +54,9 @@ static inline void pxa2xx_clear_reset_status(unsigned int mask) {} ...@@ -54,11 +54,9 @@ static inline void pxa2xx_clear_reset_status(unsigned int mask) {}
#ifdef CONFIG_PXA3xx #ifdef CONFIG_PXA3xx
extern unsigned pxa3xx_get_clk_frequency_khz(int); extern unsigned pxa3xx_get_clk_frequency_khz(int);
extern unsigned pxa3xx_get_memclk_frequency_10khz(void);
extern void pxa3xx_clear_reset_status(unsigned int); extern void pxa3xx_clear_reset_status(unsigned int);
#else #else
#define pxa3xx_get_clk_frequency_khz(x) (0) #define pxa3xx_get_clk_frequency_khz(x) (0)
#define pxa3xx_get_memclk_frequency_10khz() (0)
static inline void pxa3xx_clear_reset_status(unsigned int mask) {} static inline void pxa3xx_clear_reset_status(unsigned int mask) {}
#endif #endif
......
...@@ -874,6 +874,7 @@ MACHINE_START(H4700, "HP iPAQ HX4700") ...@@ -874,6 +874,7 @@ MACHINE_START(H4700, "HP iPAQ HX4700")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = HX4700_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.init_machine = hx4700_init, .init_machine = hx4700_init,
.timer = &pxa_timer, .timer = &pxa_timer,
......
...@@ -174,6 +174,8 @@ enum balloon3_features { ...@@ -174,6 +174,8 @@ enum balloon3_features {
#define BALLOON3_CODEC_IRQ IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ) #define BALLOON3_CODEC_IRQ IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ)
#define BALLOON3_S0_CD_IRQ IRQ_GPIO(BALLOON3_GPIO_S0_CD) #define BALLOON3_S0_CD_IRQ IRQ_GPIO(BALLOON3_GPIO_S0_CD)
#define BALLOON3_NR_IRQS (IRQ_BOARD_START + 4)
extern int balloon3_has(enum balloon3_features feature); extern int balloon3_has(enum balloon3_features feature);
#endif #endif
...@@ -25,3 +25,4 @@ ...@@ -25,3 +25,4 @@
#define TMIO_SD_IRQ IRQ_TMIO(1) #define TMIO_SD_IRQ IRQ_TMIO(1)
#define TMIO_USB_IRQ IRQ_TMIO(2) #define TMIO_USB_IRQ IRQ_TMIO(2)
#define ESERIES_NR_IRQS (IRQ_BOARD_START + 16)
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#define HX4700_ASIC3_GPIO_BASE NR_BUILTIN_GPIO #define HX4700_ASIC3_GPIO_BASE NR_BUILTIN_GPIO
#define HX4700_EGPIO_BASE (HX4700_ASIC3_GPIO_BASE + ASIC3_NUM_GPIOS) #define HX4700_EGPIO_BASE (HX4700_ASIC3_GPIO_BASE + ASIC3_NUM_GPIOS)
#define HX4700_NR_IRQS (IRQ_BOARD_START + 70)
/* /*
* PXA GPIOs * PXA GPIOs
......
...@@ -117,48 +117,12 @@ ...@@ -117,48 +117,12 @@
/* /*
* The following interrupts are for board specific purposes. Since * The following interrupts are for board specific purposes. Since
* the kernel can only run on one machine at a time, we can re-use * the kernel can only run on one machine at a time, we can re-use
* these. There will be 16 IRQs by default. If it is not enough, * these.
* IRQ_BOARD_END is allowed be customized for each board, but keep * By default, no board IRQ is reserved. It should be finished in
* the numbers within sensible limits and in descending order, so * custom board since sparse IRQ is already enabled.
* when multiple config options are selected, the maximum will be
* used.
*/ */
#define IRQ_BOARD_START (PXA_GPIO_IRQ_BASE + PXA_GPIO_IRQ_NUM) #define IRQ_BOARD_START (PXA_GPIO_IRQ_BASE + PXA_GPIO_IRQ_NUM)
#if defined(CONFIG_MACH_H4700)
#define IRQ_BOARD_END (IRQ_BOARD_START + 70)
#elif defined(CONFIG_MACH_ZYLONITE)
#define IRQ_BOARD_END (IRQ_BOARD_START + 32)
#elif defined(CONFIG_PXA_EZX)
#define IRQ_BOARD_END (IRQ_BOARD_START + 23)
#else
#define IRQ_BOARD_END (IRQ_BOARD_START + 16)
#endif
/*
* Figure out the MAX IRQ number.
*
* If we have an SA1111, the max IRQ is S1_BVD1_STSCHG+1.
* If we have an LoCoMo, the max IRQ is IRQ_LOCOMO_SPI_TEND+1
* Otherwise, we have the standard IRQs only.
*/
#ifdef CONFIG_SA1111
#define NR_IRQS (IRQ_BOARD_END + 55)
#elif defined(CONFIG_PXA_HAVE_BOARD_IRQS)
#define NR_IRQS (IRQ_BOARD_END)
#else
#define NR_IRQS (IRQ_BOARD_START) #define NR_IRQS (IRQ_BOARD_START)
#endif
/* add IT8152 IRQs beyond BOARD_END */
#ifdef CONFIG_PCI_HOST_ITE8152
#define IT8152_LAST_IRQ (IRQ_BOARD_END + 40)
#if NR_IRQS < (IT8152_LAST_IRQ+1)
#undef NR_IRQS
#define NR_IRQS (IT8152_LAST_IRQ+1)
#endif
#endif /* CONFIG_PCI_HOST_ITE8152 */
#endif /* __ASM_MACH_IRQS_H */ #endif /* __ASM_MACH_IRQS_H */
...@@ -10,4 +10,6 @@ ...@@ -10,4 +10,6 @@
#define EXT0_GPIO_BASE (NR_BUILTIN_GPIO) #define EXT0_GPIO_BASE (NR_BUILTIN_GPIO)
#define EXT0_GPIO(x) (EXT0_GPIO_BASE + (x)) #define EXT0_GPIO(x) (EXT0_GPIO_BASE + (x))
#define LITTLETON_NR_IRQS (IRQ_BOARD_START + 8)
#endif /* __ASM_ARCH_LITTLETON_H */ #endif /* __ASM_ARCH_LITTLETON_H */
...@@ -38,5 +38,6 @@ ...@@ -38,5 +38,6 @@
#define LPD270_USBC_IRQ LPD270_IRQ(2) #define LPD270_USBC_IRQ LPD270_IRQ(2)
#define LPD270_ETHERNET_IRQ LPD270_IRQ(3) #define LPD270_ETHERNET_IRQ LPD270_IRQ(3)
#define LPD270_AC97_IRQ LPD270_IRQ(4) #define LPD270_AC97_IRQ LPD270_IRQ(4)
#define LPD270_NR_IRQS (IRQ_BOARD_START + 5)
#endif #endif
...@@ -45,6 +45,9 @@ ...@@ -45,6 +45,9 @@
#define LUBBOCK_USB_DISC_IRQ LUBBOCK_IRQ(6) /* usb disconnect */ #define LUBBOCK_USB_DISC_IRQ LUBBOCK_IRQ(6) /* usb disconnect */
#define LUBBOCK_LAST_IRQ LUBBOCK_IRQ(6) #define LUBBOCK_LAST_IRQ LUBBOCK_IRQ(6)
#define LUBBOCK_SA1111_IRQ_BASE (IRQ_BOARD_START + 16)
#define LUBBOCK_NR_IRQS (IRQ_BOARD_START + 16 + 55)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
extern void lubbock_set_misc_wr(unsigned int mask, unsigned int set); extern void lubbock_set_misc_wr(unsigned int mask, unsigned int set);
#endif #endif
...@@ -71,6 +71,8 @@ ...@@ -71,6 +71,8 @@
#define IRQ_MAGICIAN_BT (IRQ_BOARD_START + 2) #define IRQ_MAGICIAN_BT (IRQ_BOARD_START + 2)
#define IRQ_MAGICIAN_VBUS (IRQ_BOARD_START + 3) #define IRQ_MAGICIAN_VBUS (IRQ_BOARD_START + 3)
#define MAGICIAN_NR_IRQS (IRQ_BOARD_START + 8)
/* /*
* CPLD EGPIOs * CPLD EGPIOs
*/ */
......
...@@ -134,4 +134,6 @@ ...@@ -134,4 +134,6 @@
#define MAINSTONE_S1_STSCHG_IRQ MAINSTONE_IRQ(14) #define MAINSTONE_S1_STSCHG_IRQ MAINSTONE_IRQ(14)
#define MAINSTONE_S1_IRQ MAINSTONE_IRQ(15) #define MAINSTONE_S1_IRQ MAINSTONE_IRQ(15)
#define MAINSTONE_NR_IRQS (IRQ_BOARD_START + 16)
#endif #endif
...@@ -69,6 +69,7 @@ ...@@ -69,6 +69,7 @@
#define nBE0_GPIO_60 MFP_CFG(nBE0, AF0) #define nBE0_GPIO_60 MFP_CFG(nBE0, AF0)
#define nBE1_GPIO_61 MFP_CFG(nBE1, AF0) #define nBE1_GPIO_61 MFP_CFG(nBE1, AF0)
#define RDY_GPIO_62 MFP_CFG(RDY, AF0) #define RDY_GPIO_62 MFP_CFG(RDY, AF0)
#define PMIC_INT_GPIO83 MFP_CFG_LPM(PMIC_INT, AF0, PULL_HIGH)
/* Chip Select */ /* Chip Select */
#define DF_nCS0_nCS2 MFP_CFG_LPM(DF_nCS0, AF3, PULL_HIGH) #define DF_nCS0_nCS2 MFP_CFG_LPM(DF_nCS0, AF3, PULL_HIGH)
...@@ -92,6 +93,9 @@ ...@@ -92,6 +93,9 @@
#define GPIO63_CI2C_SCL MFP_CFG_LPM(GPIO63, AF4, PULL_HIGH) #define GPIO63_CI2C_SCL MFP_CFG_LPM(GPIO63, AF4, PULL_HIGH)
#define GPIO64_CI2C_SDA MFP_CFG_LPM(GPIO64, AF4, PULL_HIGH) #define GPIO64_CI2C_SDA MFP_CFG_LPM(GPIO64, AF4, PULL_HIGH)
#define GPIO73_CI2C_SCL MFP_CFG_LPM(GPIO73, AF1, PULL_HIGH)
#define GPIO74_CI2C_SDA MFP_CFG_LPM(GPIO74, AF1, PULL_HIGH)
#define GPIO77_CI2C_SCL MFP_CFG_LPM(GPIO77, AF2, PULL_HIGH) #define GPIO77_CI2C_SCL MFP_CFG_LPM(GPIO77, AF2, PULL_HIGH)
#define GPIO78_CI2C_SDA MFP_CFG_LPM(GPIO78, AF2, PULL_HIGH) #define GPIO78_CI2C_SDA MFP_CFG_LPM(GPIO78, AF2, PULL_HIGH)
...@@ -345,6 +349,9 @@ ...@@ -345,6 +349,9 @@
#define GPIO69_UART1_CTS MFP_CFG(GPIO69, AF2) #define GPIO69_UART1_CTS MFP_CFG(GPIO69, AF2)
#define GPIO70_UART1_RTS MFP_CFG(GPIO70, AF2) #define GPIO70_UART1_RTS MFP_CFG(GPIO70, AF2)
#define GPIO53_UART1_TXD MFP_CFG(GPIO53, AF2)
#define GPIO54_UART1_RXD MFP_CFG(GPIO54, AF2)
/* UART2 - BTUART */ /* UART2 - BTUART */
#define GPIO91_UART2_RXD MFP_CFG(GPIO91, AF1) #define GPIO91_UART2_RXD MFP_CFG(GPIO91, AF1)
#define GPIO92_UART2_TXD MFP_CFG(GPIO92, AF1) #define GPIO92_UART2_TXD MFP_CFG(GPIO92, AF1)
......
...@@ -30,6 +30,8 @@ ...@@ -30,6 +30,8 @@
#define PCM027_MMCDET_IRQ PCM027_IRQ(2) #define PCM027_MMCDET_IRQ PCM027_IRQ(2)
#define PCM027_PM_5V_IRQ PCM027_IRQ(3) #define PCM027_PM_5V_IRQ PCM027_IRQ(3)
#define PCM027_NR_IRQS (IRQ_BOARD_START + 32)
/* I2C RTC */ /* I2C RTC */
#define PCM027_RTC_IRQ_GPIO 0 #define PCM027_RTC_IRQ_GPIO 0
#define PCM027_RTC_IRQ IRQ_GPIO(PCM027_RTC_IRQ_GPIO) #define PCM027_RTC_IRQ IRQ_GPIO(PCM027_RTC_IRQ_GPIO)
......
...@@ -85,6 +85,8 @@ ...@@ -85,6 +85,8 @@
#define POODLE_LOCOMO_GPIO_232VCC_ON LOCOMO_GPIO(12) #define POODLE_LOCOMO_GPIO_232VCC_ON LOCOMO_GPIO(12)
#define POODLE_LOCOMO_GPIO_JK_B LOCOMO_GPIO(13) #define POODLE_LOCOMO_GPIO_JK_B LOCOMO_GPIO(13)
#define POODLE_NR_IRQS (IRQ_BOARD_START + 4) /* 4 for LoCoMo */
extern struct platform_device poodle_locomo_device; extern struct platform_device poodle_locomo_device;
#endif /* __ASM_ARCH_POODLE_H */ #endif /* __ASM_ARCH_POODLE_H */
/*
* PXA3xx U2D header
*
* Copyright (C) 2010 CompuLab Ltd.
*
* Igor Grinberg <grinberg@compulab.co.il>
*
* 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 __PXA310_U2D__
#define __PXA310_U2D__
#include <linux/usb/ulpi.h>
struct pxa3xx_u2d_platform_data {
#define ULPI_SER_6PIN (1 << 0)
#define ULPI_SER_3PIN (1 << 1)
unsigned int ulpi_mode;
int (*init)(struct device *);
void (*exit)(struct device *);
};
/* Start PXA3xx U2D host */
int pxa3xx_u2d_start_hc(struct usb_bus *host);
/* Stop PXA3xx U2D host */
void pxa3xx_u2d_stop_hc(struct usb_bus *host);
extern void pxa3xx_set_u2d_info(struct pxa3xx_u2d_platform_data *info);
#endif /* __PXA310_U2D__ */
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
/* Jacket Scoop */ /* Jacket Scoop */
#define TOSA_SCOOP_PHYS (PXA_CS5_PHYS + 0x00800000) #define TOSA_SCOOP_PHYS (PXA_CS5_PHYS + 0x00800000)
#define TOSA_NR_IRQS (IRQ_BOARD_START + TC6393XB_NR_IRQS)
/* /*
* SCOOP2 internal GPIOs * SCOOP2 internal GPIOs
*/ */
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#ifndef _MACH_ZEUS_H #ifndef _MACH_ZEUS_H
#define _MACH_ZEUS_H #define _MACH_ZEUS_H
#define ZEUS_NR_IRQS (IRQ_BOARD_START + 48)
/* Physical addresses */ /* Physical addresses */
#define ZEUS_FLASH_PHYS PXA_CS0_PHYS #define ZEUS_FLASH_PHYS PXA_CS0_PHYS
#define ZEUS_ETH0_PHYS PXA_CS1_PHYS #define ZEUS_ETH0_PHYS PXA_CS1_PHYS
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
#define EXT_GPIO(x) (128 + (x)) #define EXT_GPIO(x) (128 + (x))
#define ZYLONITE_NR_IRQS (IRQ_BOARD_START + 32)
/* the following variables are processor specific and initialized /* the following variables are processor specific and initialized
* by the corresponding zylonite_pxa3xx_init() * by the corresponding zylonite_pxa3xx_init()
*/ */
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/pxa2xx_spi.h> #include <mach/pxa2xx_spi.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/littleton.h> #include <mach/littleton.h>
#include <plat/i2c.h> #include <plat/i2c.h>
#include <plat/pxa3xx_nand.h> #include <plat/pxa3xx_nand.h>
...@@ -441,6 +441,7 @@ MACHINE_START(LITTLETON, "Marvell Form Factor Development Platform (aka Littleto ...@@ -441,6 +441,7 @@ MACHINE_START(LITTLETON, "Marvell Form Factor Development Platform (aka Littleto
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = LITTLETON_NR_IRQS,
.init_irq = pxa3xx_init_irq, .init_irq = pxa3xx_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = littleton_init, .init_machine = littleton_init,
......
...@@ -509,6 +509,7 @@ MACHINE_START(LOGICPD_PXA270, "LogicPD PXA270 Card Engine") ...@@ -509,6 +509,7 @@ MACHINE_START(LOGICPD_PXA270, "LogicPD PXA270 Card Engine")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = lpd270_map_io, .map_io = lpd270_map_io,
.nr_irqs = LPD270_NR_IRQS,
.init_irq = lpd270_init_irq, .init_irq = lpd270_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = lpd270_init, .init_machine = lpd270_init,
......
...@@ -229,7 +229,7 @@ static struct resource sa1111_resources[] = { ...@@ -229,7 +229,7 @@ static struct resource sa1111_resources[] = {
}; };
static struct sa1111_platform_data sa1111_info = { static struct sa1111_platform_data sa1111_info = {
.irq_base = IRQ_BOARD_END, .irq_base = LUBBOCK_SA1111_IRQ_BASE,
}; };
static struct platform_device sa1111_device = { static struct platform_device sa1111_device = {
...@@ -560,6 +560,7 @@ MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)") ...@@ -560,6 +560,7 @@ MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)")
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = lubbock_map_io, .map_io = lubbock_map_io,
.nr_irqs = LUBBOCK_NR_IRQS,
.init_irq = lubbock_init_irq, .init_irq = lubbock_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = lubbock_init, .init_machine = lubbock_init,
......
...@@ -768,6 +768,7 @@ MACHINE_START(MAGICIAN, "HTC Magician") ...@@ -768,6 +768,7 @@ MACHINE_START(MAGICIAN, "HTC Magician")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = MAGICIAN_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.init_machine = magician_init, .init_machine = magician_init,
.timer = &pxa_timer, .timer = &pxa_timer,
......
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/ohci.h> #include <mach/ohci.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include "generic.h" #include "generic.h"
#include "devices.h" #include "devices.h"
...@@ -628,6 +628,7 @@ MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)") ...@@ -628,6 +628,7 @@ MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
.boot_params = 0xa0000100, /* BLOB boot parameter setting */ .boot_params = 0xa0000100, /* BLOB boot parameter setting */
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = mainstone_map_io, .map_io = mainstone_map_io,
.nr_irqs = MAINSTONE_NR_IRQS,
.init_irq = mainstone_init_irq, .init_irq = mainstone_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = mainstone_init, .init_machine = mainstone_init,
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
#include <mach/pxa27x.h> #include <mach/pxa27x.h>
#include <mach/regs-rtc.h> #include <mach/regs-rtc.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/udc.h> #include <mach/udc.h>
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/palmasoc.h> #include <mach/palmasoc.h>
#include <mach/palm27x.h> #include <mach/palm27x.h>
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/palmasoc.h> #include <mach/palmasoc.h>
#include <mach/palm27x.h> #include <mach/palm27x.h>
......
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/ohci.h> #include <mach/ohci.h>
#include <mach/pxa2xx-regs.h> #include <mach/pxa2xx-regs.h>
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/palmasoc.h> #include <mach/palmasoc.h>
#include <mach/palm27x.h> #include <mach/palm27x.h>
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/irda.h> #include <mach/irda.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/udc.h> #include <mach/udc.h>
#include <mach/palmasoc.h> #include <mach/palmasoc.h>
#include <mach/palm27x.h> #include <mach/palm27x.h>
......
...@@ -262,6 +262,7 @@ MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270") ...@@ -262,6 +262,7 @@ MACHINE_START(PCM027, "Phytec Messtechnik GmbH phyCORE-PXA270")
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = pcm027_map_io, .map_io = pcm027_map_io,
.nr_irqs = PCM027_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = pcm027_init, .init_machine = pcm027_init,
......
...@@ -469,6 +469,7 @@ MACHINE_START(POODLE, "SHARP Poodle") ...@@ -469,6 +469,7 @@ MACHINE_START(POODLE, "SHARP Poodle")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.fixup = fixup_poodle, .fixup = fixup_poodle,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = POODLE_NR_IRQS, /* 4 for LoCoMo */
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = poodle_init, .init_machine = poodle_init,
......
/*
* linux/arch/arm/mach-pxa/pxa3xx-ulpi.c
*
* code specific to pxa3xx aka Monahans
*
* Copyright (C) 2010 CompuLab Ltd.
*
* 2010-13-07: Igor Grinberg <grinberg@compulab.co.il>
* initial version: pxa310 USB Host mode support
*
* 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/kernel.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/err.h>
#include <linux/io.h>
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/usb.h>
#include <linux/usb/otg.h>
#include <mach/hardware.h>
#include <mach/regs-u2d.h>
#include <mach/pxa3xx-u2d.h>
struct pxa3xx_u2d_ulpi {
struct clk *clk;
void __iomem *mmio_base;
struct otg_transceiver *otg;
unsigned int ulpi_mode;
};
static struct pxa3xx_u2d_ulpi *u2d;
static inline u32 u2d_readl(u32 reg)
{
return __raw_readl(u2d->mmio_base + reg);
}
static inline void u2d_writel(u32 reg, u32 val)
{
__raw_writel(val, u2d->mmio_base + reg);
}
#if defined(CONFIG_PXA310_ULPI)
enum u2d_ulpi_phy_mode {
SYNCH = 0,
CARKIT = (1 << 0),
SER_3PIN = (1 << 1),
SER_6PIN = (1 << 2),
LOWPOWER = (1 << 3),
};
static inline enum u2d_ulpi_phy_mode pxa310_ulpi_get_phymode(void)
{
return (u2d_readl(U2DOTGUSR) >> 28) & 0xF;
}
static int pxa310_ulpi_poll(void)
{
int timeout = 50000;
while (timeout--) {
if (!(u2d_readl(U2DOTGUCR) & U2DOTGUCR_RUN))
return 0;
cpu_relax();
}
pr_warning("%s: ULPI access timed out!\n", __func__);
return -ETIMEDOUT;
}
static int pxa310_ulpi_read(struct otg_transceiver *otg, u32 reg)
{
int err;
if (pxa310_ulpi_get_phymode() != SYNCH) {
pr_warning("%s: PHY is not in SYNCH mode!\n", __func__);
return -EBUSY;
}
u2d_writel(U2DOTGUCR, U2DOTGUCR_RUN | U2DOTGUCR_RNW | (reg << 16));
msleep(5);
err = pxa310_ulpi_poll();
if (err)
return err;
return u2d_readl(U2DOTGUCR) & U2DOTGUCR_RDATA;
}
static int pxa310_ulpi_write(struct otg_transceiver *otg, u32 val, u32 reg)
{
if (pxa310_ulpi_get_phymode() != SYNCH) {
pr_warning("%s: PHY is not in SYNCH mode!\n", __func__);
return -EBUSY;
}
u2d_writel(U2DOTGUCR, U2DOTGUCR_RUN | (reg << 16) | (val << 8));
msleep(5);
return pxa310_ulpi_poll();
}
struct otg_io_access_ops pxa310_ulpi_access_ops = {
.read = pxa310_ulpi_read,
.write = pxa310_ulpi_write,
};
static void pxa310_otg_transceiver_rtsm(void)
{
u32 u2dotgcr;
/* put PHY to sync mode */
u2dotgcr = u2d_readl(U2DOTGCR);
u2dotgcr |= U2DOTGCR_RTSM | U2DOTGCR_UTMID;
u2d_writel(U2DOTGCR, u2dotgcr);
msleep(10);
/* setup OTG sync mode */
u2dotgcr = u2d_readl(U2DOTGCR);
u2dotgcr |= U2DOTGCR_ULAF;
u2dotgcr &= ~(U2DOTGCR_SMAF | U2DOTGCR_CKAF);
u2d_writel(U2DOTGCR, u2dotgcr);
}
static int pxa310_start_otg_host_transcvr(struct usb_bus *host)
{
int err;
pxa310_otg_transceiver_rtsm();
err = otg_init(u2d->otg);
if (err) {
pr_err("OTG transceiver init failed");
return err;
}
err = otg_set_vbus(u2d->otg, 1);
if (err) {
pr_err("OTG transceiver VBUS set failed");
return err;
}
err = otg_set_host(u2d->otg, host);
if (err)
pr_err("OTG transceiver Host mode set failed");
return err;
}
static int pxa310_start_otg_hc(struct usb_bus *host)
{
u32 u2dotgcr;
int err;
/* disable USB device controller */
u2d_writel(U2DCR, u2d_readl(U2DCR) & ~U2DCR_UDE);
u2d_writel(U2DOTGCR, u2d_readl(U2DOTGCR) | U2DOTGCR_UTMID);
u2d_writel(U2DOTGICR, u2d_readl(U2DOTGICR) & ~0x37F7F);
err = pxa310_start_otg_host_transcvr(host);
if (err)
return err;
/* set xceiver mode */
if (u2d->ulpi_mode & ULPI_IC_6PIN_SERIAL)
u2d_writel(U2DP3CR, u2d_readl(U2DP3CR) & ~U2DP3CR_P2SS);
else if (u2d->ulpi_mode & ULPI_IC_3PIN_SERIAL)
u2d_writel(U2DP3CR, u2d_readl(U2DP3CR) | U2DP3CR_P2SS);
/* start OTG host controller */
u2dotgcr = u2d_readl(U2DOTGCR) | U2DOTGCR_SMAF;
u2d_writel(U2DOTGCR, u2dotgcr & ~(U2DOTGCR_ULAF | U2DOTGCR_CKAF));
return 0;
}
static void pxa310_stop_otg_hc(void)
{
pxa310_otg_transceiver_rtsm();
otg_set_host(u2d->otg, NULL);
otg_set_vbus(u2d->otg, 0);
otg_shutdown(u2d->otg);
}
static void pxa310_u2d_setup_otg_hc(void)
{
u32 u2dotgcr;
u2dotgcr = u2d_readl(U2DOTGCR);
u2dotgcr |= U2DOTGCR_ULAF | U2DOTGCR_UTMID;
u2dotgcr &= ~(U2DOTGCR_SMAF | U2DOTGCR_CKAF);
u2d_writel(U2DOTGCR, u2dotgcr);
msleep(5);
u2d_writel(U2DOTGCR, u2dotgcr | U2DOTGCR_ULE);
msleep(5);
u2d_writel(U2DOTGICR, u2d_readl(U2DOTGICR) & ~0x37F7F);
}
static int pxa310_otg_init(struct pxa3xx_u2d_platform_data *pdata)
{
unsigned int ulpi_mode = ULPI_OTG_DRVVBUS;
if (pdata) {
if (pdata->ulpi_mode & ULPI_SER_6PIN)
ulpi_mode |= ULPI_IC_6PIN_SERIAL;
else if (pdata->ulpi_mode & ULPI_SER_3PIN)
ulpi_mode |= ULPI_IC_3PIN_SERIAL;
}
u2d->ulpi_mode = ulpi_mode;
u2d->otg = otg_ulpi_create(&pxa310_ulpi_access_ops, ulpi_mode);
if (!u2d->otg)
return -ENOMEM;
u2d->otg->io_priv = u2d->mmio_base;
return 0;
}
static void pxa310_otg_exit(void)
{
kfree(u2d->otg);
}
#else
static inline void pxa310_u2d_setup_otg_hc(void) {}
static inline int pxa310_start_otg_hc(struct usb_bus *host)
{
return 0;
}
static inline void pxa310_stop_otg_hc(void) {}
static inline int pxa310_otg_init(struct pxa3xx_u2d_platform_data *pdata)
{
return 0;
}
static inline void pxa310_otg_exit(void) {}
#endif /* CONFIG_PXA310_ULPI */
int pxa3xx_u2d_start_hc(struct usb_bus *host)
{
int err = 0;
/* In case the PXA3xx ULPI isn't used, do nothing. */
if (!u2d)
return 0;
clk_enable(u2d->clk);
if (cpu_is_pxa310()) {
pxa310_u2d_setup_otg_hc();
err = pxa310_start_otg_hc(host);
}
return err;
}
void pxa3xx_u2d_stop_hc(struct usb_bus *host)
{
/* In case the PXA3xx ULPI isn't used, do nothing. */
if (!u2d)
return;
if (cpu_is_pxa310())
pxa310_stop_otg_hc();
clk_disable(u2d->clk);
}
static int pxa3xx_u2d_probe(struct platform_device *pdev)
{
struct pxa3xx_u2d_platform_data *pdata = pdev->dev.platform_data;
struct resource *r;
int err;
u2d = kzalloc(sizeof(struct pxa3xx_u2d_ulpi), GFP_KERNEL);
if (!u2d) {
dev_err(&pdev->dev, "failed to allocate memory\n");
return -ENOMEM;
}
u2d->clk = clk_get(&pdev->dev, NULL);
if (IS_ERR(u2d->clk)) {
dev_err(&pdev->dev, "failed to get u2d clock\n");
err = PTR_ERR(u2d->clk);
goto err_free_mem;
}
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!r) {
dev_err(&pdev->dev, "no IO memory resource defined\n");
err = -ENODEV;
goto err_put_clk;
}
r = request_mem_region(r->start, resource_size(r), pdev->name);
if (!r) {
dev_err(&pdev->dev, "failed to request memory resource\n");
err = -EBUSY;
goto err_put_clk;
}
u2d->mmio_base = ioremap(r->start, resource_size(r));
if (!u2d->mmio_base) {
dev_err(&pdev->dev, "ioremap() failed\n");
err = -ENODEV;
goto err_free_res;
}
if (pdata->init) {
err = pdata->init(&pdev->dev);
if (err)
goto err_free_io;
}
/* Only PXA310 U2D has OTG functionality */
if (cpu_is_pxa310()) {
err = pxa310_otg_init(pdata);
if (err)
goto err_free_plat;
}
platform_set_drvdata(pdev, &u2d);
return 0;
err_free_plat:
if (pdata->exit)
pdata->exit(&pdev->dev);
err_free_io:
iounmap(u2d->mmio_base);
err_free_res:
release_mem_region(r->start, resource_size(r));
err_put_clk:
clk_put(u2d->clk);
err_free_mem:
kfree(u2d);
return err;
}
static int pxa3xx_u2d_remove(struct platform_device *pdev)
{
struct pxa3xx_u2d_platform_data *pdata = pdev->dev.platform_data;
struct resource *r;
if (cpu_is_pxa310()) {
pxa310_stop_otg_hc();
pxa310_otg_exit();
}
if (pdata->exit)
pdata->exit(&pdev->dev);
platform_set_drvdata(pdev, NULL);
iounmap(u2d->mmio_base);
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
release_mem_region(r->start, resource_size(r));
clk_put(u2d->clk);
kfree(u2d);
return 0;
}
static struct platform_driver pxa3xx_u2d_ulpi_driver = {
.driver = {
.name = "pxa3xx-u2d",
.owner = THIS_MODULE,
},
.probe = pxa3xx_u2d_probe,
.remove = pxa3xx_u2d_remove,
};
static int pxa3xx_u2d_ulpi_init(void)
{
return platform_driver_register(&pxa3xx_u2d_ulpi_driver);
}
module_init(pxa3xx_u2d_ulpi_init);
static void __exit pxa3xx_u2d_ulpi_exit(void)
{
platform_driver_unregister(&pxa3xx_u2d_ulpi_driver);
}
module_exit(pxa3xx_u2d_ulpi_exit);
MODULE_DESCRIPTION("PXA3xx U2D ULPI driver");
MODULE_AUTHOR("Igor Grinberg");
MODULE_LICENSE("GPL v2");
...@@ -98,23 +98,6 @@ unsigned int pxa3xx_get_clk_frequency_khz(int info) ...@@ -98,23 +98,6 @@ unsigned int pxa3xx_get_clk_frequency_khz(int info)
return CLK / 1000; return CLK / 1000;
} }
/*
* Return the current static memory controller clock frequency
* in units of 10kHz
*/
unsigned int pxa3xx_get_memclk_frequency_10khz(void)
{
unsigned long acsr;
unsigned int smcfs, clk = 0;
acsr = ACSR;
smcfs = (acsr >> 23) & 0x7;
clk = (acsr & ACCR_D0CS) ? RO_CLK : smcfs_mult[smcfs] * BASE_CLK;
return (clk / 10000);
}
void pxa3xx_clear_reset_status(unsigned int mask) void pxa3xx_clear_reset_status(unsigned int mask)
{ {
/* RESET_STATUS_* has a 1:1 mapping with ARSR */ /* RESET_STATUS_* has a 1:1 mapping with ARSR */
...@@ -265,7 +248,7 @@ static struct clk_lookup pxa3xx_clkregs[] = { ...@@ -265,7 +248,7 @@ static struct clk_lookup pxa3xx_clkregs[] = {
INIT_CLKREG(&clk_pxa3xx_i2c, "pxa2xx-i2c.0", NULL), INIT_CLKREG(&clk_pxa3xx_i2c, "pxa2xx-i2c.0", NULL),
INIT_CLKREG(&clk_pxa3xx_udc, "pxa27x-udc", NULL), INIT_CLKREG(&clk_pxa3xx_udc, "pxa27x-udc", NULL),
INIT_CLKREG(&clk_pxa3xx_usbh, "pxa27x-ohci", NULL), INIT_CLKREG(&clk_pxa3xx_usbh, "pxa27x-ohci", NULL),
INIT_CLKREG(&clk_pxa3xx_u2d, NULL, "U2DCLK"), INIT_CLKREG(&clk_pxa3xx_u2d, "pxa3xx-u2d", NULL),
INIT_CLKREG(&clk_pxa3xx_keypad, "pxa27x-keypad", NULL), INIT_CLKREG(&clk_pxa3xx_keypad, "pxa27x-keypad", NULL),
INIT_CLKREG(&clk_pxa3xx_ssp1, "pxa27x-ssp.0", NULL), INIT_CLKREG(&clk_pxa3xx_ssp1, "pxa27x-ssp.0", NULL),
INIT_CLKREG(&clk_pxa3xx_ssp2, "pxa27x-ssp.1", NULL), INIT_CLKREG(&clk_pxa3xx_ssp2, "pxa27x-ssp.1", NULL),
......
...@@ -192,7 +192,7 @@ static struct mfp_addr_map pxa935_mfp_addr_map[] __initdata = { ...@@ -192,7 +192,7 @@ static struct mfp_addr_map pxa935_mfp_addr_map[] __initdata = {
static int __init pxa930_init(void) static int __init pxa930_init(void)
{ {
if (cpu_is_pxa930() || cpu_is_pxa935()) { if (cpu_is_pxa930() || cpu_is_pxa935() || cpu_is_pxa950()) {
mfp_init_base(io_p2v(MFPR_BASE)); mfp_init_base(io_p2v(MFPR_BASE));
mfp_init_addr(pxa930_mfp_addr_map); mfp_init_addr(pxa930_mfp_addr_map);
} }
......
...@@ -56,6 +56,8 @@ ...@@ -56,6 +56,8 @@
#include "devices.h" #include "devices.h"
#include "generic.h" #include "generic.h"
#define STARGATE_NR_IRQS (IRQ_BOARD_START + 8)
/* Bluetooth */ /* Bluetooth */
#define SG2_BT_RESET 81 #define SG2_BT_RESET 81
...@@ -1011,6 +1013,7 @@ MACHINE_START(STARGATE2, "Stargate 2") ...@@ -1011,6 +1013,7 @@ MACHINE_START(STARGATE2, "Stargate 2")
.phys_io = 0x40000000, .phys_io = 0x40000000,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = STARGATE_NR_IRQS,
.init_irq = pxa27x_init_irq, .init_irq = pxa27x_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = stargate2_init, .init_machine = stargate2_init,
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#include <mach/pxa930.h> #include <mach/pxa930.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include "devices.h" #include "devices.h"
#include "generic.h" #include "generic.h"
......
/*
* linux/arch/arm/mach-pxa/tavorevb3.c
*
* Support for the Marvell EVB3 Development Platform.
*
* Copyright: (C) Copyright 2008-2010 Marvell International 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
* publishhed by the Free Software Foundation.
*/
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/i2c.h>
#include <linux/gpio.h>
#include <linux/mfd/88pm860x.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <mach/pxa930.h>
#include <plat/i2c.h>
#include "devices.h"
#include "generic.h"
#define TAVOREVB3_NR_IRQS (IRQ_BOARD_START + 24)
static mfp_cfg_t evb3_mfp_cfg[] __initdata = {
/* UART */
GPIO53_UART1_TXD,
GPIO54_UART1_RXD,
/* PMIC */
PMIC_INT_GPIO83,
};
#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
static struct pm860x_touch_pdata evb3_touch = {
.gpadc_prebias = 1,
.slot_cycle = 1,
.tsi_prebias = 6,
.pen_prebias = 16,
.pen_prechg = 2,
.res_x = 300,
};
static struct pm860x_backlight_pdata evb3_backlight[] = {
{
.id = PM8606_ID_BACKLIGHT,
.iset = PM8606_WLED_CURRENT(24),
.flags = PM8606_BACKLIGHT1,
},
{},
};
static struct pm860x_led_pdata evb3_led[] = {
{
.id = PM8606_ID_LED,
.iset = PM8606_LED_CURRENT(12),
.flags = PM8606_LED1_RED,
}, {
.id = PM8606_ID_LED,
.iset = PM8606_LED_CURRENT(12),
.flags = PM8606_LED1_GREEN,
}, {
.id = PM8606_ID_LED,
.iset = PM8606_LED_CURRENT(12),
.flags = PM8606_LED1_BLUE,
}, {
.id = PM8606_ID_LED,
.iset = PM8606_LED_CURRENT(12),
.flags = PM8606_LED2_RED,
}, {
.id = PM8606_ID_LED,
.iset = PM8606_LED_CURRENT(12),
.flags = PM8606_LED2_GREEN,
}, {
.id = PM8606_ID_LED,
.iset = PM8606_LED_CURRENT(12),
.flags = PM8606_LED2_BLUE,
},
};
static struct pm860x_platform_data evb3_pm8607_info = {
.touch = &evb3_touch,
.backlight = &evb3_backlight[0],
.led = &evb3_led[0],
.companion_addr = 0x10,
.irq_mode = 0,
.irq_base = IRQ_BOARD_START,
.i2c_port = GI2C_PORT,
};
static struct i2c_board_info evb3_i2c_info[] = {
{
.type = "88PM860x",
.addr = 0x34,
.platform_data = &evb3_pm8607_info,
.irq = gpio_to_irq(mfp_to_gpio(MFP_PIN_GPIO83)),
},
};
static void __init evb3_init_i2c(void)
{
pxa_set_i2c_info(NULL);
i2c_register_board_info(0, ARRAY_AND_SIZE(evb3_i2c_info));
}
#else
static inline void evb3_init_i2c(void) {}
#endif
static void __init evb3_init(void)
{
/* initialize MFP configurations */
pxa3xx_mfp_config(ARRAY_AND_SIZE(evb3_mfp_cfg));
pxa_set_ffuart_info(NULL);
evb3_init_i2c();
}
MACHINE_START(TAVOREVB3, "PXA950 Evaluation Board (aka TavorEVB3)")
.phys_io = 0x40000000,
.boot_params = 0xa0000100,
.map_io = pxa_map_io,
.nr_irqs = TAVOREVB3_NR_IRQS,
.init_irq = pxa3xx_init_irq,
.timer = &pxa_timer,
.init_machine = evb3_init,
MACHINE_END
...@@ -956,6 +956,7 @@ MACHINE_START(TOSA, "SHARP Tosa") ...@@ -956,6 +956,7 @@ MACHINE_START(TOSA, "SHARP Tosa")
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.fixup = fixup_tosa, .fixup = fixup_tosa,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = TOSA_NR_IRQS,
.init_irq = pxa25x_init_irq, .init_irq = pxa25x_init_irq,
.init_machine = tosa_init, .init_machine = tosa_init,
.timer = &pxa_timer, .timer = &pxa_timer,
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
#include <mach/z2.h> #include <mach/z2.h>
#include <mach/pxafb.h> #include <mach/pxafb.h>
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <mach/pxa2xx_spi.h> #include <mach/pxa2xx_spi.h>
#include <plat/i2c.h> #include <plat/i2c.h>
......
...@@ -904,6 +904,7 @@ MACHINE_START(ARCOM_ZEUS, "Arcom/Eurotech ZEUS") ...@@ -904,6 +904,7 @@ MACHINE_START(ARCOM_ZEUS, "Arcom/Eurotech ZEUS")
.io_pg_offst = ((io_p2v(0x40000000) >> 18) & 0xfffc), .io_pg_offst = ((io_p2v(0x40000000) >> 18) & 0xfffc),
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.map_io = zeus_map_io, .map_io = zeus_map_io,
.nr_irqs = ZEUS_NR_IRQS,
.init_irq = zeus_init_irq, .init_irq = zeus_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = zeus_init, .init_machine = zeus_init,
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include <mach/zylonite.h> #include <mach/zylonite.h>
#include <mach/mmc.h> #include <mach/mmc.h>
#include <mach/ohci.h> #include <mach/ohci.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
#include <plat/pxa3xx_nand.h> #include <plat/pxa3xx_nand.h>
#include "devices.h" #include "devices.h"
...@@ -415,6 +415,7 @@ MACHINE_START(ZYLONITE, "PXA3xx Platform Development Kit (aka Zylonite)") ...@@ -415,6 +415,7 @@ MACHINE_START(ZYLONITE, "PXA3xx Platform Development Kit (aka Zylonite)")
.boot_params = 0xa0000100, .boot_params = 0xa0000100,
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
.map_io = pxa_map_io, .map_io = pxa_map_io,
.nr_irqs = ZYLONITE_NR_IRQS,
.init_irq = pxa3xx_init_irq, .init_irq = pxa3xx_init_irq,
.timer = &pxa_timer, .timer = &pxa_timer,
.init_machine = zylonite_init, .init_machine = zylonite_init,
......
...@@ -25,6 +25,13 @@ ...@@ -25,6 +25,13 @@
* *
* 4. matrix key and direct key will use the same debounce_interval by * 4. matrix key and direct key will use the same debounce_interval by
* default, which should be sufficient in most cases * default, which should be sufficient in most cases
*
* pxa168 keypad platform specific parameter
*
* NOTE:
* clear_wakeup_event callback is a workaround required to clear the
* keypad interrupt. The keypad wake must be cleared in addition to
* reading the MI/DI bits in the KPC register.
*/ */
struct pxa27x_keypad_platform_data { struct pxa27x_keypad_platform_data {
...@@ -52,6 +59,9 @@ struct pxa27x_keypad_platform_data { ...@@ -52,6 +59,9 @@ struct pxa27x_keypad_platform_data {
/* key debounce interval */ /* key debounce interval */
unsigned int debounce_interval; unsigned int debounce_interval;
/* clear wakeup event requirement for pxa168 */
void (*clear_wakeup_event)(void);
}; };
extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info); extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);
......
...@@ -338,7 +338,7 @@ config KEYBOARD_OPENCORES ...@@ -338,7 +338,7 @@ config KEYBOARD_OPENCORES
config KEYBOARD_PXA27x config KEYBOARD_PXA27x
tristate "PXA27x/PXA3xx keypad support" tristate "PXA27x/PXA3xx keypad support"
depends on PXA27x || PXA3xx depends on PXA27x || PXA3xx || ARCH_MMP
help help
Enable support for PXA27x/PXA3xx keypad controller. Enable support for PXA27x/PXA3xx keypad controller.
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/pxa27x_keypad.h> #include <plat/pxa27x_keypad.h>
/* /*
* Keypad Controller registers * Keypad Controller registers
*/ */
...@@ -330,11 +330,21 @@ static void pxa27x_keypad_scan_direct(struct pxa27x_keypad *keypad) ...@@ -330,11 +330,21 @@ static void pxa27x_keypad_scan_direct(struct pxa27x_keypad *keypad)
keypad->direct_key_state = new_state; keypad->direct_key_state = new_state;
} }
static void clear_wakeup_event(struct pxa27x_keypad *keypad)
{
struct pxa27x_keypad_platform_data *pdata = keypad->pdata;
if (pdata->clear_wakeup_event)
(pdata->clear_wakeup_event)();
}
static irqreturn_t pxa27x_keypad_irq_handler(int irq, void *dev_id) static irqreturn_t pxa27x_keypad_irq_handler(int irq, void *dev_id)
{ {
struct pxa27x_keypad *keypad = dev_id; struct pxa27x_keypad *keypad = dev_id;
unsigned long kpc = keypad_readl(KPC); unsigned long kpc = keypad_readl(KPC);
clear_wakeup_event(keypad);
if (kpc & KPC_DI) if (kpc & KPC_DI)
pxa27x_keypad_scan_direct(keypad); pxa27x_keypad_scan_direct(keypad);
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <mach/ohci.h> #include <mach/ohci.h>
#include <mach/pxa3xx-u2d.h>
/* /*
* UHC: USB Host Controller (OHCI-like) register definitions * UHC: USB Host Controller (OHCI-like) register definitions
...@@ -235,6 +236,9 @@ static int pxa27x_start_hc(struct pxa27x_ohci *ohci, struct device *dev) ...@@ -235,6 +236,9 @@ static int pxa27x_start_hc(struct pxa27x_ohci *ohci, struct device *dev)
if (retval < 0) if (retval < 0)
return retval; return retval;
if (cpu_is_pxa3xx())
pxa3xx_u2d_start_hc(&ohci_to_hcd(&ohci->ohci)->self);
uhchr = __raw_readl(ohci->mmio_base + UHCHR) & ~UHCHR_SSE; uhchr = __raw_readl(ohci->mmio_base + UHCHR) & ~UHCHR_SSE;
__raw_writel(uhchr, ohci->mmio_base + UHCHR); __raw_writel(uhchr, ohci->mmio_base + UHCHR);
__raw_writel(UHCHIE_UPRIE | UHCHIE_RWIE, ohci->mmio_base + UHCHIE); __raw_writel(UHCHIE_UPRIE | UHCHIE_RWIE, ohci->mmio_base + UHCHIE);
...@@ -251,6 +255,9 @@ static void pxa27x_stop_hc(struct pxa27x_ohci *ohci, struct device *dev) ...@@ -251,6 +255,9 @@ static void pxa27x_stop_hc(struct pxa27x_ohci *ohci, struct device *dev)
inf = dev->platform_data; inf = dev->platform_data;
if (cpu_is_pxa3xx())
pxa3xx_u2d_stop_hc(&ohci_to_hcd(&ohci->ohci)->self);
if (inf->exit) if (inf->exit)
inf->exit(dev); inf->exit(dev);
......
...@@ -784,12 +784,53 @@ static int __devinit pxa168fb_probe(struct platform_device *pdev) ...@@ -784,12 +784,53 @@ static int __devinit pxa168fb_probe(struct platform_device *pdev)
return ret; return ret;
} }
static int __devexit pxa168fb_remove(struct platform_device *pdev)
{
struct pxa168fb_info *fbi = platform_get_drvdata(pdev);
struct fb_info *info;
int irq;
unsigned int data;
if (!fbi)
return 0;
/* disable DMA transfer */
data = readl(fbi->reg_base + LCD_SPU_DMA_CTRL0);
data &= ~CFG_GRA_ENA_MASK;
writel(data, fbi->reg_base + LCD_SPU_DMA_CTRL0);
info = fbi->info;
unregister_framebuffer(info);
writel(GRA_FRAME_IRQ0_ENA(0x0), fbi->reg_base + SPU_IRQ_ENA);
if (info->cmap.len)
fb_dealloc_cmap(&info->cmap);
irq = platform_get_irq(pdev, 0);
free_irq(irq, fbi);
dma_free_writecombine(fbi->dev, PAGE_ALIGN(info->fix.smem_len),
info->screen_base, info->fix.smem_start);
iounmap(fbi->reg_base);
clk_disable(fbi->clk);
clk_put(fbi->clk);
framebuffer_release(info);
return 0;
}
static struct platform_driver pxa168fb_driver = { static struct platform_driver pxa168fb_driver = {
.driver = { .driver = {
.name = "pxa168-fb", .name = "pxa168-fb",
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.probe = pxa168fb_probe, .probe = pxa168fb_probe,
.remove = __devexit_p(pxa168fb_remove),
}; };
static int __init pxa168fb_init(void) static int __init pxa168fb_init(void)
...@@ -798,6 +839,12 @@ static int __init pxa168fb_init(void) ...@@ -798,6 +839,12 @@ static int __init pxa168fb_init(void)
} }
module_init(pxa168fb_init); module_init(pxa168fb_init);
static void __exit pxa168fb_exit(void)
{
platform_driver_unregister(&pxa168fb_driver);
}
module_exit(pxa168fb_exit);
MODULE_AUTHOR("Lennert Buytenhek <buytenh@marvell.com> " MODULE_AUTHOR("Lennert Buytenhek <buytenh@marvell.com> "
"Green Wan <gwan@marvell.com>"); "Green Wan <gwan@marvell.com>");
MODULE_DESCRIPTION("Framebuffer driver for PXA168/910"); MODULE_DESCRIPTION("Framebuffer driver for PXA168/910");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment