ARM: pxa: redefine the cpu_is_pxa3xx
Subsystems (4)
PATCH 1/11 ARM: pxa: redefine the cpu_is_pxa3xx
PXA300/PXA310/PXA320/PXA930/PXA935 are sharing one cpu family id. It's a little confusion on cpu_is_pxa3xx().
Now reduce the scope of cpu_is_pxa3xx(). Make it focusing on PXA300/PXA310/PXA320. PXA930/PXA935 is coverd by cpu_is_pxa93x().
--- arch/arm/mach-pxa/include/mach/hardware.h | 26 +++++++++----------------- 1 files changed, 9 insertions(+), 17 deletions(-)
arch/arm/mach-pxa/include/mach/hardware.h +9 -17
@@ -145,53 +145,44 @@#define __cpu_is_pxa27x (id) (0)#endif -#ifdef CONFIG_CPU_PXA300 +#ifdef CONFIG_PXA3xx#define __cpu_is_pxa300 (id) \ ({ \ unsigned int _id = (id) >> 4 & 0xfff; \ _id == 0x688; \ }) -#else -#define __cpu_is_pxa300 (id) (0) -#endif -#ifdef CONFIG_CPU_PXA310 #define __cpu_is_pxa310 (id) \ ({ \ unsigned int _id = (id) >> 4 & 0xfff; \ _id == 0x689; \ }) -#else -#define __cpu_is_pxa310 (id) (0) -#endif -#ifdef CONFIG_CPU_PXA320 #define __cpu_is_pxa320 (id) \ ({ \ unsigned int _id = (id) >> 4 & 0xfff; \ _id == 0x603 || _id == 0x682; \ })#else +#define __cpu_is_pxa300 (id) (0) +#define __cpu_is_pxa310 (id) (0)#define __cpu_is_pxa320 (id) (0)#endif -#ifdef CONFIG_CPU_PXA930 +#ifdef CONFIG_PXA93x#define __cpu_is_pxa930 (id) \ ({ \ unsigned int _id = (id) >> 4 & 0xfff; \ _id == 0x683; \ }) -#else -#define __cpu_is_pxa930 (id) (0) -#endif -#ifdef CONFIG_CPU_PXA935 #define __cpu_is_pxa935 (id) \ ({ \ unsigned int _id = (id) >> 4 & 0xfff; \ _id == 0x693; \ })#else +#define __cpu_is_pxa930 (id) (0)#define __cpu_is_pxa935 (id) (0)#endif
@@ -264,7 +255,7 @@/* * CPUID Core Generation Bit * <= 0x2 for pxa21x/pxa25x/pxa26x/pxa27x -* == 0x3 for pxa300/pxa310/pxa320 +* == 0x3 for pxa300/pxa310/pxa320 and pxa930/pxa935 */ #if defined(CONFIG_PXA25x) || defined(CONFIG_PXA27x)#define __cpu_is_pxa2xx (id) \
@@ -279,8 +270,9 @@#ifdef CONFIG_PXA3xx#define __cpu_is_pxa3xx (id) \ ({ \ - unsigned int _id = (id) >> 13 & 0x7; \ - _id == 0x3; \ + __cpu_is_pxa300(id) \ + || __cpu_is_pxa310(id) \ + || __cpu_is_pxa320(id); \ })#else #define __cpu_is_pxa3xx (id) (0)
Signature · 1 line
1.5.6.5
PATCH 2/11 ARM: pxa: redefine irqs.h
A lot of componets of PXA93x are shared with PXA3xx. From CPUID, they belong to same family. But it's confustion that code of PXA93x is depend on PXA3xx by default.
Now clean the scope of both PXA3xx and PXA93X. Only PXA300/PXA310/PXA320 is family member of PXA3xx. Only PXA930/PXA935 is family member of PXA93x. Remove the code dependany on IRQ definition.
--- arch/arm/mach-pxa/include/mach/irqs.h | 47 ++++++++++----------------------- arch/arm/mach-pxa/irq.c | 11 +++++-- 2 files changed, 22 insertions(+), 36 deletions(-)
arch/arm/mach-pxa/include/mach/irqs.h +14 -33
@@ -21,16 +21,14 @@#define PXA_IRQ (x) (PXA_ISA_IRQ_NUM + (x)) -#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)#define IRQ_SSP3 PXA_IRQ(0)/* SSP3 service request */ #define IRQ_MSL PXA_IRQ(1)/* MSL Interface interrupt */ -#define IRQ_USBH2 PXA_IRQ(2)/* USB Host interrupt 1 (OHCI) */ -#define IRQ_USBH1 PXA_IRQ(3)/* USB Host interrupt 2 (non-OHCI) */ +#define IRQ_USBH2 PXA_IRQ(2)/* USB Host interrupt 1 (OHCI,PXA27x) */ +#define IRQ_USBH1 PXA_IRQ(3)/* USB Host interrupt 2 (non-OHCI,PXA27x) */ #define IRQ_KEYPAD PXA_IRQ(4)/* Key pad controller */ -#define IRQ_MEMSTK PXA_IRQ(5)/* Memory Stick interrupt */ +#define IRQ_MEMSTK PXA_IRQ(5)/* Memory Stick interrupt (PXA27x) */ +#define IRQ_ACIPC0 PXA_IRQ(5)/* AP-CP Communication (PXA930) */ #define IRQ_PWRI2C PXA_IRQ(6)/* Power I2C interrupt */ -#endif -#define IRQ_HWUART PXA_IRQ(7)/* HWUART Transmit/Receive/Error (PXA26x) */ #define IRQ_OST_4_11 PXA_IRQ(7)/* OS timer 4-11 matches (PXA27x) */ #define IRQ_GPIO0 PXA_IRQ(8)/* GPIO0 Edge Detect */
@@ -38,7 +36,8 @@#define IRQ_GPIO_2_x PXA_IRQ(10)/* GPIO[2-x] Edge Detect */ #define IRQ_USB PXA_IRQ(11)/* USB Service */ #define IRQ_PMU PXA_IRQ(12)/* Performance Monitoring Unit */ -#define IRQ_I2S PXA_IRQ(13)/* I2S Interrupt */ +#define IRQ_I2S PXA_IRQ(13)/* I2S Interrupt (PXA27x) */ +#define IRQ_SSP4 PXA_IRQ(13)/* SSP4 service request (PXA3xx) */ #define IRQ_AC97 PXA_IRQ(14)/* AC97 Interrupt */ #define IRQ_ASSP PXA_IRQ(15)/* Audio SSP Service Request (PXA25x) */ #define IRQ_USIM PXA_IRQ(15)/* Smart Card interface interrupt (PXA27x) */
@@ -47,6 +46,7 @@#define IRQ_LCD PXA_IRQ(17)/* LCD Controller Service Request */ #define IRQ_I2C PXA_IRQ(18)/* I2C Service Request */ #define IRQ_ICP PXA_IRQ(19)/* ICP Transmit/Receive/Error */ +#define IRQ_ACIPC2 PXA_IRQ(19)/* AP-CP Communication (PXA930) */ #define IRQ_STUART PXA_IRQ(20)/* STUART Transmit/Receive/Error */ #define IRQ_BTUART PXA_IRQ(21)/* BTUART Transmit/Receive/Error */ #define IRQ_FFUART PXA_IRQ(22)/* FFUART Transmit/Receive/Error*/
@@ -60,19 +60,17 @@#define IRQ_RTC1Hz PXA_IRQ(30)/* RTC HZ Clock Tick */ #define IRQ_RTCAlrm PXA_IRQ(31)/* RTC Alarm */ -#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)#define IRQ_TPM PXA_IRQ(32)/* TPM interrupt */ #define IRQ_CAMERA PXA_IRQ(33)/* Camera Interface */ -#endif - -#ifdef CONFIG_PXA3xx -#define IRQ_SSP4 PXA_IRQ(13)/* SSP4 service request */ #define IRQ_CIR PXA_IRQ(34)/* Consumer IR */ #define IRQ_COMM_WDT PXA_IRQ(35)/* Comm WDT interrupt */ #define IRQ_TSI PXA_IRQ(36)/* Touch Screen Interface (PXA320) */ +#define IRQ_ENHROT PXA_IRQ(37)/* Enhanced Rotary (PXA930) */ #define IRQ_USIM2 PXA_IRQ(38)/* USIM2 Controller */ -#define IRQ_GCU PXA_IRQ(39)/* Graphics Controller */ +#define IRQ_GCU PXA_IRQ(39)/* Graphics Controller (PXA3xx) */ +#define IRQ_ACIPC1 PXA_IRQ(40)/* AP-CP Communication (PXA930) */ #define IRQ_MMC2 PXA_IRQ(41)/* MMC2 Controller */ +#define IRQ_TRKBALL PXA_IRQ(43)/* Track Ball (PXA930) */ #define IRQ_1WIRE PXA_IRQ(44)/* 1-Wire Controller */ #define IRQ_NAND PXA_IRQ(45)/* NAND Controller */ #define IRQ_USB2 PXA_IRQ(46)/* USB 2.0 Device Controller */
@@ -80,30 +78,13 @@#define IRQ_WAKEUP1 PXA_IRQ(50)/* EXT_WAKEUP1 */ #define IRQ_DMEMC PXA_IRQ(51)/* Dynamic Memory Controller */ #define IRQ_MMC3 PXA_IRQ(55)/* MMC3 Controller (PXA310) */ -#endif -#ifdef CONFIG_CPU_PXA935 #define IRQ_U2O PXA_IRQ(64)/* USB OTG 2.0 Controller (PXA935) */ #define IRQ_U2H PXA_IRQ(65)/* USB Host 2.0 Controller (PXA935) */ - -#define IRQ_MMC3_PXA935 PXA_IRQ(72)/* MMC3 Controller (PXA935) */ -#define IRQ_MMC4_PXA935 PXA_IRQ(73)/* MMC4 Controller (PXA935) */ -#define IRQ_MMC5_PXA935 PXA_IRQ(74)/* MMC5 Controller (PXA935) */ - +#define IRQ_PXA935_MMC0 PXA_IRQ(72)/* MMC0 Controller (PXA935) */ +#define IRQ_PXA935_MMC1 PXA_IRQ(73)/* MMC1 Controller (PXA935) */ +#define IRQ_PXA935_MMC2 PXA_IRQ(74)/* MMC2 Controller (PXA935) */ #define IRQ_U2P PXA_IRQ(93)/* USB PHY D+/D- Lines (PXA935) */ -#endif - -#ifdef CONFIG_CPU_PXA930 -#define IRQ_ENHROT PXA_IRQ(37)/* Enhanced Rotary (PXA930) */ -#define IRQ_ACIPC0 PXA_IRQ(5) -#define IRQ_ACIPC1 PXA_IRQ(40) -#define IRQ_ACIPC2 PXA_IRQ(19) -#define IRQ_TRKBALL PXA_IRQ(43)/* Track Ball */ -#endif - -#ifdef CONFIG_CPU_PXA950 -#define IRQ_GC500 PXA_IRQ(70)/* Graphics Controller (PXA950) */ -#endif #define PXA_GPIO_IRQ_BASE PXA_IRQ(96)#define PXA_GPIO_IRQ_NUM (192)
arch/arm/mach-pxa/irq.c +8 -3
@@ -37,6 +37,11 @@static int pxa_internal_irq_nr; +static inline int cpu_has_ipr (void ) +{ +return !cpu_is_pxa25x (); +} +static void pxa_mask_irq (unsigned int irq) {_ICMR (irq) &= ~(1 <<IRQ_BIT (irq));
@@ -134,7 +139,7 @@ void __init pxa_init_irq(int irq_nr, set_wake_t fn) }/* initialize interrupt priority */ -if (cpu_is_pxa27x () ||cpu_is_pxa3xx ()) { +if (cpu_has_ipr ()) {for (i =0 ; i < irq_nr; i++)IPR (i) = i | (1 <<31 ); }
@@ -165,7 +170,7 @@ static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)_ICMR (irq) =0 ; } -if (cpu_is_pxa27x () ||cpu_is_pxa3xx ()) { +if (cpu_has_ipr ()) {for (i =0 ; i < pxa_internal_irq_nr; i++) saved_ipr[i] =IPR (i); }
@@ -177,7 +182,7 @@ static int pxa_irq_resume(struct sys_device *dev) {int i, irq =PXA_IRQ (0 ); -if (cpu_is_pxa27x () ||cpu_is_pxa3xx ()) { +if (cpu_has_ipr ()) {for (i =0 ; i < pxa_internal_irq_nr; i++)IPR (i) = saved_ipr[i]; }
Signature · 1 line
1.5.6.5
PATCH 3/11 ARM: pxa: split pxa93x from pxa3xx
In order to avoid confusion, seperate pxa93x from pxa3xx.
--- arch/arm/mach-pxa/Kconfig | 18 +- arch/arm/mach-pxa/Makefile | 2 +- arch/arm/mach-pxa/clock.h | 20 ++ arch/arm/mach-pxa/devices.c | 10 +- arch/arm/mach-pxa/generic.c | 8 +- arch/arm/mach-pxa/generic.h | 3 +- arch/arm/mach-pxa/mfp-pxa3xx.c | 5 +- arch/arm/mach-pxa/pxa3xx.c | 9 - arch/arm/mach-pxa/pxa930.c | 206 --------------- arch/arm/mach-pxa/pxa93x.c | 471 ++++++++++++++++++++++++++++++++++ arch/arm/mach-pxa/saar.c | 2 +- arch/arm/mach-pxa/smemc.c | 10 +- arch/arm/mach-pxa/tavorevb.c | 2 +- arch/arm/plat-pxa/Makefile | 1 + arch/arm/plat-pxa/include/plat/mfp.h | 4 +- 15 files changed, 525 insertions(+), 246 deletions(-) delete mode 100644 arch/arm/mach-pxa/pxa930.c create mode 100644 arch/arm/mach-pxa/pxa93x.c
arch/arm/mach-pxa/Kconfig +12 -6
@@ -37,18 +37,18 @@ config MACH_LITTLETON select CPU_PXA310 config MACH_TAVOREVB - bool "PXA930 Evaluation Board (aka TavorEVB)" - select PXA3xx + bool "PXA935 Evaluation Board (aka TavorEVB)" select CPU_PXA930 + select CPU_PXA935 config MACH_TAVOREVB3 bool "PXA95x Development Platform (aka TavorEVB III)" select CPU_PXA950 config MACH_SAAR - bool "PXA930 Handheld Platform (aka SAAR)" - select PXA3xx + bool "PXA935 Handheld Platform (aka SAAR)" select CPU_PXA930 + select CPU_PXA935 comment "Third Party Dev Platforms (sorted by vendor name)"
@@ -639,15 +639,21 @@ config CPU_PXA320 help PXA320 (codename Monahans-P) +config PXA93x + bool + select CPU_XSC3 + help + Select code specific to PXA93x variants + config CPU_PXA930 bool - select PXA3xx + select PXA93x help PXA930 (codename Tavor-P) config CPU_PXA935 bool - select CPU_PXA930 + select PXA93x help PXA935 (codename Tavor-P65)
arch/arm/mach-pxa/Makefile +1 -1
@@ -19,9 +19,9 @@ endif obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa2xx.o pxa25x.o obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa2xx.o pxa27x.o obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o pxa3xx-ulpi.o +obj-$(CONFIG_PXA93x) += mfp-pxa3xx.o pxa93x.o smemc.o obj-$(CONFIG_CPU_PXA300) += pxa300.o obj-$(CONFIG_CPU_PXA320) += pxa320.o -obj-$(CONFIG_CPU_PXA930) += pxa930.o # NOTE: keep the order of boards in accordance to their order in Kconfig
arch/arm/mach-pxa/clock.h +20 -0
@@ -67,3 +67,23 @@ extern void clk_pxa3xx_cken_enable(struct clk *);extern void clk_pxa3xx_cken_disable (struct clk *);#endif +#ifdef CONFIG_PXA93x +#define DEFINE_PXA93_CKEN (_name, _cken, _rate, _delay) \ +struct clk clk_##_name = { \ + .ops = &clk_pxa93x_cken_ops, \ + .rate = _rate, \ + .cken = CKEN_##_cken, \ + .delay = _delay, \ + } + +#define DEFINE_PXA93_CK (_name, _cken, _ops) \ +struct clk clk_##_name = { \ + .ops = _ops, \ + .cken = CKEN_##_cken, \ + } + +extern const struct clkops clk_pxa93x_cken_ops; +extern void clk_pxa93x_cken_enable (struct clk *); +extern void clk_pxa93x_cken_disable (struct clk *); +#endif +
arch/arm/mach-pxa/devices.c +5 -5
@@ -342,7 +342,7 @@ struct platform_device pxa27x_device_i2c_power = { };#endif -#ifdef CONFIG_PXA3xx +#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x) static struct resource pxa3xx_resources_i2c_power[] = { { .start = 0x40f500c0,
@@ -632,7 +632,7 @@ struct platform_device pxa25x_device_assp = { };#endif /* CONFIG_PXA25x */ -#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx) +#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x) static struct resource pxa27x_resource_keypad[] = { [0] = {
@@ -864,9 +864,9 @@ void __init pxa_set_camera_info(struct pxacamera_platform_data *info) {pxa_register_device (&pxa27x_device_camera, info); } -#endif /* CONFIG_PXA27x || CONFIG_PXA3xx */ +#endif /* CONFIG_PXA27x || CONFIG_PXA3xx || CONFIG_PXA93x */ -#ifdef CONFIG_PXA3xx +#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x)static u64 pxa3xx_ssp4_dma_mask =DMA_BIT_MASK (32 ); static struct resource pxa3xx_resource_ssp4[] = {
@@ -1053,7 +1053,7 @@ struct platform_device pxa3xx_device_gcu = { }, }; -#endif /* CONFIG_PXA3xx */ +#endif /* CONFIG_PXA3xx || CONFIG_PXA93x */ /* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1. * See comment in arch/arm/mach-pxa/ssp.c::ssp_probe() */
arch/arm/mach-pxa/generic.c +5 -3
@@ -29,6 +29,7 @@#include <mach/reset.h> #include <mach/gpio.h> #include <mach/smemc.h> +#include <mach/pxa3xx-regs.h> #include "generic.h"
@@ -36,9 +37,10 @@ void clear_reset_status(unsigned int mask) {if (cpu_is_pxa2xx ())pxa2xx_clear_reset_status (mask); - -if (cpu_is_pxa3xx ()) -pxa3xx_clear_reset_status (mask); +else { +/* RESET_STATUS_* has a 1:1 mapping with ARSR */ +ARSR = mask; + } }unsigned long get_clock_tick_rate (void )
arch/arm/mach-pxa/generic.h +1 -2
@@ -20,6 +20,7 @@ extern void __init pxa26x_init_irq(void);#endif extern void __init pxa27x_init_irq (void );extern void __init pxa3xx_init_irq (void ); +extern void __init pxa93x_init_irq (void );extern void __init pxa_map_io (void );extern void __init pxa25x_map_io (void );
@@ -58,10 +59,8 @@ static inline void pxa2xx_clear_reset_status(unsigned int mask) {}#ifdef CONFIG_PXA3xxextern unsigned pxa3xx_get_clk_frequency_khz (int ); -extern void pxa3xx_clear_reset_status (unsigned int );#else #define pxa3xx_get_clk_frequency_khz (x) (0) -static inline void pxa3xx_clear_reset_status (unsigned int mask) {}#endif extern struct sysdev_class pxa_irq_sysclass;
arch/arm/mach-pxa/mfp-pxa3xx.c +1 -4
@@ -62,9 +62,6 @@ struct sysdev_class pxa3xx_mfp_sysclass = {static int __init mfp_init_devicefs (void ) { -if (cpu_is_pxa3xx ()) -return sysdev_class_register (&pxa3xx_mfp_sysclass); - -return 0 ; +return sysdev_class_register (&pxa3xx_mfp_sysclass); }postcore_initcall (mfp_init_devicefs);
arch/arm/mach-pxa/pxa3xx.c +0 -9
@@ -50,9 +50,6 @@#define PECR_IE (n) ((1 << ((n) * 2)) << 28)#define PECR_IS (n) ((1 << ((n) * 2)) << 29) -/* crystal frequency to static memory controller multiplier (SMCFS) */ -static unsigned char smcfs_mult[8 ] = {6 ,0 ,8 ,0 ,0 ,16 , }; -/* crystal frequency to HSIO bus frequency multiplier (HSS) */ static unsigned char hss_mult[4 ] = {8 ,12 ,16 ,24 };
@@ -100,12 +97,6 @@ unsigned int pxa3xx_get_clk_frequency_khz(int info)return CLK /1000 ; } -void pxa3xx_clear_reset_status (unsigned int mask) -{ -/* RESET_STATUS_* has a 1:1 mapping with ARSR */ -ARSR = mask; -} -/* * Return the current AC97 clock frequency. */
arch/arm/mach-pxa/pxa930.c deleted +0 -206
206 lines not on this page · raw message
arch/arm/mach-pxa/pxa93x.c new file +471 -0
471 lines not on this page · raw message
arch/arm/mach-pxa/saar.c +1 -1
@@ -598,7 +598,7 @@ MACHINE_START(SAAR, "PXA930 Handheld Platform (aka SAAR)")/* Maintainer: Eric Miao <[email protected]> */ .boot_params = 0xa0000100, .map_io = pxa3xx_map_io, - .init_irq = pxa3xx_init_irq, + .init_irq = pxa93x_init_irq, .timer = &pxa_timer, .init_machine = saar_init,MACHINE_END
arch/arm/mach-pxa/smemc.c +4 -6
@@ -59,13 +59,11 @@ static int __init smemc_init(void) {int ret =0 ; -if (cpu_is_pxa3xx ()) { - ret =sysdev_class_register (&smemc_sysclass); -if (ret) -return ret; + ret =sysdev_class_register (&smemc_sysclass); +if (ret) +return ret; - ret =sysdev_register (&smemc_sysdev); - } + ret =sysdev_register (&smemc_sysdev);return ret; }
arch/arm/mach-pxa/tavorevb.c +1 -1
@@ -491,7 +491,7 @@ MACHINE_START(TAVOREVB, "PXA930 Evaluation Board (aka TavorEVB)")/* Maintainer: Eric Miao <[email protected]> */ .boot_params = 0xa0000100, .map_io = pxa3xx_map_io, - .init_irq = pxa3xx_init_irq, + .init_irq = pxa93x_init_irq, .timer = &pxa_timer, .init_machine = tavorevb_init,MACHINE_END
arch/arm/plat-pxa/Makefile +1 -0
@@ -6,6 +6,7 @@ obj-y := dma.o obj-$(CONFIG_GENERIC_GPIO) += gpio.o obj-$(CONFIG_PXA3xx) += mfp.o +obj-$(CONFIG_PXA93x) += mfp.o obj-$(CONFIG_ARCH_MMP) += mfp.o obj-$(CONFIG_HAVE_PWM) += pwm.o
arch/arm/plat-pxa/include/plat/mfp.h +2 -2
@@ -423,7 +423,7 @@ typedef unsigned long mfp_cfg_t; ((MFP_CFG_DEFAULT & ~(MFP_AF_MASK | MFP_DS_MASK | MFP_LPM_STATE_MASK)) |\ (MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_##drv | MFP_LPM_##lpm)) -#if defined(CONFIG_PXA3xx) || defined(CONFIG_ARCH_MMP ) +#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x) || defined(CONFIG_ARCH_MMP )/* * each MFP pin will have a MFPR register, since the offset of the * register varies between processors, the processor specific code
@@ -470,6 +470,6 @@ void mfp_write(int mfp, unsigned long mfpr_val);void mfp_config (unsigned long *mfp_cfgs,int num);void mfp_config_run (void );void mfp_config_lpm (void ); -#endif /* CONFIG_PXA3xx || CONFIG_ARCH_MMP */ +#endif /* CONFIG_PXA3xx || CONFIG_PXA93x || CONFIG_ARCH_MMP */ #endif /* __ASM_PLAT_MFP_H */
Signature · 1 line
1.5.6.5
PATCH 4/11 ARM: pxa: update to read ICHP
ICHP records the highest priority interrupt occured. In PXA27x/PXA3xx, we can read ICHP via cooprocessor. In PJ4, we can only read ICHP via bus register. So use the same method to read ICHP via bus register.
--- arch/arm/mach-pxa/include/mach/entry-macro.S | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-)
arch/arm/mach-pxa/include/mach/entry-macro.S +5 -1
@@ -41,11 +41,15 @@ b 1001f 1002: @ Core Generation 2 (PXA27x) or Core Generation 3 (PXA3xx) - mrc p6, 0, \irqstat, c5, c0, 0 @ ICHP + @ or Core PJ4 + mov \base, #io_p2v(0x40000000) @ IIR Ctl = 0x40d00000 + add \base, \base, #0x00d00000 + ldr \irqstat, [\base, #0x18] @ ICHP offset tst \irqstat, #0x80000000 beq 1001f bic \irqstat, \irqstat, #0x80000000 mov \irqnr, \irqstat, lsr #16 add \irqnr, \irqnr, #(PXA_IRQ(0)) + 1001: .endm
Signature · 1 line
1.5.6.5
PATCH 5/11 ARM: pxa: support pxa95x
The core of PXA955 is PJ4. Add new PJ4 support. And add new macro CONFIG_PXA95x.
--- arch/arm/Kconfig | 4 +- arch/arm/mach-pxa/Kconfig | 12 +- arch/arm/mach-pxa/Makefile | 1 + arch/arm/mach-pxa/clock.h | 20 ++ arch/arm/mach-pxa/devices.c | 292 ++++++++++--------- arch/arm/mach-pxa/generic.h | 7 + arch/arm/mach-pxa/include/mach/hardware.h | 29 ++- arch/arm/mach-pxa/include/mach/irqs.h | 1 + arch/arm/mach-pxa/pxa95x.c | 452 +++++++++++++++++++++++++++++ arch/arm/mm/Kconfig | 8 +- arch/arm/plat-pxa/Makefile | 1 + arch/arm/plat-pxa/include/plat/mfp.h | 5 +- 12 files changed, 670 insertions(+), 162 deletions(-) create mode 100644 arch/arm/mach-pxa/pxa95x.c
arch/arm/Kconfig +2 -2
@@ -999,8 +999,8 @@ source arch/arm/mm/Kconfig config IWMMXT bool "Enable iWMMXt support" - depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK - default y if PXA27x || PXA3xx || ARCH_MMP + depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4 + default y if PXA27x || PXA3xx || PXA93x || PXA95x || ARCH_MMP help Enable support for iWMMXt context switching at run time if running on a CPU that supports it.
arch/arm/mach-pxa/Kconfig +9 -3
@@ -657,11 +657,17 @@ config CPU_PXA935 help PXA935 (codename Tavor-P65) -config CPU_PXA950 +config PXA95x bool - select CPU_PXA930 + select CPU_PJ4 + help + Select code specific to PXA95x variants + +config CPU_PXA955 + bool + select PXA95x help - PXA950 (codename Tavor-PV2) + PXA955 (codename MG1) config PXA_SHARP_C7xx bool
arch/arm/mach-pxa/Makefile +1 -0
@@ -20,6 +20,7 @@ obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa2xx.o pxa25x.o obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa2xx.o pxa27x.o obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o pxa3xx-ulpi.o obj-$(CONFIG_PXA93x) += mfp-pxa3xx.o pxa93x.o smemc.o +obj-$(CONFIG_PXA95x) += mfp-pxa3xx.o pxa95x.o smemc.o obj-$(CONFIG_CPU_PXA300) += pxa300.o obj-$(CONFIG_CPU_PXA320) += pxa320.o
arch/arm/mach-pxa/clock.h +20 -0
@@ -87,3 +87,23 @@ extern void clk_pxa93x_cken_enable(struct clk *);extern void clk_pxa93x_cken_disable (struct clk *);#endif +#ifdef CONFIG_PXA95x +#define DEFINE_PXA95_CKEN (_name, _cken, _rate, _delay) \ +struct clk clk_##_name = { \ + .ops = &clk_pxa95x_cken_ops, \ + .rate = _rate, \ + .cken = CKEN_##_cken, \ + .delay = _delay, \ + } + +#define DEFINE_PXA95_CK (_name, _cken, _ops) \ +struct clk clk_##_name = { \ + .ops = _ops, \ + .cken = CKEN_##_cken, \ + } + +extern const struct clkops clk_pxa95x_cken_ops; +extern void clk_pxa95x_cken_enable (struct clk *); +extern void clk_pxa95x_cken_disable (struct clk *); +#endif +
arch/arm/mach-pxa/devices.c +147 -145
331 lines not on this page · raw message
arch/arm/mach-pxa/generic.h +7 -0
@@ -21,6 +21,7 @@ extern void __init pxa26x_init_irq(void);extern void __init pxa27x_init_irq (void );extern void __init pxa3xx_init_irq (void );extern void __init pxa93x_init_irq (void ); +extern void __init pxa95x_init_irq (void );extern void __init pxa_map_io (void );extern void __init pxa25x_map_io (void );
@@ -63,6 +64,12 @@ extern unsigned pxa3xx_get_clk_frequency_khz(int);#define pxa3xx_get_clk_frequency_khz (x) (0)#endif +#ifdef CONFIG_PXA95x +extern void pxa95x_clear_reset_status (unsigned int ); +#else +static inline void pxa95x_clear_reset_status (unsigned int mask) {} +#endif +extern struct sysdev_class pxa_irq_sysclass;extern struct sysdev_class pxa_gpio_sysclass;extern struct sysdev_class pxa2xx_mfp_sysclass;
arch/arm/mach-pxa/include/mach/hardware.h +20 -9
@@ -186,14 +186,14 @@#define __cpu_is_pxa935 (id) (0)#endif -#ifdef CONFIG_CPU_PXA950 -#define __cpu_is_pxa950 (id) \ - ({ \ - unsigned int _id = (id) >> 4 & 0xfff; \ - _id == 0x697; \ +#ifdef CONFIG_CPU_PXA955 +#define __cpu_is_pxa955 (id) \ + ({ \ + unsigned int _id = (id) >> 4 & 0xfff; \ + _id == 0x581 || _id == 0xc08 || _id == 0xb76; \ })#else -#define __cpu_is_pxa950 (id) (0) +#define __cpu_is_pxa955 (id) (0)#endif #define cpu_is_pxa210 () \
@@ -246,10 +246,10 @@__cpu_is_pxa935 (read_cpuid_id ()); \ }) -#define cpu_is_pxa950 () \ +#define cpu_is_pxa955 () \ ({ \ - __cpu_is_pxa950(read_cpuid_id()); \ - }) + __cpu_is_pxa955(read_cpuid_id()); \ + })/*
@@ -288,6 +288,11 @@#define __cpu_is_pxa93x (id) (0)#endif +#define __cpu_is_pxa95x (id) \ + ({ \ + __cpu_is_pxa955(id); \ + }) +#define cpu_is_pxa2xx () \ ({ \ __cpu_is_pxa2xx(read_cpuid_id()); \
@@ -302,6 +307,12 @@ ({ \__cpu_is_pxa93x (read_cpuid_id ()); \ }) + +#define cpu_is_pxa95x () \ + ({ \ + __cpu_is_pxa95x(read_cpuid_id()); \ + }) +/* * return current memory and LCD clock frequency in units of 10kHz */
arch/arm/mach-pxa/include/mach/irqs.h +1 -0
@@ -84,6 +84,7 @@#define IRQ_PXA935_MMC0 PXA_IRQ(72)/* MMC0 Controller (PXA935) */ #define IRQ_PXA935_MMC1 PXA_IRQ(73)/* MMC1 Controller (PXA935) */ #define IRQ_PXA935_MMC2 PXA_IRQ(74)/* MMC2 Controller (PXA935) */ +#define IRQ_PXA955_MMC3 PXA_IRQ(75)/* MMC3 Controller (PXA955) */ #define IRQ_U2P PXA_IRQ(93)/* USB PHY D+/D- Lines (PXA935) */ #define PXA_GPIO_IRQ_BASE PXA_IRQ(96)
arch/arm/mach-pxa/pxa95x.c new file +452 -0
452 lines not on this page · raw message
arch/arm/mm/Kconfig +7 -1
@@ -382,6 +382,12 @@ config CPU_FEROCEON_OLD_ID for which the CPU ID is equal to the ARM926 ID. Relevant for Feroceon-1850 and early Feroceon-2850. +# Marvell PJ4 +config CPU_PJ4 + bool + select CPU_V7 + select ARM_THUMBEE + # ARMv6 config CPU_V6 bool "Support ARM V6 processor" if ARCH_INTEGRATOR || MACH_REALVIEW_EB || MACH_REALVIEW_PBX || ARCH_DOVE
@@ -789,7 +795,7 @@ config CACHE_PL310 config CACHE_TAUROS2 bool "Enable the Tauros2 L2 cache controller" - depends on (ARCH_DOVE || ARCH_MMP) + depends on (ARCH_DOVE || ARCH_MMP || CPU_PJ4) default y select OUTER_CACHE help
arch/arm/plat-pxa/Makefile +1 -0
@@ -7,6 +7,7 @@ obj-y := dma.o obj-$(CONFIG_GENERIC_GPIO) += gpio.o obj-$(CONFIG_PXA3xx) += mfp.o obj-$(CONFIG_PXA93x) += mfp.o +obj-$(CONFIG_PXA95x) += mfp.o obj-$(CONFIG_ARCH_MMP) += mfp.o obj-$(CONFIG_HAVE_PWM) += pwm.o
arch/arm/plat-pxa/include/plat/mfp.h +3 -2
@@ -423,7 +423,8 @@ typedef unsigned long mfp_cfg_t; ((MFP_CFG_DEFAULT & ~(MFP_AF_MASK | MFP_DS_MASK | MFP_LPM_STATE_MASK)) |\ (MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_##drv | MFP_LPM_##lpm)) -#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x) || defined(CONFIG_ARCH_MMP ) +#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x) \ + || defined(CONFIG_PXA95x) || defined(CONFIG_ARCH_MMP )/* * each MFP pin will have a MFPR register, since the offset of the * register varies between processors, the processor specific code
@@ -470,6 +471,6 @@ void mfp_write(int mfp, unsigned long mfpr_val);void mfp_config (unsigned long *mfp_cfgs,int num);void mfp_config_run (void );void mfp_config_lpm (void ); -#endif /* CONFIG_PXA3xx || CONFIG_PXA93x || CONFIG_ARCH_MMP */ +#endif /* CONFIG_PXA3xx || CONFIG_PXA93x || CONFIG_PXA95x || CONFIG_ARCH_MMP */ #endif /* __ASM_PLAT_MFP_H */
Signature · 1 line
1.5.6.5
PATCH 6/11 ARM: pxa: support saarb platform
Saarb platform is a handheld platform that supports Marvell PXA955 silicon.
--- arch/arm/mach-pxa/Kconfig | 5 ++ arch/arm/mach-pxa/Makefile | 1 + arch/arm/mach-pxa/pxa95x.c | 3 - arch/arm/mach-pxa/saarb.c | 114 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 arch/arm/mach-pxa/saarb.c
arch/arm/mach-pxa/Kconfig +5 -0
@@ -50,6 +50,11 @@ config MACH_SAAR select CPU_PXA930 select CPU_PXA935 +config MACH_SAARB + bool "PXA955 Handheld Platform (aka SAARB)" + depends on !(CPU_XSCALE || CPU_XSC3) + select CPU_PXA955 + comment "Third Party Dev Platforms (sorted by vendor name)" config ARCH_PXA_IDP
arch/arm/mach-pxa/Makefile +1 -0
@@ -35,6 +35,7 @@ obj-$(CONFIG_MACH_LITTLETON) += littleton.o obj-$(CONFIG_MACH_TAVOREVB) += tavorevb.o obj-$(CONFIG_MACH_TAVOREVB3) += tavorevb3.o obj-$(CONFIG_MACH_SAAR) += saar.o +obj-$(CONFIG_MACH_SAARB) += saarb.o # 3rd Party Dev Platforms obj-$(CONFIG_ARCH_PXA_IDP) += idp.o
arch/arm/mach-pxa/pxa95x.c +0 -3
@@ -45,9 +45,6 @@#define PECR_IE (n) ((1 << ((n) * 2)) << 28)#define PECR_IS (n) ((1 << ((n) * 2)) << 29) -/* crystal frequency to static memory controller multiplier (SMCFS) */ -static unsigned char smcfs_mult[8 ] = {6 ,0 ,8 ,0 ,0 ,16 , }; -/* crystal frequency to HSIO bus frequency multiplier (HSS) */ static unsigned char hss_mult[4 ] = {8 ,12 ,16 ,24 };
arch/arm/mach-pxa/saarb.c new file +114 -0
114 lines not on this page · raw message
Signature · 1 line
1.5.6.5
PATCH 7/11 ARM: mmp: select CPU_PJ4
Since CPU_PJ4 is shared between PXA95x and MMP2, select CPU_PJ4 in MMP2 configuration.
--- arch/arm/mach-mmp/Kconfig | 5 +++-- arch/arm/mm/Kconfig | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-)
arch/arm/mach-mmp/Kconfig +3 -2
@@ -39,6 +39,7 @@ config MACH_TTC_DKB config MACH_FLINT bool "Marvell's Flint Development Platform" + depends on !(CPU_MOHAWK) select CPU_MMP2 help Say 'Y' here if you want to support the Marvell MMP2-based
@@ -49,6 +50,7 @@ config MACH_FLINT config MACH_MARVELL_JASPER bool "Marvell's Jasper Development Platform" + depends on !(CPU_MOHAWK) select CPU_MMP2 help Say 'Y' here if you want to support the Marvell MMP2-base
@@ -80,8 +82,7 @@ config CPU_PXA910 config CPU_MMP2 bool - select CPU_V6 - select CPU_32v6K + select CPU_PJ4 help Select code specific to MMP2. MMP2 is ARMv6 compatible. endif
arch/arm/mm/Kconfig +1 -1
@@ -795,7 +795,7 @@ config CACHE_PL310 config CACHE_TAUROS2 bool "Enable the Tauros2 L2 cache controller" - depends on (ARCH_DOVE || ARCH_MMP || CPU_PJ4) + depends on (ARCH_DOVE || CPU_PJ4) default y select OUTER_CACHE help
Signature · 1 line
1.5.6.5
PATCH 8/11 ARM: pxa: sanitize IRQ registers access based on offset
--- arch/arm/mach-pxa/include/mach/regs-intc.h | 4 - arch/arm/mach-pxa/irq.c | 122 ++++++++++++++++++---------- 2 files changed, 80 insertions(+), 46 deletions(-)
arch/arm/mach-pxa/include/mach/regs-intc.h +0 -4
@@ -27,8 +27,4 @@#define ICFP3 __REG(0x40D0013C)/* Interrupt Controller FIQ Pending Register 3 */ #define ICPR3 __REG(0x40D00140)/* Interrupt Controller Pending Register 3 */ -#define IPR (x) __REG(0x40D0001C + (x < 32 ? (x << 2) \ - : (x < 64 ? (0x94 + ((x - 32) << 2)) \ - : (0x128 + ((x - 64) << 2))))) -#endif /* __ASM_MACH_REGS_INTC_H */
arch/arm/mach-pxa/irq.c +80 -42
192 lines not on this page · raw message
Signature · 1 line
1.5.6.5
PATCH 9/11 ARM: pxa: auto compute shift and mult of timer
Use auto-computed shift and mult of timer with new API clocksource_calc_mult_shift()/clockevents_calc_mult_shift().
--- arch/arm/mach-pxa/time.c | 9 ++------- 1 files changed, 2 insertions(+), 7 deletions(-)
arch/arm/mach-pxa/time.c +2 -7
@@ -111,7 +111,6 @@ pxa_osmr0_set_mode(enum clock_event_mode mode, struct clock_event_device *dev)static struct clock_event_device ckevt_pxa_osmr0 = { .name ="osmr0" , .features =CLOCK_EVT_FEAT_ONESHOT , - .shift =32 , .rating =200 , .set_next_event = pxa_osmr0_set_next_event, .set_mode = pxa_osmr0_set_mode,
@@ -127,7 +126,6 @@ static struct clocksource cksrc_pxa_oscr0 = { .rating = 200, .read = pxa_read_oscr, .mask = CLOCKSOURCE_MASK(32), - .shift = 20, .flags = CLOCK_SOURCE_IS_CONTINUOUS, };
@@ -147,17 +145,14 @@ static void __init pxa_timer_init(void)set_oscr2ns_scale (clock_tick_rate); - ckevt_pxa_osmr0.mult = -div_sc (clock_tick_rate,NSEC_PER_SEC , ckevt_pxa_osmr0.shift); +clocksource_calc_mult_shift (&cksrc_pxa_oscr0, clock_tick_rate,4 ); +clockevents_calc_mult_shift (&ckevt_pxa_osmr0, clock_tick_rate,4 ); ckevt_pxa_osmr0.max_delta_ns =clockevent_delta2ns (0x7fffffff , &ckevt_pxa_osmr0); ckevt_pxa_osmr0.min_delta_ns =clockevent_delta2ns (MIN_OSCR_DELTA *2 , &ckevt_pxa_osmr0) +1 ; ckevt_pxa_osmr0.cpumask =cpumask_of (0 ); - cksrc_pxa_oscr0.mult = -clocksource_hz2mult (clock_tick_rate, cksrc_pxa_oscr0.shift); -setup_irq (IRQ_OST0 , &pxa_ost0_irq);clocksource_register (&cksrc_pxa_oscr0);
Signature · 1 line
1.5.6.5
PATCH 10/11 ARM: pxa: add 32KHz timer as clock source
PXA silicons are using 3MHz timer as default clock source. But it'll be stopped counting in low power mode. Although 32KHz timer is slow, it can continue counting in low power mode. While low power mode is implemented as idle, stopped timer can't be accepted.
Add 32KHz timer as an alternative clock source. User can switch clock source on demand.
--- arch/arm/mach-pxa/include/mach/regs-ost.h | 2 + arch/arm/mach-pxa/time.c | 217 +++++++++++++++++++++++------ 2 files changed, 174 insertions(+), 45 deletions(-)
arch/arm/mach-pxa/include/mach/regs-ost.h +2 -0
@@ -19,6 +19,7 @@#define OWER __REG(0x40A00018)/* OS Timer Watchdog Enable Register */ #define OIER __REG(0x40A0001C)/* OS Timer Interrupt Enable Register */ +#define OSSR_M4 (1 << 4)/* Match status channel 4 */ #define OSSR_M3 (1 << 3)/* Match status channel 3 */ #define OSSR_M2 (1 << 2)/* Match status channel 2 */ #define OSSR_M1 (1 << 1)/* Match status channel 1 */
@@ -26,6 +27,7 @@#define OWER_WME (1 << 0)/* Watchdog Match Enable */ +#define OIER_E4 (1 << 4)/* Interrupt enable channel 4 */ #define OIER_E3 (1 << 3)/* Interrupt enable channel 3 */ #define OIER_E2 (1 << 2)/* Interrupt enable channel 2 */ #define OIER_E1 (1 << 1)/* Interrupt enable channel 1 */
arch/arm/mach-pxa/time.c +172 -45
300 lines not on this page · raw message
Signature · 1 line
1.5.6.5
PATCH 11/11 ARM: pxa: add iwmmx support for PJ4
iwmmxt is used in XScale, XScale3, Mohawk and PJ4 core. But the instructions of accessing CP0 and CP1 is changed in PJ4. Append more files to support iwmmxt in PJ4 core.
--- arch/arm/kernel/Makefile | 14 +- arch/arm/kernel/iwmmxt.S | 317 -------------------------------------- arch/arm/kernel/pj4-cp0.c | 180 ++++++++++++++++++++++ arch/arm/kernel/pj4-iwmmxt.S | 319 +++++++++++++++++++++++++++++++++++++++ arch/arm/kernel/xscale-iwmmxt.S | 317 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 825 insertions(+), 322 deletions(-) delete mode 100644 arch/arm/kernel/iwmmxt.S create mode 100644 arch/arm/kernel/pj4-cp0.c create mode 100644 arch/arm/kernel/pj4-iwmmxt.S create mode 100644 arch/arm/kernel/xscale-iwmmxt.S
arch/arm/kernel/Makefile +9 -5
@@ -47,13 +47,17 @@ obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312 -obj-$(CONFIG_CPU_XSCALE) += xscale-cp0.o -obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o -obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o -obj-$(CONFIG_IWMMXT) += iwmmxt.o +ifeq ($(CONFIG_IWMMXT),y) + obj-$(CONFIG_CPU_XSCALE) += xscale-cp0.o xscale-iwmmxt.o + obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o xscale-iwmmxt.o + obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o xscale-iwmmxt.o + AFLAGS_xscale-iwmmxt.o := -Wa,-mcpu=iwmmxt+iwmmxt2 + + obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o pj4-iwmmxt.o + AFLAGS_pj4-iwmmxt.o := -Wa,-mcpu=iwmmxt+iwmmxt2 +endif obj-$(CONFIG_CPU_HAS_PMU) += pmu.o obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o -AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt ifneq ($(CONFIG_ARCH_EBSA110),y) obj-y += io.o
arch/arm/kernel/iwmmxt.S deleted +0 -317
317 lines not on this page · raw message
arch/arm/kernel/pj4-cp0.c new file +180 -0
180 lines not on this page · raw message
arch/arm/kernel/pj4-iwmmxt.S new file +319 -0
319 lines not on this page · raw message
arch/arm/kernel/xscale-iwmmxt.S new file +317 -0
317 lines not on this page · raw message
Signature · 1 line
1.5.6.5
PATCH 11/11 ARM: pxa: add iwmmx support for PJ4
Quoted 8 lines · Haojian Zhuang
iwmmxt is used in XScale, XScale3, Mohawk and PJ4 core. But the instructions of accessing CP0 and CP1 is changed in PJ4. Append more files to support iwmmxt in PJ4 core.
Signed-off-by Zhou Zhu <[email protected]>Signed-off-by Haojian Zhuang <[email protected]>Cc Eric Miao <[email protected]>Cc Nicolas Pitre <[email protected]>
Comments below.
Quoted 3 lines
delete mode 100644 arch/arm/kernel/iwmmxt.S create mode 100644 arch/arm/kernel/pj4-iwmmxt.S create mode 100644 arch/arm/kernel/xscale-iwmmxt.S
According to your previous patch, the changes needed to iwmmxt.S were minimal. Please don't duplicate the whole file just for this.
In retrospective I think I still prefer the #ifdef's for this file. Eventually we could use some dynamic kernel patching (we're getting good at it) when we'll want to support XScale and PJ4 with the same kernel binary.
So what you could do to make the code cleaner in iwmmxt.S is:
[...]
#if defined(CONFIG_CPU_PJ4)
#define PJ4(code...) code
#define XSC(code...)
#else
#define PJ4(code...)
#define XSC(code...) code
#endif
[...]
ENTRY(iwmmxt_task_switch)
XSC( mrc p15, 0, r1, c15, c1, 0 )
PJ4( mrc p15, 0, r1, c1, c0, 2 )
@ CP0 and CP1 accessible?
XSC( tst r1, #0x3 )
PJ4( tst r1, #0xf )
bne 1f @ yes: block them for next task
[...]
This way the code is pretty readable, and that paves the way for a future dynamic patching capability.
Quoted 16 lines
arch/arm/kernel/pj4-cp0.c new file +13
-0@@ -0,0 +1,180 @@ +/* +* linux/arch/arm/kernel/pj4-cp0.c +* +* XScale DSP and iWMMXt coprocessor context switching and handling +* +* Copyright (c) 2010 Marvell International Inc. +* +* 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>
arch/arm/kernel/pj4-cp0.c line 23
Quoted 10 lines
arch/arm/kernel/pj4-cp0.c new file +10
-0+#include <linux/types.h> +#include <linux/kernel.h> +#include <linux/signal.h> +#include <linux/sched.h> +#include <linux/init.h> +#include <linux/io.h> +#include <asm/thread_notify.h> + +static inline void dsp_save_state (u32 *state) +{
Do you really need this? The "dsp" stuff was to support early XScale versions which had only an accumulator and not the full iwmmx support. Therefore you should only keep the appropriate iwmmxt notifier block and get
rid of the "dsp" one.
[...]
arch/arm/kernel/pj4-cp0.c line 122
Quoted 8 lines
arch/arm/kernel/pj4-cp0.c new file +8
-0+/* +* Detect whether we have a MAC coprocessor (40 bit register) or an +* iWMMXt coprocessor (64 bit registers) by loading 00000100:00000000 +* into a coprocessor register and reading it back, and checking +* whether the upper word survived intact. +*/ +static int __init cpu_has_iwmmxt (void ) +{
And obviously you don't need this anymore either.
arch/arm/kernel/pj4-cp0.c line 154
Quoted 10 lines
arch/arm/kernel/pj4-cp0.c new file +10
-0+/* +* If we detect that the CPU has iWMMXt (and CONFIG_IWMMXT=y), we +* disable CP0/CP1 on boot, and let call_fpe() and the iWMMXt lazy +* switch code handle iWMMXt context switching. If on the other +* hand the CPU has a DSP coprocessor, we keep access to CP0 enabled +* all the time, and save/restore acc0 on context switch in non-lazy +* fashion. +*/ +static int __init pj4_cp0_init (void ) +{
The first case described in the comment above should be unconditional with a
PJ4, obviously. Therefore this code and comment need to be reworked as well.
Nicolas
PATCH 10/11 ARM: pxa: add 32KHz timer as clock source
In reply to Haojian ZhuangQuoted 7 lines · Haojian Zhuang
PXA silicons are using 3MHz timer as default clock source. But it'll be stopped counting in low power mode. Although 32KHz timer is slow, it can continue counting in low power mode. While low power mode is implemented as idle, stopped timer can't be accepted.
Add 32KHz timer as an alternative clock source. User can switch clock source on demand.
Why are you doing this? What's wrong with having timers stopped when in sleep mode? I don't think a 32K timer is precise enough for runtime usage in general.
What you should do instead is to use the 32KHz timer to readjust OSCR when the CPU comes out of sleep mode.
Nicolas
PATCH 10/11 ARM: pxa: add 32KHz timer as clock source
Quoted 23 lines
-----Original Message-----
From: Nicolas Pitre [mailto:nico at fluxnic.net]
Sent: 2010?11?13? 1:50 AM
To: Haojian Zhuang
Cc: linux-arm-kernel at lists.infradead.org; Eric Miao
Subject: Re: [PATCH 10/11] ARM: pxa: add 32KHz timer as clock sourceQuoted 7 lines · Haojian Zhuang
PXA silicons are using 3MHz timer as default clock source. But it'll be stopped counting in low power mode. Although 32KHz timer is slow, it can continue counting in low power mode. While low power mode is implemented as idle, stopped timer can't be accepted.
Add 32KHz timer as an alternative clock source. User can switch clock source on demand.
Why are you doing this? What's wrong with having timers stopped when in sleep mode? I don't think a 32K timer is precise enough for runtime usage in general.
Quoted 5 lines
What you should do instead is to use the 32KHz timer to readjust OSCR when the CPU comes out of sleep mode.
Nicolas
Hi Nicolas,
It's not suspend mode. It's idle mode. System will enter idle frequently and time shouldn't stop counting in idle time.
If we use 32KHz timer to compensate OSCR, the drifts on OSCR will be larger and larger. Because 32KHz time isn't precise. System time is based on our timer. I don't think this solution could be acceptable.
If we only use 32KHz timer, it can't meet precise time requirement in performance test.
So I use both clock source. While we need to get a precise time usage for performance calculating, we can switch clock source to fast clock. While we need to keep system to save power, we shouldn't care precise time at this time. We have to choose one in this scenario.
Thanks
Haojian
PATCH 8/11 ARM: pxa: sanitize IRQ registers access based on offset
In reply to Haojian ZhuangQuoted 2 lines · On Friday 12 November 2010 08:17:37 Haojian Zhuang wrote:
Signed-off-by Eric Miao <[email protected]>Signed-off-by Haojian Zhuang <[email protected]>
I think there's something wrong with this patch. It crashes my ZipitZ2 (no crash with this patch reverted). I'll investigate a bit and keep you informed, but see below.
Quoted 201 lines
--- arch/arm/mach-pxa/include/mach/regs-intc.h | 4 - arch/arm/mach-pxa/irq.c | 122++++++++++++++++++---------- 2 files changed, 80 insertions(+), 46 deletions(-)
(quoted diff) +0
-0
b/arch/arm/mach-pxa/include/mach/regs-intc.hindex 68464ce..662288e 100644arch/arm/mach-pxa/include/mach/regs-intc.h +0
-0@@ -27,8 +27,4 @@#define ICFP3 __REG(0x40D0013C)/* Interrupt Controller FIQ Pending Register 3 */ #define ICPR3
__REG(0x40D00140)/* Interrupt Controller
Pending Register 3 */arch/arm/mach-pxa/include/mach/regs-intc.h +0
-4-#define IPR (x) __REG(0x40D0001C + (x < 32 ? (x << 2) \ - : (x < 64 ? (0x94 + ((x - 32) << 2)) \ - : (0x128 + ((x - 64) << 2))))) -#endif /* __ASM_MACH_REGS_INTC_H */ arch/arm/mach-pxa/irq.c +71
-35@@ -16,20 +16,31 @@#include <linux/module.h> #include <linux/interrupt.h> #include <linux/sysdev.h> +#include <linux/io.h> +#include <linux/irq.h> #include <mach/hardware.h> -#include <asm/irq.h> -#include <asm/mach/irq.h> +#include <mach/irqs.h> #include <mach/gpio.h> -#include <mach/regs-intc.h> #include "generic.h" -#define MAX_INTERNAL_IRQS 128 +#define IRQ_BASE (void __iomem *)io_p2v(0x40d00000) + +#define ICIP (0x000) +#define ICMR (0x004) +#define ICLR (0x008) +#define ICFR (0x00c) +#define ICPR (0x010) +#define ICCR (0x014) +#define ICHP (0x018) +#define IPR (i) (((i) < 32) ? (0x01c + ((i) << 2)) : \ + ((i) < 64) ? (0x0b0 + (((i) - 32) << 2)) : \ + (0x144 + (((i) - 64) << 2))) +#define IPR_VALID (1 << 31) +#define IRQ_BIT (n) (((n) - PXA_IRQ(0)) & 0x1f) -#define IRQ_BIT (n) (((n) - PXA_IRQ(0)) & 0x1f) -#define _ICMR (n) (*((((n) - PXA_IRQ(0)) & ~0x1f) ? &ICMR2 : &ICMR)) -#define _ICLR (n) (*((((n) - PXA_IRQ(0)) & ~0x1f) ? &ICLR2 : &ICLR)) +#define MAX_INTERNAL_IRQS 128/* * This is for peripheral IRQs internal to the PXA chip. @@ -44,12 +55,20 @@ static inline int cpu_has_ipr(void)static void pxa_mask_irq (unsigned int irq) { -_ICMR (irq) &= ~(1 <<IRQ_BIT (irq)); +void __iomem *base =get_irq_chip_data (irq); +uint32_t icmr =__raw_readl (base +ICMR ); + + icmr &= ~(1 <<IRQ_BIT (irq)); +__raw_writel (icmr, base +ICMR ); }static void pxa_unmask_irq (unsigned int irq) { -_ICMR (irq) |=1 <<IRQ_BIT (irq); +void __iomem *base =get_irq_chip_data (irq); +uint32_t icmr =__raw_readl (base +ICMR ); + + icmr |=1 <<IRQ_BIT (irq); +__raw_writel (icmr, base +ICMR ); }static struct irq_chip pxa_internal_irq_chip = {@@ -91,12 +110,16 @@ static void pxa_ack_low_gpio(unsigned int irq)static void pxa_mask_low_gpio (unsigned int irq) { -ICMR &= ~(1 << (irq -PXA_IRQ (0 ))); +struct irq_desc *desc =irq_to_desc (irq); + + desc->chip->mask (irq); }static void pxa_unmask_low_gpio (unsigned int irq) { -ICMR |=1 << (irq -PXA_IRQ (0 )); +struct irq_desc *desc =irq_to_desc (irq); + + desc->chip->unmask (irq); }static struct irq_chip pxa_low_gpio_chip = {@@ -125,33 +148,45 @@ static void __init pxa_init_low_gpio_irq(set_wake_t fn) pxa_low_gpio_chip.set_wake = fn; } +static inline void __iomem *irq_base (int i) +{ +static unsigned long phys_base[] = { +0x40d00000 , +0x40d0009c , +0x40d00130 , + }; + +return (void __iomem *)io_p2v (phys_base[i >>5 ]); +} +void __init pxa_init_irq (int irq_nr,set_wake_t fn) { -int irq, i; +int irq, i, n;BUG_ON (irq_nr >MAX_INTERNAL_IRQS ); pxa_internal_irq_nr = irq_nr; -for (irq =PXA_IRQ (0 ); irq <PXA_IRQ (irq_nr); irq +=32 ) { -_ICMR (irq) =0 ;/* disable all IRQs */ -_ICLR (irq) =0 ;/* all IRQs are IRQ, not FIQ */ - } - -/* initialize interrupt priority */ -if (cpu_has_ipr ()) { -for (i =0 ; i < irq_nr; i++) -IPR (i) = i | (1 <<31 ); +for (n =0 ; n < irq_nr; n +=32 ) { +void __iomem *base =irq_base (n); + +__raw_writel (0 , base +ICMR );/* disable all IRQs */ +__raw_writel (0 , base +ICLR );/* all IRQs are IRQ, not FIQ */ +for (i = n; (i < (n +32 )) && (i < irq_nr); i++) { +/* initialize interrupt priority */ +if (cpu_has_ipr ()) +__raw_writel (i |IPR_VALID ,IRQ_BASE +IPR (i)); + + irq =PXA_IRQ (i); +set_irq_chip (irq, &pxa_internal_irq_chip); +set_irq_chip_data (irq, base); +set_irq_handler (irq, handle_level_irq); +set_irq_flags (irq,IRQF_VALID ); + } }/* only unmasked interrupts kick us out of idle */ -ICCR =1 ; - -for (irq =PXA_IRQ (0 ); irq <PXA_IRQ (irq_nr); irq++) { -set_irq_chip (irq, &pxa_internal_irq_chip); -set_irq_handler (irq, handle_level_irq); -set_irq_flags (irq,IRQF_VALID ); - } +__raw_writel (1 ,irq_base (0 ) +ICCR ); pxa_internal_irq_chip.set_wake = fn;pxa_init_low_gpio_irq (fn);@@ -163,16 +198,18 @@ static unsigned long saved_ipr[MAX_INTERNAL_IRQS];static int pxa_irq_suspend (struct sys_device *dev,pm_message_t state) { -int i, irq =PXA_IRQ (0 ); +int i; + +for (i =0 ; i < pxa_internal_irq_nr; i +=32 ) { +void __iomem *base =irq_base (i); -for (i =0 ; irq <PXA_IRQ (pxa_internal_irq_nr); i++, irq +=32 ) { - saved_icmr[i] =_ICMR (irq); -_ICMR (irq) =0 ; + saved_icmr[i] =__raw_readl (base +ICMR ); +__raw_writel (0 , base +ICMR ); }if (cpu_has_ipr ()) {for (i =0 ; i < pxa_internal_irq_nr; i++) - saved_ipr[i] =IPR (i); + saved_ipr[i] =__raw_readl (IRQ_BASE +IPR (i)); }return 0 ;@@ -180,19 +217,20 @@ static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)static int pxa_irq_resume (struct sys_device *dev) { -int i, irq =PXA_IRQ (0 ); +int i; -if (cpu_has_ipr ()) {
arch/arm/mach-pxa/irq.c static int pxa_irq_suspend(struct sys_device *dev, · line 226
Quoted 10 lines
arch/arm/mach-pxa/irq.c +3
-6-for (i =0 ; i < pxa_internal_irq_nr; i++) -IPR (i) = saved_ipr[i]; - } +for (i =0 ; i < pxa_internal_irq_nr; i +=32 ) { +void __iomem *base =irq_base (i); -for (i =0 ; irq <PXA_IRQ (pxa_internal_irq_nr); i++, irq +=32 ) { -_ICMR (irq) = saved_icmr[i]; -_ICLR (irq) =0 ; +__raw_writel (saved_icmr[i], base +ICMR );
eg. here, it just so does out-of-bounds access (saved_icmr[32] is wrong).
Quoted 12 lines
arch/arm/mach-pxa/irq.c +6
-1+__raw_writel (0 , base +ICLR ); } -ICCR =1 ; +if (!cpu_is_pxa25x ()) +for (i =0 ; i < pxa_internal_irq_nr; i++) +__raw_writel (saved_ipr[i],IRQ_BASE +IPR (i)); + +__raw_writel (1 ,IRQ_BASE +ICCR );return 0 ; }#else
PATCH 5/11 ARM: pxa: support pxa95x
In reply to Haojian ZhuangQuoted 9 lines
-----Original Message-----
From: Haojian Zhuang [mailto:haojian.zhuang at marvell.com]
Sent: 2010?11?12? 3:18 PM
To: linux-arm-kernel at lists.infradead.org
Cc: Haojian Zhuang; Eric Miao
Subject: [PATCH 05/11] ARM: pxa: support pxa95x
Quoted 6 lines
The core of PXA955 is PJ4. Add new PJ4 support. And add new macro
CONFIG_PXA95x.Signed-off-by Haojian Zhuang <[email protected]>Cc Eric Miao <[email protected]>---
Changelog:
1. Remove pxa95x_clear_reset_status() in pxa95x.c
2. Remove pxa95x_clear_reset_status() definition in generic.h
Thanks
Haojian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0005-ARM-pxa-support-pxa95x.patch
Type: application/octet-stream
Size: 28875 bytes
Desc: 0005-ARM-pxa-support-pxa95x.patch
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101112/b430ec9b/attachment-0001.obj>
PATCH 4/11 ARM: pxa: update to read ICHP
In reply to Haojian ZhuangQuoted 15 lines · Haojian Zhuang
ICHP records the highest priority interrupt occured. In PXA27x/PXA3xx, we can read ICHP via cooprocessor. In PJ4, we can only read ICHP via bus register. So use the same method to read ICHP via bus register.
Signed-off-by Haojian Zhuang <[email protected]>Cc Eric Miao <[email protected]>---
?arch/arm/mach-pxa/include/mach/entry-macro.S | ? ?6 +++++- ?1 files changed, 5 insertions(+), 1 deletions(-)arch/arm/mach-pxa/include/mach/entry-macro.S +0
-0@@ -41,11 +41,15 @@
Quoted 8 lines
? ? ? ? ? ? ? ?b ? ? ? 1001f
?1002:
? ? ? ? ? ? ? ?@ Core Generation 2 (PXA27x) or Core Generation 3 (PXA3xx)
- ? ? ? ? ? ? ? mrc ? ? p6, 0, \irqstat, c5, c0, 0 ? ? ?@ ICHP
+ ? ? ? ? ? ? ? @ or Core PJ4
+ ? ? ? ? ? ? ? mov ? ? \base, #io_p2v(0x40000000) ? ? ?@ IIR Ctl =0x40d00000
+ ? ? ? ? ? ? ? add ? ? \base, \base, #0x00d00000
+ ? ? ? ? ? ? ? ldr ? ? \irqstat, [\base, #0x18] ? ? ? ?@ ICHP offset
Accessing from co-processor is supposed to be faster than MMIO.
BTW, this could be addressed by MULTI_IRQ_HANDLER as in patch:
http://www.spinics.net/lists/arm-kernel/msg88817.html
Once it gets merged.
Quoted 12 lines
? ? ? ? ? ? ? ?tst ? ? \irqstat, #0x80000000 ? ? ? ? ? ? ? ?beq ? ? 1001f
? ? ? ? ? ? ? ?bic ? ? \irqstat, \irqstat, #0x80000000 ? ? ? ? ? ? ? ?mov ? ? \irqnr, \irqstat, lsr #16 ? ? ? ? ? ? ? ?add ? ? \irqnr, \irqnr, #(PXA_IRQ(0)) +
?1001:
? ? ? ? ? ? ? ?.endm
--
1.5.6.5
PATCH 4/11 ARM: pxa: update to read ICHP
Quoted 38 lines
-----Original Message-----
From: Eric Miao [mailto:eric.y.miao at gmail.com]
Sent: 2010?11?12? 4:35 PM
To: Haojian Zhuang
Cc: linux-arm-kernel at lists.infradead.org
Subject: Re: [PATCH 04/11] ARM: pxa: update to read ICHParch/arm/mach-
Quoted 11 lines · Haojian Zhuang
ICHP records the highest priority interrupt occured. In PXA27x/PXA3xx, we can read ICHP via cooprocessor. In PJ4, we can only read ICHP via bus register. So use the same method to read ICHP via bus register.
Signed-off-by Haojian Zhuang <[email protected]>Cc Eric Miao <[email protected]>---
?arch/arm/mach-pxa/include/mach/entry-macro.S | ? ?6 +++++- ?1 files changed, 5 insertions(+), 1 deletions(-)arch/arm/mach- renamed from arch/arm/mach-pxa/include/mach/entry-macro.S +0
-0
pxa/include/mach/entry-macro.SQuoted 4 lines
index a73bc86..91457dd 100644
arch/arm/mach-pxa/include/mach/entry-macro.S +0
-0@@ -41,11 +41,15 @@Quoted 8 lines
? ? ? ? ? ? ? ?b ? ? ? 1001f
?1002:
? ? ? ? ? ? ? ?@ Core Generation 2 (PXA27x) or Core Generation 3 (PXA3xx)
- ? ? ? ? ? ? ? mrc ? ? p6, 0, \irqstat, c5, c0, 0 ? ? ?@ ICHP
+ ? ? ? ? ? ? ? @ or Core PJ4
+ ? ? ? ? ? ? ? mov ? ? \base, #io_p2v(0x40000000) ? ? ?@ IIR Ctl =0x40d00000
+ ? ? ? ? ? ? ? add ? ? \base, \base, #0x00d00000
+ ? ? ? ? ? ? ? ldr ? ? \irqstat, [\base, #0x18] ? ? ? ?@ ICHP offsetAccessing from co-processor is supposed to be faster than MMIO.
Quoted 6 lines
BTW, this could be addressed by
MULTI_IRQ_HANDLERas in patch:http://www.spinics.net/lists/arm-kernel/msg88817.html
Once it gets merged.
No problem. I can reformat this patch for MULTI_IRQ_HANDLER after it merged. You can skip this patch from current patch series since it won't impact old silicons.
Thanks
Haojian
PATCH 3/11 ARM: pxa: split pxa93x from pxa3xx
In reply to Haojian ZhuangQuoted 690 lines · Haojian Zhuang
In order to avoid confusion, seperate pxa93x from pxa3xx.
Signed-off-by Haojian Zhuang <[email protected]>Cc Eric Miao <[email protected]>---
?arch/arm/mach-pxa/Kconfig ? ? ? ? ? ?| ? 18 +- ?arch/arm/mach-pxa/Makefile ? ? ? ? ? | ? ?2 +- ?arch/arm/mach-pxa/clock.h ? ? ? ? ? ?| ? 20 ++ ?arch/arm/mach-pxa/devices.c ? ? ? ? ?| ? 10 +- ?arch/arm/mach-pxa/generic.c ? ? ? ? ?| ? ?8 +- ?arch/arm/mach-pxa/generic.h ? ? ? ? ?| ? ?3 +- ?arch/arm/mach-pxa/mfp-pxa3xx.c ? ? ? | ? ?5 +- ?arch/arm/mach-pxa/pxa3xx.c ? ? ? ? ? | ? ?9 - ?arch/arm/mach-pxa/pxa930.c ? ? ? ? ? | ?206 --------------- ?arch/arm/mach-pxa/pxa93x.c ? ? ? ? ? | ?471 ++++++++++++++++++++++++++++++++++ ?arch/arm/mach-pxa/saar.c ? ? ? ? ? ? | ? ?2 +- ?arch/arm/mach-pxa/smemc.c ? ? ? ? ? ?| ? 10 +- ?arch/arm/mach-pxa/tavorevb.c ? ? ? ? | ? ?2 +- ?arch/arm/plat-pxa/Makefile ? ? ? ? ? | ? ?1 + ?arch/arm/plat-pxa/include/plat/mfp.h | ? ?4 +-?15 files changed, 525 insertions(+), 246 deletions(-) ?delete mode 100644
arch/arm/mach-pxa/pxa930.c?create mode 100644arch/arm/mach-pxa/pxa93x.carch/arm/mach-pxa/Kconfig +0
-0@@ -37,18 +37,18 @@ config MACH_LITTLETON? ? ? ?select
CPU_PXA310?config
MACH_TAVOREVB
- ? ? ? bool "PXA930 Evaluation Board (aka TavorEVB)"
- ? ? ? select PXA3xx
+ ? ? ? bool "PXA935 Evaluation Board (aka TavorEVB)" ? ? ? ?selectCPU_PXA930
+ ? ? ? selectCPU_PXA935?config
MACH_TAVOREVB3
? ? ? ?bool "PXA95x Development Platform (aka TavorEVB III)" ? ? ? ?selectCPU_PXA950?config
MACH_SAAR
- ? ? ? bool "PXA930 Handheld Platform (aka SAAR)"
- ? ? ? select PXA3xx
+ ? ? ? bool "PXA935 Handheld Platform (aka SAAR)" ? ? ? ?selectCPU_PXA930
+ ? ? ? selectCPU_PXA935?comment "Third Party Dev Platforms (sorted by vendor name)"
arch/arm/mach-pxa/Kconfig +0
-0@@ -639,15 +639,21 @@ config CPU_PXA320? ? ? ?help
? ? ? ? ?PXA320 (codename Monahans-P)arch/arm/mach-pxa/Kconfig +6
-0+config PXA93x + ? ? ? bool + ? ? ? select CPU_XSC3 + ? ? ? help + ? ? ? ? Select code specific to PXA93x variants +?config
CPU_PXA930
? ? ? ?bool
- ? ? ? select PXA3xx
+ ? ? ? select PXA93x
? ? ? ?help
? ? ? ? ?PXA930 (codename Tavor-P)?config
CPU_PXA935
? ? ? ?bool
- ? ? ? selectCPU_PXA930
+ ? ? ? select PXA93x
? ? ? ?help
? ? ? ? ?PXA935 (codename Tavor-P65)arch/arm/mach-pxa/Makefile +0
-0@@ -19,9 +19,9 @@ endif?obj-$(CONFIG_PXA25x) ? ? ? ? ? += mfp-pxa2xx.o pxa2xx.o pxa25x.o ?obj-$(CONFIG_PXA27x) ? ? ? ? ? += mfp-pxa2xx.o pxa2xx.o pxa27x.o ?obj-$(CONFIG_PXA3xx) ? ? ? ? ? += mfp-pxa3xx.o pxa3xx.o smemc.o pxa3xx-ulpi.o +obj-$(CONFIG_PXA93x) ? ? ? ? ? += mfp-pxa3xx.o pxa93x.o smemc.o ?obj-$(CONFIG_CPU_PXA300) ? ? ? += pxa300.o ?obj-$(CONFIG_CPU_PXA320) ? ? ? += pxa320.o -obj-$(CONFIG_CPU_PXA930) ? ? ? += pxa930.o
?# NOTE: keep the order of boards in accordance to their order in
Kconfigarch/arm/mach-pxa/clock.h +0
-0@@ -67,3 +67,23 @@ extern void clk_pxa3xx_cken_enable(struct clk *); ?extern void clk_pxa3xx_cken_disable(struct clk *);?#endif
arch/arm/mach-pxa/clock.h +20
-0+#ifdef CONFIG_PXA93x +#define DEFINE_PXA93_CKEN (_name, _cken, _rate, _delay) \ +struct clk clk_##_name = { ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ + ? ? ? ? ? ? ? .ops ? ?= &clk_pxa93x_cken_ops, ? ? ? ? \ + ? ? ? ? ? ? ? .rate ? = _rate, ? ? ? ? ? ? ? ? ? ? ? ?\ + ? ? ? ? ? ? ? .cken ? = CKEN_##_cken, ? ? ? ? ? ? ? ? \ + ? ? ? ? ? ? ? .delay ?= _delay, ? ? ? ? ? ? ? ? ? ? ? \ + ? ? ? } + +#define DEFINE_PXA93_CK (_name, _cken, _ops) ? ? ? ? ? ?\ +struct clk clk_##_name = { ? ? ? ? ? ? ? ? ? ? ? ? ? ? \ + ? ? ? ? ? ? ? .ops ? ?= _ops, ? ? ? ? ? ? ? ? ? ? ? ? \ + ? ? ? ? ? ? ? .cken ? = CKEN_##_cken, ? ? ? ? ? ? ? ? \ + ? ? ? } + +extern const struct clkops clk_pxa93x_cken_ops; +extern void clk_pxa93x_cken_enable (struct clk *); +extern void clk_pxa93x_cken_disable (struct clk *); +#endif +arch/arm/mach-pxa/devices.c +0
-0@@ -342,7 +342,7 @@ struct platform_device pxa27x_device_i2c_power = { ?};?#endif
arch/arm/mach-pxa/devices.c +1
-1-#ifdef CONFIG_PXA3xx +#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x)?static struct resource pxa3xx_resources_i2c_power[] = { ? ? ? ?{
? ? ? ? ? ? ? ?.start ?=0x40f500c0,arch/arm/mach-pxa/devices.c +0
-0@@ -632,7 +632,7 @@ struct platform_device pxa25x_device_assp = { ?};?#endif /*
CONFIG_PXA25x*/arch/arm/mach-pxa/devices.c +1
-1-#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx) +#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x)?static struct resource pxa27x_resource_keypad[] = { ? ? ? ?[0] = {
arch/arm/mach-pxa/devices.c +3
-3@@ -864,9 +864,9 @@ void __init pxa_set_camera_info(struct pxacamera_platform_data *info) ?{ ? ? ? ?pxa_register_device(&pxa27x_device_camera, info); ?} -#endif /* CONFIG_PXA27x || CONFIG_PXA3xx */ +#endif /* CONFIG_PXA27x || CONFIG_PXA3xx || CONFIG_PXA93x */ -#ifdef CONFIG_PXA3xx +#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x) ?static u64 pxa3xx_ssp4_dma_mask = DMA_BIT_MASK(32); ?static struct resource pxa3xx_resource_ssp4[] = {@@ -1053,7 +1053,7 @@ struct platform_device pxa3xx_device_gcu = { ? ? ? ?}, ?}; -#endif /* CONFIG_PXA3xx */ +#endif /* CONFIG_PXA3xx || CONFIG_PXA93x */ ?/* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1. ?* See comment in arch/arm/mach-pxa/ssp.c::ssp_probe() */
arch/arm/mach-pxa/generic.c +0
-0@@ -29,6 +29,7 @@?#include <
mach/reset.h>
?#include <mach/gpio.h>
?#include <mach/smemc.h>
+#include <mach/pxa3xx-regs.h>?#include "
generic.h"arch/arm/mach-pxa/generic.c +4
-3@@ -36,9 +37,10 @@ void clear_reset_status(unsigned int mask) ?{ ? ? ? ?if (cpu_is_pxa2xx()) ? ? ? ? ? ? ? ?pxa2xx_clear_reset_status(mask); - - ? ? ? if (cpu_is_pxa3xx()) - ? ? ? ? ? ? ? pxa3xx_clear_reset_status(mask); + ? ? ? else { + ? ? ? ? ? ? ? /* RESET_STATUS_* has a 1:1 mapping with ARSR */ + ? ? ? ? ? ? ? ARSR = mask; + ? ? ? } ?} ?unsigned long get_clock_tick_rate(void)arch/arm/mach-pxa/generic.h +0
-0@@ -20,6 +20,7 @@ extern void __init pxa26x_init_irq(void);?#endif
?extern void__initpxa27x_init_irq(void);
?extern void__initpxa3xx_init_irq(void);
+extern void__initpxa93x_init_irq(void);?extern void
__initpxa_map_io(void);
?extern void__initpxa25x_map_io(void);arch/arm/mach-pxa/generic.h +0
-0@@ -58,10 +59,8 @@ static inline void pxa2xx_clear_reset_status(unsigned int mask) {}?#ifdef
CONFIG_PXA3xx
?extern unsignedpxa3xx_get_clk_frequency_khz(int); -extern voidpxa3xx_clear_reset_status(unsigned int); ?#else
?#definepxa3xx_get_clk_frequency_khz(x)? ? ? ? ? ? ? ?(0) -static inline voidpxa3xx_clear_reset_status(unsigned int mask){} ?#endif?extern struct
sysdev_classpxa_irq_sysclass;arch/arm/mach-pxa/mfp-pxa3xx.c +1
-4@@ -62,9 +62,6 @@ struct sysdev_class pxa3xx_mfp_sysclass = { ?static int __init mfp_init_devicefs(void) ?{ - ? ? ? if (cpu_is_pxa3xx()) - ? ? ? ? ? ? ? return sysdev_class_register(&pxa3xx_mfp_sysclass); - - ? ? ? return 0; + ? ? ? return sysdev_class_register(&pxa3xx_mfp_sysclass); ?} ?postcore_initcall(mfp_init_devicefs);arch/arm/mach-pxa/pxa3xx.c +0
-3@@ -50,9 +50,6 @@ ?#define PECR_IE(n) ? ? ((1 << ((n) * 2)) << 28) ?#define PECR_IS(n) ? ? ((1 << ((n) * 2)) << 29) -/* crystal frequency to static memory controller multiplier (SMCFS) */ -static unsigned char smcfs_mult[8 ] = {6 ,0 ,8 ,0 ,0 ,16 , }; -?/* crystal frequency to HSIO bus frequency multiplier (HSS) */ ?static unsigned char hss_mult[4] = { 8, 12, 16, 24 };
arch/arm/mach-pxa/pxa3xx.c +0
-6@@ -100,12 +97,6 @@ unsigned int pxa3xx_get_clk_frequency_khz(int info) ? ? ? ?return CLK / 1000; ?} -void pxa3xx_clear_reset_status (unsigned int mask) -{ - ? ? ? /* RESET_STATUS_* has a 1:1 mapping with ARSR */ - ? ? ? ARSR = mask; -} -?/*
?* Return the current AC97 clock frequency.
?*/arch/arm/mach-pxa/pxa930.c deleted +0
-206@@ -1,206 +0,0 @@ -/* -* linux/arch/arm/mach-pxa/pxa930.c -* -* Code specific to PXA930 -* -* Copyright (C) 2007-2008 Marvell Internation Ltd. -* -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License version 2 as -* published by the Free Software Foundation. -*/ - -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/platform_device.h> -#include <linux/irq.h> -#include <linux/dma-mapping.h> - -#include <mach/pxa930.h> - -static struct mfp_addr_map pxa930_mfp_addr_map[]__initdata = { - - ? ? ? MFP_ADDR(GPIO0, 0x02e0), - ? ? ? MFP_ADDR(GPIO1, 0x02dc), - ? ? ? MFP_ADDR(GPIO2, 0x02e8), - ? ? ? MFP_ADDR(GPIO3, 0x02d8), - ? ? ? MFP_ADDR(GPIO4, 0x02e4), - ? ? ? MFP_ADDR(GPIO5, 0x02ec), - ? ? ? MFP_ADDR(GPIO6, 0x02f8), - ? ? ? MFP_ADDR(GPIO7, 0x02fc), - ? ? ? MFP_ADDR(GPIO8, 0x0300), - ? ? ? MFP_ADDR(GPIO9, 0x02d4), - ? ? ? MFP_ADDR(GPIO10, 0x02f4), - ? ? ? MFP_ADDR(GPIO11, 0x02f0), - ? ? ? MFP_ADDR(GPIO12, 0x0304), - ? ? ? MFP_ADDR(GPIO13, 0x0310), - ? ? ? MFP_ADDR(GPIO14, 0x0308), - ? ? ? MFP_ADDR(GPIO15, 0x030c), - ? ? ? MFP_ADDR(GPIO16, 0x04e8), - ? ? ? MFP_ADDR(GPIO17, 0x04f4), - ? ? ? MFP_ADDR(GPIO18, 0x04f8), - ? ? ? MFP_ADDR(GPIO19, 0x04fc), - ? ? ? MFP_ADDR(GPIO20, 0x0518), - ? ? ? MFP_ADDR(GPIO21, 0x051c), - ? ? ? MFP_ADDR(GPIO22, 0x04ec), - ? ? ? MFP_ADDR(GPIO23, 0x0500), - ? ? ? MFP_ADDR(GPIO24, 0x04f0), - ? ? ? MFP_ADDR(GPIO25, 0x0504), - ? ? ? MFP_ADDR(GPIO26, 0x0510), - ? ? ? MFP_ADDR(GPIO27, 0x0514), - ? ? ? MFP_ADDR(GPIO28, 0x0520), - ? ? ? MFP_ADDR(GPIO29, 0x0600), - ? ? ? MFP_ADDR(GPIO30, 0x0618), - ? ? ? MFP_ADDR(GPIO31, 0x0610), - ? ? ? MFP_ADDR(GPIO32, 0x060c), - ? ? ? MFP_ADDR(GPIO33, 0x061c), - ? ? ? MFP_ADDR(GPIO34, 0x0620), - ? ? ? MFP_ADDR(GPIO35, 0x0628), - ? ? ? MFP_ADDR(GPIO36, 0x062c), - ? ? ? MFP_ADDR(GPIO37, 0x0630), - ? ? ? MFP_ADDR(GPIO38, 0x0634), - ? ? ? MFP_ADDR(GPIO39, 0x0638), - ? ? ? MFP_ADDR(GPIO40, 0x063c), - ? ? ? MFP_ADDR(GPIO41, 0x0614), - ? ? ? MFP_ADDR(GPIO42, 0x0624), - ? ? ? MFP_ADDR(GPIO43, 0x0608), - ? ? ? MFP_ADDR(GPIO44, 0x0604), - ? ? ? MFP_ADDR(GPIO45, 0x050c), - ? ? ? MFP_ADDR(GPIO46, 0x0508), - ? ? ? MFP_ADDR(GPIO47, 0x02bc), - ? ? ? MFP_ADDR(GPIO48, 0x02b4), - ? ? ? MFP_ADDR(GPIO49, 0x02b8), - ? ? ? MFP_ADDR(GPIO50, 0x02c8), - ? ? ? MFP_ADDR(GPIO51, 0x02c0), - ? ? ? MFP_ADDR(GPIO52, 0x02c4), - ? ? ? MFP_ADDR(GPIO53, 0x02d0), - ? ? ? MFP_ADDR(GPIO54, 0x02cc), - ? ? ? MFP_ADDR(GPIO55, 0x029c), - ? ? ? MFP_ADDR(GPIO56, 0x02a0), - ? ? ? MFP_ADDR(GPIO57, 0x0294), - ? ? ? MFP_ADDR(GPIO58, 0x0298), - ? ? ? MFP_ADDR(GPIO59, 0x02a4), - ? ? ? MFP_ADDR(GPIO60, 0x02a8), - ? ? ? MFP_ADDR(GPIO61, 0x02b0), - ? ? ? MFP_ADDR(GPIO62, 0x02ac), - ? ? ? MFP_ADDR(GPIO63, 0x0640), - ? ? ? MFP_ADDR(GPIO64, 0x065c), - ? ? ? MFP_ADDR(GPIO65, 0x0648), - ? ? ? MFP_ADDR(GPIO66, 0x0644), - ? ? ? MFP_ADDR(GPIO67, 0x0674), - ? ? ? MFP_ADDR(GPIO68, 0x0658), - ? ? ? MFP_ADDR(GPIO69, 0x0654), - ? ? ? MFP_ADDR(GPIO70, 0x0660), - ? ? ? MFP_ADDR(GPIO71, 0x0668), - ? ? ? MFP_ADDR(GPIO72, 0x0664), - ? ? ? MFP_ADDR(GPIO73, 0x0650), - ? ? ? MFP_ADDR(GPIO74, 0x066c), - ? ? ? MFP_ADDR(GPIO75, 0x064c), - ? ? ? MFP_ADDR(GPIO76, 0x0670), - ? ? ? MFP_ADDR(GPIO77, 0x0678), - ? ? ? MFP_ADDR(GPIO78, 0x067c), - ? ? ? MFP_ADDR(GPIO79, 0x0694), - ? ? ? MFP_ADDR(GPIO80, 0x069c), - ? ? ? MFP_ADDR(GPIO81, 0x06a0), - ? ? ? MFP_ADDR(GPIO82, 0x06a4), - ? ? ? MFP_ADDR(GPIO83, 0x0698), - ? ? ? MFP_ADDR(GPIO84, 0x06bc), - ? ? ? MFP_ADDR(GPIO85, 0x06b4), - ? ? ? MFP_ADDR(GPIO86, 0x06b0), - ? ? ? MFP_ADDR(GPIO87, 0x06c0), - ? ? ? MFP_ADDR(GPIO88, 0x06c4), - ? ? ? MFP_ADDR(GPIO89, 0x06ac), - ? ? ? MFP_ADDR(GPIO90, 0x0680), - ? ? ? MFP_ADDR(GPIO91, 0x0684), - ? ? ? MFP_ADDR(GPIO92, 0x0688), - ? ? ? MFP_ADDR(GPIO93, 0x0690), - ? ? ? MFP_ADDR(GPIO94, 0x068c), - ? ? ? MFP_ADDR(GPIO95, 0x06a8), - ? ? ? MFP_ADDR(GPIO96, 0x06b8), - ? ? ? MFP_ADDR(GPIO97, 0x0410), - ? ? ? MFP_ADDR(GPIO98, 0x0418), - ? ? ? MFP_ADDR(GPIO99, 0x041c), - ? ? ? MFP_ADDR(GPIO100, 0x0414), - ? ? ? MFP_ADDR(GPIO101, 0x0408), - ? ? ? MFP_ADDR(GPIO102, 0x0324), - ? ? ? MFP_ADDR(GPIO103, 0x040c), - ? ? ? MFP_ADDR(GPIO104, 0x0400), - ? ? ? MFP_ADDR(GPIO105, 0x0328), - ? ? ? MFP_ADDR(GPIO106, 0x0404), - - ? ? ? MFP_ADDR(nXCVREN, 0x0204), - ? ? ? MFP_ADDR(DF_CLE_nOE, 0x020c), - ? ? ? MFP_ADDR(DF_nADV1_ALE, 0x0218), - ? ? ? MFP_ADDR(DF_SCLK_E, 0x0214), - ? ? ? MFP_ADDR(DF_SCLK_S, 0x0210), - ? ? ? MFP_ADDR(nBE0, 0x021c), - ? ? ? MFP_ADDR(nBE1, 0x0220), - ? ? ? MFP_ADDR(DF_nADV2_ALE, 0x0224), - ? ? ? MFP_ADDR(DF_INT_RnB, 0x0228), - ? ? ? MFP_ADDR(DF_nCS0, 0x022c), - ? ? ? MFP_ADDR(DF_nCS1, 0x0230), - ? ? ? MFP_ADDR(nLUA, 0x0254), - ? ? ? MFP_ADDR(nLLA, 0x0258), - ? ? ? MFP_ADDR(DF_nWE, 0x0234), - ? ? ? MFP_ADDR(DF_nRE_nOE, 0x0238), - ? ? ? MFP_ADDR(DF_ADDR0, 0x024c), - ? ? ? MFP_ADDR(DF_ADDR1, 0x0250), - ? ? ? MFP_ADDR(DF_ADDR2, 0x025c), - ? ? ? MFP_ADDR(DF_ADDR3, 0x0260), - ? ? ? MFP_ADDR(DF_IO0, 0x023c), - ? ? ? MFP_ADDR(DF_IO1, 0x0240), - ? ? ? MFP_ADDR(DF_IO2, 0x0244), - ? ? ? MFP_ADDR(DF_IO3, 0x0248), - ? ? ? MFP_ADDR(DF_IO4, 0x0264), - ? ? ? MFP_ADDR(DF_IO5, 0x0268), - ? ? ? MFP_ADDR(DF_IO6, 0x026c), - ? ? ? MFP_ADDR(DF_IO7, 0x0270), - ? ? ? MFP_ADDR(DF_IO8, 0x0274), - ? ? ? MFP_ADDR(DF_IO9, 0x0278), - ? ? ? MFP_ADDR(DF_IO10, 0x027c), - ? ? ? MFP_ADDR(DF_IO11, 0x0280), - ? ? ? MFP_ADDR(DF_IO12, 0x0284), - ? ? ? MFP_ADDR(DF_IO13, 0x0288), - ? ? ? MFP_ADDR(DF_IO14, 0x028c), - ? ? ? MFP_ADDR(DF_IO15, 0x0290), - - ? ? ? MFP_ADDR(GSIM_UIO, 0x0314), - ? ? ? MFP_ADDR(GSIM_UCLK, 0x0318), - ? ? ? MFP_ADDR(GSIM_UDET, 0x031c), - ? ? ? MFP_ADDR(GSIM_nURST, 0x0320), - - ? ? ? MFP_ADDR(PMIC_INT, 0x06c8), - - ? ? ? MFP_ADDR(RDY, 0x0200), - - ? ? ? MFP_ADDR_END, -}; - -static struct mfp_addr_map pxa935_mfp_addr_map[]__initdata = { - ? ? ? MFP_ADDR(GPIO159, 0x0524), - ? ? ? MFP_ADDR(GPIO163, 0x0534), - ? ? ? MFP_ADDR(GPIO167, 0x0544), - ? ? ? MFP_ADDR(GPIO168, 0x0548), - ? ? ? MFP_ADDR(GPIO169, 0x054c), - ? ? ? MFP_ADDR(GPIO170, 0x0550), - ? ? ? MFP_ADDR(GPIO171, 0x0554), - ? ? ? MFP_ADDR(GPIO172, 0x0558), - ? ? ? MFP_ADDR(GPIO173, 0x055c), - - ? ? ? MFP_ADDR_END, -}; - -static int __init pxa930_init (void ) -{ - ? ? ? if (cpu_is_pxa930() || cpu_is_pxa935() || cpu_is_pxa950()) { - ? ? ? ? ? ? ? mfp_init_base(io_p2v(MFPR_BASE)); - ? ? ? ? ? ? ? mfp_init_addr(pxa930_mfp_addr_map); - ? ? ? } - - ? ? ? if (cpu_is_pxa935()) - ? ? ? ? ? ? ? mfp_init_addr(pxa935_mfp_addr_map); - - ? ? ? return 0; -} - -core_initcall (pxa930_init);arch/arm/mach-pxa/pxa93x.c new file +220
-0@@ -0,0 +1,471 @@ +/* +* linux/arch/arm/mach-pxa/pxa93x.c +* +* code specific to pxa93x aka Tavor +* +* Copyright (C) 2006 Marvell International Ltd. +* +* 2007-09-02: eric miao <[email protected]> +* ? ? ? ? ? ? initial version +* +* 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/init.h> +#include <linux/pm.h> +#include <linux/platform_device.h> +#include <linux/irq.h> +#include <linux/io.h> +#include <linux/sysdev.h> + +#include <mach/hardware.h> +#include <mach/gpio.h> +#include <mach/pxa3xx-regs.h> +#include <mach/pxa930.h> +#include <mach/reset.h> +#include <mach/pm.h> +#include <mach/dma.h> +#include <mach/regs-intc.h> +#include <plat/i2c.h> + +#include "generic.h" +#include "devices.h" +#include "clock.h" + +/* Crystal clock: 13MHz */ +#define BASE_CLK ? ? ? 13000000 + +/* Ring Oscillator Clock: 60MHz */ +#define RO_CLK ? ? ? ? 60000000 + +#define ACCR_D0CS ? ? ?(1 << 26) +#define ACCR_PCCE ? ? ?(1 << 11) + +#define PECR_IE (n) ? ? ((1 << ((n) * 2)) << 28) +#define PECR_IS (n) ? ? ((1 << ((n) * 2)) << 29) + +/* crystal frequency to HSIO bus frequency multiplier (HSS) */ +static unsigned char hss_mult[4 ] = {8 ,12 ,16 ,24 }; + +static struct mfp_addr_map pxa930_mfp_addr_map[]__initdata = { + + ? ? ? MFP_ADDR(GPIO0, 0x02e0), + ? ? ? MFP_ADDR(GPIO1, 0x02dc), + ? ? ? MFP_ADDR(GPIO2, 0x02e8), + ? ? ? MFP_ADDR(GPIO3, 0x02d8), + ? ? ? MFP_ADDR(GPIO4, 0x02e4), + ? ? ? MFP_ADDR(GPIO5, 0x02ec), + ? ? ? MFP_ADDR(GPIO6, 0x02f8), + ? ? ? MFP_ADDR(GPIO7, 0x02fc), + ? ? ? MFP_ADDR(GPIO8, 0x0300), + ? ? ? MFP_ADDR(GPIO9, 0x02d4), + ? ? ? MFP_ADDR(GPIO10, 0x02f4), + ? ? ? MFP_ADDR(GPIO11, 0x02f0), + ? ? ? MFP_ADDR(GPIO12, 0x0304), + ? ? ? MFP_ADDR(GPIO13, 0x0310), + ? ? ? MFP_ADDR(GPIO14, 0x0308), + ? ? ? MFP_ADDR(GPIO15, 0x030c), + ? ? ? MFP_ADDR(GPIO16, 0x04e8), + ? ? ? MFP_ADDR(GPIO17, 0x04f4), + ? ? ? MFP_ADDR(GPIO18, 0x04f8), + ? ? ? MFP_ADDR(GPIO19, 0x04fc), + ? ? ? MFP_ADDR(GPIO20, 0x0518), + ? ? ? MFP_ADDR(GPIO21, 0x051c), + ? ? ? MFP_ADDR(GPIO22, 0x04ec), + ? ? ? MFP_ADDR(GPIO23, 0x0500), + ? ? ? MFP_ADDR(GPIO24, 0x04f0), + ? ? ? MFP_ADDR(GPIO25, 0x0504), + ? ? ? MFP_ADDR(GPIO26, 0x0510), + ? ? ? MFP_ADDR(GPIO27, 0x0514), + ? ? ? MFP_ADDR(GPIO28, 0x0520), + ? ? ? MFP_ADDR(GPIO29, 0x0600), + ? ? ? MFP_ADDR(GPIO30, 0x0618), + ? ? ? MFP_ADDR(GPIO31, 0x0610), + ? ? ? MFP_ADDR(GPIO32, 0x060c), + ? ? ? MFP_ADDR(GPIO33, 0x061c), + ? ? ? MFP_ADDR(GPIO34, 0x0620), + ? ? ? MFP_ADDR(GPIO35, 0x0628), + ? ? ? MFP_ADDR(GPIO36, 0x062c), + ? ? ? MFP_ADDR(GPIO37, 0x0630), + ? ? ? MFP_ADDR(GPIO38, 0x0634), + ? ? ? MFP_ADDR(GPIO39, 0x0638), + ? ? ? MFP_ADDR(GPIO40, 0x063c), + ? ? ? MFP_ADDR(GPIO41, 0x0614), + ? ? ? MFP_ADDR(GPIO42, 0x0624), + ? ? ? MFP_ADDR(GPIO43, 0x0608), + ? ? ? MFP_ADDR(GPIO44, 0x0604), + ? ? ? MFP_ADDR(GPIO45, 0x050c), + ? ? ? MFP_ADDR(GPIO46, 0x0508), + ? ? ? MFP_ADDR(GPIO47, 0x02bc), + ? ? ? MFP_ADDR(GPIO48, 0x02b4), + ? ? ? MFP_ADDR(GPIO49, 0x02b8), + ? ? ? MFP_ADDR(GPIO50, 0x02c8), + ? ? ? MFP_ADDR(GPIO51, 0x02c0), + ? ? ? MFP_ADDR(GPIO52, 0x02c4), + ? ? ? MFP_ADDR(GPIO53, 0x02d0), + ? ? ? MFP_ADDR(GPIO54, 0x02cc), + ? ? ? MFP_ADDR(GPIO55, 0x029c), + ? ? ? MFP_ADDR(GPIO56, 0x02a0), + ? ? ? MFP_ADDR(GPIO57, 0x0294), + ? ? ? MFP_ADDR(GPIO58, 0x0298), + ? ? ? MFP_ADDR(GPIO59, 0x02a4), + ? ? ? MFP_ADDR(GPIO60, 0x02a8), + ? ? ? MFP_ADDR(GPIO61, 0x02b0), + ? ? ? MFP_ADDR(GPIO62, 0x02ac), + ? ? ? MFP_ADDR(GPIO63, 0x0640), + ? ? ? MFP_ADDR(GPIO64, 0x065c), + ? ? ? MFP_ADDR(GPIO65, 0x0648), + ? ? ? MFP_ADDR(GPIO66, 0x0644), + ? ? ? MFP_ADDR(GPIO67, 0x0674), + ? ? ? MFP_ADDR(GPIO68, 0x0658), + ? ? ? MFP_ADDR(GPIO69, 0x0654), + ? ? ? MFP_ADDR(GPIO70, 0x0660), + ? ? ? MFP_ADDR(GPIO71, 0x0668), + ? ? ? MFP_ADDR(GPIO72, 0x0664), + ? ? ? MFP_ADDR(GPIO73, 0x0650), + ? ? ? MFP_ADDR(GPIO74, 0x066c), + ? ? ? MFP_ADDR(GPIO75, 0x064c), + ? ? ? MFP_ADDR(GPIO76, 0x0670), + ? ? ? MFP_ADDR(GPIO77, 0x0678), + ? ? ? MFP_ADDR(GPIO78, 0x067c), + ? ? ? MFP_ADDR(GPIO79, 0x0694), + ? ? ? MFP_ADDR(GPIO80, 0x069c), + ? ? ? MFP_ADDR(GPIO81, 0x06a0), + ? ? ? MFP_ADDR(GPIO82, 0x06a4), + ? ? ? MFP_ADDR(GPIO83, 0x0698), + ? ? ? MFP_ADDR(GPIO84, 0x06bc), + ? ? ? MFP_ADDR(GPIO85, 0x06b4), + ? ? ? MFP_ADDR(GPIO86, 0x06b0), + ? ? ? MFP_ADDR(GPIO87, 0x06c0), + ? ? ? MFP_ADDR(GPIO88, 0x06c4), + ? ? ? MFP_ADDR(GPIO89, 0x06ac), + ? ? ? MFP_ADDR(GPIO90, 0x0680), + ? ? ? MFP_ADDR(GPIO91, 0x0684), + ? ? ? MFP_ADDR(GPIO92, 0x0688), + ? ? ? MFP_ADDR(GPIO93, 0x0690), + ? ? ? MFP_ADDR(GPIO94, 0x068c), + ? ? ? MFP_ADDR(GPIO95, 0x06a8), + ? ? ? MFP_ADDR(GPIO96, 0x06b8), + ? ? ? MFP_ADDR(GPIO97, 0x0410), + ? ? ? MFP_ADDR(GPIO98, 0x0418), + ? ? ? MFP_ADDR(GPIO99, 0x041c), + ? ? ? MFP_ADDR(GPIO100, 0x0414), + ? ? ? MFP_ADDR(GPIO101, 0x0408), + ? ? ? MFP_ADDR(GPIO102, 0x0324), + ? ? ? MFP_ADDR(GPIO103, 0x040c), + ? ? ? MFP_ADDR(GPIO104, 0x0400), + ? ? ? MFP_ADDR(GPIO105, 0x0328), + ? ? ? MFP_ADDR(GPIO106, 0x0404), + + ? ? ? MFP_ADDR(nXCVREN, 0x0204), + ? ? ? MFP_ADDR(DF_CLE_nOE, 0x020c), + ? ? ? MFP_ADDR(DF_nADV1_ALE, 0x0218), + ? ? ? MFP_ADDR(DF_SCLK_E, 0x0214), + ? ? ? MFP_ADDR(DF_SCLK_S, 0x0210), + ? ? ? MFP_ADDR(nBE0, 0x021c), + ? ? ? MFP_ADDR(nBE1, 0x0220), + ? ? ? MFP_ADDR(DF_nADV2_ALE, 0x0224), + ? ? ? MFP_ADDR(DF_INT_RnB, 0x0228), + ? ? ? MFP_ADDR(DF_nCS0, 0x022c), + ? ? ? MFP_ADDR(DF_nCS1, 0x0230), + ? ? ? MFP_ADDR(nLUA, 0x0254), + ? ? ? MFP_ADDR(nLLA, 0x0258), + ? ? ? MFP_ADDR(DF_nWE, 0x0234), + ? ? ? MFP_ADDR(DF_nRE_nOE, 0x0238), + ? ? ? MFP_ADDR(DF_ADDR0, 0x024c), + ? ? ? MFP_ADDR(DF_ADDR1, 0x0250), + ? ? ? MFP_ADDR(DF_ADDR2, 0x025c), + ? ? ? MFP_ADDR(DF_ADDR3, 0x0260), + ? ? ? MFP_ADDR(DF_IO0, 0x023c), + ? ? ? MFP_ADDR(DF_IO1, 0x0240), + ? ? ? MFP_ADDR(DF_IO2, 0x0244), + ? ? ? MFP_ADDR(DF_IO3, 0x0248), + ? ? ? MFP_ADDR(DF_IO4, 0x0264), + ? ? ? MFP_ADDR(DF_IO5, 0x0268), + ? ? ? MFP_ADDR(DF_IO6, 0x026c), + ? ? ? MFP_ADDR(DF_IO7, 0x0270), + ? ? ? MFP_ADDR(DF_IO8, 0x0274), + ? ? ? MFP_ADDR(DF_IO9, 0x0278), + ? ? ? MFP_ADDR(DF_IO10, 0x027c), + ? ? ? MFP_ADDR(DF_IO11, 0x0280), + ? ? ? MFP_ADDR(DF_IO12, 0x0284), + ? ? ? MFP_ADDR(DF_IO13, 0x0288), + ? ? ? MFP_ADDR(DF_IO14, 0x028c), + ? ? ? MFP_ADDR(DF_IO15, 0x0290), + + ? ? ? MFP_ADDR(GSIM_UIO, 0x0314), + ? ? ? MFP_ADDR(GSIM_UCLK, 0x0318), + ? ? ? MFP_ADDR(GSIM_UDET, 0x031c), + ? ? ? MFP_ADDR(GSIM_nURST, 0x0320), + + ? ? ? MFP_ADDR(PMIC_INT, 0x06c8), + + ? ? ? MFP_ADDR(RDY, 0x0200), + + ? ? ? MFP_ADDR_END, +}; + +static struct mfp_addr_map pxa935_mfp_addr_map[]__initdata = { + ? ? ? MFP_ADDR(GPIO159, 0x0524), + ? ? ? MFP_ADDR(GPIO163, 0x0534), + ? ? ? MFP_ADDR(GPIO167, 0x0544), + ? ? ? MFP_ADDR(GPIO168, 0x0548), + ? ? ? MFP_ADDR(GPIO169, 0x054c), + ? ? ? MFP_ADDR(GPIO170, 0x0550), + ? ? ? MFP_ADDR(GPIO171, 0x0554), + ? ? ? MFP_ADDR(GPIO172, 0x0558),
arch/arm/mach-pxa/pxa93x.c line 230
Quoted 10 lines
arch/arm/mach-pxa/pxa93x.c new file +10
-0+ ? ? ? MFP_ADDR(GPIO173, 0x055c), + + ? ? ? MFP_ADDR_END, +}; + +void pxa93x_clear_reset_status (unsigned int mask) +{ + ? ? ? /* RESET_STATUS_* has a 1:1 mapping with ARSR */ + ? ? ? ARSR = mask; +}
This is not necessary now.
Quoted 6 lines
arch/arm/mach-pxa/pxa93x.c new file +6
-0+ +/* +* Return the current HSIO bus clock frequency +*/ +static unsigned long clk_pxa93x_hsio_getrate (struct clk *clk) +{
arch/arm/mach-pxa/pxa93x.c line 246
Quoted 10 lines
arch/arm/mach-pxa/pxa93x.c new file +10
-0+ ? ? ? unsigned long acsr; + ? ? ? unsigned int hss, hsio_clk; + + ? ? ? acsr = ACSR; + + ? ? ? hss = (acsr >> 14) & 0x3; + ? ? ? hsio_clk = (acsr & ACCR_D0CS) ? RO_CLK : hss_mult[hss] * BASE_CLK; + + ? ? ? return hsio_clk; +}
Provided that the AP side is exactly same as PXA3xx, I'm still not convinced that PXA93x should be separated as a family.
Quoted 310 lines
arch/arm/mach-pxa/pxa93x.c new file +225
-0+ +void clk_pxa93x_cken_enable(struct clk *clk) +{ + ? ? ? unsigned long mask = 1ul << (clk->cken & 0x1f); + + ? ? ? if (clk->cken < 32) + ? ? ? ? ? ? ? CKENA |= mask; + ? ? ? else + ? ? ? ? ? ? ? CKENB |= mask; +} + +void clk_pxa93x_cken_disable(struct clk *clk) +{ + ? ? ? unsigned long mask = 1ul << (clk->cken & 0x1f); + + ? ? ? if (clk->cken < 32) + ? ? ? ? ? ? ? CKENA &= ~mask; + ? ? ? else + ? ? ? ? ? ? ? CKENB &= ~mask; +} + +const struct clkops clk_pxa93x_cken_ops = { + ? ? ? .enable ? ? ? ? = clk_pxa93x_cken_enable, + ? ? ? .disable ? ? ? ?= clk_pxa93x_cken_disable, +}; + +static const struct clkops clk_pxa93x_hsio_ops = { + ? ? ? .enable ? ? ? ? = clk_pxa93x_cken_enable, + ? ? ? .disable ? ? ? ?= clk_pxa93x_cken_disable, + ? ? ? .getrate ? ? ? ?= clk_pxa93x_hsio_getrate, +}; + +static void clk_pout_enable(struct clk *clk) +{ + ? ? ? OSCC |= OSCC_PEN; +} + +static void clk_pout_disable(struct clk *clk) +{ + ? ? ? OSCC &= ~OSCC_PEN; +} + +static const struct clkops clk_pout_ops = { + ? ? ? .enable ? ? ? ? = clk_pout_enable, + ? ? ? .disable ? ? ? ?= clk_pout_disable, +}; + +static void clk_dummy_enable(struct clk *clk) +{ +} + +static void clk_dummy_disable(struct clk *clk) +{ +} + +static const struct clkops clk_dummy_ops = { + ? ? ? .enable ? ? ? ? = clk_dummy_enable, + ? ? ? .disable ? ? ? ?= clk_dummy_disable, +}; + +static struct clk clk_pxa93x_pout = { + ? ? ? .ops ? ? ? ? ? ?= &clk_pout_ops, + ? ? ? .rate ? ? ? ? ? = 13000000, + ? ? ? .delay ? ? ? ? ?= 70, +}; + +static struct clk clk_dummy = { + ? ? ? .ops ? ? ? ? ? ?= &clk_dummy_ops, +}; + +static DEFINE_PXA93_CK(pxa93x_lcd, LCD, &clk_pxa93x_hsio_ops); +static DEFINE_PXA93_CK(pxa93x_camera, CAMERA, &clk_pxa93x_hsio_ops); +static DEFINE_PXA93_CKEN(pxa93x_ffuart, FFUART, 14857000, 1); +static DEFINE_PXA93_CKEN(pxa93x_btuart, BTUART, 14857000, 1); +static DEFINE_PXA93_CKEN(pxa93x_stuart, STUART, 14857000, 1); +static DEFINE_PXA93_CKEN(pxa93x_i2c, I2C, 32842000, 0); +static DEFINE_PXA93_CKEN(pxa93x_keypad, KEYPAD, 32768, 0); +static DEFINE_PXA93_CKEN(pxa93x_ssp1, SSP1, 13000000, 0); +static DEFINE_PXA93_CKEN(pxa93x_ssp2, SSP2, 13000000, 0); +static DEFINE_PXA93_CKEN(pxa93x_ssp3, SSP3, 13000000, 0); +static DEFINE_PXA93_CKEN(pxa93x_ssp4, SSP4, 13000000, 0); +static DEFINE_PXA93_CKEN(pxa93x_pwm0, PWM0, 13000000, 0); +static DEFINE_PXA93_CKEN(pxa93x_pwm1, PWM1, 13000000, 0); +static DEFINE_PXA93_CKEN(pxa93x_mmc1, MMC1, 19500000, 0); +static DEFINE_PXA93_CKEN(pxa93x_mmc2, MMC2, 19500000, 0); + +static struct clk_lookup pxa93x_clkregs[] = { + ? ? ? INIT_CLKREG(&clk_pxa93x_pout, NULL, "CLK_POUT"), + ? ? ? /* Power I2C clock is always on */ + ? ? ? INIT_CLKREG(&clk_dummy, "pxa3xx-pwri2c.1", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_lcd, "pxa2xx-fb", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_camera, NULL, "CAMCLK"), + ? ? ? INIT_CLKREG(&clk_pxa93x_ffuart, "pxa2xx-uart.0", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_btuart, "pxa2xx-uart.1", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_stuart, "pxa2xx-uart.2", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_stuart, "pxa2xx-ir", "UARTCLK"), + ? ? ? INIT_CLKREG(&clk_pxa93x_i2c, "pxa2xx-i2c.0", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_keypad, "pxa27x-keypad", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_ssp1, "pxa27x-ssp.0", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_ssp2, "pxa27x-ssp.1", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_ssp3, "pxa27x-ssp.2", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_ssp4, "pxa27x-ssp.3", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_pwm0, "pxa27x-pwm.0", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_pwm1, "pxa27x-pwm.1", NULL), +}; + +static struct clk_lookup pxa930_clkregs[] = { + ? ? ? INIT_CLKREG(&clk_pxa93x_mmc1, "pxa2xx-mci.0", NULL), + ? ? ? INIT_CLKREG(&clk_pxa93x_mmc2, "pxa2xx-mci.1", NULL), +}; + +static void pxa_ack_ext_wakeup(unsigned int irq) +{ + ? ? ? PECR |= PECR_IS(irq - IRQ_WAKEUP0); +} + +static void pxa_mask_ext_wakeup(unsigned int irq) +{ + ? ? ? ICMR2 &= ~(1 << ((irq - PXA_IRQ(0)) & 0x1f)); + ? ? ? PECR &= ~PECR_IE(irq - IRQ_WAKEUP0); +} + +static void pxa_unmask_ext_wakeup(unsigned int irq) +{ + ? ? ? ICMR2 |= 1 << ((irq - PXA_IRQ(0)) & 0x1f); + ? ? ? PECR |= PECR_IE(irq - IRQ_WAKEUP0); +} + +static int pxa_set_ext_wakeup_type(unsigned int irq, unsigned int flow_type) +{ + ? ? ? if (flow_type & IRQ_TYPE_EDGE_RISING) + ? ? ? ? ? ? ? PWER |= 1 << (irq - IRQ_WAKEUP0); + + ? ? ? if (flow_type & IRQ_TYPE_EDGE_FALLING) + ? ? ? ? ? ? ? PWER |= 1 << (irq - IRQ_WAKEUP0 + 2); + + ? ? ? return 0; +} + +static struct irq_chip pxa_ext_wakeup_chip = { + ? ? ? .name ? ? ? ? ? = "WAKEUP", + ? ? ? .ack ? ? ? ? ? ?= pxa_ack_ext_wakeup, + ? ? ? .mask ? ? ? ? ? = pxa_mask_ext_wakeup, + ? ? ? .unmask ? ? ? ? = pxa_unmask_ext_wakeup, + ? ? ? .set_type ? ? ? = pxa_set_ext_wakeup_type, +}; + +static void __init pxa_init_ext_wakeup_irq(set_wake_t fn) +{ + ? ? ? set_irq_chip(IRQ_WAKEUP0, &pxa_ext_wakeup_chip); + ? ? ? set_irq_handler(IRQ_WAKEUP0, handle_edge_irq); + ? ? ? set_irq_flags(IRQ_WAKEUP0, IRQF_VALID); + + ? ? ? pxa_ext_wakeup_chip.set_wake = fn; +} + +void __init pxa93x_init_irq(void) +{ + ? ? ? /* enable CP6 access */ + ? ? ? u32 value; + ? ? ? __asm__ __volatile__("mrc p15, 0, %0, c15, c1, 0\n": "=r"(value)); + ? ? ? value |= (1 << 6); + ? ? ? __asm__ __volatile__("mcr p15, 0, %0, c15, c1, 0\n": :"r"(value)); + + ? ? ? pxa_init_irq(96, NULL); + ? ? ? pxa_init_ext_wakeup_irq(NULL); + ? ? ? pxa_init_gpio(IRQ_GPIO_2_x, 2, 127, NULL); +} + +/* + * device registration specific to PXA93x. + */ + +void __init pxa93x_set_i2c_power_info(struct i2c_pxa_platform_data *info) +{ + ? ? ? pxa_register_device(&pxa3xx_device_i2c_power, info); +} + +static struct platform_device *devices[] __initdata = { + ? ? ? &sa1100_device_rtc, + ? ? ? &pxa_device_rtc, + ? ? ? &pxa27x_device_ssp1, + ? ? ? &pxa27x_device_ssp2, + ? ? ? &pxa27x_device_ssp3, + ? ? ? &pxa3xx_device_ssp4, + ? ? ? &pxa27x_device_pwm0, + ? ? ? &pxa27x_device_pwm1, +}; + +static int __init pxa93x_init(void) +{ + ? ? ? int ret = 0; + + ? ? ? if (cpu_is_pxa93x()) { + ? ? ? ? ? ? ? mfp_init_base(io_p2v(MFPR_BASE)); + ? ? ? ? ? ? ? mfp_init_addr(pxa930_mfp_addr_map); + + ? ? ? ? ? ? ? if (cpu_is_pxa935()) + ? ? ? ? ? ? ? ? ? ? ? mfp_init_addr(pxa935_mfp_addr_map); + + ? ? ? ? ? ? ? reset_status = ARSR; + + ? ? ? ? ? ? ? /* + ? ? ? ? ? ? ? ?* clear RDH bit every time after reset + ? ? ? ? ? ? ? ?* + ? ? ? ? ? ? ? ?* Note: the last 3 bits DxS are write-1-to-clear so carefully + ? ? ? ? ? ? ? ?* preserve them here in case they will be referenced later + ? ? ? ? ? ? ? ?*/ + ? ? ? ? ? ? ? ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S); + + ? ? ? ? ? ? ? clkdev_add_table(pxa93x_clkregs, ARRAY_SIZE(pxa93x_clkregs)); + ? ? ? ? ? ? ? if (cpu_is_pxa930()) + ? ? ? ? ? ? ? ? ? ? ? clkdev_add_table(pxa930_clkregs, + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ARRAY_SIZE(pxa930_clkregs)); + + ? ? ? ? ? ? ? if ((ret = pxa_init_dma(IRQ_DMA, 32))) + ? ? ? ? ? ? ? ? ? ? ? return ret; + + ? ? ? ? ? ? ? ret = platform_add_devices(devices, ARRAY_SIZE(devices)); + ? ? ? } + + ? ? ? return ret; +} + +postcore_initcall(pxa93x_init);arch/arm/mach-pxa/saar.c +0
-0@@ -598,7 +598,7 @@ MACHINE_START(SAAR, "PXA930 Handheld Platform (aka SAAR)")? ? ? ?/* Maintainer: Eric Miao <[email protected]> */ ? ? ? ?.boot_params ? ?=
0xa0000100,
? ? ? ?.map_io ? ? ? ? =pxa3xx_map_io,
- ? ? ? .init_irq ? ? ? =pxa3xx_init_irq,
+ ? ? ? .init_irq ? ? ? =pxa93x_init_irq,
? ? ? ?.timer ? ? ? ? ?=&pxa_timer,
? ? ? ?.init_machine ? =saar_init,
?MACHINE_ENDarch/arm/mach-pxa/smemc.c +4
-6@@ -59,13 +59,11 @@ static int __init smemc_init(void) ?{ ? ? ? ?int ret = 0; - ? ? ? if (cpu_is_pxa3xx()) { - ? ? ? ? ? ? ? ret = sysdev_class_register(&smemc_sysclass); - ? ? ? ? ? ? ? if (ret) - ? ? ? ? ? ? ? ? ? ? ? return ret; + ? ? ? ret = sysdev_class_register(&smemc_sysclass); + ? ? ? if (ret) + ? ? ? ? ? ? ? return ret; - ? ? ? ? ? ? ? ret = sysdev_register(&smemc_sysdev); - ? ? ? } + ? ? ? ret = sysdev_register(&smemc_sysdev); ? ? ? ?return ret; ?}arch/arm/mach-pxa/tavorevb.c +0
-0@@ -491,7 +491,7 @@ MACHINE_START(TAVOREVB, "PXA930 Evaluation Board (aka TavorEVB)")? ? ? ?/* Maintainer: Eric Miao <[email protected]> */ ? ? ? ?.boot_params ? ?=
0xa0000100,
? ? ? ?.map_io ? ? ? ? =pxa3xx_map_io,
- ? ? ? .init_irq ? ? ? =pxa3xx_init_irq,
+ ? ? ? .init_irq ? ? ? =pxa93x_init_irq,
? ? ? ?.timer ? ? ? ? ?=&pxa_timer,
? ? ? ?.init_machine ? =tavorevb_init, ?MACHINE_ENDarch/arm/plat-pxa/Makefile +0
-0@@ -6,6 +6,7 @@ obj-y ? := dma.o?obj-$(CONFIG_GENERIC_GPIO) ? ? += gpio.o
?obj-$(CONFIG_PXA3xx) ? ? ? ? ? += mfp.o
+obj-$(CONFIG_PXA93x) ? ? ? ? ? += mfp.o
?obj-$(CONFIG_ARCH_MMP) ? ? ? ? += mfp.o?obj-$(CONFIG_HAVE_PWM) ? ? ? ? += pwm.o
arch/arm/plat-pxa/include/plat/mfp.h +1
-1@@ -423,7 +423,7 @@ typedef unsigned long mfp_cfg_t; ? ? ? ?((MFP_CFG_DEFAULT & ~(MFP_AF_MASK | MFP_DS_MASK | MFP_LPM_STATE_MASK)) |\ ? ? ? ? (MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_##drv | MFP_LPM_##lpm)) -#if defined(CONFIG_PXA3xx) || defined(CONFIG_ARCH_MMP ) +#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA93x) || defined(CONFIG_ARCH_MMP )?/*
?* each MFP pin will have a MFPR register, since the offset of the ?* register varies between processors, the processor specific codearch/arm/plat-pxa/include/plat/mfp.h +1
-1@@ -470,6 +470,6 @@ void mfp_write(int mfp, unsigned long mfpr_val); ?void mfp_config(unsigned long *mfp_cfgs, int num); ?void mfp_config_run(void); ?void mfp_config_lpm(void); -#endif /* CONFIG_PXA3xx || CONFIG_ARCH_MMP */ +#endif /* CONFIG_PXA3xx || CONFIG_PXA93x || CONFIG_ARCH_MMP */ ?#endif /*
__ASM_PLAT_MFP_H*/
--
1.5.6.5
PATCH 3/11 ARM: pxa: split pxa93x from pxa3xx
Quoted 13 lines
-----Original Message-----
From: Eric Miao [mailto:eric.y.miao at gmail.com]
Sent: 2010?11?12? 4:08 PM
To: Haojian Zhuang
Cc: linux-arm-kernel at lists.infradead.org
Subject: Re: [PATCH 03/11] ARM: pxa: split pxa93x from pxa3xxQuoted 2 lines · Haojian Zhuang
In order to avoid confusion, seperate pxa93x from pxa3xx.
Quoted 10 lines
arch/arm/mach-pxa/pxa93x.c line 230
Quoted 7 lines
Signed-off-by Haojian Zhuang <[email protected]>Cc Eric Miao <[email protected]>arch/arm/mach-pxa/pxa93x.c new file +5
-0+void pxa93x_clear_reset_status (unsigned int mask) +{ + ? ? ? /* RESET_STATUS_* has a 1:1 mapping with ARSR */ + ? ? ? ARSR = mask; +}This is not necessary now.
Thanks. It's fixed now.
Quoted 11 lines
Quoted 11 lines
arch/arm/mach-pxa/pxa93x.c new file +11
-0+ +/* +* Return the current HSIO bus clock frequency +*/ +static unsigned long clk_pxa93x_hsio_getrate (struct clk *clk) +{ + ? ? ? unsigned long acsr; + ? ? ? unsigned int hss, hsio_clk; + + ? ? ? acsr = ACSR; +
Quoted 9 lines
arch/arm/mach-pxa/clock.h extern void clk_pxa3xx_cken_enable(struct clk *); · line 83
Quoted 5 lines
+ ? ? ? hss = (acsr >> 14) &
0x3;
+ ? ? ?hsio_clk= (acsr &ACCR_D0CS) ?RO_CLK: hss_mult[hss] *BASE_CLK;arch/arm/mach-pxa/clock.h +3
-0+ + ? ? ? return hsio_clk; +}Provided that the AP side is exactly same as PXA3xx, I'm still not convinced that PXA93x should be separated as a family.
Yes, HSIO is nearly same. But DVFM operation is different. And using separated file can avoid too much cpu id checking.
Changelog:
1. Remove pxa93x_clear_reset_status() implementation in pxa93x.c
2. Remove pxa93x_clear_reset_status() definition in generic.h
Thanks
Haojian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0003-ARM-pxa-split-pxa93x-from-pxa3xx.patch
Type: application/octet-stream
Size: 29158 bytes
Desc: 0003-ARM-pxa-split-pxa93x-from-pxa3xx.patch
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101112/2c788260/attachment-0001.obj>
Eric Miao
AppliedPATCH 2/11 ARM: pxa: redefine irqs.h
In reply to Haojian ZhuangQuoted 10 lines · Haojian Zhuang
A lot of componets of PXA93x are shared with PXA3xx. From CPUID, they belong to same family. But it's confustion that code of PXA93x is depend on PXA3xx by default.
Now clean the scope of both PXA3xx and PXA93X. Only PXA300/PXA310/PXA320 is family member of PXA3xx. Only PXA930/PXA935 is family member of PXA93x. Remove the code dependany on IRQ definition.
Signed-off-by Haojian Zhuang <[email protected]>Cc Eric Miao <[email protected]>
Applied.
Quoted 153 lines
---
?arch/arm/mach-pxa/include/mach/irqs.h | ? 47 ++++++++++----------------------- ?arch/arm/mach-pxa/irq.c ? ? ? ? ? ? ? | ? 11 +++++--
?2 files changed, 22 insertions(+), 36 deletions(-)arch/arm/mach-pxa/include/mach/irqs.h +0
-1@@ -21,16 +21,14 @@ ?#define PXA_IRQ(x) ? ? (PXA_ISA_IRQ_NUM + (x)) -#if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)?#define
IRQ_SSP3? ? ?PXA_IRQ(0)? ? ?/* SSP3 service request */ ?#defineIRQ_MSL? ? ? ? ? ? ? ?PXA_IRQ(1) ? ? ?/* MSL Interface interrupt */arch/arm/mach-pxa/include/mach/irqs.h +2
-2-#define IRQ_USBH2 ? ? ?PXA_IRQ(2) ? ? ?/* USB Host interrupt 1 (OHCI) */ -#define IRQ_USBH1 ? ? ?PXA_IRQ(3) ? ? ?/* USB Host interrupt 2 (non-OHCI) */ +#define IRQ_USBH2 ? ? ?PXA_IRQ(2) ? ? ?/* USB Host interrupt 1 (OHCI,PXA27x) */ +#define IRQ_USBH1 ? ? ?PXA_IRQ(3) ? ? ?/* USB Host interrupt 2 (non-OHCI,PXA27x) */ ?#define
IRQ_KEYPAD? ?PXA_IRQ(4)? ? ?/* Key pad controller */arch/arm/mach-pxa/include/mach/irqs.h +2
-1-#define IRQ_MEMSTK ? ? PXA_IRQ(5) ? ? ?/* Memory Stick interrupt */ +#define IRQ_MEMSTK ? ? PXA_IRQ(5) ? ? ?/* Memory Stick interrupt (PXA27x) */ +#define IRQ_ACIPC0 ? ? PXA_IRQ(5) ? ? ?/* AP-CP Communication (PXA930) */ ?#define
IRQ_PWRI2C? ?PXA_IRQ(6)? ? ?/* Power I2C interrupt */arch/arm/mach-pxa/include/mach/irqs.h +0
-2-#endif -?#define
IRQ_HWUART? ?PXA_IRQ(7)? ? ?/* HWUART Transmit/Receive/Error (PXA26x) */ ?#defineIRQ_OST_4_11?PXA_IRQ(7)? ? ?/* OS timer 4-11 matches (PXA27x) */ ?#define ? ? ? ?IRQ_GPIO0 ? ? ?PXA_IRQ(8)? ? ?/* GPIO0 Edge Detect */arch/arm/mach-pxa/include/mach/irqs.h +0
-0@@ -38,7 +36,8 @@?#define ? ? ? ?IRQ_GPIO_2_x ? ?PXA_IRQ(10) ? ? /* GPIO[2-x] Edge Detect */ ?#define ? ? ? ?IRQ_USB ? ? ? ?
PXA_IRQ(11)? ? /* USB Service */ ?#define ? ? ? ?IRQ_PMU ? ? ? ?PXA_IRQ(12)? ? /* Performance Monitoring Unit */arch/arm/mach-pxa/include/mach/irqs.h +2
-1-#define ? ? ? ?IRQ_I2S ? ? ? ? PXA_IRQ(13) ? ? /* I2S Interrupt */ +#define ? ? ? ?IRQ_I2S ? ? ? ? PXA_IRQ(13) ? ? /* I2S Interrupt (PXA27x) */ +#define IRQ_SSP4 ? ? ? PXA_IRQ(13) ? ?/* SSP4 service request (PXA3xx) */ ?#define ? ? ? ?IRQ_AC97 ? ? ? ?PXA_IRQ(14) ? ? /* AC97 Interrupt */ ?#define
IRQ_ASSP? ? ?PXA_IRQ(15)? ? /* Audio SSP Service Request (PXA25x) */ ?#defineIRQ_USIM? ? ?PXA_IRQ(15)? ? /* Smart Card interface interrupt (PXA27x) */arch/arm/mach-pxa/include/mach/irqs.h +0
-0@@ -47,6 +46,7 @@?#define ? ? ? ?IRQ_LCD ? ? ? ?
PXA_IRQ(17)? ? /* LCD Controller Service Request */ ?#define ? ? ? ?IRQ_I2C ? ? ? ?PXA_IRQ(18)? ? /* I2C Service Request */ ?#define ? ? ? ?IRQ_ICP ? ? ? ?PXA_IRQ(19)? ? /* ICP Transmit/Receive/Error */ +#defineIRQ_ACIPC2? ?PXA_IRQ(19)? ? /* AP-CP Communication (PXA930) */ ?#define ? ? ? ?IRQ_STUART ? ? ?PXA_IRQ(20) ? ? /* STUART Transmit/Receive/Error */ ?#define ? ? ? ?IRQ_BTUART ? ? ?PXA_IRQ(21) ? ? /* BTUART Transmit/Receive/Error */ ?#define ? ? ? ?IRQ_FFUART ? ? ?PXA_IRQ(22) ? ? /* FFUART Transmit/Receive/Error*/arch/arm/mach-pxa/include/mach/irqs.h +0
-0@@ -60,19 +60,17 @@?#define ? ? ? ?IRQ_RTC1Hz ? ? ?PXA_IRQ(30) ? ? /* RTC HZ Clock Tick */ ?#define ? ? ? ?IRQ_RTCAlrm ? ?
PXA_IRQ(31)? ? /* RTC Alarm */-#if
defined(CONFIG_PXA27x)||defined(CONFIG_PXA3xx)?#defineIRQ_TPM? ? ? ? ? ? ? ?PXA_IRQ(32) ? ? /* TPM interrupt */ ?#defineIRQ_CAMERA? ?PXA_IRQ(33)? ? /* Camera Interface */arch/arm/mach-pxa/include/mach/irqs.h +0
-4-#endif - -#ifdef CONFIG_PXA3xx -#define IRQ_SSP4 ? ? ? PXA_IRQ(13) ? ?/* SSP4 service request */ ?#define
IRQ_CIR? ? ? ? ? ? ? ?PXA_IRQ(34) ? ? /* Consumer IR */ ?#defineIRQ_COMM_WDT?PXA_IRQ(35)? ? /* Comm WDT interrupt */ ?#defineIRQ_TSI? ? ? ? ? ? ? ?PXA_IRQ(36) ? ? /* Touch Screen Interface (PXA320) */ +#defineIRQ_ENHROT? ?PXA_IRQ(37)? ? /* Enhanced Rotary (PXA930) */ ?#defineIRQ_USIM2? ? ?PXA_IRQ(38) ? ? /* USIM2 Controller */arch/arm/mach-pxa/include/mach/irqs.h +2
-1-#define IRQ_GCU ? ? ? ? ? ? ? ?PXA_IRQ(39) ? ?/* Graphics Controller */ +#define IRQ_GCU ? ? ? ? ? ? ? ?PXA_IRQ(39) ? ?/* Graphics Controller (PXA3xx) */ +#define IRQ_ACIPC1 ? ? PXA_IRQ(40) ? ?/* AP-CP Communication (PXA930) */ ?#define
IRQ_MMC2? ? ?PXA_IRQ(41)? ? /* MMC2 Controller */ +#defineIRQ_TRKBALL? ?PXA_IRQ(43) ? ? /* Track Ball (PXA930) */ ?#defineIRQ_1WIRE? ? ?PXA_IRQ(44) ? ? /* 1-Wire Controller */ ?#defineIRQ_NAND? ? ?PXA_IRQ(45)? ? /* NAND Controller */ ?#defineIRQ_USB2? ? ?PXA_IRQ(46)? ? /* USB 2.0 Device Controller */arch/arm/mach-pxa/include/mach/irqs.h +0
-0@@ -80,30 +78,13 @@?#define
IRQ_WAKEUP1? ?PXA_IRQ(50) ? ? /*EXT_WAKEUP1*/ ?#defineIRQ_DMEMC? ? ?PXA_IRQ(51) ? ? /* Dynamic Memory Controller */ ?#defineIRQ_MMC3? ? ?PXA_IRQ(55)? ? /* MMC3 Controller (PXA310) */arch/arm/mach-pxa/include/mach/irqs.h +0
-2-#endif -#ifdef CONFIG_CPU_PXA935 ?#define
IRQ_U2O? ? ? ? ? ? ? ?PXA_IRQ(64) ? ? /* USB OTG 2.0 Controller (PXA935) */ ?#defineIRQ_U2H? ? ? ? ? ? ? ?PXA_IRQ(65) ? ? /* USB Host 2.0 Controller (PXA935) */arch/arm/mach-pxa/include/mach/irqs.h +3
-5- -#define IRQ_MMC3_PXA935 ? ? ? ?PXA_IRQ(72) ? ?/* MMC3 Controller (PXA935) */ -#define IRQ_MMC4_PXA935 ? ? ? ?PXA_IRQ(73) ? ?/* MMC4 Controller (PXA935) */ -#define IRQ_MMC5_PXA935 ? ? ? ?PXA_IRQ(74) ? ?/* MMC5 Controller (PXA935) */ - +#define IRQ_PXA935_MMC0 ? ? ? ?PXA_IRQ(72) ? ?/* MMC0 Controller (PXA935) */ +#define IRQ_PXA935_MMC1 ? ? ? ?PXA_IRQ(73) ? ?/* MMC1 Controller (PXA935) */ +#define IRQ_PXA935_MMC2 ? ? ? ?PXA_IRQ(74) ? ?/* MMC2 Controller (PXA935) */ ?#define
IRQ_U2P? ? ? ? ? ? ? ?PXA_IRQ(93) ? ? /* USB PHY D+/D- Lines (PXA935) */arch/arm/mach-pxa/include/mach/irqs.h +0
-13-#endif - -#ifdef CONFIG_CPU_PXA930 -#define IRQ_ENHROT ? ? PXA_IRQ(37) ? ?/* Enhanced Rotary (PXA930) */ -#define IRQ_ACIPC0 ? ? PXA_IRQ(5) -#define IRQ_ACIPC1 ? ? PXA_IRQ(40) -#define IRQ_ACIPC2 ? ? PXA_IRQ(19) -#define IRQ_TRKBALL ? ?PXA_IRQ(43) ? ?/* Track Ball */ -#endif - -#ifdef CONFIG_CPU_PXA950 -#define IRQ_GC500 ? ? ?PXA_IRQ(70) ? ?/* Graphics Controller (PXA950) */ -#endif ?#define
PXA_GPIO_IRQ_BASE? ? ?PXA_IRQ(96)
?#definePXA_GPIO_IRQ_NUM? ? ? (192)arch/arm/mach-pxa/irq.c +5
-0@@ -37,6 +37,11 @@ ?static int pxa_internal_irq_nr; +static inline int cpu_has_ipr (void ) +{ + ? ? ? return !cpu_is_pxa25x(); +} + ?static void pxa_mask_irq(unsigned int irq) ?{ ? ? ? ?_ICMR(irq) &= ~(1 << IRQ_BIT(irq));@@ -134,7 +139,7 @@ void __init pxa_init_irq(int irq_nr, set_wake_t fn) ? ? ? ?}? ? ? ?/* initialize interrupt priority */
- ? ? ? if (cpu_is_pxa27x()||cpu_is_pxa3xx()) {
+ ? ? ? if (cpu_has_ipr()) {
? ? ? ? ? ? ? ?for (i = 0; i <irq_nr; i++)
? ? ? ? ? ? ? ? ? ? ? ?IPR(i) = i | (1 << 31);
? ? ? ?}arch/arm/mach-pxa/irq.c +2
-3@@ -165,7 +170,7 @@ static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state) ? ? ? ? ? ? ? ?_ICMR(irq) = 0; ? ? ? ?} - ? ? ? if (cpu_is_pxa27x() || cpu_is_pxa3xx()) { + ? ? ? if (cpu_has_ipr()) { ? ? ? ? ? ? ? ?for (i = 0; i < pxa_internal_irq_nr; i++) ? ? ? ? ? ? ? ? ? ? ? ?saved_ipr[i] = IPR(i); ? ? ? ?}@@ -177,7 +182,7 @@ static int pxa_irq_resume(struct sys_device *dev) ?{ ? ? ? ?int i, irq = PXA_IRQ(0); - ? ? ? if (cpu_is_pxa27x() || cpu_is_pxa3xx()) { + ? ? ? if (cpu_has_ipr()) { ? ? ? ? ? ? ? ?for (i = 0; i < pxa_internal_irq_nr; i++) ? ? ? ? ? ? ? ? ? ? ? ?IPR(i) = saved_ipr[i]; ? ? ? ?} --1.5.6.5
Eric Miao
AppliedPATCH 1/11 ARM: pxa: redefine the cpu_is_pxa3xx
In reply to Haojian ZhuangQuoted 8 lines · Haojian Zhuang
PXA300/PXA310/PXA320/PXA930/PXA935 are sharing one cpu family id. It's a little confusion on
cpu_is_pxa3xx().Now reduce the scope of
cpu_is_pxa3xx(). Make it focusing on PXA300/PXA310/PXA320. PXA930/PXA935 is coverd bycpu_is_pxa93x().Signed-off-by Haojian Zhuang <[email protected]>Cc Eric Miao <[email protected]>
Applied.
Quoted 92 lines
---
?arch/arm/mach-pxa/include/mach/hardware.h | ? 26 +++++++++----------------- ?1 files changed, 9 insertions(+), 17 deletions(-)arch/arm/mach-pxa/include/mach/hardware.h +0
-0@@ -145,53 +145,44 @@ ?#define __cpu_is_pxa27x(id) ? ?(0)?#endif
arch/arm/mach-pxa/include/mach/hardware.h +1
-1-#ifdef CONFIG_CPU_PXA300 +#ifdef CONFIG_PXA3xx?#define
__cpu_is_pxa300(id)? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ?({ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? ? ? ? ?unsigned int_id= (id) >> 4 &0xfff; ? \
? ? ? ? ? ? ? ?_id ==0x688; ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? })arch/arm/mach-pxa/include/mach/hardware.h +0
-4-#else -#define __cpu_is_pxa300 (id) ? ?(0) -#endif -#ifdef CONFIG_CPU_PXA310 ?#define
__cpu_is_pxa310(id)? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ?({ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? ? ? ? ?unsigned int_id= (id) >> 4 &0xfff; ? \
? ? ? ? ? ? ? ?_id ==0x689; ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? })arch/arm/mach-pxa/include/mach/hardware.h +0
-4-#else -#define __cpu_is_pxa310 (id) ? ?(0) -#endif -#ifdef CONFIG_CPU_PXA320 ?#define
__cpu_is_pxa320(id)? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ?({ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? ? ? ? ?unsigned int_id= (id) >> 4 &0xfff; ? \
? ? ? ? ? ? ? ?_id ==0x603||_id==0x682; ? ? ? ? ? \
? ? ? ? })
?#elsearch/arm/mach-pxa/include/mach/hardware.h +2
-0+#define __cpu_is_pxa300 (id) ? ?(0) +#define __cpu_is_pxa310 (id) ? ?(0)?#define
__cpu_is_pxa320(id)? ?(0)
?#endifarch/arm/mach-pxa/include/mach/hardware.h +1
-1-#ifdef CONFIG_CPU_PXA930 +#ifdef CONFIG_PXA93x?#define
__cpu_is_pxa930(id)? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ?({ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? ? ? ? ?unsigned int_id= (id) >> 4 &0xfff; ? \
? ? ? ? ? ? ? ?_id ==0x683; ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? })arch/arm/mach-pxa/include/mach/hardware.h +0
-4-#else -#define __cpu_is_pxa930 (id) ? ?(0) -#endif -#ifdef CONFIG_CPU_PXA935 ?#define
__cpu_is_pxa935(id)? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ?({ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? ? ? ? ?unsigned int_id= (id) >> 4 &0xfff; ? \
? ? ? ? ? ? ? ?_id ==0x693; ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? })
?#else
+#define__cpu_is_pxa930(id)? ?(0)
?#define__cpu_is_pxa935(id)? ?(0)
?#endifarch/arm/mach-pxa/include/mach/hardware.h +0
-0@@ -264,7 +255,7 @@?/*
?* CPUID Core Generation Bit
?* <=0x2for pxa21x/pxa25x/pxa26x/pxa27x
- * ==0x3for pxa300/pxa310/pxa320
+ * ==0x3for pxa300/pxa310/pxa320 and pxa930/pxa935 ?*/
?#ifdefined(CONFIG_PXA25x)||defined(CONFIG_PXA27x)?#define__cpu_is_pxa2xx(id)? ? ? ? ? ? ? ? ? ? ? ? ? ?\arch/arm/mach-pxa/include/mach/hardware.h +0
-0@@ -279,8 +270,9 @@?#ifdef
CONFIG_PXA3xx
?#define__cpu_is_pxa3xx(id)? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ?({ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
- ? ? ? ? ? ? ? unsigned int_id= (id) >> 13 &0x7; ? ?\
- ? ? ? ? ? ? ?_id==0x3; ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
+ ? ? ? ? ? ? ?__cpu_is_pxa300(id)? ? ? ? ? ? ? ? ? ? \+ ? ? ? ? ? ? ? ? ? ? ? || __cpu_is_pxa310(id) ? ? ? ? ?\ + ? ? ? ? ? ? ? ? ? ? ? || __cpu_is_pxa320(id); ? ? ? ? \? ? ? ? })
?#else
?#define__cpu_is_pxa3xx(id)? ?(0)
--
1.5.6.5
PATCH 1/11 ARM: pxa: redefine the cpu_is_pxa3xx
Quoted 5 lines · Eric Miao
Quoted 3 lines · Haojian Zhuang
PXA300/PXA310/PXA320/PXA930/PXA935 are sharing one cpu family id. It's a little confusion on
cpu_is_pxa3xx().
Quoted 8 lines
Quoted 5 lines
Now reduce the scope of
cpu_is_pxa3xx(). Make it focusing on PXA300/PXA310/PXA320. PXA930/PXA935 is coverd bycpu_is_pxa93x().Signed-off-by Haojian Zhuang <[email protected]>Cc Eric Miao <[email protected]>Applied.
Dropped as we discussed. Waiting for your new submission.